From 5c0ed8cdc4544a94fa6d1ea3797fcc6a4bd22010 Mon Sep 17 00:00:00 2001 From: Kristina Martšenko Date: Fri, 20 Jun 2014 17:49:59 +0300 Subject: staging: crystalhd: remove driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The driver hasn't had significant work done on it for a long time. Broadcom has EOLed the hardware and is no longer selling it. There are probably very few people still using it. So remove the driver. Signed-off-by: Kristina Martšenko Cc: Naren Sankar Cc: Jarod Wilson Cc: Scott Davilla Cc: Manu Abraham Signed-off-by: Greg Kroah-Hartman --- MAINTAINERS | 8 -------- 1 file changed, 8 deletions(-) (limited to 'MAINTAINERS') diff --git a/MAINTAINERS b/MAINTAINERS index 134483f206e4..7c291d13182c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8512,14 +8512,6 @@ M: H Hartley Sweeten S: Odd Fixes F: drivers/staging/comedi/ -STAGING - CRYSTAL HD VIDEO DECODER -M: Naren Sankar -M: Jarod Wilson -M: Scott Davilla -M: Manu Abraham -S: Odd Fixes -F: drivers/staging/crystalhd/ - STAGING - ECHO CANCELLER M: Steve Underwood M: David Rowe -- cgit v1.2.3 From ac4ddad67acb9f67b42902939df64980fcbdbae5 Mon Sep 17 00:00:00 2001 From: Kristina Martšenko Date: Sun, 29 Jun 2014 00:26:50 +0300 Subject: staging: winbond: remove driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The driver hasn't been cleaned up and nobody is working to do so, so remove it. Signed-off-by: Kristina Martšenko Cc: Pavel Machek Signed-off-by: Greg Kroah-Hartman --- MAINTAINERS | 5 - drivers/staging/Kconfig | 2 - drivers/staging/Makefile | 1 - drivers/staging/winbond/Kconfig | 11 - drivers/staging/winbond/Makefile | 15 - drivers/staging/winbond/TODO | 12 - drivers/staging/winbond/core.h | 61 - drivers/staging/winbond/localpara.h | 311 ---- drivers/staging/winbond/mac_structures.h | 71 - drivers/staging/winbond/mds.c | 650 -------- drivers/staging/winbond/mds_f.h | 22 - drivers/staging/winbond/mds_s.h | 130 -- drivers/staging/winbond/mto.c | 167 --- drivers/staging/winbond/mto.h | 134 -- drivers/staging/winbond/phy_calibration.c | 1317 ---------------- drivers/staging/winbond/phy_calibration.h | 85 -- drivers/staging/winbond/reg.c | 2328 ----------------------------- drivers/staging/winbond/sme_api.h | 191 --- drivers/staging/winbond/wb35reg.c | 806 ---------- drivers/staging/winbond/wb35reg_f.h | 65 - drivers/staging/winbond/wb35reg_s.h | 240 --- drivers/staging/winbond/wb35rx.c | 358 ----- drivers/staging/winbond/wb35rx_f.h | 15 - drivers/staging/winbond/wb35rx_s.h | 44 - drivers/staging/winbond/wb35tx.c | 290 ---- drivers/staging/winbond/wb35tx_f.h | 22 - drivers/staging/winbond/wb35tx_s.h | 39 - drivers/staging/winbond/wbhal.h | 513 ------- drivers/staging/winbond/wbusb.c | 853 ----------- 29 files changed, 8758 deletions(-) delete mode 100644 drivers/staging/winbond/Kconfig delete mode 100644 drivers/staging/winbond/Makefile delete mode 100644 drivers/staging/winbond/TODO delete mode 100644 drivers/staging/winbond/core.h delete mode 100644 drivers/staging/winbond/localpara.h delete mode 100644 drivers/staging/winbond/mac_structures.h delete mode 100644 drivers/staging/winbond/mds.c delete mode 100644 drivers/staging/winbond/mds_f.h delete mode 100644 drivers/staging/winbond/mds_s.h delete mode 100644 drivers/staging/winbond/mto.c delete mode 100644 drivers/staging/winbond/mto.h delete mode 100644 drivers/staging/winbond/phy_calibration.c delete mode 100644 drivers/staging/winbond/phy_calibration.h delete mode 100644 drivers/staging/winbond/reg.c delete mode 100644 drivers/staging/winbond/sme_api.h delete mode 100644 drivers/staging/winbond/wb35reg.c delete mode 100644 drivers/staging/winbond/wb35reg_f.h delete mode 100644 drivers/staging/winbond/wb35reg_s.h delete mode 100644 drivers/staging/winbond/wb35rx.c delete mode 100644 drivers/staging/winbond/wb35rx_f.h delete mode 100644 drivers/staging/winbond/wb35rx_s.h delete mode 100644 drivers/staging/winbond/wb35tx.c delete mode 100644 drivers/staging/winbond/wb35tx_f.h delete mode 100644 drivers/staging/winbond/wb35tx_s.h delete mode 100644 drivers/staging/winbond/wbhal.h delete mode 100644 drivers/staging/winbond/wbusb.c (limited to 'MAINTAINERS') diff --git a/MAINTAINERS b/MAINTAINERS index 1a3564dddcb7..4c7cff443a5e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8631,11 +8631,6 @@ M: Forest Bond S: Odd Fixes F: drivers/staging/vt665?/ -STAGING - WINBOND IS89C35 WLAN USB DRIVER -M: Pavel Machek -S: Odd Fixes -F: drivers/staging/winbond/ - STAGING - XGI Z7,Z9,Z11 PCI DISPLAY DRIVER M: Arnaud Patard S: Odd Fixes diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index 52d7e8b63347..c7e34a28c6f1 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -30,8 +30,6 @@ source "drivers/staging/slicoss/Kconfig" source "drivers/staging/usbip/Kconfig" -source "drivers/staging/winbond/Kconfig" - source "drivers/staging/wlan-ng/Kconfig" source "drivers/staging/comedi/Kconfig" diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index 1b9e10c639e3..8ad1689da19d 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -7,7 +7,6 @@ obj-y += media/ obj-$(CONFIG_ET131X) += et131x/ obj-$(CONFIG_SLICOSS) += slicoss/ obj-$(CONFIG_USBIP_CORE) += usbip/ -obj-$(CONFIG_W35UND) += winbond/ obj-$(CONFIG_PRISM2_USB) += wlan-ng/ obj-$(CONFIG_COMEDI) += comedi/ obj-$(CONFIG_FB_OLPC_DCON) += olpc_dcon/ diff --git a/drivers/staging/winbond/Kconfig b/drivers/staging/winbond/Kconfig deleted file mode 100644 index db5b053d9bc2..000000000000 --- a/drivers/staging/winbond/Kconfig +++ /dev/null @@ -1,11 +0,0 @@ -config W35UND - tristate "IS89C35 WLAN USB driver" - depends on MAC80211 && WLAN && USB - default n - ---help--- - This is highly experimental driver for Winbond WIFI card. - - Hardware is present in some Kohjinsha subnotebooks, and in some - stand-alone USB modules. Chipset name seems to be w89c35d. - - Check for new version. diff --git a/drivers/staging/winbond/Makefile b/drivers/staging/winbond/Makefile deleted file mode 100644 index 081d48db04cb..000000000000 --- a/drivers/staging/winbond/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -w35und-y := \ - mds.o \ - mto.o \ - phy_calibration.o \ - reg.o \ - wb35reg.o \ - wb35rx.o \ - wb35tx.o \ - wbusb.o \ - - -obj-$(CONFIG_W35UND) += w35und.o - - - diff --git a/drivers/staging/winbond/TODO b/drivers/staging/winbond/TODO deleted file mode 100644 index b4c592a96844..000000000000 --- a/drivers/staging/winbond/TODO +++ /dev/null @@ -1,12 +0,0 @@ -TODO: - - sparse cleanups - - checkpatch cleanups - - kerneldoc cleanups - - fix severeCamelCaseInfestation - - remove unused ioctls - - use cfg80211 for regulatory stuff - - fix 4k stack problems - - fix locking problems (it's done using atomics...) - -Please send patches to Greg Kroah-Hartman and -Pavel Machek diff --git a/drivers/staging/winbond/core.h b/drivers/staging/winbond/core.h deleted file mode 100644 index fc0ef24fad3b..000000000000 --- a/drivers/staging/winbond/core.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef __WINBOND_CORE_H -#define __WINBOND_CORE_H - -#include -#include -#include - -#include "wbhal.h" -#include "mto.h" - -#include "mac_structures.h" -#include "mds_s.h" - -#define MAX_NUM_TX_MMPDU 2 -#define MAX_MMPDU_SIZE 1512 -#define MAX_NUM_RX_MMPDU 6 - -struct mlme_frame { - s8 *pMMPDU; - u16 len; - u8 data_type; - u8 is_in_used; - - u8 TxMMPDU[MAX_NUM_TX_MMPDU][MAX_MMPDU_SIZE]; - u8 TxMMPDUInUse[(MAX_NUM_TX_MMPDU + 3) & ~0x03]; - - u16 wNumTxMMPDU; - u16 wNumTxMMPDUDiscarded; - - u8 RxMMPDU[MAX_NUM_RX_MMPDU][MAX_MMPDU_SIZE]; - u8 SaveRxBufSlotInUse[(MAX_NUM_RX_MMPDU + 3) & ~0x03]; - - u16 wNumRxMMPDU; - u16 wNumRxMMPDUDiscarded; - - u16 wNumRxMMPDUInMLME; /* Number of the Rx MMPDU */ - u16 reserved_1; /* in MLME. */ - /* excluding the discarded */ -}; - -#define WBLINUX_PACKET_ARRAY_SIZE (ETHERNET_TX_DESCRIPTORS*4) - -#define WB_MAX_LINK_NAME_LEN 40 - -struct wbsoft_priv { - struct wb_local_para sLocalPara; /* Myself connected - parameters */ - - struct mlme_frame sMlmeFrame; /* connect to peerSTA parameters */ - - struct wb35_mto_params sMtoPara; /* MTO_struct ... */ - struct hw_data sHwData; /*For HAL */ - struct wb35_mds Mds; - - u32 RxByteCount; - u32 TxByteCount; - - bool enabled; -}; - -#endif /* __WINBOND_CORE_H */ diff --git a/drivers/staging/winbond/localpara.h b/drivers/staging/winbond/localpara.h deleted file mode 100644 index 8ca80ddda59a..000000000000 --- a/drivers/staging/winbond/localpara.h +++ /dev/null @@ -1,311 +0,0 @@ -#ifndef __WINBOND_LOCALPARA_H -#define __WINBOND_LOCALPARA_H - -/* - * ============================================================= - * LocalPara.h - - * ============================================================= - */ - -#include "mac_structures.h" - -/* Define the local ability */ - -#define LOCAL_DEFAULT_BEACON_PERIOD 100 /* ms */ -#define LOCAL_DEFAULT_ATIM_WINDOW 0 -#define LOCAL_DEFAULT_ERP_CAPABILITY 0x0431 /* - * 0x0001: ESS - * 0x0010: Privacy - * 0x0020: short preamble - * 0x0400: short slot time - */ -#define LOCAL_DEFAULT_LISTEN_INTERVAL 5 - -#define LOCAL_DEFAULT_24_CHANNEL_NUM 13 /* channel 1..13 */ -#define LOCAL_DEFAULT_5_CHANNEL_NUM 8 /* channel 36..64 */ - -#define LOCAL_USA_24_CHANNEL_NUM 11 -#define LOCAL_USA_5_CHANNEL_NUM 12 -#define LOCAL_EUROPE_24_CHANNEL_NUM 13 -#define LOCAL_EUROPE_5_CHANNEL_NUM 19 -#define LOCAL_JAPAN_24_CHANNEL_NUM 14 -#define LOCAL_JAPAN_5_CHANNEL_NUM 11 -#define LOCAL_UNKNOWN_24_CHANNEL_NUM 14 -#define LOCAL_UNKNOWN_5_CHANNEL_NUM 34 /* not include 165 */ - -#define psLOCAL (&(adapter->sLocalPara)) - -#define MODE_802_11_BG 0 -#define MODE_802_11_A 1 -#define MODE_802_11_ABG 2 -#define MODE_802_11_BG_IBSS 3 -#define MODE_802_11_B 4 -#define MODE_AUTO 255 - -#define BAND_TYPE_DSSS 0 -#define BAND_TYPE_OFDM_24 1 -#define BAND_TYPE_OFDM_5 2 - -/* refer Bitmap2RateValue table */ - -/* the bitmap value of all the H/W supported rates: */ -/* 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 */ -#define LOCAL_ALL_SUPPORTED_RATES_BITMAP 0x130c1a66 -/* the bitmap value of all the H/W supported rates except to non-OFDM rates: */ -/* 6, 9, 12, 18, 24, 36, 48, 54 */ -#define LOCAL_OFDM_SUPPORTED_RATES_BITMAP 0x130c1240 -#define LOCAL_11B_SUPPORTED_RATE_BITMAP 0x826 -#define LOCAL_11B_BASIC_RATE_BITMAP 0x826 -#define LOCAL_11B_OPERATION_RATE_BITMAP 0x826 -#define LOCAL_11G_BASIC_RATE_BITMAP 0x826 /* 1, 2, 5.5, 11 */ -#define LOCAL_11G_OPERATION_RATE_BITMAP 0x130c1240 /* 6, 9, 12, 18, - * 24, 36, 48, 54 - */ -#define LOCAL_11A_BASIC_RATE_BITMAP 0x01001040 /* 6, 12, 24 */ -#define LOCAL_11A_OPERATION_RATE_BITMAP 0x120c0200 /* 9, 18, 36, - * 48, 54 - */ - - -#define PWR_ACTIVE 0 -#define PWR_SAVE 1 -#define PWR_TX_IDLE_CYCLE 6 - -/* bPreambleMode and bSlotTimeMode */ -#define AUTO_MODE 0 -#define LONG_MODE 1 - -/* Region definition */ -#define REGION_AUTO 0xff -#define REGION_UNKNOWN 0 -#define REGION_EUROPE 1 /* ETSI */ -#define REGION_JAPAN 2 /* MKK */ -#define REGION_USA 3 /* FCC */ -#define REGION_FRANCE 4 /* FRANCE */ -#define REGION_SPAIN 5 /* SPAIN */ -#define REGION_ISRAEL 6 /* ISRAEL */ - -#define MAX_BSS_DESCRIPT_ELEMENT 32 -#define MAX_PMKID_CandidateList 16 - -/* - * High byte : Event number, low byte : reason - * Event definition - * -- SME/MLME event - */ -#define EVENT_RCV_DEAUTH 0x0100 -#define EVENT_JOIN_FAIL 0x0200 -#define EVENT_AUTH_FAIL 0x0300 -#define EVENT_ASSOC_FAIL 0x0400 -#define EVENT_LOST_SIGNAL 0x0500 -#define EVENT_BSS_DESCRIPT_LACK 0x0600 -#define EVENT_COUNTERMEASURE 0x0700 -#define EVENT_JOIN_FILTER 0x0800 -/* -- TX/RX event */ -#define EVENT_RX_BUFF_UNAVAILABLE 0x4100 - -#define EVENT_CONNECT 0x8100 -#define EVENT_DISCONNECT 0x8200 -#define EVENT_SCAN_REQ 0x8300 - -/* Reason of Event */ -#define EVENT_REASON_FILTER_BASIC_RATE 0x0001 -#define EVENT_REASON_FILTER_PRIVACY 0x0002 -#define EVENT_REASON_FILTER_AUTH_MODE 0x0003 -#define EVENT_REASON_TIMEOUT 0x00ff - -/* Due to[E id][Length][OUI][Data] may be 257 bytes */ -#define MAX_IE_APPEND_SIZE (256 + 4) - -struct chan_info { - u8 band; - u8 ChanNo; -}; - -struct radio_off { - u8 boHwRadioOff; - u8 boSwRadioOff; -}; - -struct wb_local_para { - /* read from EPROM, manufacture set for each NetCard */ - u8 PermanentAddress[MAC_ADDR_LENGTH + 2]; - /* the driver will use this one actually. */ - u8 ThisMacAddress[MAC_ADDR_LENGTH + 2]; - u32 MTUsize; /* Ind to Uplayer, Max transmission unit size */ - u8 region_INF; /* region setting from INF */ - u8 region; /* real region setting of the device */ - u8 Reserved_1[2]; - - /* power-save variables */ - u8 iPowerSaveMode; /* 0 indicates on, 1 indicates off */ - u8 ATIMmode; - u8 ExcludeUnencrypted; - /* Unit time count for the decision to enter PS mode */ - u16 CheckCountForPS; - u8 boHasTxActivity;/* tx activity has occurred */ - u8 boMacPsValid; /* Power save mode obtained - * from H/W is valid or not - */ - - /* Rate */ - u8 TxRateMode; /* - * Initial, input from Registry, - * may be updated by GUI - * Tx Rate Mode: auto(DTO on), max, 1M, 2M, .. - */ - u8 CurrentTxRate; /* The current Tx rate */ - u8 CurrentTxRateForMng; /* - * The current Tx rate for management - * frames. It will be decided before - * connection succeeds. - */ - u8 CurrentTxFallbackRate; - - /* for Rate handler */ - u8 BRateSet[32]; /* basic rate set */ - u8 SRateSet[32]; /* support rate set */ - - u8 NumOfBRate; - u8 NumOfSRate; - u8 NumOfDsssRateInSRate; /* number of DSSS rates in - * supported rate set - */ - u8 reserved1; - - u32 dwBasicRateBitmap; /* bit map of basic rates */ - - u32 dwSupportRateBitmap; /* bit map of all support rates - * including basic and operational - * rates - */ - - - /* For SME/MLME handler */ - - u16 wOldSTAindex; /* valid when boHandover=TRUE, - * store old connected STA index - */ - u16 wConnectedSTAindex; /* Index of peerly connected AP or - * IBSS in the descriptionset. - */ - u16 Association_ID; /* The Association ID in the - * (Re)Association Response frame. - */ - u16 ListenInterval; /* The listen interval when SME invoking - * MLME_ (Re)Associate_Request(). - */ - - struct radio_off RadioOffStatus; - u8 Reserved0[2]; - u8 boMsRadioOff; /* Ndis demands to be true when set - * Disassoc. OID and be false when - * set SSID OID. - */ - u8 bAntennaNo; /* which antenna */ - u8 bConnectFlag; /* the connect status flag for - * roaming task - */ - - u8 RoamStatus; - u8 reserved7[3]; - - struct chan_info CurrentChan; /* Current channel no. and channel band. - * It may be changed by scanning. - */ - u8 boHandover; /* Roaming, Handover to other AP. */ - u8 boCCAbusy; - - u16 CWMax; /* It may not be the real value - * that H/W used - */ - u8 CWMin; /* 255: set according to 802.11 spec. */ - u8 reserved2; - - /* 11G: */ - u8 bMacOperationMode; /* operation in 802.11b or 802.11g */ - u8 bSlotTimeMode; /* AUTO, s32 */ - u8 bPreambleMode; /* AUTO, s32 */ - u8 boNonERPpresent; - - u8 boProtectMechanism; /* H/W will take the necessary action - * based on this variable - */ - u8 boShortPreamble; /* Same here */ - u8 boShortSlotTime; /* Same here */ - u8 reserved_3; - - u32 RSN_IE_Bitmap; - u32 RSN_OUI_Type; - - /* For the BSSID */ - u8 HwBssid[MAC_ADDR_LENGTH + 2]; - u32 HwBssidValid; - - /* For scan list */ - u8 BssListCount; /* Total count of valid - * descriptor indexes - */ - u8 boReceiveUncorrectInfo; /* important settings in beacon/probe - * resp. have been changed - */ - u8 NoOfJoinerInIbss; - u8 reserved_4; - - /* Store the valid descriptor indexes obtained from scannings */ - u8 BssListIndex[(MAX_BSS_DESCRIPT_ELEMENT + 3) & ~0x03]; - /* - * Save the BssDescriptor index in this IBSS. - * The index 0 is local descriptor (psLOCAL->wConnectedSTAindex). - * If CONNECTED : NoOfJoinerInIbss >= 2 - * else : NoOfJoinerInIbss <= 1 - */ - u8 JoinerInIbss[(MAX_BSS_DESCRIPT_ELEMENT + 3) & ~0x03]; - - /* General Statistics, count at Rx_handler or - * Tx_callback interrupt handler - */ - u64 GS_XMIT_OK; /* Good Frames Transmitted */ - u64 GS_RCV_OK; /* Good Frames Received */ - u32 GS_RCV_ERROR; /* Frames received with crc error */ - u32 GS_XMIT_ERROR; /* Bad Frames Transmitted */ - u32 GS_RCV_NO_BUFFER; /* Receive Buffer underrun */ - u32 GS_XMIT_ONE_COLLISION; /* one collision */ - u32 GS_XMIT_MORE_COLLISIONS;/* more collisions */ - - /* - * ================================================================ - * Statistics (no matter whether it had done successfully) -wkchen - * ================================================================ - */ - u32 _NumRxMSDU; - u32 _NumTxMSDU; - u32 _dot11WEPExcludedCount; - u32 _dot11WEPUndecryptableCount; - u32 _dot11FrameDuplicateCount; - - struct chan_info IbssChanSetting; /* 2B. Start IBSS Channel - * setting by registry or - * WWU. - */ - u8 reserved_5[2]; /* It may not be used after - * considering RF type, region - * and modulation type. - */ - - u8 reserved_6[2]; /* two variables are for wep - * key error detection - */ - u32 bWepKeyError; - u32 bToSelfPacketReceived; - u32 WepKeyDetectTimerCount; - - u16 SignalLostTh; - u16 SignalRoamTh; - - u8 IE_Append_data[MAX_IE_APPEND_SIZE]; - u16 IE_Append_size; - u16 reserved_7; -}; - -#endif diff --git a/drivers/staging/winbond/mac_structures.h b/drivers/staging/winbond/mac_structures.h deleted file mode 100644 index 76c63c74d50c..000000000000 --- a/drivers/staging/winbond/mac_structures.h +++ /dev/null @@ -1,71 +0,0 @@ -/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// MAC_Structures.h -// -// This file contains the definitions and data structures used by SW-MAC. -// -// Revision Histoy -//================= -// 0.1 2002 UN00 -// 0.2 20021004 PD43 CCLiu6 -// 20021018 PD43 CCLiu6 -// Add enum_TxRate type -// Modify enum_STAState type -// 0.3 20021023 PE23 CYLiu update MAC session struct -// 20021108 -// 20021122 PD43 Austin -// Deleted some unused. -// 20021129 PD43 Austin -// 20030617 increase the 802.11g definition -//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - -#ifndef _MAC_Structures_H_ -#define _MAC_Structures_H_ - -#define MAC_ADDR_LENGTH 6 - -/* ======================================================== -// 802.11 Frame define -//----- */ -#define DOT_11_MAC_HEADER_SIZE 24 -#define DOT_11_SNAP_SIZE 6 -#define DOT_11_DURATION_OFFSET 2 -/* Sequence control offset */ -#define DOT_11_SEQUENCE_OFFSET 22 -/* The start offset of 802.11 Frame// */ -#define DOT_11_TYPE_OFFSET 30 -#define DOT_11_DATA_OFFSET 24 -#define DOT_11_DA_OFFSET 4 - -#define MAX_ETHERNET_PACKET_SIZE 1514 - -/* ----- management : Type of Bits (2, 3) and Subtype of Bits (4, 5, 6, 7) */ -#define MAC_SUBTYPE_MNGMNT_ASSOC_REQUEST 0x00 -#define MAC_SUBTYPE_MNGMNT_ASSOC_RESPONSE 0x10 -#define MAC_SUBTYPE_MNGMNT_REASSOC_REQUEST 0x20 -#define MAC_SUBTYPE_MNGMNT_REASSOC_RESPONSE 0x30 -#define MAC_SUBTYPE_MNGMNT_PROBE_REQUEST 0x40 -#define MAC_SUBTYPE_MNGMNT_PROBE_RESPONSE 0x50 -#define MAC_SUBTYPE_MNGMNT_BEACON 0x80 -#define MAC_SUBTYPE_MNGMNT_ATIM 0x90 -#define MAC_SUBTYPE_MNGMNT_DISASSOCIATION 0xA0 -#define MAC_SUBTYPE_MNGMNT_AUTHENTICATION 0xB0 -#define MAC_SUBTYPE_MNGMNT_DEAUTHENTICATION 0xC0 - -#define RATE_AUTO 0 -#define RATE_1M 2 -#define RATE_2M 4 -#define RATE_5dot5M 11 -#define RATE_6M 12 -#define RATE_9M 18 -#define RATE_11M 22 -#define RATE_12M 24 -#define RATE_18M 36 -#define RATE_22M 44 -#define RATE_24M 48 -#define RATE_33M 66 -#define RATE_36M 72 -#define RATE_48M 96 -#define RATE_54M 108 -#define RATE_MAX 255 - -#endif /* _MAC_Structure_H_ */ diff --git a/drivers/staging/winbond/mds.c b/drivers/staging/winbond/mds.c deleted file mode 100644 index aef0855f4c68..000000000000 --- a/drivers/staging/winbond/mds.c +++ /dev/null @@ -1,650 +0,0 @@ -#include "mds_f.h" -#include "mto.h" -#include "wbhal.h" -#include "wb35tx_f.h" - -unsigned char -Mds_initial(struct wbsoft_priv *adapter) -{ - struct wb35_mds *pMds = &adapter->Mds; - - pMds->TxPause = false; - pMds->TxRTSThreshold = DEFAULT_RTSThreshold; - pMds->TxFragmentThreshold = DEFAULT_FRAGMENT_THRESHOLD; - - return hal_get_tx_buffer(&adapter->sHwData, &pMds->pTxBuffer); -} - -static void Mds_DurationSet(struct wbsoft_priv *adapter, - struct wb35_descriptor *pDes, u8 *buffer) -{ - struct T00_descriptor *pT00; - struct T01_descriptor *pT01; - u16 Duration, NextBodyLen, OffsetSize; - u8 Rate, i; - unsigned char CTS_on = false, RTS_on = false; - struct T00_descriptor *pNextT00; - u16 BodyLen = 0; - unsigned char boGroupAddr = false; - - OffsetSize = pDes->FragmentThreshold + 32 + 3; - OffsetSize &= ~0x03; - Rate = pDes->TxRate >> 1; - if (!Rate) - Rate = 1; - - pT00 = (struct T00_descriptor *)buffer; - pT01 = (struct T01_descriptor *)(buffer+4); - pNextT00 = (struct T00_descriptor *)(buffer+OffsetSize); - - if (buffer[DOT_11_DA_OFFSET+8] & 0x1) /* +8 for USB hdr */ - boGroupAddr = true; - - /****************************************** - * Set RTS/CTS mechanism - ******************************************/ - if (!boGroupAddr) { - /* NOTE : If the protection mode is enabled and the MSDU will - * be fragmented, the tx rates of MPDUs will all be DSSS - * rates. So it will not use CTS-to-self in this case. - * CTS-To-self will only be used when without - * fragmentation. -- 20050112 */ - BodyLen = (u16)pT00->T00_frame_length; /* include 802.11 header */ - BodyLen += 4; /* CRC */ - - if (BodyLen >= CURRENT_RTS_THRESHOLD) - RTS_on = true; /* Using RTS */ - else { - if (pT01->T01_modulation_type) { /* Is using OFDM */ - /* Is using protect */ - if (CURRENT_PROTECT_MECHANISM) - CTS_on = true; /* Using CTS */ - } - } - } - - if (RTS_on || CTS_on) { - if (pT01->T01_modulation_type) { /* Is using OFDM */ - /* CTS duration - * 2 SIFS + DATA transmit time + 1 ACK - * ACK Rate : 24 Mega bps - * ACK frame length = 14 bytes */ - Duration = 2*DEFAULT_SIFSTIME + - 2*PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION + - ((BodyLen*8 + 22 + Rate*4 - 1)/(Rate*4))*Tsym + - ((112 + 22 + 95)/96)*Tsym; - } else { /* DSSS */ - /* CTS duration - * 2 SIFS + DATA transmit time + 1 ACK - * Rate : ?? Mega bps - * ACK frame length = 14 bytes */ - if (pT01->T01_plcp_header_length) /* long preamble */ - Duration = LONG_PREAMBLE_PLUS_PLCPHEADER_TIME*2; - else - Duration = SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME*2; - - Duration += (((BodyLen + 14)*8 + Rate-1) / Rate + - DEFAULT_SIFSTIME*2); - } - - if (RTS_on) { - if (pT01->T01_modulation_type) { /* Is using OFDM */ - /* CTS + 1 SIFS + CTS duration - * CTS Rate : 24 Mega bps - * CTS frame length = 14 bytes */ - Duration += (DEFAULT_SIFSTIME + - PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION + - ((112 + 22 + 95)/96)*Tsym); - } else { - /* CTS + 1 SIFS + CTS duration - * CTS Rate : ?? Mega bps - * CTS frame length = 14 bytes - */ - /* long preamble */ - if (pT01->T01_plcp_header_length) - Duration += LONG_PREAMBLE_PLUS_PLCPHEADER_TIME; - else - Duration += SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME; - - Duration += (((112 + Rate-1) / Rate) + - DEFAULT_SIFSTIME); - } - } - - /* Set the value into USB descriptor */ - pT01->T01_add_rts = RTS_on ? 1 : 0; - pT01->T01_add_cts = CTS_on ? 1 : 0; - pT01->T01_rts_cts_duration = Duration; - } - - /****************************************** - * Fill the more fragment descriptor - ******************************************/ - if (boGroupAddr) - Duration = 0; - else { - for (i = pDes->FragmentCount-1; i > 0; i--) { - NextBodyLen = (u16)pNextT00->T00_frame_length; - NextBodyLen += 4; /* CRC */ - - if (pT01->T01_modulation_type) { - /* OFDM - * data transmit time + 3 SIFS + 2 ACK - * Rate : ??Mega bps - * ACK frame length = 14 bytes, tx rate = 24M */ - Duration = PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION * 3; - Duration += (((NextBodyLen*8 + 22 + Rate*4 - 1) - /(Rate*4)) * Tsym + - (((2*14)*8 + 22 + 95)/96)*Tsym + - DEFAULT_SIFSTIME*3); - } else { - /* DSSS - * data transmit time + 2 ACK + 3 SIFS - * Rate : ??Mega bps - * ACK frame length = 14 bytes - * TODO : */ - if (pT01->T01_plcp_header_length) /* long preamble */ - Duration = LONG_PREAMBLE_PLUS_PLCPHEADER_TIME*3; - else - Duration = SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME*3; - - Duration += (((NextBodyLen + (2*14))*8 - + Rate-1) / Rate + - DEFAULT_SIFSTIME*3); - } - /* 4 USHOR for skip 8B USB, 2USHORT=FC + Duration */ - ((u16 *)buffer)[5] = cpu_to_le16(Duration); - - /* ----20061009 add by anson's endian */ - pNextT00->value = cpu_to_le32(pNextT00->value); - pT01->value = cpu_to_le32(pT01->value); - /* ----end 20061009 add by anson's endian */ - - buffer += OffsetSize; - pT01 = (struct T01_descriptor *)(buffer+4); - /* The last fragment will not have the next fragment */ - if (i != 1) - pNextT00 = (struct T00_descriptor *)(buffer+OffsetSize); - } - - /******************************************* - * Fill the last fragment descriptor - *******************************************/ - if (pT01->T01_modulation_type) { - /* OFDM - * 1 SIFS + 1 ACK - * Rate : 24 Mega bps - * ACK frame length = 14 bytes */ - Duration = PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION; - /* The Tx rate of ACK use 24M */ - Duration += (((112 + 22 + 95)/96)*Tsym + - DEFAULT_SIFSTIME); - } else { - /* DSSS - * 1 ACK + 1 SIFS - * Rate : ?? Mega bps - * ACK frame length = 14 bytes(112 bits) */ - if (pT01->T01_plcp_header_length) /* long preamble */ - Duration = LONG_PREAMBLE_PLUS_PLCPHEADER_TIME; - else - Duration = SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME; - - Duration += ((112 + Rate-1)/Rate + DEFAULT_SIFSTIME); - } - } - - /* 4 USHOR for skip 8B USB, 2USHORT=FC + Duration */ - ((u16 *)buffer)[5] = cpu_to_le16(Duration); - pT00->value = cpu_to_le32(pT00->value); - pT01->value = cpu_to_le32(pT01->value); - /* --end 20061009 add */ - -} - -/* The function return the 4n size of usb pk */ -static u16 Mds_BodyCopy(struct wbsoft_priv *adapter, - struct wb35_descriptor *pDes, u8 *TargetBuffer) -{ - struct T00_descriptor *pT00; - struct wb35_mds *pMds = &adapter->Mds; - u8 *buffer; - u8 *src_buffer; - u8 *pctmp; - u16 Size = 0; - u16 SizeLeft, CopySize, CopyLeft, stmp; - u8 buf_index, FragmentCount = 0; - - - /* Copy fragment body */ - buffer = TargetBuffer; /* shift 8B usb + 24B 802.11 */ - SizeLeft = pDes->buffer_total_size; - buf_index = pDes->buffer_start_index; - - pT00 = (struct T00_descriptor *)buffer; - while (SizeLeft) { - pT00 = (struct T00_descriptor *)buffer; - CopySize = SizeLeft; - if (SizeLeft > pDes->FragmentThreshold) { - CopySize = pDes->FragmentThreshold; - /* Set USB length */ - pT00->T00_frame_length = 24 + CopySize; - } else /* Set USB length */ - pT00->T00_frame_length = 24 + SizeLeft; - - SizeLeft -= CopySize; - - /* 1 Byte operation */ - pctmp = (u8 *)(buffer + 8 + DOT_11_SEQUENCE_OFFSET); - *pctmp &= 0xf0; - *pctmp |= FragmentCount; /* 931130.5.m */ - if (!FragmentCount) - pT00->T00_first_mpdu = 1; - - buffer += 32; /* 8B usb + 24B 802.11 header */ - Size += 32; - - /* Copy into buffer */ - stmp = CopySize + 3; - stmp &= ~0x03; /* 4n Alignment */ - Size += stmp; /* Current 4n offset of mpdu */ - - while (CopySize) { - /* Copy body */ - src_buffer = pDes->buffer_address[buf_index]; - CopyLeft = CopySize; - if (CopySize >= pDes->buffer_size[buf_index]) { - CopyLeft = pDes->buffer_size[buf_index]; - - /* Get the next buffer of descriptor */ - buf_index++; - buf_index %= MAX_DESCRIPTOR_BUFFER_INDEX; - } else { - u8 *pctmp = pDes->buffer_address[buf_index]; - pctmp += CopySize; - pDes->buffer_address[buf_index] = pctmp; - pDes->buffer_size[buf_index] -= CopySize; - } - - memcpy(buffer, src_buffer, CopyLeft); - buffer += CopyLeft; - CopySize -= CopyLeft; - } - - /* 931130.5.n */ - if (pMds->MicAdd) { - if (!SizeLeft) { - pMds->MicWriteAddress[pMds->MicWriteIndex] = - buffer - pMds->MicAdd; - pMds->MicWriteSize[pMds->MicWriteIndex] = - pMds->MicAdd; - pMds->MicAdd = 0; - } else if (SizeLeft < 8) { /* 931130.5.p */ - pMds->MicAdd = SizeLeft; - pMds->MicWriteAddress[pMds->MicWriteIndex] = - buffer - (8 - SizeLeft); - pMds->MicWriteSize[pMds->MicWriteIndex] = - 8 - SizeLeft; - pMds->MicWriteIndex++; - } - } - - /* Does it need to generate the new header for next mpdu? */ - if (SizeLeft) { - /* Get the next 4n start address */ - buffer = TargetBuffer + Size; - /* Copy 8B USB +24B 802.11 */ - memcpy(buffer, TargetBuffer, 32); - pT00 = (struct T00_descriptor *)buffer; - pT00->T00_first_mpdu = 0; - } - - FragmentCount++; - } - - pT00->T00_last_mpdu = 1; - pT00->T00_IsLastMpdu = 1; - buffer = (u8 *)pT00 + 8; /* +8 for USB hdr */ - buffer[1] &= ~0x04; /* Clear more frag bit of 802.11 frame control */ - /* Update the correct fragment number */ - pDes->FragmentCount = FragmentCount; - return Size; -} - -static void Mds_HeaderCopy(struct wbsoft_priv *adapter, - struct wb35_descriptor *pDes, u8 *TargetBuffer) -{ - struct wb35_mds *pMds = &adapter->Mds; - u8 *src_buffer = pDes->buffer_address[0]; /* 931130.5.g */ - struct T00_descriptor *pT00; - struct T01_descriptor *pT01; - u16 stmp; - u8 i, ctmp1, ctmp2, ctmpf; - u16 FragmentThreshold = CURRENT_FRAGMENT_THRESHOLD; - - - stmp = pDes->buffer_total_size; - /* - * Set USB header 8 byte - */ - pT00 = (struct T00_descriptor *)TargetBuffer; - TargetBuffer += 4; - pT01 = (struct T01_descriptor *)TargetBuffer; - TargetBuffer += 4; - - pT00->value = 0; /* Clear */ - pT01->value = 0; /* Clear */ - - pT00->T00_tx_packet_id = pDes->Descriptor_ID; /* Set packet ID */ - pT00->T00_header_length = 24; /* Set header length */ - pT01->T01_retry_abort_enable = 1; /* 921013 931130.5.h */ - - /* Key ID setup */ - pT01->T01_wep_id = 0; - - FragmentThreshold = DEFAULT_FRAGMENT_THRESHOLD; /* Do not fragment */ - /* Copy full data, the 1'st buffer contain all the data 931130.5.j */ - /* Copy header */ - memcpy(TargetBuffer, src_buffer, DOT_11_MAC_HEADER_SIZE); - pDes->buffer_address[0] = src_buffer + DOT_11_MAC_HEADER_SIZE; - pDes->buffer_total_size -= DOT_11_MAC_HEADER_SIZE; - pDes->buffer_size[0] = pDes->buffer_total_size; - - /* Set fragment threshold */ - FragmentThreshold -= (DOT_11_MAC_HEADER_SIZE + 4); - pDes->FragmentThreshold = FragmentThreshold; - - /* Set more frag bit */ - TargetBuffer[1] |= 0x04; /* Set more frag bit */ - - /* - * Set tx rate - */ - stmp = *(u16 *)(TargetBuffer+30); /* 2n alignment address */ - - /* Use basic rate */ - ctmp1 = ctmpf = CURRENT_TX_RATE_FOR_MNG; - - pDes->TxRate = ctmp1; - pr_debug("Tx rate =%x\n", ctmp1); - - pT01->T01_modulation_type = (ctmp1%3) ? 0 : 1; - - for (i = 0; i < 2; i++) { - if (i == 1) - ctmp1 = ctmpf; - /* backup the ta rate and fall back rate */ - pMds->TxRate[pDes->Descriptor_ID][i] = ctmp1; - - if (ctmp1 == 108) - ctmp2 = 7; - else if (ctmp1 == 96) - ctmp2 = 6; /* Rate convert for USB */ - else if (ctmp1 == 72) - ctmp2 = 5; - else if (ctmp1 == 48) - ctmp2 = 4; - else if (ctmp1 == 36) - ctmp2 = 3; - else if (ctmp1 == 24) - ctmp2 = 2; - else if (ctmp1 == 18) - ctmp2 = 1; - else if (ctmp1 == 12) - ctmp2 = 0; - else if (ctmp1 == 22) - ctmp2 = 3; - else if (ctmp1 == 11) - ctmp2 = 2; - else if (ctmp1 == 4) - ctmp2 = 1; - else - ctmp2 = 0; /* if( ctmp1 == 2 ) or default */ - - if (i == 0) - pT01->T01_transmit_rate = ctmp2; - else - pT01->T01_fall_back_rate = ctmp2; - } - - /* - * Set preamble type - */ - /* RATE_1M */ - if ((pT01->T01_modulation_type == 0) && (pT01->T01_transmit_rate == 0)) - pDes->PreambleMode = WLAN_PREAMBLE_TYPE_LONG; - else - pDes->PreambleMode = CURRENT_PREAMBLE_MODE; - pT01->T01_plcp_header_length = pDes->PreambleMode; /* Set preamble */ - -} - -static void MLME_GetNextPacket(struct wbsoft_priv *adapter, - struct wb35_descriptor *desc) -{ - desc->InternalUsed = desc->buffer_start_index + desc->buffer_number; - desc->InternalUsed %= MAX_DESCRIPTOR_BUFFER_INDEX; - desc->buffer_address[desc->InternalUsed] = adapter->sMlmeFrame.pMMPDU; - desc->buffer_size[desc->InternalUsed] = adapter->sMlmeFrame.len; - desc->buffer_total_size += adapter->sMlmeFrame.len; - desc->buffer_number++; - desc->Type = adapter->sMlmeFrame.data_type; -} - -static void MLMEfreeMMPDUBuffer(struct wbsoft_priv *adapter, s8 *pData) -{ - int i; - - /* Reclaim the data buffer */ - for (i = 0; i < MAX_NUM_TX_MMPDU; i++) { - if (pData == (s8 *)&(adapter->sMlmeFrame.TxMMPDU[i])) - break; - } - if (adapter->sMlmeFrame.TxMMPDUInUse[i]) - adapter->sMlmeFrame.TxMMPDUInUse[i] = false; - else { - /* Something wrong - PD43 Add debug code here??? */ - } -} - -static void MLME_SendComplete(struct wbsoft_priv *adapter, u8 PacketID, - unsigned char SendOK) -{ - /* Reclaim the data buffer */ - adapter->sMlmeFrame.len = 0; - MLMEfreeMMPDUBuffer(adapter, adapter->sMlmeFrame.pMMPDU); - - /* Return resource */ - adapter->sMlmeFrame.is_in_used = PACKET_FREE_TO_USE; -} - -void -Mds_Tx(struct wbsoft_priv *adapter) -{ - struct hw_data *pHwData = &adapter->sHwData; - struct wb35_mds *pMds = &adapter->Mds; - struct wb35_descriptor TxDes; - struct wb35_descriptor *pTxDes = &TxDes; - u8 *XmitBufAddress; - u16 XmitBufSize, PacketSize, stmp, CurrentSize, FragmentThreshold; - u8 FillIndex, TxDesIndex, FragmentCount, FillCount; - unsigned char BufferFilled = false; - - - if (pMds->TxPause) - return; - if (!hal_driver_init_OK(pHwData)) - return; - - /* Only one thread can be run here */ - if (atomic_inc_return(&pMds->TxThreadCount) != 1) - goto cleanup; - - /* Start to fill the data */ - do { - FillIndex = pMds->TxFillIndex; - /* Is owned by software 0:Yes 1:No */ - if (pMds->TxOwner[FillIndex]) { - pr_debug("[Mds_Tx] Tx Owner is H/W.\n"); - break; - } - - /* Get buffer */ - XmitBufAddress = pMds->pTxBuffer + (MAX_USB_TX_BUFFER * FillIndex); - XmitBufSize = 0; - FillCount = 0; - do { - PacketSize = adapter->sMlmeFrame.len; - if (!PacketSize) - break; - - /* For Check the buffer resource */ - FragmentThreshold = CURRENT_FRAGMENT_THRESHOLD; - /* 931130.5.b */ - FragmentCount = PacketSize/FragmentThreshold + 1; - /* 931130.5.c 8:MIC */ - stmp = PacketSize + FragmentCount*32 + 8; - if ((XmitBufSize + stmp) >= MAX_USB_TX_BUFFER) - break; /* buffer is not enough */ - - /* - * Start transmitting - */ - BufferFilled = true; - - /* Leaves first u8 intact */ - memset((u8 *)pTxDes + 1, 0, sizeof(struct wb35_descriptor) - 1); - - TxDesIndex = pMds->TxDesIndex; /* Get the current ID */ - pTxDes->Descriptor_ID = TxDesIndex; - /* Storing the information of source coming from */ - pMds->TxDesFrom[TxDesIndex] = 2; - pMds->TxDesIndex++; - pMds->TxDesIndex %= MAX_USB_TX_DESCRIPTOR; - - MLME_GetNextPacket(adapter, pTxDes); - - /* - * Copy header. 8byte USB + 24byte 802.11Hdr. - * Set TxRate, Preamble type - */ - Mds_HeaderCopy(adapter, pTxDes, XmitBufAddress); - - /* For speed up Key setting */ - if (pTxDes->EapFix) { - pr_debug("35: EPA 4th frame detected. Size = %d\n", - PacketSize); - pHwData->IsKeyPreSet = 1; - } - - /* Copy (fragment) frame body, and set USB, 802.11 hdr flag */ - CurrentSize = Mds_BodyCopy(adapter, pTxDes, XmitBufAddress); - - /* Set RTS/CTS and Normal duration field into buffer */ - Mds_DurationSet(adapter, pTxDes, XmitBufAddress); - - /* Shift to the next address */ - XmitBufSize += CurrentSize; - XmitBufAddress += CurrentSize; - - /* Get packet to transmit completed, - * 1:TESTSTA 2:MLME 3: Ndis data - */ - MLME_SendComplete(adapter, 0, true); - - /* Software TSC count 20060214 */ - pMds->TxTsc++; - if (pMds->TxTsc == 0) - pMds->TxTsc_2++; - - FillCount++; /* 20060928 */ - /* - * End of multiple MSDU copy loop. - * false = single - * true = multiple sending - */ - } while (HAL_USB_MODE_BURST(pHwData)); - - /* Move to the next one, if necessary */ - if (BufferFilled) { - /* size setting */ - pMds->TxBufferSize[FillIndex] = XmitBufSize; - - /* 20060928 set Tx count */ - pMds->TxCountInBuffer[FillIndex] = FillCount; - - /* Set owner flag */ - pMds->TxOwner[FillIndex] = 1; - - pMds->TxFillIndex++; - pMds->TxFillIndex %= MAX_USB_TX_BUFFER_NUMBER; - BufferFilled = false; - } else - break; - - if (!PacketSize) /* No more pk for transmitting */ - break; - - } while (true); - - /* - * Start to send by lower module - */ - if (!pHwData->IsKeyPreSet) - Wb35Tx_start(adapter); - -cleanup: - atomic_dec(&pMds->TxThreadCount); -} - -void -Mds_SendComplete(struct wbsoft_priv *adapter, struct T02_descriptor *pT02) -{ - struct wb35_mds *pMds = &adapter->Mds; - struct hw_data *pHwData = &adapter->sHwData; - u8 PacketId = (u8)pT02->T02_Tx_PktID; - unsigned char SendOK = true; - u8 RetryCount, TxRate; - - if (pT02->T02_IgnoreResult) /* Don't care about the result */ - return; - if (pT02->T02_IsLastMpdu) { - /* TODO: DTO -- get the retry count and fragment count */ - /* Tx rate */ - TxRate = pMds->TxRate[PacketId][0]; - RetryCount = (u8)pT02->T02_MPDU_Cnt; - if (pT02->value & FLAG_ERROR_TX_MASK) { - SendOK = false; - - if (pT02->T02_transmit_abort || pT02->T02_out_of_MaxTxMSDULiftTime) { - /* retry error */ - pHwData->dto_tx_retry_count += (RetryCount+1); - /* [for tx debug] */ - if (RetryCount < 7) - pHwData->tx_retry_count[RetryCount] += RetryCount; - else - pHwData->tx_retry_count[7] += RetryCount; - pr_debug("dto_tx_retry_count =%d\n", - pHwData->dto_tx_retry_count); - MTO_SetTxCount(adapter, TxRate, RetryCount); - } - pHwData->dto_tx_frag_count += (RetryCount+1); - - /* [for tx debug] */ - if (pT02->T02_transmit_abort_due_to_TBTT) - pHwData->tx_TBTT_start_count++; - if (pT02->T02_transmit_without_encryption_due_to_wep_on_false) - pHwData->tx_WepOn_false_count++; - if (pT02->T02_discard_due_to_null_wep_key) - pHwData->tx_Null_key_count++; - } else { - if (pT02->T02_effective_transmission_rate) - pHwData->tx_ETR_count++; - MTO_SetTxCount(adapter, TxRate, RetryCount); - } - - /* Clear send result buffer */ - pMds->TxResult[PacketId] = 0; - } else - pMds->TxResult[PacketId] |= ((u16)(pT02->value & 0x0ffff)); -} diff --git a/drivers/staging/winbond/mds_f.h b/drivers/staging/winbond/mds_f.h deleted file mode 100644 index 159b2eb366e8..000000000000 --- a/drivers/staging/winbond/mds_f.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef __WINBOND_MDS_F_H -#define __WINBOND_MDS_F_H - -#include "wbhal.h" -#include "core.h" - -unsigned char Mds_initial(struct wbsoft_priv *adapter); -void Mds_Tx(struct wbsoft_priv *adapter); -void Mds_SendComplete(struct wbsoft_priv *adapter, struct T02_descriptor *pt02); -void Mds_MpduProcess(struct wbsoft_priv *adapter, - struct wb35_descriptor *prxdes); - -/* For data frame sending */ -u16 MDS_GetPacketSize(struct wbsoft_priv *adapter); -void MDS_GetNextPacket(struct wbsoft_priv *adapter, - struct wb35_descriptor *pdes); -void MDS_GetNextPacketComplete(struct wbsoft_priv *adapter, - struct wb35_descriptor *pdes); -void MDS_SendResult(struct wbsoft_priv *adapter, u8 packetid, - unsigned char sendok); - -#endif diff --git a/drivers/staging/winbond/mds_s.h b/drivers/staging/winbond/mds_s.h deleted file mode 100644 index 2972d66c9436..000000000000 --- a/drivers/staging/winbond/mds_s.h +++ /dev/null @@ -1,130 +0,0 @@ -#ifndef __WINBOND_MDS_H -#define __WINBOND_MDS_H - -#include -#include -#include - -#include "localpara.h" -#include "mac_structures.h" - -/* Preamble_Type, see */ -enum { - WLAN_PREAMBLE_TYPE_SHORT, - WLAN_PREAMBLE_TYPE_LONG, -}; - -/*****************************************************************************/ -#define MAX_USB_TX_DESCRIPTOR 15 /* IS89C35 ability */ -#define MAX_USB_TX_BUFFER_NUMBER 4 /* Virtual pre-buffer number of MAX_USB_TX_BUFFER */ -#define MAX_USB_TX_BUFFER 4096 /* IS89C35 ability 4n alignment is required for hardware */ - -#define AUTH_REQUEST_PAIRWISE_ERROR 0 /* _F flag setting */ -#define AUTH_REQUEST_GROUP_ERROR 1 /* _F flag setting */ - -#define CURRENT_FRAGMENT_THRESHOLD (adapter->Mds.TxFragmentThreshold & ~0x1) -#define CURRENT_PREAMBLE_MODE (psLOCAL->boShortPreamble ? WLAN_PREAMBLE_TYPE_SHORT : WLAN_PREAMBLE_TYPE_LONG) -#define CURRENT_TX_RATE_FOR_MNG (adapter->sLocalPara.CurrentTxRateForMng) -#define CURRENT_PROTECT_MECHANISM (psLOCAL->boProtectMechanism) -#define CURRENT_RTS_THRESHOLD (adapter->Mds.TxRTSThreshold) - -#define MIB_GS_XMIT_OK_INC (adapter->sLocalPara.GS_XMIT_OK++) -#define MIB_GS_RCV_OK_INC (adapter->sLocalPara.GS_RCV_OK++) -#define MIB_GS_XMIT_ERROR_INC (adapter->sLocalPara.GS_XMIT_ERROR) - -/* ---------- TX ----------------------------------- */ -#define ETHERNET_TX_DESCRIPTORS MAX_USB_TX_BUFFER_NUMBER - -/* ---------- RX ----------------------------------- */ -#define ETHERNET_RX_DESCRIPTORS 8 /* It's not necessary to allocate more than 2 in sync indicate */ - -/* - * ================================================================ - * Configuration default value - * ================================================================ - */ -#define DEFAULT_MULTICASTLISTMAX 32 /* standard */ -#define DEFAULT_TX_BURSTLENGTH 3 /* 32 Longwords */ -#define DEFAULT_RX_BURSTLENGTH 3 /* 32 Longwords */ -#define DEFAULT_TX_THRESHOLD 0 /* Full Packet */ -#define DEFAULT_RX_THRESHOLD 0 /* Full Packet */ -#define DEFAULT_MAXTXRATE 6 /* 11 Mbps (Long) */ -#define DEFAULT_CHANNEL 3 /* Chennel 3 */ -#define DEFAULT_RTSThreshold 2347 /* Disable RTS */ -#define DEFAULT_PME 0 /* Disable */ -#define DEFAULT_SIFSTIME 10 -#define DEFAULT_ACKTIME_1ML 304 /* 148 + 44 + 112 */ -#define DEFAULT_ACKTIME_2ML 248 /* 148 + 44 + 56 */ -#define DEFAULT_FRAGMENT_THRESHOLD 2346 /* No fragment */ -#define DEFAULT_PREAMBLE_LENGTH 72 -#define DEFAULT_PLCPHEADERTIME_LENGTH 24 - -/* - * ------------------------------------------------------------------------ - * 0.96 sec since time unit of the R03 for the current, W89C32 is about 60ns - * instead of 960 ns. This shall be fixed in the future W89C32 - * ------------------------------------------------------------------------- - */ -#define DEFAULT_MAX_RECEIVE_TIME 16440000 - -#define RX_BUF_SIZE 2352 /* 600 - For 301 must be multiple of 8 */ -#define MAX_RX_DESCRIPTORS 18 /* Rx Layer 2 */ - -/* For brand-new rx system */ -#define MDS_ID_IGNORE ETHERNET_RX_DESCRIPTORS - -/* For Tx Packet status classify */ -#define PACKET_FREE_TO_USE 0 -#define PACKET_COME_FROM_NDIS 0x08 -#define PACKET_COME_FROM_MLME 0x80 -#define PACKET_SEND_COMPLETE 0xff - -struct wb35_mds { - /* For Tx usage */ - u8 TxOwner[((MAX_USB_TX_BUFFER_NUMBER + 3) & ~0x03)]; - u8 *pTxBuffer; - u16 TxBufferSize[((MAX_USB_TX_BUFFER_NUMBER + 1) & ~0x01)]; - u8 TxDesFrom[((MAX_USB_TX_DESCRIPTOR + 3) & ~0x03)];/* 1: MLME 2: NDIS control 3: NDIS data */ - u8 TxCountInBuffer[((MAX_USB_TX_DESCRIPTOR + 3) & ~0x03)]; - - u8 TxFillIndex; /* the next index of TxBuffer can be used */ - u8 TxDesIndex; /* The next index of TxDes can be used */ - u8 ScanTxPause; /* data Tx pause because the scanning is progressing, but probe request Tx won't. */ - u8 TxPause; /*For pause the Mds_Tx modult */ - - atomic_t TxThreadCount; /* For thread counting */ - - u16 TxResult[((MAX_USB_TX_DESCRIPTOR + 1) & ~0x01)];/* Collect the sending result of Mpdu */ - - u8 MicRedundant[8]; /* For tmp use */ - u8 *MicWriteAddress[2]; /* The start address to fill the Mic, use 2 point due to Mic maybe fragment */ - - u16 MicWriteSize[2]; - - u16 MicAdd; /* If want to add the Mic, this variable equal to 8 */ - u16 MicWriteIndex; /* The number of MicWriteAddress */ - - u8 TxRate[((MAX_USB_TX_DESCRIPTOR + 1) & ~0x01)][2]; /* [0] current tx rate, [1] fall back rate */ - u8 TxInfo[((MAX_USB_TX_DESCRIPTOR + 1) & ~0x01)]; /*Store information for callback function */ - - /* ---- for Tx Parameter */ - u16 TxFragmentThreshold; /* For frame body only */ - u16 TxRTSThreshold; - - u32 MaxReceiveTime; - - /* depend on OS, */ - u32 MulticastListNo; - u32 PacketFilter; /* Setting by NDIS, the current packet filter in use. */ - u8 MulticastAddressesArray[DEFAULT_MULTICASTLISTMAX][MAC_ADDR_LENGTH]; - - /* COUNTERMEASURE */ - u8 bMICfailCount; - u8 boCounterMeasureBlock; - u8 reserved_4[2]; - - u32 TxTsc; - u32 TxTsc_2; -}; - -#endif diff --git a/drivers/staging/winbond/mto.c b/drivers/staging/winbond/mto.c deleted file mode 100644 index b031ecd4f3c0..000000000000 --- a/drivers/staging/winbond/mto.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * ============================================================================ - * MTO.C - - * - * Description: - * MAC Throughput Optimization for W89C33 802.11g WLAN STA. - * - * The following MIB attributes or internal variables will be affected - * while the MTO is being executed: - * dot11FragmentationThreshold, - * dot11RTSThreshold, - * transmission rate and PLCP preamble type, - * CCA mode, - * antenna diversity. - * - * Copyright (c) 2003 Winbond Electronics Corp. All rights reserved. - * ============================================================================ - */ - -#include "sme_api.h" -#include "wbhal.h" -#include "wb35reg_f.h" -#include "core.h" -#include "mto.h" - -/* Declare SQ3 to rate and fragmentation threshold table */ -/* Declare fragmentation threshold table */ -#define MTO_MAX_FRAG_TH_LEVELS 5 -#define MTO_MAX_DATA_RATE_LEVELS 12 - -u16 MTO_Frag_Th_Tbl[MTO_MAX_FRAG_TH_LEVELS] = { - 256, 384, 512, 768, 1536 -}; - -/* - * Declare data rate table: - * The following table will be changed at anytime if the operation rate - * supported by AP don't match the table - */ -static u8 MTO_Data_Rate_Tbl[MTO_MAX_DATA_RATE_LEVELS] = { - 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 -}; - -/* this record the retry rate at different data rate */ -static int retryrate_rec[MTO_MAX_DATA_RATE_LEVELS]; - -static u8 boSparseTxTraffic; - -/* - * =========================================================================== - * MTO_Init -- - * - * Description: - * Initialize MTO parameters. - * - * This function should be invoked during system initialization. - * - * Arguments: - * adapter - The pointer to the Miniport adapter Context - * =========================================================================== - */ -void MTO_Init(struct wbsoft_priv *adapter) -{ - int i; - - MTO_PREAMBLE_TYPE() = MTO_PREAMBLE_SHORT; /* for test */ - - MTO_CNT_ANT(0) = 0; - MTO_CNT_ANT(1) = 0; - MTO_SQ_ANT(0) = 0; - MTO_SQ_ANT(1) = 0; - - MTO_AGING_TIMEOUT() = 0; - - /* The following parameters should be initialized to the values set by user */ - MTO_RATE_LEVEL() = 0; - MTO_FRAG_TH_LEVEL() = 4; - MTO_RTS_THRESHOLD() = MTO_FRAG_TH() + 1; - MTO_RTS_THRESHOLD_SETUP() = MTO_FRAG_TH() + 1; - MTO_RATE_CHANGE_ENABLE() = 1; - MTO_FRAG_CHANGE_ENABLE() = 0; - MTO_POWER_CHANGE_ENABLE() = 1; - MTO_PREAMBLE_CHANGE_ENABLE() = 1; - MTO_RTS_CHANGE_ENABLE() = 0; - - for (i = 0; i < MTO_MAX_DATA_RATE_LEVELS; i++) - retryrate_rec[i] = 5; - - MTO_TXFLOWCOUNT() = 0; - /* --------- DTO threshold parameters ------------- */ - MTOPARA_PERIODIC_CHECK_CYCLE() = 10; - MTOPARA_RSSI_TH_FOR_ANTDIV() = 10; - MTOPARA_TXCOUNT_TH_FOR_CALC_RATE() = 50; - MTOPARA_TXRATE_INC_TH() = 10; - MTOPARA_TXRATE_DEC_TH() = 30; - MTOPARA_TXRATE_EQ_TH() = 40; - MTOPARA_TXRATE_BACKOFF() = 12; - MTOPARA_TXRETRYRATE_REDUCE() = 6; - if (MTO_TXPOWER_FROM_EEPROM == 0xff) { - switch (MTO_HAL()->phy_type) { - case RF_AIROHA_2230: - case RF_AIROHA_2230S: - MTOPARA_TXPOWER_INDEX() = 46; /* MAX-8 @@ Only for AL 2230 */ - break; - case RF_AIROHA_7230: - MTOPARA_TXPOWER_INDEX() = 49; - break; - case RF_WB_242: - MTOPARA_TXPOWER_INDEX() = 10; - break; - case RF_WB_242_1: - MTOPARA_TXPOWER_INDEX() = 24; - break; - } - } else { /* follow the setting from EEPROM */ - MTOPARA_TXPOWER_INDEX() = MTO_TXPOWER_FROM_EEPROM; - } - RFSynthesizer_SetPowerIndex(MTO_HAL(), (u8) MTOPARA_TXPOWER_INDEX()); - /* ------------------------------------------------ */ - - /* For RSSI turning -- Cancel load from EEPROM */ - MTO_DATA().RSSI_high = -41; - MTO_DATA().RSSI_low = -60; -} - -/* =========================================================================== - * Description: - * If we enable DTO, we will ignore the tx count with different tx rate - * from DTO rate. This is because when we adjust DTO tx rate, there could - * be some packets in the tx queue with previous tx rate - */ - -void MTO_SetTxCount(struct wbsoft_priv *adapter, u8 tx_rate, u8 index) -{ - MTO_TXFLOWCOUNT()++; - if ((MTO_ENABLE == 1) && (MTO_RATE_CHANGE_ENABLE() == 1)) { - if (tx_rate == MTO_DATA_RATE()) { - if (index == 0) { - if (boSparseTxTraffic) - MTO_HAL()->dto_tx_frag_count += MTOPARA_PERIODIC_CHECK_CYCLE(); - else - MTO_HAL()->dto_tx_frag_count += 1; - } else { - if (index < 8) { - MTO_HAL()->dto_tx_retry_count += index; - MTO_HAL()->dto_tx_frag_count += (index + 1); - } else { - MTO_HAL()->dto_tx_retry_count += 7; - MTO_HAL()->dto_tx_frag_count += 7; - } - } - } else if (MTO_DATA_RATE() > 48 && tx_rate == 48) { - /* for reducing data rate scheme, do not calculate different data rate. 3 is the reducing data rate at retry. */ - if (index < 3) { - MTO_HAL()->dto_tx_retry_count += index; - MTO_HAL()->dto_tx_frag_count += (index + 1); - } else { - MTO_HAL()->dto_tx_retry_count += 3; - MTO_HAL()->dto_tx_frag_count += 3; - } - - } - } else { - MTO_HAL()->dto_tx_retry_count += index; - MTO_HAL()->dto_tx_frag_count += (index + 1); - } -} diff --git a/drivers/staging/winbond/mto.h b/drivers/staging/winbond/mto.h deleted file mode 100644 index 8d41eeda45bf..000000000000 --- a/drivers/staging/winbond/mto.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * ================================================================== - * MTO.H - * - * Copyright (c) 2003 Winbond Electronics Corp. All rights reserved. - * ================================================================== - */ -#ifndef __MTO_H__ -#define __MTO_H__ - -#include - -struct wbsoft_priv; - -#define MTO_PREAMBLE_LONG WLAN_PREAMBLE_TYPE_LONG -#define MTO_PREAMBLE_SHORT WLAN_PREAMBLE_TYPE_SHORT - -/* Defines the parameters used in the MAC Throughput Optimization algorithm */ -struct wb35_mto_params { - u32 TxFlowCount; /* to judge what kind the tx flow(sparse or busy) is */ - - /* --------- DTO threshold parameters ------------- */ - u16 DTO_PeriodicCheckCycle; - u16 DTO_RssiThForAntDiv; - - u16 DTO_TxCountThForCalcNewRate; - u16 DTO_TxRateIncTh; - - u16 DTO_TxRateDecTh; - u16 DTO_TxRateEqTh; - - u16 DTO_TxRateBackOff; - u16 DTO_TxRetryRateReduce; - - u16 DTO_TxPowerIndex; /* 0 ~ 31 */ - u16 reserved_1; - /* ------------------------------------------------ */ - - u8 PowerChangeEnable; - u8 AntDiversityEnable; - u8 CCA_Mode; - u8 CCA_Mode_Setup; - u8 Preamble_Type; - u8 PreambleChangeEnable; - - u8 DataRateLevel; - u8 DataRateChangeEnable; - u8 FragThresholdLevel; - u8 FragThresholdChangeEnable; - - u16 RTSThreshold; - u16 RTSThreshold_Setup; - - u32 AvgIdleSlot; - u32 Pr_Interf; - u32 AvgGapBtwnInterf; - - u8 RTSChangeEnable; - u8 Ant_sel; - u8 aging_timeout; - u8 reserved_2; - - u32 Cnt_Ant[2]; - u32 SQ_Ant[2]; - - u8 FallbackRateLevel; - u8 OfdmRateLevel; - - u8 RatePolicy; - u8 reserved_3[3]; - - /* For RSSI turning */ - s32 RSSI_high; - s32 RSSI_low; -}; - - -#define MTO_DATA() (adapter->sMtoPara) -#define MTO_HAL() (&adapter->sHwData) -#define MTO_SET_PREAMBLE_TYPE(x) /* Turbo mark LM_PREAMBLE_TYPE(&pcore_data->lm_data) = (x) */ -#define MTO_ENABLE (adapter->sLocalPara.TxRateMode == RATE_AUTO) -#define MTO_TXPOWER_FROM_EEPROM (adapter->sHwData.PowerIndexFromEEPROM) -#define LOCAL_ANTENNA_NO() (adapter->sLocalPara.bAntennaNo) -#define LOCAL_IS_CONNECTED() (adapter->sLocalPara.wConnectedSTAindex != 0) -#define MTO_INITTXRATE_MODE (adapter->sHwData.SoftwareSet&0x2) /* bit 1 */ - -#define MTO_POWER_CHANGE_ENABLE() MTO_DATA().PowerChangeEnable -#define MTO_CCA_MODE() MTO_DATA().CCA_Mode -#define MTO_CCA_MODE_SETUP() MTO_DATA().CCA_Mode_Setup -#define MTO_PREAMBLE_TYPE() MTO_DATA().Preamble_Type -#define MTO_PREAMBLE_CHANGE_ENABLE() MTO_DATA().PreambleChangeEnable - -#define MTO_RATE_LEVEL() MTO_DATA().DataRateLevel -#define MTO_OFDM_RATE_LEVEL() MTO_DATA().OfdmRateLevel -#define MTO_RATE_CHANGE_ENABLE() MTO_DATA().DataRateChangeEnable -#define MTO_FRAG_TH_LEVEL() MTO_DATA().FragThresholdLevel -#define MTO_FRAG_CHANGE_ENABLE() MTO_DATA().FragThresholdChangeEnable -#define MTO_RTS_THRESHOLD() MTO_DATA().RTSThreshold -#define MTO_RTS_CHANGE_ENABLE() MTO_DATA().RTSChangeEnable -#define MTO_RTS_THRESHOLD_SETUP() MTO_DATA().RTSThreshold_Setup - -#define MTO_AVG_IDLE_SLOT() MTO_DATA().AvgIdleSlot -#define MTO_PR_INTERF() MTO_DATA().Pr_Interf -#define MTO_AVG_GAP_BTWN_INTERF() MTO_DATA().AvgGapBtwnInterf - -#define MTO_CNT_ANT(x) MTO_DATA().Cnt_Ant[(x)] -#define MTO_SQ_ANT(x) MTO_DATA().SQ_Ant[(x)] -#define MTO_AGING_TIMEOUT() MTO_DATA().aging_timeout - -#define MTO_TXFLOWCOUNT() MTO_DATA().TxFlowCount - -/* --------- DTO threshold parameters ------------- */ -#define MTOPARA_PERIODIC_CHECK_CYCLE() MTO_DATA().DTO_PeriodicCheckCycle -#define MTOPARA_RSSI_TH_FOR_ANTDIV() MTO_DATA().DTO_RssiThForAntDiv -#define MTOPARA_TXCOUNT_TH_FOR_CALC_RATE() MTO_DATA().DTO_TxCountThForCalcNewRate -#define MTOPARA_TXRATE_INC_TH() MTO_DATA().DTO_TxRateIncTh -#define MTOPARA_TXRATE_DEC_TH() MTO_DATA().DTO_TxRateDecTh -#define MTOPARA_TXRATE_EQ_TH() MTO_DATA().DTO_TxRateEqTh -#define MTOPARA_TXRATE_BACKOFF() MTO_DATA().DTO_TxRateBackOff -#define MTOPARA_TXRETRYRATE_REDUCE() MTO_DATA().DTO_TxRetryRateReduce -#define MTOPARA_TXPOWER_INDEX() MTO_DATA().DTO_TxPowerIndex -/* ------------------------------------------------ */ - - -extern u16 MTO_Frag_Th_Tbl[]; - -#define MTO_DATA_RATE() MTO_Data_Rate_Tbl[MTO_RATE_LEVEL()] -#define MTO_FRAG_TH() MTO_Frag_Th_Tbl[MTO_FRAG_TH_LEVEL()] - -void MTO_Init(struct wbsoft_priv *); -void MTO_SetTxCount(struct wbsoft_priv *adapter, u8 t0, u8 index); - -#endif /* __MTO_H__ */ - diff --git a/drivers/staging/winbond/phy_calibration.c b/drivers/staging/winbond/phy_calibration.c deleted file mode 100644 index 8aecced62dde..000000000000 --- a/drivers/staging/winbond/phy_calibration.c +++ /dev/null @@ -1,1317 +0,0 @@ -/* - * phy_302_calibration.c - * - * Copyright (C) 2002, 2005 Winbond Electronics Corp. - * - * modification history - * --------------------------------------------------------------------------- - * 0.01.001, 2003-04-16, Kevin created - * - */ - -/****************** INCLUDE FILES SECTION ***********************************/ -#include "phy_calibration.h" -#include "wbhal.h" -#include "wb35reg_f.h" -#include "core.h" - - -/****************** DEBUG CONSTANT AND MACRO SECTION ************************/ - -/****************** LOCAL CONSTANT AND MACRO SECTION ************************/ -#define LOOP_TIMES 20 -#define US 1000/* MICROSECOND*/ - -#define AG_CONST 0.6072529350 -#define FIXED(X) ((s32)((X) * 32768.0)) -#define DEG2RAD(X) (0.017453 * (X)) - -static const s32 Angles[] = { - FIXED(DEG2RAD(45.0)), FIXED(DEG2RAD(26.565)), - FIXED(DEG2RAD(14.0362)), FIXED(DEG2RAD(7.12502)), - FIXED(DEG2RAD(3.57633)), FIXED(DEG2RAD(1.78991)), - FIXED(DEG2RAD(0.895174)), FIXED(DEG2RAD(0.447614)), - FIXED(DEG2RAD(0.223811)), FIXED(DEG2RAD(0.111906)), - FIXED(DEG2RAD(0.055953)), FIXED(DEG2RAD(0.027977)) -}; - -/****************** LOCAL FUNCTION DECLARATION SECTION **********************/ - -/* - * void _phy_rf_write_delay(struct hw_data *phw_data); - * void phy_init_rf(struct hw_data *phw_data); - */ - -/****************** FUNCTION DEFINITION SECTION *****************************/ - -static s32 _s13_to_s32(u32 data) -{ - u32 val; - - val = (data & 0x0FFF); - - if ((data & BIT(12)) != 0) - val |= 0xFFFFF000; - - return (s32) val; -} - -/****************************************************************************/ -static s32 _s4_to_s32(u32 data) -{ - s32 val; - - val = (data & 0x0007); - - if ((data & BIT(3)) != 0) - val |= 0xFFFFFFF8; - - return val; -} - -static u32 _s32_to_s4(s32 data) -{ - u32 val; - - if (data > 7) - data = 7; - else if (data < -8) - data = -8; - - val = data & 0x000F; - - return val; -} - -/****************************************************************************/ -static s32 _s5_to_s32(u32 data) -{ - s32 val; - - val = (data & 0x000F); - - if ((data & BIT(4)) != 0) - val |= 0xFFFFFFF0; - - return val; -} - -static u32 _s32_to_s5(s32 data) -{ - u32 val; - - if (data > 15) - data = 15; - else if (data < -16) - data = -16; - - val = data & 0x001F; - - return val; -} - -/****************************************************************************/ -static s32 _s6_to_s32(u32 data) -{ - s32 val; - - val = (data & 0x001F); - - if ((data & BIT(5)) != 0) - val |= 0xFFFFFFE0; - - return val; -} - -static u32 _s32_to_s6(s32 data) -{ - u32 val; - - if (data > 31) - data = 31; - else if (data < -32) - data = -32; - - val = data & 0x003F; - - return val; -} - -/****************************************************************************/ -static s32 _floor(s32 n) -{ - if (n > 0) - n += 5; - else - n -= 5; - - return n/10; -} - -/****************************************************************************/ -/* - * The following code is sqare-root function. - * sqsum is the input and the output is sq_rt; - * The maximum of sqsum = 2^27 -1; - */ -static u32 _sqrt(u32 sqsum) -{ - u32 sq_rt; - - int g0, g1, g2, g3, g4; - int seed; - int next; - int step; - - g4 = sqsum / 100000000; - g3 = (sqsum - g4*100000000) / 1000000; - g2 = (sqsum - g4*100000000 - g3*1000000) / 10000; - g1 = (sqsum - g4*100000000 - g3*1000000 - g2*10000) / 100; - g0 = (sqsum - g4*100000000 - g3*1000000 - g2*10000 - g1*100); - - next = g4; - step = 0; - seed = 0; - while (((seed+1)*(step+1)) <= next) { - step++; - seed++; - } - - sq_rt = seed * 10000; - next = (next-(seed*step))*100 + g3; - - step = 0; - seed = 2 * seed * 10; - while (((seed+1)*(step+1)) <= next) { - step++; - seed++; - } - - sq_rt = sq_rt + step * 1000; - next = (next - seed * step) * 100 + g2; - seed = (seed + step) * 10; - step = 0; - while (((seed+1)*(step+1)) <= next) { - step++; - seed++; - } - - sq_rt = sq_rt + step * 100; - next = (next - seed * step) * 100 + g1; - seed = (seed + step) * 10; - step = 0; - - while (((seed+1)*(step+1)) <= next) { - step++; - seed++; - } - - sq_rt = sq_rt + step * 10; - next = (next - seed * step) * 100 + g0; - seed = (seed + step) * 10; - step = 0; - - while (((seed+1)*(step+1)) <= next) { - step++; - seed++; - } - - sq_rt = sq_rt + step; - - return sq_rt; -} - -/****************************************************************************/ -static void _sin_cos(s32 angle, s32 *sin, s32 *cos) -{ - s32 X, Y, TargetAngle, CurrAngle; - unsigned Step; - - X = FIXED(AG_CONST); /* AG_CONST * cos(0) */ - Y = 0; /* AG_CONST * sin(0) */ - TargetAngle = abs(angle); - CurrAngle = 0; - - for (Step = 0; Step < 12; Step++) { - s32 NewX; - - if (TargetAngle > CurrAngle) { - NewX = X - (Y >> Step); - Y = (X >> Step) + Y; - X = NewX; - CurrAngle += Angles[Step]; - } else { - NewX = X + (Y >> Step); - Y = -(X >> Step) + Y; - X = NewX; - CurrAngle -= Angles[Step]; - } - } - - if (angle > 0) { - *cos = X; - *sin = Y; - } else { - *cos = X; - *sin = -Y; - } -} - -static unsigned char hal_get_dxx_reg(struct hw_data *pHwData, u16 number, - u32 *pValue) -{ - if (number < 0x1000) - number += 0x1000; - return Wb35Reg_ReadSync(pHwData, number, pValue); -} -#define hw_get_dxx_reg(_A, _B, _C) hal_get_dxx_reg(_A, _B, (u32 *)_C) - -static unsigned char hal_set_dxx_reg(struct hw_data *pHwData, u16 number, - u32 value) -{ - unsigned char ret; - - if (number < 0x1000) - number += 0x1000; - ret = Wb35Reg_WriteSync(pHwData, number, value); - return ret; -} -#define hw_set_dxx_reg(_A, _B, _C) hal_set_dxx_reg(_A, _B, (u32)_C) - - -static void _reset_rx_cal(struct hw_data *phw_data) -{ - u32 val; - - hw_get_dxx_reg(phw_data, 0x54, &val); - - if (phw_data->revision == 0x2002) /* 1st-cut */ - val &= 0xFFFF0000; - else /* 2nd-cut */ - val &= 0x000003FF; - - hw_set_dxx_reg(phw_data, 0x54, val); -} - - -/**************for winbond calibration*********/ - - - -/**********************************************/ -static void _rxadc_dc_offset_cancellation_winbond(struct hw_data *phw_data, u32 frequency) -{ - u32 reg_agc_ctrl3; - u32 reg_a_acq_ctrl; - u32 reg_b_acq_ctrl; - u32 val; - - PHY_DEBUG(("[CAL] -> [1]_rxadc_dc_offset_cancellation()\n")); - phy_init_rf(phw_data); - - /* set calibration channel */ - if ((RF_WB_242 == phw_data->phy_type) || - (RF_WB_242_1 == phw_data->phy_type)) /* 20060619.5 Add */{ - if ((frequency >= 2412) && (frequency <= 2484)) { - /* w89rf242 change frequency to 2390Mhz */ - PHY_DEBUG(("[CAL] W89RF242/11G/Channel=2390Mhz\n")); - phy_set_rf_data(phw_data, 3, (3<<24)|0x025586); - - } - } else { - - } - - /* reset cancel_dc_i[9:5] and cancel_dc_q[4:0] in register DC_Cancel */ - hw_get_dxx_reg(phw_data, 0x5C, &val); - val &= ~(0x03FF); - hw_set_dxx_reg(phw_data, 0x5C, val); - - /* reset the TX and RX IQ calibration data */ - hw_set_dxx_reg(phw_data, 0x3C, 0); - hw_set_dxx_reg(phw_data, 0x54, 0); - - hw_set_dxx_reg(phw_data, 0x58, 0x30303030); /* IQ_Alpha Changed */ - - /* a. Disable AGC */ - hw_get_dxx_reg(phw_data, REG_AGC_CTRL3, ®_agc_ctrl3); - reg_agc_ctrl3 &= ~BIT(2); - reg_agc_ctrl3 |= (MASK_LNA_FIX_GAIN|MASK_AGC_FIX); - hw_set_dxx_reg(phw_data, REG_AGC_CTRL3, reg_agc_ctrl3); - - hw_get_dxx_reg(phw_data, REG_AGC_CTRL5, &val); - val |= MASK_AGC_FIX_GAIN; - hw_set_dxx_reg(phw_data, REG_AGC_CTRL5, val); - - /* b. Turn off BB RX */ - hw_get_dxx_reg(phw_data, REG_A_ACQ_CTRL, ®_a_acq_ctrl); - reg_a_acq_ctrl |= MASK_AMER_OFF_REG; - hw_set_dxx_reg(phw_data, REG_A_ACQ_CTRL, reg_a_acq_ctrl); - - hw_get_dxx_reg(phw_data, REG_B_ACQ_CTRL, ®_b_acq_ctrl); - reg_b_acq_ctrl |= MASK_BMER_OFF_REG; - hw_set_dxx_reg(phw_data, REG_B_ACQ_CTRL, reg_b_acq_ctrl); - - /* c. Make sure MAC is in receiving mode - * d. Turn ON ADC calibration - * - ADC calibrator is triggered by this signal rising from 0 to 1 */ - hw_get_dxx_reg(phw_data, REG_MODE_CTRL, &val); - val &= ~MASK_ADC_DC_CAL_STR; - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, val); - - val |= MASK_ADC_DC_CAL_STR; - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, val); - - /* e. The results are shown in "adc_dc_cal_i[8:0] and adc_dc_cal_q[8:0]" */ -#ifdef _DEBUG - hw_get_dxx_reg(phw_data, REG_OFFSET_READ, &val); - PHY_DEBUG(("[CAL] REG_OFFSET_READ = 0x%08X\n", val)); - - PHY_DEBUG(("[CAL] ** adc_dc_cal_i = %d (0x%04X)\n", - _s9_to_s32(val&0x000001FF), val&0x000001FF)); - PHY_DEBUG(("[CAL] ** adc_dc_cal_q = %d (0x%04X)\n", - _s9_to_s32((val&0x0003FE00)>>9), - (val&0x0003FE00)>>9)); -#endif - - hw_get_dxx_reg(phw_data, REG_MODE_CTRL, &val); - val &= ~MASK_ADC_DC_CAL_STR; - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, val); - - /* f. Turn on BB RX */ - /* hw_get_dxx_reg(phw_data, REG_A_ACQ_CTRL, ®_a_acq_ctrl); */ - reg_a_acq_ctrl &= ~MASK_AMER_OFF_REG; - hw_set_dxx_reg(phw_data, REG_A_ACQ_CTRL, reg_a_acq_ctrl); - - /* hw_get_dxx_reg(phw_data, REG_B_ACQ_CTRL, ®_b_acq_ctrl); */ - reg_b_acq_ctrl &= ~MASK_BMER_OFF_REG; - hw_set_dxx_reg(phw_data, REG_B_ACQ_CTRL, reg_b_acq_ctrl); - - /* g. Enable AGC */ - /* hw_get_dxx_reg(phw_data, REG_AGC_CTRL3, &val); */ - reg_agc_ctrl3 |= BIT(2); - reg_agc_ctrl3 &= ~(MASK_LNA_FIX_GAIN|MASK_AGC_FIX); - hw_set_dxx_reg(phw_data, REG_AGC_CTRL3, reg_agc_ctrl3); -} - -/* 20060612.1.a 20060718.1 Modify */ -static u8 _tx_iq_calibration_loop_winbond(struct hw_data *phw_data, - s32 a_2_threshold, - s32 b_2_threshold) -{ - u32 reg_mode_ctrl; - s32 iq_mag_0_tx; - s32 iqcal_tone_i0; - s32 iqcal_tone_q0; - s32 iqcal_tone_i; - s32 iqcal_tone_q; - u32 sqsum; - s32 rot_i_b; - s32 rot_q_b; - s32 tx_cal_flt_b[4]; - s32 tx_cal[4]; - s32 tx_cal_reg[4]; - s32 a_2, b_2; - s32 sin_b, sin_2b; - s32 cos_b, cos_2b; - s32 divisor; - s32 temp1, temp2; - u32 val; - u16 loop; - s32 iqcal_tone_i_avg, iqcal_tone_q_avg; - u8 verify_count; - int capture_time; - - PHY_DEBUG(("[CAL] -> _tx_iq_calibration_loop()\n")); - PHY_DEBUG(("[CAL] ** a_2_threshold = %d\n", a_2_threshold)); - PHY_DEBUG(("[CAL] ** b_2_threshold = %d\n", b_2_threshold)); - - verify_count = 0; - - hw_get_dxx_reg(phw_data, REG_MODE_CTRL, ®_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (read) = 0x%08X\n", reg_mode_ctrl)); - - loop = LOOP_TIMES; - - while (loop > 0) { - PHY_DEBUG(("[CAL] [%d.] <_tx_iq_calibration_loop>\n", - (LOOP_TIMES-loop+1))); - - iqcal_tone_i_avg = 0; - iqcal_tone_q_avg = 0; - if (!hw_set_dxx_reg(phw_data, 0x3C, 0x00)) /* 20060718.1 modify */ - return 0; - for (capture_time = 0; capture_time < 10; capture_time++) { - /* - * a. Set iqcal_mode[1:0] to 0x2 and set "calib_start" - * to 0x1 to enable "IQ calibration Mode II" - */ - reg_mode_ctrl &= ~(MASK_IQCAL_TONE_SEL|MASK_IQCAL_MODE); - reg_mode_ctrl &= ~MASK_IQCAL_MODE; - reg_mode_ctrl |= (MASK_CALIB_START|0x02); - reg_mode_ctrl |= (MASK_CALIB_START|0x02|2<<2); - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - - /* b. */ - hw_get_dxx_reg(phw_data, REG_CALIB_READ1, &val); - PHY_DEBUG(("[CAL] CALIB_READ1 = 0x%08X\n", val)); - - iqcal_tone_i0 = _s13_to_s32(val & 0x00001FFF); - iqcal_tone_q0 = _s13_to_s32((val & 0x03FFE000) >> 13); - PHY_DEBUG(("[CAL] ** iqcal_tone_i0=%d, iqcal_tone_q0=%d\n", - iqcal_tone_i0, iqcal_tone_q0)); - - sqsum = iqcal_tone_i0*iqcal_tone_i0 + - iqcal_tone_q0*iqcal_tone_q0; - iq_mag_0_tx = (s32) _sqrt(sqsum); - PHY_DEBUG(("[CAL] ** iq_mag_0_tx=%d\n", iq_mag_0_tx)); - - /* c. Set "calib_start" to 0x0 */ - reg_mode_ctrl &= ~MASK_CALIB_START; - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - - /* - * d. Set iqcal_mode[1:0] to 0x3 and set "calib_start" - * to 0x1 to enable "IQ calibration Mode II" - */ - /* hw_get_dxx_reg(phw_data, REG_MODE_CTRL, &val); */ - hw_get_dxx_reg(phw_data, REG_MODE_CTRL, ®_mode_ctrl); - reg_mode_ctrl &= ~MASK_IQCAL_MODE; - reg_mode_ctrl |= (MASK_CALIB_START|0x03); - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - - /* e. */ - hw_get_dxx_reg(phw_data, REG_CALIB_READ1, &val); - PHY_DEBUG(("[CAL] CALIB_READ1 = 0x%08X\n", val)); - - iqcal_tone_i = _s13_to_s32(val & 0x00001FFF); - iqcal_tone_q = _s13_to_s32((val & 0x03FFE000) >> 13); - PHY_DEBUG(("[CAL] ** iqcal_tone_i = %d, iqcal_tone_q = %d\n", - iqcal_tone_i, iqcal_tone_q)); - if (capture_time == 0) - continue; - else { - iqcal_tone_i_avg = (iqcal_tone_i_avg*(capture_time-1) + iqcal_tone_i)/capture_time; - iqcal_tone_q_avg = (iqcal_tone_q_avg*(capture_time-1) + iqcal_tone_q)/capture_time; - } - } - - iqcal_tone_i = iqcal_tone_i_avg; - iqcal_tone_q = iqcal_tone_q_avg; - - - rot_i_b = (iqcal_tone_i * iqcal_tone_i0 + - iqcal_tone_q * iqcal_tone_q0) / 1024; - rot_q_b = (iqcal_tone_i * iqcal_tone_q0 * (-1) + - iqcal_tone_q * iqcal_tone_i0) / 1024; - PHY_DEBUG(("[CAL] ** rot_i_b = %d, rot_q_b = %d\n", - rot_i_b, rot_q_b)); - - /* f. */ - divisor = ((iq_mag_0_tx * iq_mag_0_tx * 2)/1024 - rot_i_b) * 2; - - if (divisor == 0) { - PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> ERROR *******\n")); - PHY_DEBUG(("[CAL] ** divisor=0 to calculate EPS and THETA !!\n")); - PHY_DEBUG(("[CAL] ******************************************\n")); - break; - } - - a_2 = (rot_i_b * 32768) / divisor; - b_2 = (rot_q_b * (-32768)) / divisor; - PHY_DEBUG(("[CAL] ***** EPSILON/2 = %d\n", a_2)); - PHY_DEBUG(("[CAL] ***** THETA/2 = %d\n", b_2)); - - phw_data->iq_rsdl_gain_tx_d2 = a_2; - phw_data->iq_rsdl_phase_tx_d2 = b_2; - - /* if ((abs(a_2) < 150) && (abs(b_2) < 100)) */ - /* if ((abs(a_2) < 200) && (abs(b_2) < 200)) */ - if ((abs(a_2) < a_2_threshold) && (abs(b_2) < b_2_threshold)) { - verify_count++; - - PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> *************\n")); - PHY_DEBUG(("[CAL] ** VERIFY OK # %d !!\n", verify_count)); - PHY_DEBUG(("[CAL] ******************************************\n")); - - if (verify_count > 2) { - PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> *********\n")); - PHY_DEBUG(("[CAL] ** TX_IQ_CALIBRATION (EPS,THETA) OK !!\n")); - PHY_DEBUG(("[CAL] **************************************\n")); - return 0; - } - - continue; - } else - verify_count = 0; - - _sin_cos(b_2, &sin_b, &cos_b); - _sin_cos(b_2*2, &sin_2b, &cos_2b); - PHY_DEBUG(("[CAL] ** sin(b/2)=%d, cos(b/2)=%d\n", sin_b, cos_b)); - PHY_DEBUG(("[CAL] ** sin(b)=%d, cos(b)=%d\n", sin_2b, cos_2b)); - - if (cos_2b == 0) { - PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> ERROR *******\n")); - PHY_DEBUG(("[CAL] ** cos(b)=0 !!\n")); - PHY_DEBUG(("[CAL] ******************************************\n")); - break; - } - - /* 1280 * 32768 = 41943040 */ - temp1 = (41943040/cos_2b)*cos_b; - - /* temp2 = (41943040/cos_2b)*sin_b*(-1); */ - if (phw_data->revision == 0x2002) /* 1st-cut */ - temp2 = (41943040/cos_2b)*sin_b*(-1); - else /* 2nd-cut */ - temp2 = (41943040*4/cos_2b)*sin_b*(-1); - - tx_cal_flt_b[0] = _floor(temp1/(32768+a_2)); - tx_cal_flt_b[1] = _floor(temp2/(32768+a_2)); - tx_cal_flt_b[2] = _floor(temp2/(32768-a_2)); - tx_cal_flt_b[3] = _floor(temp1/(32768-a_2)); - PHY_DEBUG(("[CAL] ** tx_cal_flt_b[0] = %d\n", tx_cal_flt_b[0])); - PHY_DEBUG(("[CAL] tx_cal_flt_b[1] = %d\n", tx_cal_flt_b[1])); - PHY_DEBUG(("[CAL] tx_cal_flt_b[2] = %d\n", tx_cal_flt_b[2])); - PHY_DEBUG(("[CAL] tx_cal_flt_b[3] = %d\n", tx_cal_flt_b[3])); - - tx_cal[2] = tx_cal_flt_b[2]; - tx_cal[2] = tx_cal[2] + 3; - tx_cal[1] = tx_cal[2]; - tx_cal[3] = tx_cal_flt_b[3] - 128; - tx_cal[0] = -tx_cal[3] + 1; - - PHY_DEBUG(("[CAL] tx_cal[0] = %d\n", tx_cal[0])); - PHY_DEBUG(("[CAL] tx_cal[1] = %d\n", tx_cal[1])); - PHY_DEBUG(("[CAL] tx_cal[2] = %d\n", tx_cal[2])); - PHY_DEBUG(("[CAL] tx_cal[3] = %d\n", tx_cal[3])); - - /* if ((tx_cal[0] == 0) && (tx_cal[1] == 0) && - (tx_cal[2] == 0) && (tx_cal[3] == 0)) - { */ - /* PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> *************\n")); - * PHY_DEBUG(("[CAL] ** TX_IQ_CALIBRATION COMPLETE !!\n")); - * PHY_DEBUG(("[CAL] ******************************************\n")); - * return 0; - } */ - - /* g. */ - if (phw_data->revision == 0x2002) /* 1st-cut */{ - hw_get_dxx_reg(phw_data, 0x54, &val); - PHY_DEBUG(("[CAL] ** 0x54 = 0x%08X\n", val)); - tx_cal_reg[0] = _s4_to_s32((val & 0xF0000000) >> 28); - tx_cal_reg[1] = _s4_to_s32((val & 0x0F000000) >> 24); - tx_cal_reg[2] = _s4_to_s32((val & 0x00F00000) >> 20); - tx_cal_reg[3] = _s4_to_s32((val & 0x000F0000) >> 16); - } else /* 2nd-cut */{ - hw_get_dxx_reg(phw_data, 0x3C, &val); - PHY_DEBUG(("[CAL] ** 0x3C = 0x%08X\n", val)); - tx_cal_reg[0] = _s5_to_s32((val & 0xF8000000) >> 27); - tx_cal_reg[1] = _s6_to_s32((val & 0x07E00000) >> 21); - tx_cal_reg[2] = _s6_to_s32((val & 0x001F8000) >> 15); - tx_cal_reg[3] = _s5_to_s32((val & 0x00007C00) >> 10); - - } - - PHY_DEBUG(("[CAL] ** tx_cal_reg[0] = %d\n", tx_cal_reg[0])); - PHY_DEBUG(("[CAL] tx_cal_reg[1] = %d\n", tx_cal_reg[1])); - PHY_DEBUG(("[CAL] tx_cal_reg[2] = %d\n", tx_cal_reg[2])); - PHY_DEBUG(("[CAL] tx_cal_reg[3] = %d\n", tx_cal_reg[3])); - - if (phw_data->revision == 0x2002) /* 1st-cut */{ - if (((tx_cal_reg[0] == 7) || (tx_cal_reg[0] == (-8))) && - ((tx_cal_reg[3] == 7) || (tx_cal_reg[3] == (-8)))) { - PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> *********\n")); - PHY_DEBUG(("[CAL] ** TX_IQ_CALIBRATION SATUATION !!\n")); - PHY_DEBUG(("[CAL] **************************************\n")); - break; - } - } else /* 2nd-cut */{ - if (((tx_cal_reg[0] == 31) || (tx_cal_reg[0] == (-32))) && - ((tx_cal_reg[3] == 31) || (tx_cal_reg[3] == (-32)))) { - PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> *********\n")); - PHY_DEBUG(("[CAL] ** TX_IQ_CALIBRATION SATUATION !!\n")); - PHY_DEBUG(("[CAL] **************************************\n")); - break; - } - } - - tx_cal[0] = tx_cal[0] + tx_cal_reg[0]; - tx_cal[1] = tx_cal[1] + tx_cal_reg[1]; - tx_cal[2] = tx_cal[2] + tx_cal_reg[2]; - tx_cal[3] = tx_cal[3] + tx_cal_reg[3]; - PHY_DEBUG(("[CAL] ** apply tx_cal[0] = %d\n", tx_cal[0])); - PHY_DEBUG(("[CAL] apply tx_cal[1] = %d\n", tx_cal[1])); - PHY_DEBUG(("[CAL] apply tx_cal[2] = %d\n", tx_cal[2])); - PHY_DEBUG(("[CAL] apply tx_cal[3] = %d\n", tx_cal[3])); - - if (phw_data->revision == 0x2002) /* 1st-cut */{ - val &= 0x0000FFFF; - val |= ((_s32_to_s4(tx_cal[0]) << 28)| - (_s32_to_s4(tx_cal[1]) << 24)| - (_s32_to_s4(tx_cal[2]) << 20)| - (_s32_to_s4(tx_cal[3]) << 16)); - hw_set_dxx_reg(phw_data, 0x54, val); - PHY_DEBUG(("[CAL] ** CALIB_DATA = 0x%08X\n", val)); - return 0; - } else /* 2nd-cut */{ - val &= 0x000003FF; - val |= ((_s32_to_s5(tx_cal[0]) << 27)| - (_s32_to_s6(tx_cal[1]) << 21)| - (_s32_to_s6(tx_cal[2]) << 15)| - (_s32_to_s5(tx_cal[3]) << 10)); - hw_set_dxx_reg(phw_data, 0x3C, val); - PHY_DEBUG(("[CAL] ** TX_IQ_CALIBRATION = 0x%08X\n", val)); - return 0; - } - - /* i. Set "calib_start" to 0x0 */ - reg_mode_ctrl &= ~MASK_CALIB_START; - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - - loop--; - } - - return 1; -} - -static void _tx_iq_calibration_winbond(struct hw_data *phw_data) -{ - u32 reg_agc_ctrl3; -#ifdef _DEBUG - s32 tx_cal_reg[4]; - -#endif - u32 reg_mode_ctrl; - u32 val; - u8 result; - - PHY_DEBUG(("[CAL] -> [4]_tx_iq_calibration()\n")); - - /* 0x01 0xEE3FC2 ; 3B8FF ; Calibration (6a). enable TX IQ calibration loop circuits */ - phy_set_rf_data(phw_data, 1, (1<<24)|0xEE3FC2); - /* 0x0B 0x1905D6 ; 06417 ; Calibration (6b). enable TX I/Q cal loop squaring circuit */ - phy_set_rf_data(phw_data, 11, (11<<24)|0x19BDD6); /* 20060612.1.a 0x1905D6); */ - /* 0x05 0x24C60A ; 09318 ; Calibration (6c). setting TX-VGA gain: TXGCH=2 & GPK=110 --> to be optimized */ - phy_set_rf_data(phw_data, 5, (5<<24)|0x24C60A); /* 0x24C60A (high temperature) */ - /* 0x06 0x06880C ; 01A20 ; Calibration (6d). RXGCH=00; RXGCL=100 000 (RXVGA=32) --> to be optimized */ - phy_set_rf_data(phw_data, 6, (6<<24)|0x34880C); /* 20060612.1.a 0x06890C); */ - /* 0x00 0xFDF1C0 ; 3F7C7 ; Calibration (6e). turn on IQ imbalance/Test mode */ - phy_set_rf_data(phw_data, 0, (0<<24)|0xFDF1C0); - /* ; [BB-chip]: Calibration (6f).Send test pattern */ - /* ; [BB-chip]: Calibration (6g). Search RXGCL optimal value */ - /* ; [BB-chip]: Calibration (6h). Calculate TX-path IQ imbalance and setting TX path IQ compensation table */ - /* phy_set_rf_data(phw_data, 3, (3<<24)|0x025586); */ - - msleep(30); /* 20060612.1.a 30ms delay. Add the follow 2 lines */ - /* To adjust TXVGA to fit iq_mag_0 range from 1250 ~ 1750 */ - adjust_TXVGA_for_iq_mag(phw_data); - - /* a. Disable AGC */ - hw_get_dxx_reg(phw_data, REG_AGC_CTRL3, ®_agc_ctrl3); - reg_agc_ctrl3 &= ~BIT(2); - reg_agc_ctrl3 |= (MASK_LNA_FIX_GAIN|MASK_AGC_FIX); - hw_set_dxx_reg(phw_data, REG_AGC_CTRL3, reg_agc_ctrl3); - - hw_get_dxx_reg(phw_data, REG_AGC_CTRL5, &val); - val |= MASK_AGC_FIX_GAIN; - hw_set_dxx_reg(phw_data, REG_AGC_CTRL5, val); - - result = _tx_iq_calibration_loop_winbond(phw_data, 150, 100); - - if (result > 0) { - if (phw_data->revision == 0x2002) /* 1st-cut */{ - hw_get_dxx_reg(phw_data, 0x54, &val); - val &= 0x0000FFFF; - hw_set_dxx_reg(phw_data, 0x54, val); - } else /* 2nd-cut*/{ - hw_get_dxx_reg(phw_data, 0x3C, &val); - val &= 0x000003FF; - hw_set_dxx_reg(phw_data, 0x3C, val); - } - - result = _tx_iq_calibration_loop_winbond(phw_data, 300, 200); - - if (result > 0) { - if (phw_data->revision == 0x2002) /* 1st-cut */{ - hw_get_dxx_reg(phw_data, 0x54, &val); - val &= 0x0000FFFF; - hw_set_dxx_reg(phw_data, 0x54, val); - } else /* 2nd-cut*/{ - hw_get_dxx_reg(phw_data, 0x3C, &val); - val &= 0x000003FF; - hw_set_dxx_reg(phw_data, 0x3C, val); - } - - result = _tx_iq_calibration_loop_winbond(phw_data, 500, 400); - if (result > 0) { - if (phw_data->revision == 0x2002) /* 1st-cut */{ - hw_get_dxx_reg(phw_data, 0x54, &val); - val &= 0x0000FFFF; - hw_set_dxx_reg(phw_data, 0x54, val); - } else /* 2nd-cut */{ - hw_get_dxx_reg(phw_data, 0x3C, &val); - val &= 0x000003FF; - hw_set_dxx_reg(phw_data, 0x3C, val); - } - - - result = _tx_iq_calibration_loop_winbond(phw_data, 700, 500); - - if (result > 0) { - PHY_DEBUG(("[CAL] ** <_tx_iq_calibration> **************\n")); - PHY_DEBUG(("[CAL] ** TX_IQ_CALIBRATION FAILURE !!\n")); - PHY_DEBUG(("[CAL] **************************************\n")); - - if (phw_data->revision == 0x2002) /* 1st-cut */{ - hw_get_dxx_reg(phw_data, 0x54, &val); - val &= 0x0000FFFF; - hw_set_dxx_reg(phw_data, 0x54, val); - } else /* 2nd-cut */{ - hw_get_dxx_reg(phw_data, 0x3C, &val); - val &= 0x000003FF; - hw_set_dxx_reg(phw_data, 0x3C, val); - } - } - } - } - } - - /* i. Set "calib_start" to 0x0 */ - hw_get_dxx_reg(phw_data, REG_MODE_CTRL, ®_mode_ctrl); - reg_mode_ctrl &= ~MASK_CALIB_START; - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - - /* g. Enable AGC */ - /* hw_get_dxx_reg(phw_data, REG_AGC_CTRL3, &val); */ - reg_agc_ctrl3 |= BIT(2); - reg_agc_ctrl3 &= ~(MASK_LNA_FIX_GAIN|MASK_AGC_FIX); - hw_set_dxx_reg(phw_data, REG_AGC_CTRL3, reg_agc_ctrl3); - -#ifdef _DEBUG - if (phw_data->revision == 0x2002) /* 1st-cut */{ - hw_get_dxx_reg(phw_data, 0x54, &val); - PHY_DEBUG(("[CAL] ** 0x54 = 0x%08X\n", val)); - tx_cal_reg[0] = _s4_to_s32((val & 0xF0000000) >> 28); - tx_cal_reg[1] = _s4_to_s32((val & 0x0F000000) >> 24); - tx_cal_reg[2] = _s4_to_s32((val & 0x00F00000) >> 20); - tx_cal_reg[3] = _s4_to_s32((val & 0x000F0000) >> 16); - } else /* 2nd-cut */ { - hw_get_dxx_reg(phw_data, 0x3C, &val); - PHY_DEBUG(("[CAL] ** 0x3C = 0x%08X\n", val)); - tx_cal_reg[0] = _s5_to_s32((val & 0xF8000000) >> 27); - tx_cal_reg[1] = _s6_to_s32((val & 0x07E00000) >> 21); - tx_cal_reg[2] = _s6_to_s32((val & 0x001F8000) >> 15); - tx_cal_reg[3] = _s5_to_s32((val & 0x00007C00) >> 10); - - } - - PHY_DEBUG(("[CAL] ** tx_cal_reg[0] = %d\n", tx_cal_reg[0])); - PHY_DEBUG(("[CAL] tx_cal_reg[1] = %d\n", tx_cal_reg[1])); - PHY_DEBUG(("[CAL] tx_cal_reg[2] = %d\n", tx_cal_reg[2])); - PHY_DEBUG(("[CAL] tx_cal_reg[3] = %d\n", tx_cal_reg[3])); -#endif - - - /* - * for test - BEN - * RF Control Override - */ -} - -/*****************************************************/ -static u8 _rx_iq_calibration_loop_winbond(struct hw_data *phw_data, u16 factor, u32 frequency) -{ - u32 reg_mode_ctrl; - s32 iqcal_tone_i; - s32 iqcal_tone_q; - s32 iqcal_image_i; - s32 iqcal_image_q; - s32 rot_tone_i_b; - s32 rot_tone_q_b; - s32 rot_image_i_b; - s32 rot_image_q_b; - s32 rx_cal_flt_b[4]; - s32 rx_cal[4]; - s32 rx_cal_reg[4]; - s32 a_2, b_2; - s32 sin_b, sin_2b; - s32 cos_b, cos_2b; - s32 temp1, temp2; - u32 val; - u16 loop; - - u32 pwr_tone; - u32 pwr_image; - u8 verify_count; - - s32 iqcal_tone_i_avg, iqcal_tone_q_avg; - s32 iqcal_image_i_avg, iqcal_image_q_avg; - u16 capture_time; - - PHY_DEBUG(("[CAL] -> [5]_rx_iq_calibration_loop()\n")); - PHY_DEBUG(("[CAL] ** factor = %d\n", factor)); - - hw_set_dxx_reg(phw_data, 0x58, 0x44444444); /* IQ_Alpha */ - - /* b. */ - - hw_get_dxx_reg(phw_data, REG_MODE_CTRL, ®_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (read) = 0x%08X\n", reg_mode_ctrl)); - - verify_count = 0; - - /* for (loop = 0; loop < 1; loop++) */ - /* for (loop = 0; loop < LOOP_TIMES; loop++) */ - loop = LOOP_TIMES; - while (loop > 0) { - PHY_DEBUG(("[CAL] [%d.] <_rx_iq_calibration_loop>\n", - (LOOP_TIMES-loop+1))); - iqcal_tone_i_avg = 0; - iqcal_tone_q_avg = 0; - iqcal_image_i_avg = 0; - iqcal_image_q_avg = 0; - capture_time = 0; - - for (capture_time = 0; capture_time < 10; capture_time++) { - /* i. Set "calib_start" to 0x0 */ - reg_mode_ctrl &= ~MASK_CALIB_START; - if (!hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl))/*20060718.1 modify */ - return 0; - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - - reg_mode_ctrl &= ~MASK_IQCAL_MODE; - reg_mode_ctrl |= (MASK_CALIB_START|0x1); - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - - /* c. */ - hw_get_dxx_reg(phw_data, REG_CALIB_READ1, &val); - PHY_DEBUG(("[CAL] CALIB_READ1 = 0x%08X\n", val)); - - iqcal_tone_i = _s13_to_s32(val & 0x00001FFF); - iqcal_tone_q = _s13_to_s32((val & 0x03FFE000) >> 13); - PHY_DEBUG(("[CAL] ** iqcal_tone_i = %d, iqcal_tone_q = %d\n", - iqcal_tone_i, iqcal_tone_q)); - - hw_get_dxx_reg(phw_data, REG_CALIB_READ2, &val); - PHY_DEBUG(("[CAL] CALIB_READ2 = 0x%08X\n", val)); - - iqcal_image_i = _s13_to_s32(val & 0x00001FFF); - iqcal_image_q = _s13_to_s32((val & 0x03FFE000) >> 13); - PHY_DEBUG(("[CAL] ** iqcal_image_i = %d, iqcal_image_q = %d\n", - iqcal_image_i, iqcal_image_q)); - if (capture_time == 0) - continue; - else { - iqcal_image_i_avg = (iqcal_image_i_avg*(capture_time-1) + iqcal_image_i)/capture_time; - iqcal_image_q_avg = (iqcal_image_q_avg*(capture_time-1) + iqcal_image_q)/capture_time; - iqcal_tone_i_avg = (iqcal_tone_i_avg*(capture_time-1) + iqcal_tone_i)/capture_time; - iqcal_tone_q_avg = (iqcal_tone_q_avg*(capture_time-1) + iqcal_tone_q)/capture_time; - } - } - - - iqcal_image_i = iqcal_image_i_avg; - iqcal_image_q = iqcal_image_q_avg; - iqcal_tone_i = iqcal_tone_i_avg; - iqcal_tone_q = iqcal_tone_q_avg; - - /* d. */ - rot_tone_i_b = (iqcal_tone_i * iqcal_tone_i + - iqcal_tone_q * iqcal_tone_q) / 1024; - rot_tone_q_b = (iqcal_tone_i * iqcal_tone_q * (-1) + - iqcal_tone_q * iqcal_tone_i) / 1024; - rot_image_i_b = (iqcal_image_i * iqcal_tone_i - - iqcal_image_q * iqcal_tone_q) / 1024; - rot_image_q_b = (iqcal_image_i * iqcal_tone_q + - iqcal_image_q * iqcal_tone_i) / 1024; - - PHY_DEBUG(("[CAL] ** rot_tone_i_b = %d\n", rot_tone_i_b)); - PHY_DEBUG(("[CAL] ** rot_tone_q_b = %d\n", rot_tone_q_b)); - PHY_DEBUG(("[CAL] ** rot_image_i_b = %d\n", rot_image_i_b)); - PHY_DEBUG(("[CAL] ** rot_image_q_b = %d\n", rot_image_q_b)); - - /* f. */ - if (rot_tone_i_b == 0) { - PHY_DEBUG(("[CAL] ** <_rx_iq_calibration_loop> ERROR *******\n")); - PHY_DEBUG(("[CAL] ** rot_tone_i_b=0 to calculate EPS and THETA !!\n")); - PHY_DEBUG(("[CAL] ******************************************\n")); - break; - } - - a_2 = (rot_image_i_b * 32768) / rot_tone_i_b - - phw_data->iq_rsdl_gain_tx_d2; - b_2 = (rot_image_q_b * 32768) / rot_tone_i_b - - phw_data->iq_rsdl_phase_tx_d2; - - PHY_DEBUG(("[CAL] ** iq_rsdl_gain_tx_d2 = %d\n", - phw_data->iq_rsdl_gain_tx_d2)); - PHY_DEBUG(("[CAL] ** iq_rsdl_phase_tx_d2= %d\n", - phw_data->iq_rsdl_phase_tx_d2)); - PHY_DEBUG(("[CAL] ***** EPSILON/2 = %d\n", a_2)); - PHY_DEBUG(("[CAL] ***** THETA/2 = %d\n", b_2)); - - _sin_cos(b_2, &sin_b, &cos_b); - _sin_cos(b_2*2, &sin_2b, &cos_2b); - PHY_DEBUG(("[CAL] ** sin(b/2)=%d, cos(b/2)=%d\n", sin_b, cos_b)); - PHY_DEBUG(("[CAL] ** sin(b)=%d, cos(b)=%d\n", sin_2b, cos_2b)); - - if (cos_2b == 0) { - PHY_DEBUG(("[CAL] ** <_rx_iq_calibration_loop> ERROR *******\n")); - PHY_DEBUG(("[CAL] ** cos(b)=0 !!\n")); - PHY_DEBUG(("[CAL] ******************************************\n")); - break; - } - - /* 1280 * 32768 = 41943040 */ - temp1 = (41943040/cos_2b)*cos_b; - - /* temp2 = (41943040/cos_2b)*sin_b*(-1); */ - if (phw_data->revision == 0x2002)/* 1st-cut */ - temp2 = (41943040/cos_2b)*sin_b*(-1); - else/* 2nd-cut */ - temp2 = (41943040*4/cos_2b)*sin_b*(-1); - - rx_cal_flt_b[0] = _floor(temp1/(32768+a_2)); - rx_cal_flt_b[1] = _floor(temp2/(32768-a_2)); - rx_cal_flt_b[2] = _floor(temp2/(32768+a_2)); - rx_cal_flt_b[3] = _floor(temp1/(32768-a_2)); - - PHY_DEBUG(("[CAL] ** rx_cal_flt_b[0] = %d\n", rx_cal_flt_b[0])); - PHY_DEBUG(("[CAL] rx_cal_flt_b[1] = %d\n", rx_cal_flt_b[1])); - PHY_DEBUG(("[CAL] rx_cal_flt_b[2] = %d\n", rx_cal_flt_b[2])); - PHY_DEBUG(("[CAL] rx_cal_flt_b[3] = %d\n", rx_cal_flt_b[3])); - - rx_cal[0] = rx_cal_flt_b[0] - 128; - rx_cal[1] = rx_cal_flt_b[1]; - rx_cal[2] = rx_cal_flt_b[2]; - rx_cal[3] = rx_cal_flt_b[3] - 128; - PHY_DEBUG(("[CAL] ** rx_cal[0] = %d\n", rx_cal[0])); - PHY_DEBUG(("[CAL] rx_cal[1] = %d\n", rx_cal[1])); - PHY_DEBUG(("[CAL] rx_cal[2] = %d\n", rx_cal[2])); - PHY_DEBUG(("[CAL] rx_cal[3] = %d\n", rx_cal[3])); - - /* e. */ - pwr_tone = (iqcal_tone_i*iqcal_tone_i + iqcal_tone_q*iqcal_tone_q); - pwr_image = (iqcal_image_i*iqcal_image_i + - iqcal_image_q*iqcal_image_q)*factor; - - PHY_DEBUG(("[CAL] ** pwr_tone = %d\n", pwr_tone)); - PHY_DEBUG(("[CAL] ** pwr_image = %d\n", pwr_image)); - - if (pwr_tone > pwr_image) { - verify_count++; - - PHY_DEBUG(("[CAL] ** <_rx_iq_calibration_loop> *************\n")); - PHY_DEBUG(("[CAL] ** VERIFY OK # %d !!\n", verify_count)); - PHY_DEBUG(("[CAL] ******************************************\n")); - - if (verify_count > 2) { - PHY_DEBUG(("[CAL] ** <_rx_iq_calibration_loop> *********\n")); - PHY_DEBUG(("[CAL] ** RX_IQ_CALIBRATION OK !!\n")); - PHY_DEBUG(("[CAL] **************************************\n")); - return 0; - } - - continue; - } - /* g. */ - hw_get_dxx_reg(phw_data, 0x54, &val); - PHY_DEBUG(("[CAL] ** 0x54 = 0x%08X\n", val)); - - if (phw_data->revision == 0x2002) /* 1st-cut */{ - rx_cal_reg[0] = _s4_to_s32((val & 0x0000F000) >> 12); - rx_cal_reg[1] = _s4_to_s32((val & 0x00000F00) >> 8); - rx_cal_reg[2] = _s4_to_s32((val & 0x000000F0) >> 4); - rx_cal_reg[3] = _s4_to_s32((val & 0x0000000F)); - } else /* 2nd-cut */{ - rx_cal_reg[0] = _s5_to_s32((val & 0xF8000000) >> 27); - rx_cal_reg[1] = _s6_to_s32((val & 0x07E00000) >> 21); - rx_cal_reg[2] = _s6_to_s32((val & 0x001F8000) >> 15); - rx_cal_reg[3] = _s5_to_s32((val & 0x00007C00) >> 10); - } - - PHY_DEBUG(("[CAL] ** rx_cal_reg[0] = %d\n", rx_cal_reg[0])); - PHY_DEBUG(("[CAL] rx_cal_reg[1] = %d\n", rx_cal_reg[1])); - PHY_DEBUG(("[CAL] rx_cal_reg[2] = %d\n", rx_cal_reg[2])); - PHY_DEBUG(("[CAL] rx_cal_reg[3] = %d\n", rx_cal_reg[3])); - - if (phw_data->revision == 0x2002) /* 1st-cut */{ - if (((rx_cal_reg[0] == 7) || (rx_cal_reg[0] == (-8))) && - ((rx_cal_reg[3] == 7) || (rx_cal_reg[3] == (-8)))) { - PHY_DEBUG(("[CAL] ** <_rx_iq_calibration_loop> *********\n")); - PHY_DEBUG(("[CAL] ** RX_IQ_CALIBRATION SATUATION !!\n")); - PHY_DEBUG(("[CAL] **************************************\n")); - break; - } - } else /* 2nd-cut */{ - if (((rx_cal_reg[0] == 31) || (rx_cal_reg[0] == (-32))) && - ((rx_cal_reg[3] == 31) || (rx_cal_reg[3] == (-32)))) { - PHY_DEBUG(("[CAL] ** <_rx_iq_calibration_loop> *********\n")); - PHY_DEBUG(("[CAL] ** RX_IQ_CALIBRATION SATUATION !!\n")); - PHY_DEBUG(("[CAL] **************************************\n")); - break; - } - } - - rx_cal[0] = rx_cal[0] + rx_cal_reg[0]; - rx_cal[1] = rx_cal[1] + rx_cal_reg[1]; - rx_cal[2] = rx_cal[2] + rx_cal_reg[2]; - rx_cal[3] = rx_cal[3] + rx_cal_reg[3]; - PHY_DEBUG(("[CAL] ** apply rx_cal[0] = %d\n", rx_cal[0])); - PHY_DEBUG(("[CAL] apply rx_cal[1] = %d\n", rx_cal[1])); - PHY_DEBUG(("[CAL] apply rx_cal[2] = %d\n", rx_cal[2])); - PHY_DEBUG(("[CAL] apply rx_cal[3] = %d\n", rx_cal[3])); - - hw_get_dxx_reg(phw_data, 0x54, &val); - if (phw_data->revision == 0x2002) /* 1st-cut */{ - val &= 0x0000FFFF; - val |= ((_s32_to_s4(rx_cal[0]) << 12)| - (_s32_to_s4(rx_cal[1]) << 8)| - (_s32_to_s4(rx_cal[2]) << 4)| - (_s32_to_s4(rx_cal[3]))); - hw_set_dxx_reg(phw_data, 0x54, val); - } else /* 2nd-cut */{ - val &= 0x000003FF; - val |= ((_s32_to_s5(rx_cal[0]) << 27)| - (_s32_to_s6(rx_cal[1]) << 21)| - (_s32_to_s6(rx_cal[2]) << 15)| - (_s32_to_s5(rx_cal[3]) << 10)); - hw_set_dxx_reg(phw_data, 0x54, val); - - if (loop == 3) - return 0; - } - PHY_DEBUG(("[CAL] ** CALIB_DATA = 0x%08X\n", val)); - - loop--; - } - - return 1; -} - -/*************************************************/ - -/***************************************************************/ -static void _rx_iq_calibration_winbond(struct hw_data *phw_data, u32 frequency) -{ -/* figo 20050523 marked this flag for can't compile for release */ -#ifdef _DEBUG - s32 rx_cal_reg[4]; - u32 val; -#endif - - u8 result; - - PHY_DEBUG(("[CAL] -> [5]_rx_iq_calibration()\n")); -/* a. Set RFIC to "RX calibration mode" */ - /* ; ----- Calibration (7). RX path IQ imbalance calibration loop */ - /* 0x01 0xFFBFC2 ; 3FEFF ; Calibration (7a). enable RX IQ calibration loop circuits */ - phy_set_rf_data(phw_data, 1, (1<<24)|0xEFBFC2); - /* 0x0B 0x1A01D6 ; 06817 ; Calibration (7b). enable RX I/Q cal loop SW1 circuits */ - phy_set_rf_data(phw_data, 11, (11<<24)|0x1A05D6); - /* 0x05 0x24848A ; 09212 ; Calibration (7c). setting TX-VGA gain (TXGCH) to 2 --> to be optimized */ - phy_set_rf_data(phw_data, 5, (5<<24) | phw_data->txvga_setting_for_cal); - /* 0x06 0x06840C ; 01A10 ; Calibration (7d). RXGCH=00; RXGCL=010 000 (RXVGA) --> to be optimized */ - phy_set_rf_data(phw_data, 6, (6<<24)|0x06834C); - /* 0x00 0xFFF1C0 ; 3F7C7 ; Calibration (7e). turn on IQ imbalance/Test mode */ - phy_set_rf_data(phw_data, 0, (0<<24)|0xFFF1C0); - - /* ; [BB-chip]: Calibration (7f). Send test pattern */ - /* ; [BB-chip]: Calibration (7g). Search RXGCL optimal value */ - /* ; [BB-chip]: Calibration (7h). Calculate RX-path IQ imbalance and setting RX path IQ compensation table */ - - result = _rx_iq_calibration_loop_winbond(phw_data, 12589, frequency); - - if (result > 0) { - _reset_rx_cal(phw_data); - result = _rx_iq_calibration_loop_winbond(phw_data, 7943, frequency); - - if (result > 0) { - _reset_rx_cal(phw_data); - result = _rx_iq_calibration_loop_winbond(phw_data, 5011, frequency); - - if (result > 0) { - PHY_DEBUG(("[CAL] ** <_rx_iq_calibration> **************\n")); - PHY_DEBUG(("[CAL] ** RX_IQ_CALIBRATION FAILURE !!\n")); - PHY_DEBUG(("[CAL] **************************************\n")); - _reset_rx_cal(phw_data); - } - } - } - -#ifdef _DEBUG - hw_get_dxx_reg(phw_data, 0x54, &val); - PHY_DEBUG(("[CAL] ** 0x54 = 0x%08X\n", val)); - - if (phw_data->revision == 0x2002) /* 1st-cut */{ - rx_cal_reg[0] = _s4_to_s32((val & 0x0000F000) >> 12); - rx_cal_reg[1] = _s4_to_s32((val & 0x00000F00) >> 8); - rx_cal_reg[2] = _s4_to_s32((val & 0x000000F0) >> 4); - rx_cal_reg[3] = _s4_to_s32((val & 0x0000000F)); - } else /* 2nd-cut */{ - rx_cal_reg[0] = _s5_to_s32((val & 0xF8000000) >> 27); - rx_cal_reg[1] = _s6_to_s32((val & 0x07E00000) >> 21); - rx_cal_reg[2] = _s6_to_s32((val & 0x001F8000) >> 15); - rx_cal_reg[3] = _s5_to_s32((val & 0x00007C00) >> 10); - } - - PHY_DEBUG(("[CAL] ** rx_cal_reg[0] = %d\n", rx_cal_reg[0])); - PHY_DEBUG(("[CAL] rx_cal_reg[1] = %d\n", rx_cal_reg[1])); - PHY_DEBUG(("[CAL] rx_cal_reg[2] = %d\n", rx_cal_reg[2])); - PHY_DEBUG(("[CAL] rx_cal_reg[3] = %d\n", rx_cal_reg[3])); -#endif - -} - -/*******************************************************/ -void phy_calibration_winbond(struct hw_data *phw_data, u32 frequency) -{ - u32 reg_mode_ctrl; - u32 iq_alpha; - - PHY_DEBUG(("[CAL] -> phy_calibration_winbond()\n")); - - hw_get_dxx_reg(phw_data, 0x58, &iq_alpha); - - _rxadc_dc_offset_cancellation_winbond(phw_data, frequency); - /* _txidac_dc_offset_cancellation_winbond(phw_data); */ - /* _txqdac_dc_offset_cancellation_winbond(phw_data); */ - - _tx_iq_calibration_winbond(phw_data); - _rx_iq_calibration_winbond(phw_data, frequency); - - /*********************************************************************/ - hw_get_dxx_reg(phw_data, REG_MODE_CTRL, ®_mode_ctrl); - reg_mode_ctrl &= ~(MASK_IQCAL_TONE_SEL|MASK_IQCAL_MODE|MASK_CALIB_START); /* set when finish */ - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - - /* i. Set RFIC to "Normal mode" */ - hw_set_dxx_reg(phw_data, 0x58, iq_alpha); - - /*********************************************************************/ - phy_init_rf(phw_data); - -} - -/******************/ -void phy_set_rf_data(struct hw_data *pHwData, u32 index, u32 value) -{ - u32 ltmp = 0; - - switch (pHwData->phy_type) { - case RF_MAXIM_2825: - case RF_MAXIM_V1: /* 11g Winbond 2nd BB(with Phy board (v1) + Maxim 331) */ - ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(value, 18); - break; - - case RF_MAXIM_2827: - ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(value, 18); - break; - - case RF_MAXIM_2828: - ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(value, 18); - break; - - case RF_MAXIM_2829: - ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(value, 18); - break; - - case RF_AIROHA_2230: - case RF_AIROHA_2230S: /* 20060420 Add this */ - ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse(value, 20); - break; - - case RF_AIROHA_7230: - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | (value&0xffffff); - break; - - case RF_WB_242: - case RF_WB_242_1:/* 20060619.5 Add */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse(value, 24); - break; - } - - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); -} - -/* 20060717 modify as Bruce's mail */ -unsigned char adjust_TXVGA_for_iq_mag(struct hw_data *phw_data) -{ - int init_txvga = 0; - u32 reg_mode_ctrl; - u32 val; - s32 iqcal_tone_i0; - s32 iqcal_tone_q0; - u32 sqsum; - s32 iq_mag_0_tx; - u8 reg_state; - int current_txvga; - - - reg_state = 0; - for (init_txvga = 0; init_txvga < 10; init_txvga++) { - current_txvga = (0x24C40A|(init_txvga<<6)); - phy_set_rf_data(phw_data, 5, ((5<<24)|current_txvga)); - phw_data->txvga_setting_for_cal = current_txvga; - - msleep(30);/* 20060612.1.a */ - - if (!hw_get_dxx_reg(phw_data, REG_MODE_CTRL, ®_mode_ctrl))/* 20060718.1 modify */ - return false; - - PHY_DEBUG(("[CAL] MODE_CTRL (read) = 0x%08X\n", reg_mode_ctrl)); - - /* - * a. Set iqcal_mode[1:0] to 0x2 and set "calib_start" to 0x1 to - * enable "IQ alibration Mode II" - */ - reg_mode_ctrl &= ~(MASK_IQCAL_TONE_SEL|MASK_IQCAL_MODE); - reg_mode_ctrl &= ~MASK_IQCAL_MODE; - reg_mode_ctrl |= (MASK_CALIB_START|0x02); - reg_mode_ctrl |= (MASK_CALIB_START|0x02|2<<2); - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - - udelay(1);/* 20060612.1.a */ - - udelay(300);/* 20060612.1.a */ - - /* b. */ - hw_get_dxx_reg(phw_data, REG_CALIB_READ1, &val); - - PHY_DEBUG(("[CAL] CALIB_READ1 = 0x%08X\n", val)); - udelay(300);/* 20060612.1.a */ - - iqcal_tone_i0 = _s13_to_s32(val & 0x00001FFF); - iqcal_tone_q0 = _s13_to_s32((val & 0x03FFE000) >> 13); - PHY_DEBUG(("[CAL] ** iqcal_tone_i0=%d, iqcal_tone_q0=%d\n", - iqcal_tone_i0, iqcal_tone_q0)); - - sqsum = iqcal_tone_i0*iqcal_tone_i0 + iqcal_tone_q0*iqcal_tone_q0; - iq_mag_0_tx = (s32) _sqrt(sqsum); - PHY_DEBUG(("[CAL] ** auto_adjust_txvga_for_iq_mag_0_tx=%d\n", - iq_mag_0_tx)); - - if (iq_mag_0_tx >= 700 && iq_mag_0_tx <= 1750) - break; - else if (iq_mag_0_tx > 1750) { - init_txvga = -2; - continue; - } else - continue; - - } - - if (iq_mag_0_tx >= 700 && iq_mag_0_tx <= 1750) - return true; - else - return false; -} diff --git a/drivers/staging/winbond/phy_calibration.h b/drivers/staging/winbond/phy_calibration.h deleted file mode 100644 index 78fc68058607..000000000000 --- a/drivers/staging/winbond/phy_calibration.h +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef __WINBOND_PHY_CALIBRATION_H -#define __WINBOND_PHY_CALIBRATION_H - -#include "wbhal.h" - -#define REG_AGC_CTRL1 0x1000 -#define REG_AGC_CTRL2 0x1004 -#define REG_AGC_CTRL3 0x1008 -#define REG_AGC_CTRL4 0x100C -#define REG_AGC_CTRL5 0x1010 -#define REG_AGC_CTRL6 0x1014 -#define REG_AGC_CTRL7 0x1018 -#define REG_AGC_CTRL8 0x101C -#define REG_AGC_CTRL9 0x1020 -#define REG_AGC_CTRL10 0x1024 -#define REG_CCA_CTRL 0x1028 -#define REG_A_ACQ_CTRL 0x102C -#define REG_B_ACQ_CTRL 0x1030 -#define REG_A_TXRX_CTRL 0x1034 -#define REG_B_TXRX_CTRL 0x1038 -#define REG_A_TX_COEF3 0x103C -#define REG_A_TX_COEF2 0x1040 -#define REG_A_TX_COEF1 0x1044 -#define REG_B_TX_COEF2 0x1048 -#define REG_B_TX_COEF1 0x104C -#define REG_MODE_CTRL 0x1050 -#define REG_CALIB_DATA 0x1054 -#define REG_IQ_ALPHA 0x1058 -#define REG_DC_CANCEL 0x105C -#define REG_WTO_READ 0x1060 -#define REG_OFFSET_READ 0x1064 -#define REG_CALIB_READ1 0x1068 -#define REG_CALIB_READ2 0x106C -#define REG_A_FREQ_EST 0x1070 - - -#define MASK_AMER_OFF_REG BIT(31) - -#define MASK_BMER_OFF_REG BIT(31) - -#define MASK_LNA_FIX_GAIN (BIT(3) | BIT(4)) -#define MASK_AGC_FIX BIT(1) - -#define MASK_AGC_FIX_GAIN 0xFF00 - -#define MASK_ADC_DC_CAL_STR BIT(10) -#define MASK_CALIB_START BIT(4) -#define MASK_IQCAL_TONE_SEL (BIT(3) | BIT(2)) -#define MASK_IQCAL_MODE (BIT(1) | BIT(0)) - -#define MASK_TX_CAL_0 0xF0000000 -#define TX_CAL_0_SHIFT 28 -#define MASK_TX_CAL_1 0x0F000000 -#define TX_CAL_1_SHIFT 24 -#define MASK_TX_CAL_2 0x00F00000 -#define TX_CAL_2_SHIFT 20 -#define MASK_TX_CAL_3 0x000F0000 -#define TX_CAL_3_SHIFT 16 -#define MASK_RX_CAL_0 0x0000F000 -#define RX_CAL_0_SHIFT 12 -#define MASK_RX_CAL_1 0x00000F00 -#define RX_CAL_1_SHIFT 8 -#define MASK_RX_CAL_2 0x000000F0 -#define RX_CAL_2_SHIFT 4 -#define MASK_RX_CAL_3 0x0000000F -#define RX_CAL_3_SHIFT 0 - -#define MASK_CANCEL_DC_I 0x3E0 -#define CANCEL_DC_I_SHIFT 5 -#define MASK_CANCEL_DC_Q 0x01F -#define CANCEL_DC_Q_SHIFT 0 - -#define MASK_ADC_DC_CAL_I(x) (((x) & 0x0003FE00) >> 9) -#define MASK_ADC_DC_CAL_Q(x) ((x) & 0x000001FF) - -#define MASK_IQCAL_TONE_I 0x00001FFF -#define SHIFT_IQCAL_TONE_I(x) ((x) >> 0) -#define MASK_IQCAL_TONE_Q 0x03FFE000 -#define SHIFT_IQCAL_TONE_Q(x) ((x) >> 13) - -void phy_set_rf_data(struct hw_data *pHwData, u32 index, u32 value); -void phy_calibration_winbond(struct hw_data *phw_data, u32 frequency); -#define phy_init_rf(_A) /* RFSynthesizer_initial(_A) */ - -#endif diff --git a/drivers/staging/winbond/reg.c b/drivers/staging/winbond/reg.c deleted file mode 100644 index 5fd4c4a72eee..000000000000 --- a/drivers/staging/winbond/reg.c +++ /dev/null @@ -1,2328 +0,0 @@ -#include "wbhal.h" -#include "wb35reg_f.h" -#include "core.h" - -/* - * ==================================================== - * Original Phy.h - * ==================================================== - */ - -/* - * ==================================================== - * For MAXIM2825/6/7 Ver. 331 or more - * - * 0x00 0x000a2 - * 0x01 0x21cc0 - * 0x02 0x13802 - * 0x02 0x1383a - * - * channe1 01 ; 0x03 0x30142 ; 0x04 0x0b333; - * channe1 02 ; 0x03 0x32141 ; 0x04 0x08444; - * channe1 03 ; 0x03 0x32143 ; 0x04 0x0aeee; - * channe1 04 ; 0x03 0x32142 ; 0x04 0x0b333; - * channe1 05 ; 0x03 0x31141 ; 0x04 0x08444; - * channe1 06 ; 0x03 0x31143 ; 0x04 0x0aeee; - * channe1 07 ; 0x03 0x31142 ; 0x04 0x0b333; - * channe1 08 ; 0x03 0x33141 ; 0x04 0x08444; - * channe1 09 ; 0x03 0x33143 ; 0x04 0x0aeee; - * channe1 10 ; 0x03 0x33142 ; 0x04 0x0b333; - * channe1 11 ; 0x03 0x30941 ; 0x04 0x08444; - * channe1 12 ; 0x03 0x30943 ; 0x04 0x0aeee; - * channe1 13 ; 0x03 0x30942 ; 0x04 0x0b333; - * - * 0x05 0x28986 - * 0x06 0x18008 - * 0x07 0x38400 - * 0x08 0x05100; 100 Hz DC - * 0x08 0x05900; 30 KHz DC - * 0x09 0x24f08 - * 0x0a 0x17e00, 0x17ea0 - * 0x0b 0x37d80 - * 0x0c 0x0c900 -- 0x0ca00 (lager power 9db than 0x0c000), 0x0c000 - */ - -/* MAX2825 (pure b/g) */ -static u32 max2825_rf_data[] = { - (0x00<<18) | 0x000a2, - (0x01<<18) | 0x21cc0, - (0x02<<18) | 0x13806, - (0x03<<18) | 0x30142, - (0x04<<18) | 0x0b333, - (0x05<<18) | 0x289A6, - (0x06<<18) | 0x18008, - (0x07<<18) | 0x38000, - (0x08<<18) | 0x05100, - (0x09<<18) | 0x24f08, - (0x0A<<18) | 0x14000, - (0x0B<<18) | 0x37d80, - (0x0C<<18) | 0x0c100 /* 11a: 0x0c300, 11g: 0x0c100 */ -}; - -static u32 max2825_channel_data_24[][3] = { - {(0x03 << 18) | 0x30142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channel 01 */ - {(0x03 << 18) | 0x32141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channel 02 */ - {(0x03 << 18) | 0x32143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channel 03 */ - {(0x03 << 18) | 0x32142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channel 04 */ - {(0x03 << 18) | 0x31141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channel 05 */ - {(0x03 << 18) | 0x31143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channel 06 */ - {(0x03 << 18) | 0x31142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channel 07 */ - {(0x03 << 18) | 0x33141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channel 08 */ - {(0x03 << 18) | 0x33143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channel 09 */ - {(0x03 << 18) | 0x33142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channel 10 */ - {(0x03 << 18) | 0x30941, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channel 11 */ - {(0x03 << 18) | 0x30943, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channel 12 */ - {(0x03 << 18) | 0x30942, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channel 13 */ - {(0x03 << 18) | 0x32941, (0x04 << 18) | 0x09999, (0x05 << 18) | 0x289A6} /* channel 14 (2484MHz) */ -}; - -static u32 max2825_power_data_24[] = {(0x0C << 18) | 0x0c000, (0x0C << 18) | 0x0c100}; - -/* ========================================== */ -/* MAX2827 (a/b/g) */ -static u32 max2827_rf_data[] = { - (0x00 << 18) | 0x000a2, - (0x01 << 18) | 0x21cc0, - (0x02 << 18) | 0x13806, - (0x03 << 18) | 0x30142, - (0x04 << 18) | 0x0b333, - (0x05 << 18) | 0x289A6, - (0x06 << 18) | 0x18008, - (0x07 << 18) | 0x38000, - (0x08 << 18) | 0x05100, - (0x09 << 18) | 0x24f08, - (0x0A << 18) | 0x14000, - (0x0B << 18) | 0x37d80, - (0x0C << 18) | 0x0c100 /* 11a: 0x0c300, 11g: 0x0c100 */ -}; - -static u32 max2827_channel_data_24[][3] = { - {(0x03 << 18) | 0x30142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 01 */ - {(0x03 << 18) | 0x32141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 02 */ - {(0x03 << 18) | 0x32143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 03 */ - {(0x03 << 18) | 0x32142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 04 */ - {(0x03 << 18) | 0x31141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 05 */ - {(0x03 << 18) | 0x31143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 06 */ - {(0x03 << 18) | 0x31142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 07 */ - {(0x03 << 18) | 0x33141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 08 */ - {(0x03 << 18) | 0x33143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 09 */ - {(0x03 << 18) | 0x33142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 10 */ - {(0x03 << 18) | 0x30941, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 11 */ - {(0x03 << 18) | 0x30943, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 12 */ - {(0x03 << 18) | 0x30942, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 13 */ - {(0x03 << 18) | 0x32941, (0x04 << 18) | 0x09999, (0x05 << 18) | 0x289A6} /* channel 14 (2484MHz) */ -}; - -static u32 max2827_channel_data_50[][3] = { - {(0x03 << 18) | 0x33cc3, (0x04 << 18) | 0x08ccc, (0x05 << 18) | 0x2A9A6}, /* channel 36 */ - {(0x03 << 18) | 0x302c0, (0x04 << 18) | 0x08000, (0x05 << 18) | 0x2A9A6}, /* channel 40 */ - {(0x03 << 18) | 0x302c2, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x2A9A6}, /* channel 44 */ - {(0x03 << 18) | 0x322c1, (0x04 << 18) | 0x09999, (0x05 << 18) | 0x2A9A6}, /* channel 48 */ - {(0x03 << 18) | 0x312c1, (0x04 << 18) | 0x0a666, (0x05 << 18) | 0x2A9A6}, /* channel 52 */ - {(0x03 << 18) | 0x332c3, (0x04 << 18) | 0x08ccc, (0x05 << 18) | 0x2A9A6}, /* channel 56 */ - {(0x03 << 18) | 0x30ac0, (0x04 << 18) | 0x08000, (0x05 << 18) | 0x2A9A6}, /* channel 60 */ - {(0x03 << 18) | 0x30ac2, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x2A9A6} /* channel 64 */ -}; - -static u32 max2827_power_data_24[] = {(0x0C << 18) | 0x0C000, (0x0C << 18) | 0x0D600, (0x0C << 18) | 0x0C100}; -static u32 max2827_power_data_50[] = {(0x0C << 18) | 0x0C400, (0x0C << 18) | 0x0D500, (0x0C << 18) | 0x0C300}; - -/* ======================================================= */ -/* MAX2828 (a/b/g) */ -static u32 max2828_rf_data[] = { - (0x00 << 18) | 0x000a2, - (0x01 << 18) | 0x21cc0, - (0x02 << 18) | 0x13806, - (0x03 << 18) | 0x30142, - (0x04 << 18) | 0x0b333, - (0x05 << 18) | 0x289A6, - (0x06 << 18) | 0x18008, - (0x07 << 18) | 0x38000, - (0x08 << 18) | 0x05100, - (0x09 << 18) | 0x24f08, - (0x0A << 18) | 0x14000, - (0x0B << 18) | 0x37d80, - (0x0C << 18) | 0x0c100 /* 11a: 0x0c300, 11g: 0x0c100 */ -}; - -static u32 max2828_channel_data_24[][3] = { - {(0x03 << 18) | 0x30142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 01 */ - {(0x03 << 18) | 0x32141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 02 */ - {(0x03 << 18) | 0x32143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 03 */ - {(0x03 << 18) | 0x32142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 04 */ - {(0x03 << 18) | 0x31141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 05 */ - {(0x03 << 18) | 0x31143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 06 */ - {(0x03 << 18) | 0x31142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 07 */ - {(0x03 << 18) | 0x33141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 08 */ - {(0x03 << 18) | 0x33143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 09 */ - {(0x03 << 18) | 0x33142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 10 */ - {(0x03 << 18) | 0x30941, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 11 */ - {(0x03 << 18) | 0x30943, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 12 */ - {(0x03 << 18) | 0x30942, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 13 */ - {(0x03 << 18) | 0x32941, (0x04 << 18) | 0x09999, (0x05 << 18) | 0x289A6} /* channel 14 (2484MHz) */ -}; - -static u32 max2828_channel_data_50[][3] = { - {(0x03 << 18) | 0x33cc3, (0x04 << 18) | 0x08ccc, (0x05 << 18) | 0x289A6}, /* channel 36 */ - {(0x03 << 18) | 0x302c0, (0x04 << 18) | 0x08000, (0x05 << 18) | 0x289A6}, /* channel 40 */ - {(0x03 << 18) | 0x302c2, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channel 44 */ - {(0x03 << 18) | 0x322c1, (0x04 << 18) | 0x09999, (0x05 << 18) | 0x289A6}, /* channel 48 */ - {(0x03 << 18) | 0x312c1, (0x04 << 18) | 0x0a666, (0x05 << 18) | 0x289A6}, /* channel 52 */ - {(0x03 << 18) | 0x332c3, (0x04 << 18) | 0x08ccc, (0x05 << 18) | 0x289A6}, /* channel 56 */ - {(0x03 << 18) | 0x30ac0, (0x04 << 18) | 0x08000, (0x05 << 18) | 0x289A6}, /* channel 60 */ - {(0x03 << 18) | 0x30ac2, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6} /* channel 64 */ -}; - -static u32 max2828_power_data_24[] = {(0x0C << 18) | 0x0c000, (0x0C << 18) | 0x0c100}; -static u32 max2828_power_data_50[] = {(0x0C << 18) | 0x0c000, (0x0C << 18) | 0x0c100}; - -/* ========================================================== */ -/* MAX2829 (a/b/g) */ -static u32 max2829_rf_data[] = { - (0x00 << 18) | 0x000a2, - (0x01 << 18) | 0x23520, - (0x02 << 18) | 0x13802, - (0x03 << 18) | 0x30142, - (0x04 << 18) | 0x0b333, - (0x05 << 18) | 0x28906, - (0x06 << 18) | 0x18008, - (0x07 << 18) | 0x3B500, - (0x08 << 18) | 0x05100, - (0x09 << 18) | 0x24f08, - (0x0A << 18) | 0x14000, - (0x0B << 18) | 0x37d80, - (0x0C << 18) | 0x0F300 /* TXVGA=51, (MAX-6 dB) */ -}; - -static u32 max2829_channel_data_24[][3] = { - {(3 << 18) | 0x30142, (4 << 18) | 0x0b333, (5 << 18) | 0x289C6}, /* 01 (2412MHz) */ - {(3 << 18) | 0x32141, (4 << 18) | 0x08444, (5 << 18) | 0x289C6}, /* 02 (2417MHz) */ - {(3 << 18) | 0x32143, (4 << 18) | 0x0aeee, (5 << 18) | 0x289C6}, /* 03 (2422MHz) */ - {(3 << 18) | 0x32142, (4 << 18) | 0x0b333, (5 << 18) | 0x289C6}, /* 04 (2427MHz) */ - {(3 << 18) | 0x31141, (4 << 18) | 0x08444, (5 << 18) | 0x289C6}, /* 05 (2432MHz) */ - {(3 << 18) | 0x31143, (4 << 18) | 0x0aeee, (5 << 18) | 0x289C6}, /* 06 (2437MHz) */ - {(3 << 18) | 0x31142, (4 << 18) | 0x0b333, (5 << 18) | 0x289C6}, /* 07 (2442MHz) */ - {(3 << 18) | 0x33141, (4 << 18) | 0x08444, (5 << 18) | 0x289C6}, /* 08 (2447MHz) */ - {(3 << 18) | 0x33143, (4 << 18) | 0x0aeee, (5 << 18) | 0x289C6}, /* 09 (2452MHz) */ - {(3 << 18) | 0x33142, (4 << 18) | 0x0b333, (5 << 18) | 0x289C6}, /* 10 (2457MHz) */ - {(3 << 18) | 0x30941, (4 << 18) | 0x08444, (5 << 18) | 0x289C6}, /* 11 (2462MHz) */ - {(3 << 18) | 0x30943, (4 << 18) | 0x0aeee, (5 << 18) | 0x289C6}, /* 12 (2467MHz) */ - {(3 << 18) | 0x30942, (4 << 18) | 0x0b333, (5 << 18) | 0x289C6}, /* 13 (2472MHz) */ - {(3 << 18) | 0x32941, (4 << 18) | 0x09999, (5 << 18) | 0x289C6}, /* 14 (2484MHz) */ -}; - -static u32 max2829_channel_data_50[][4] = { - {36, (3 << 18) | 0x33cc3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A946}, /* 36 (5.180GHz) */ - {40, (3 << 18) | 0x302c0, (4 << 18) | 0x08000, (5 << 18) | 0x2A946}, /* 40 (5.200GHz) */ - {44, (3 << 18) | 0x302c2, (4 << 18) | 0x0b333, (5 << 18) | 0x2A946}, /* 44 (5.220GHz) */ - {48, (3 << 18) | 0x322c1, (4 << 18) | 0x09999, (5 << 18) | 0x2A946}, /* 48 (5.240GHz) */ - {52, (3 << 18) | 0x312c1, (4 << 18) | 0x0a666, (5 << 18) | 0x2A946}, /* 52 (5.260GHz) */ - {56, (3 << 18) | 0x332c3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A946}, /* 56 (5.280GHz) */ - {60, (3 << 18) | 0x30ac0, (4 << 18) | 0x08000, (5 << 18) | 0x2A946}, /* 60 (5.300GHz) */ - {64, (3 << 18) | 0x30ac2, (4 << 18) | 0x0b333, (5 << 18) | 0x2A946}, /* 64 (5.320GHz) */ - - {100, (3 << 18) | 0x30ec0, (4 << 18) | 0x08000, (5 << 18) | 0x2A9C6}, /* 100 (5.500GHz) */ - {104, (3 << 18) | 0x30ec2, (4 << 18) | 0x0b333, (5 << 18) | 0x2A9C6}, /* 104 (5.520GHz) */ - {108, (3 << 18) | 0x32ec1, (4 << 18) | 0x09999, (5 << 18) | 0x2A9C6}, /* 108 (5.540GHz) */ - {112, (3 << 18) | 0x31ec1, (4 << 18) | 0x0a666, (5 << 18) | 0x2A9C6}, /* 112 (5.560GHz) */ - {116, (3 << 18) | 0x33ec3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A9C6}, /* 116 (5.580GHz) */ - {120, (3 << 18) | 0x301c0, (4 << 18) | 0x08000, (5 << 18) | 0x2A9C6}, /* 120 (5.600GHz) */ - {124, (3 << 18) | 0x301c2, (4 << 18) | 0x0b333, (5 << 18) | 0x2A9C6}, /* 124 (5.620GHz) */ - {128, (3 << 18) | 0x321c1, (4 << 18) | 0x09999, (5 << 18) | 0x2A9C6}, /* 128 (5.640GHz) */ - {132, (3 << 18) | 0x311c1, (4 << 18) | 0x0a666, (5 << 18) | 0x2A9C6}, /* 132 (5.660GHz) */ - {136, (3 << 18) | 0x331c3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A9C6}, /* 136 (5.680GHz) */ - {140, (3 << 18) | 0x309c0, (4 << 18) | 0x08000, (5 << 18) | 0x2A9C6}, /* 140 (5.700GHz) */ - - {149, (3 << 18) | 0x329c2, (4 << 18) | 0x0b333, (5 << 18) | 0x2A9C6}, /* 149 (5.745GHz) */ - {153, (3 << 18) | 0x319c1, (4 << 18) | 0x09999, (5 << 18) | 0x2A9C6}, /* 153 (5.765GHz) */ - {157, (3 << 18) | 0x339c1, (4 << 18) | 0x0a666, (5 << 18) | 0x2A9C6}, /* 157 (5.785GHz) */ - {161, (3 << 18) | 0x305c3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A9C6}, /* 161 (5.805GHz) */ - - /* Japan */ - { 184, (3 << 18) | 0x308c2, (4 << 18) | 0x0b333, (5 << 18) | 0x2A946}, /* 184 (4.920GHz) */ - { 188, (3 << 18) | 0x328c1, (4 << 18) | 0x09999, (5 << 18) | 0x2A946}, /* 188 (4.940GHz) */ - { 192, (3 << 18) | 0x318c1, (4 << 18) | 0x0a666, (5 << 18) | 0x2A946}, /* 192 (4.960GHz) */ - { 196, (3 << 18) | 0x338c3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A946}, /* 196 (4.980GHz) */ - { 8, (3 << 18) | 0x324c1, (4 << 18) | 0x09999, (5 << 18) | 0x2A946}, /* 8 (5.040GHz) */ - { 12, (3 << 18) | 0x314c1, (4 << 18) | 0x0a666, (5 << 18) | 0x2A946}, /* 12 (5.060GHz) */ - { 16, (3 << 18) | 0x334c3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A946}, /* 16 (5.080GHz) */ - { 34, (3 << 18) | 0x31cc2, (4 << 18) | 0x0b333, (5 << 18) | 0x2A946}, /* 34 (5.170GHz) */ - { 38, (3 << 18) | 0x33cc1, (4 << 18) | 0x09999, (5 << 18) | 0x2A946}, /* 38 (5.190GHz) */ - { 42, (3 << 18) | 0x302c1, (4 << 18) | 0x0a666, (5 << 18) | 0x2A946}, /* 42 (5.210GHz) */ - { 46, (3 << 18) | 0x322c3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A946}, /* 46 (5.230GHz) */ -}; - -/* - * ==================================================================== - * For MAXIM2825/6/7 Ver. 317 or less - * - * 0x00 0x00080 - * 0x01 0x214c0 - * 0x02 0x13802 - * - * 2.4GHz Channels - * channe1 01 (2.412GHz); 0x03 0x30143 ;0x04 0x0accc - * channe1 02 (2.417GHz); 0x03 0x32140 ;0x04 0x09111 - * channe1 03 (2.422GHz); 0x03 0x32142 ;0x04 0x0bbbb - * channe1 04 (2.427GHz); 0x03 0x32143 ;0x04 0x0accc - * channe1 05 (2.432GHz); 0x03 0x31140 ;0x04 0x09111 - * channe1 06 (2.437GHz); 0x03 0x31142 ;0x04 0x0bbbb - * channe1 07 (2.442GHz); 0x03 0x31143 ;0x04 0x0accc - * channe1 08 (2.447GHz); 0x03 0x33140 ;0x04 0x09111 - * channe1 09 (2.452GHz); 0x03 0x33142 ;0x04 0x0bbbb - * channe1 10 (2.457GHz); 0x03 0x33143 ;0x04 0x0accc - * channe1 11 (2.462GHz); 0x03 0x30940 ;0x04 0x09111 - * channe1 12 (2.467GHz); 0x03 0x30942 ;0x04 0x0bbbb - * channe1 13 (2.472GHz); 0x03 0x30943 ;0x04 0x0accc - * - * 5.0Ghz Channels - * channel 36 (5.180GHz); 0x03 0x33cc0 ;0x04 0x0b333 - * channel 40 (5.200GHz); 0x03 0x302c0 ;0x04 0x08000 - * channel 44 (5.220GHz); 0x03 0x302c2 ;0x04 0x0b333 - * channel 48 (5.240GHz); 0x03 0x322c1 ;0x04 0x09999 - * channel 52 (5.260GHz); 0x03 0x312c1 ;0x04 0x0a666 - * channel 56 (5.280GHz); 0x03 0x332c3 ;0x04 0x08ccc - * channel 60 (5.300GHz); 0x03 0x30ac0 ;0x04 0x08000 - * channel 64 (5.320GHz); 0x03 0x30ac2 ;0x04 0x08333 - * - * 2.4GHz band ; 0x05 0x28986; - * 5.0GHz band ; 0x05 0x2a986 - * 0x06 0x18008 - * 0x07 0x38400 - * 0x08 0x05108 - * 0x09 0x27ff8 - * 0x0a 0x14000 - * 0x0b 0x37f99 - * 0x0c 0x0c000 - * ==================================================================== - */ - -/* - * =================================================================== - * AL2230 MP (Mass Production Version) - * RF Registers Setting for Airoha AL2230 silicon after June 1st, 2004 - * 20-bit length and LSB first - * - * Ch01 (2412MHz) ;0x00 0x09EFC ;0x01 0x8CCCC; - * Ch02 (2417MHz) ;0x00 0x09EFC ;0x01 0x8CCCD; - * Ch03 (2422MHz) ;0x00 0x09E7C ;0x01 0x8CCCC; - * Ch04 (2427MHz) ;0x00 0x09E7C ;0x01 0x8CCCD; - * Ch05 (2432MHz) ;0x00 0x05EFC ;0x01 0x8CCCC; - * Ch06 (2437MHz) ;0x00 0x05EFC ;0x01 0x8CCCD; - * Ch07 (2442MHz) ;0x00 0x05E7C ;0x01 0x8CCCC; - * Ch08 (2447MHz) ;0x00 0x05E7C ;0x01 0x8CCCD; - * Ch09 (2452MHz) ;0x00 0x0DEFC ;0x01 0x8CCCC; - * Ch10 (2457MHz) ;0x00 0x0DEFC ;0x01 0x8CCCD; - * Ch11 (2462MHz) ;0x00 0x0DE7C ;0x01 0x8CCCC; - * Ch12 (2467MHz) ;0x00 0x0DE7C ;0x01 0x8CCCD; - * Ch13 (2472MHz) ;0x00 0x03EFC ;0x01 0x8CCCC; - * Ch14 (2484Mhz) ;0x00 0x03E7C ;0x01 0x86666; - * - * 0x02 0x401D8; RXDCOC BW 100Hz for RXHP low - * 0x02 0x481DC; RXDCOC BW 30Khz for RXHP low - * - * 0x03 0xCFFF0 - * 0x04 0x23800 - * 0x05 0xA3B72 - * 0x06 0x6DA01 - * 0x07 0xE1688 - * 0x08 0x11600 - * 0x09 0x99E02 - * 0x0A 0x5DDB0 - * 0x0B 0xD9900 - * 0x0C 0x3FFBD - * 0x0D 0xB0000 - * 0x0F 0xF00A0 - * - * RF Calibration for Airoha AL2230 - * - * 0x0f 0xf00a0 ; Initial Setting - * 0x0f 0xf00b0 ; Activate TX DCC - * 0x0f 0xf02a0 ; Activate Phase Calibration - * 0x0f 0xf00e0 ; Activate Filter RC Calibration - * 0x0f 0xf00a0 ; Restore Initial Setting - * ================================================================== - */ -static u32 al2230_rf_data[] = { - (0x00 << 20) | 0x09EFC, - (0x01 << 20) | 0x8CCCC, - (0x02 << 20) | 0x40058, - (0x03 << 20) | 0xCFFF0, - (0x04 << 20) | 0x24100, - (0x05 << 20) | 0xA3B2F, - (0x06 << 20) | 0x6DA01, - (0x07 << 20) | 0xE3628, - (0x08 << 20) | 0x11600, - (0x09 << 20) | 0x9DC02, - (0x0A << 20) | 0x5ddb0, - (0x0B << 20) | 0xD9900, - (0x0C << 20) | 0x3FFBD, - (0x0D << 20) | 0xB0000, - (0x0F << 20) | 0xF01A0 -}; - -static u32 al2230s_rf_data[] = { - (0x00 << 20) | 0x09EFC, - (0x01 << 20) | 0x8CCCC, - (0x02 << 20) | 0x40058, - (0x03 << 20) | 0xCFFF0, - (0x04 << 20) | 0x24100, - (0x05 << 20) | 0xA3B2F, - (0x06 << 20) | 0x6DA01, - (0x07 << 20) | 0xE3628, - (0x08 << 20) | 0x11600, - (0x09 << 20) | 0x9DC02, - (0x0A << 20) | 0x5DDB0, - (0x0B << 20) | 0xD9900, - (0x0C << 20) | 0x3FFBD, - (0x0D << 20) | 0xB0000, - (0x0F << 20) | 0xF01A0 -}; - -static u32 al2230_channel_data_24[][2] = { - {(0x00 << 20) | 0x09EFC, (0x01 << 20) | 0x8CCCC}, /* channe1 01 */ - {(0x00 << 20) | 0x09EFC, (0x01 << 20) | 0x8CCCD}, /* channe1 02 */ - {(0x00 << 20) | 0x09E7C, (0x01 << 20) | 0x8CCCC}, /* channe1 03 */ - {(0x00 << 20) | 0x09E7C, (0x01 << 20) | 0x8CCCD}, /* channe1 04 */ - {(0x00 << 20) | 0x05EFC, (0x01 << 20) | 0x8CCCC}, /* channe1 05 */ - {(0x00 << 20) | 0x05EFC, (0x01 << 20) | 0x8CCCD}, /* channe1 06 */ - {(0x00 << 20) | 0x05E7C, (0x01 << 20) | 0x8CCCC}, /* channe1 07 */ - {(0x00 << 20) | 0x05E7C, (0x01 << 20) | 0x8CCCD}, /* channe1 08 */ - {(0x00 << 20) | 0x0DEFC, (0x01 << 20) | 0x8CCCC}, /* channe1 09 */ - {(0x00 << 20) | 0x0DEFC, (0x01 << 20) | 0x8CCCD}, /* channe1 10 */ - {(0x00 << 20) | 0x0DE7C, (0x01 << 20) | 0x8CCCC}, /* channe1 11 */ - {(0x00 << 20) | 0x0DE7C, (0x01 << 20) | 0x8CCCD}, /* channe1 12 */ - {(0x00 << 20) | 0x03EFC, (0x01 << 20) | 0x8CCCC}, /* channe1 13 */ - {(0x00 << 20) | 0x03E7C, (0x01 << 20) | 0x86666} /* channe1 14 */ -}; - -/* Current setting. u32 airoha_power_data_24[] = {(0x09 << 20) | 0x90202, (0x09 << 20) | 0x96602, (0x09 << 20) | 0x97602}; */ -#define AIROHA_TXVGA_LOW_INDEX 31 /* Index for 0x90202 */ -#define AIROHA_TXVGA_MIDDLE_INDEX 12 /* Index for 0x96602 */ -#define AIROHA_TXVGA_HIGH_INDEX 8 /* Index for 0x97602 1.0.24.0 1.0.28.0 */ - -static u32 al2230_txvga_data[][2] = { - /* value , index */ - {0x090202, 0}, - {0x094202, 2}, - {0x092202, 4}, - {0x096202, 6}, - {0x091202, 8}, - {0x095202, 10}, - {0x093202, 12}, - {0x097202, 14}, - {0x090A02, 16}, - {0x094A02, 18}, - {0x092A02, 20}, - {0x096A02, 22}, - {0x091A02, 24}, - {0x095A02, 26}, - {0x093A02, 28}, - {0x097A02, 30}, - {0x090602, 32}, - {0x094602, 34}, - {0x092602, 36}, - {0x096602, 38}, - {0x091602, 40}, - {0x095602, 42}, - {0x093602, 44}, - {0x097602, 46}, - {0x090E02, 48}, - {0x098E02, 49}, - {0x094E02, 50}, - {0x09CE02, 51}, - {0x092E02, 52}, - {0x09AE02, 53}, - {0x096E02, 54}, - {0x09EE02, 55}, - {0x091E02, 56}, - {0x099E02, 57}, - {0x095E02, 58}, - {0x09DE02, 59}, - {0x093E02, 60}, - {0x09BE02, 61}, - {0x097E02, 62}, - {0x09FE02, 63} -}; - -/* - * ========================================== - * For Airoha AL7230, 2.4Ghz band - * 24bit, MSB first - */ - -/* channel independent registers: */ -static u32 al7230_rf_data_24[] = { - (0x00 << 24) | 0x003790, - (0x01 << 24) | 0x133331, - (0x02 << 24) | 0x841FF2, - (0x03 << 24) | 0x3FDFA3, - (0x04 << 24) | 0x7FD784, - (0x05 << 24) | 0x802B55, - (0x06 << 24) | 0x56AF36, - (0x07 << 24) | 0xCE0207, - (0x08 << 24) | 0x6EBC08, - (0x09 << 24) | 0x221BB9, - (0x0A << 24) | 0xE0000A, - (0x0B << 24) | 0x08071B, - (0x0C << 24) | 0x000A3C, - (0x0D << 24) | 0xFFFFFD, - (0x0E << 24) | 0x00000E, - (0x0F << 24) | 0x1ABA8F -}; - -static u32 al7230_channel_data_24[][2] = { - {(0x00 << 24) | 0x003790, (0x01 << 24) | 0x133331}, /* channe1 01 */ - {(0x00 << 24) | 0x003790, (0x01 << 24) | 0x1B3331}, /* channe1 02 */ - {(0x00 << 24) | 0x003790, (0x01 << 24) | 0x033331}, /* channe1 03 */ - {(0x00 << 24) | 0x003790, (0x01 << 24) | 0x0B3331}, /* channe1 04 */ - {(0x00 << 24) | 0x0037A0, (0x01 << 24) | 0x133331}, /* channe1 05 */ - {(0x00 << 24) | 0x0037A0, (0x01 << 24) | 0x1B3331}, /* channe1 06 */ - {(0x00 << 24) | 0x0037A0, (0x01 << 24) | 0x033331}, /* channe1 07 */ - {(0x00 << 24) | 0x0037A0, (0x01 << 24) | 0x0B3331}, /* channe1 08 */ - {(0x00 << 24) | 0x0037B0, (0x01 << 24) | 0x133331}, /* channe1 09 */ - {(0x00 << 24) | 0x0037B0, (0x01 << 24) | 0x1B3331}, /* channe1 10 */ - {(0x00 << 24) | 0x0037B0, (0x01 << 24) | 0x033331}, /* channe1 11 */ - {(0x00 << 24) | 0x0037B0, (0x01 << 24) | 0x0B3331}, /* channe1 12 */ - {(0x00 << 24) | 0x0037C0, (0x01 << 24) | 0x133331}, /* channe1 13 */ - {(0x00 << 24) | 0x0037C0, (0x01 << 24) | 0x066661} /* channel 14 */ -}; - -/* channel independent registers: */ -static u32 al7230_rf_data_50[] = { - (0x00 << 24) | 0x0FF520, - (0x01 << 24) | 0x000001, - (0x02 << 24) | 0x451FE2, - (0x03 << 24) | 0x5FDFA3, - (0x04 << 24) | 0x6FD784, - (0x05 << 24) | 0x853F55, - (0x06 << 24) | 0x56AF36, - (0x07 << 24) | 0xCE0207, - (0x08 << 24) | 0x6EBC08, - (0x09 << 24) | 0x221BB9, - (0x0A << 24) | 0xE0600A, - (0x0B << 24) | 0x08044B, - (0x0C << 24) | 0x00143C, - (0x0D << 24) | 0xFFFFFD, - (0x0E << 24) | 0x00000E, - (0x0F << 24) | 0x12BACF /* 5Ghz default state */ -}; - -static u32 al7230_channel_data_5[][4] = { - /* channel dependent registers: 0x00, 0x01 and 0x04 */ - /* 11J =========== */ - {184, (0x00 << 24) | 0x0FF520, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 184 */ - {188, (0x00 << 24) | 0x0FF520, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 188 */ - {192, (0x00 << 24) | 0x0FF530, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 192 */ - {196, (0x00 << 24) | 0x0FF530, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 196 */ - {8, (0x00 << 24) | 0x0FF540, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 008 */ - {12, (0x00 << 24) | 0x0FF540, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 012 */ - {16, (0x00 << 24) | 0x0FF550, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 016 */ - {34, (0x00 << 24) | 0x0FF560, (0x01 << 24) | 0x055551, (0x04 << 24) | 0x77F784}, /* channel 034 */ - {38, (0x00 << 24) | 0x0FF570, (0x01 << 24) | 0x100001, (0x04 << 24) | 0x77F784}, /* channel 038 */ - {42, (0x00 << 24) | 0x0FF570, (0x01 << 24) | 0x1AAAA1, (0x04 << 24) | 0x77F784}, /* channel 042 */ - {46, (0x00 << 24) | 0x0FF570, (0x01 << 24) | 0x055551, (0x04 << 24) | 0x77F784}, /* channel 046 */ - /* 11 A/H ========= */ - {36, (0x00 << 24) | 0x0FF560, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 036 */ - {40, (0x00 << 24) | 0x0FF570, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 040 */ - {44, (0x00 << 24) | 0x0FF570, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 044 */ - {48, (0x00 << 24) | 0x0FF570, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 048 */ - {52, (0x00 << 24) | 0x0FF580, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 052 */ - {56, (0x00 << 24) | 0x0FF580, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 056 */ - {60, (0x00 << 24) | 0x0FF580, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 060 */ - {64, (0x00 << 24) | 0x0FF590, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 064 */ - {100, (0x00 << 24) | 0x0FF5C0, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 100 */ - {104, (0x00 << 24) | 0x0FF5C0, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 104 */ - {108, (0x00 << 24) | 0x0FF5C0, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 108 */ - {112, (0x00 << 24) | 0x0FF5D0, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 112 */ - {116, (0x00 << 24) | 0x0FF5D0, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 116 */ - {120, (0x00 << 24) | 0x0FF5D0, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 120 */ - {124, (0x00 << 24) | 0x0FF5E0, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 124 */ - {128, (0x00 << 24) | 0x0FF5E0, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 128 */ - {132, (0x00 << 24) | 0x0FF5E0, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 132 */ - {136, (0x00 << 24) | 0x0FF5F0, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 136 */ - {140, (0x00 << 24) | 0x0FF5F0, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 140 */ - {149, (0x00 << 24) | 0x0FF600, (0x01 << 24) | 0x180001, (0x04 << 24) | 0x77F784}, /* channel 149 */ - {153, (0x00 << 24) | 0x0FF600, (0x01 << 24) | 0x02AAA1, (0x04 << 24) | 0x77F784}, /* channel 153 */ - {157, (0x00 << 24) | 0x0FF600, (0x01 << 24) | 0x0D5551, (0x04 << 24) | 0x77F784}, /* channel 157 */ - {161, (0x00 << 24) | 0x0FF610, (0x01 << 24) | 0x180001, (0x04 << 24) | 0x77F784}, /* channel 161 */ - {165, (0x00 << 24) | 0x0FF610, (0x01 << 24) | 0x02AAA1, (0x04 << 24) | 0x77F784} /* channel 165 */ -}; - -/* - * RF Calibration <=== Register 0x0F - * 0x0F 0x1ABA8F; start from 2.4Ghz default state - * 0x0F 0x9ABA8F; TXDC compensation - * 0x0F 0x3ABA8F; RXFIL adjustment - * 0x0F 0x1ABA8F; restore 2.4Ghz default state - */ - -/* TXVGA Mapping Table <=== Register 0x0B */ -static u32 al7230_txvga_data[][2] = { - {0x08040B, 0}, /* TXVGA = 0; */ - {0x08041B, 1}, /* TXVGA = 1; */ - {0x08042B, 2}, /* TXVGA = 2; */ - {0x08043B, 3}, /* TXVGA = 3; */ - {0x08044B, 4}, /* TXVGA = 4; */ - {0x08045B, 5}, /* TXVGA = 5; */ - {0x08046B, 6}, /* TXVGA = 6; */ - {0x08047B, 7}, /* TXVGA = 7; */ - {0x08048B, 8}, /* TXVGA = 8; */ - {0x08049B, 9}, /* TXVGA = 9; */ - {0x0804AB, 10}, /* TXVGA = 10; */ - {0x0804BB, 11}, /* TXVGA = 11; */ - {0x0804CB, 12}, /* TXVGA = 12; */ - {0x0804DB, 13}, /* TXVGA = 13; */ - {0x0804EB, 14}, /* TXVGA = 14; */ - {0x0804FB, 15}, /* TXVGA = 15; */ - {0x08050B, 16}, /* TXVGA = 16; */ - {0x08051B, 17}, /* TXVGA = 17; */ - {0x08052B, 18}, /* TXVGA = 18; */ - {0x08053B, 19}, /* TXVGA = 19; */ - {0x08054B, 20}, /* TXVGA = 20; */ - {0x08055B, 21}, /* TXVGA = 21; */ - {0x08056B, 22}, /* TXVGA = 22; */ - {0x08057B, 23}, /* TXVGA = 23; */ - {0x08058B, 24}, /* TXVGA = 24; */ - {0x08059B, 25}, /* TXVGA = 25; */ - {0x0805AB, 26}, /* TXVGA = 26; */ - {0x0805BB, 27}, /* TXVGA = 27; */ - {0x0805CB, 28}, /* TXVGA = 28; */ - {0x0805DB, 29}, /* TXVGA = 29; */ - {0x0805EB, 30}, /* TXVGA = 30; */ - {0x0805FB, 31}, /* TXVGA = 31; */ - {0x08060B, 32}, /* TXVGA = 32; */ - {0x08061B, 33}, /* TXVGA = 33; */ - {0x08062B, 34}, /* TXVGA = 34; */ - {0x08063B, 35}, /* TXVGA = 35; */ - {0x08064B, 36}, /* TXVGA = 36; */ - {0x08065B, 37}, /* TXVGA = 37; */ - {0x08066B, 38}, /* TXVGA = 38; */ - {0x08067B, 39}, /* TXVGA = 39; */ - {0x08068B, 40}, /* TXVGA = 40; */ - {0x08069B, 41}, /* TXVGA = 41; */ - {0x0806AB, 42}, /* TXVGA = 42; */ - {0x0806BB, 43}, /* TXVGA = 43; */ - {0x0806CB, 44}, /* TXVGA = 44; */ - {0x0806DB, 45}, /* TXVGA = 45; */ - {0x0806EB, 46}, /* TXVGA = 46; */ - {0x0806FB, 47}, /* TXVGA = 47; */ - {0x08070B, 48}, /* TXVGA = 48; */ - {0x08071B, 49}, /* TXVGA = 49; */ - {0x08072B, 50}, /* TXVGA = 50; */ - {0x08073B, 51}, /* TXVGA = 51; */ - {0x08074B, 52}, /* TXVGA = 52; */ - {0x08075B, 53}, /* TXVGA = 53; */ - {0x08076B, 54}, /* TXVGA = 54; */ - {0x08077B, 55}, /* TXVGA = 55; */ - {0x08078B, 56}, /* TXVGA = 56; */ - {0x08079B, 57}, /* TXVGA = 57; */ - {0x0807AB, 58}, /* TXVGA = 58; */ - {0x0807BB, 59}, /* TXVGA = 59; */ - {0x0807CB, 60}, /* TXVGA = 60; */ - {0x0807DB, 61}, /* TXVGA = 61; */ - {0x0807EB, 62}, /* TXVGA = 62; */ - {0x0807FB, 63}, /* TXVGA = 63; */ -}; -/* ============================================= */ - -/* - * W89RF242 RFIC SPI programming initial data - * Winbond WLAN 11g RFIC BB-SPI register -- version FA5976A rev 1.3b - */ -static u32 w89rf242_rf_data[] = { - (0x00 << 24) | 0xF86100, /* 3E184; MODA (0x00) -- Normal mode ; calibration off */ - (0x01 << 24) | 0xEFFFC2, /* 3BFFF; MODB (0x01) -- turn off RSSI, and other circuits are turned on */ - (0x02 << 24) | 0x102504, /* 04094; FSET (0x02) -- default 20MHz crystal ; Icmp=1.5mA */ - (0x03 << 24) | 0x026286, /* 0098A; FCHN (0x03) -- default CH7, 2442MHz */ - (0x04 << 24) | 0x000208, /* 02008; FCAL (0x04) -- XTAL Freq Trim=001000 (socket board#1); FA5976AYG_v1.3C */ - (0x05 << 24) | 0x24C60A, /* 09316; GANA (0x05) -- TX VGA default (TXVGA=0x18(12)) & TXGPK=110 ; FA5976A_1.3D */ - (0x06 << 24) | 0x3432CC, /* 0D0CB; GANB (0x06) -- RXDC(DC offset) on; LNA=11; RXVGA=001011(11) ; RXFLSW=11(010001); RXGPK=00; RXGCF=00; -50dBm input */ - (0x07 << 24) | 0x0C68CE, /* 031A3; FILT (0x07) -- TX/RX filter with auto-tuning; TFLBW=011; RFLBW=100 */ - (0x08 << 24) | 0x100010, /* 04000; TCAL (0x08) -- for LO */ - (0x09 << 24) | 0x004012, /* 1B900; RCALA (0x09) -- FASTS=11; HPDE=01 (100nsec); SEHP=1 (select B0 pin=RXHP); RXHP=1 (Turn on RXHP function)(FA5976A_1.3C) */ - (0x0A << 24) | 0x704014, /* 1C100; RCALB (0x0A) */ - (0x0B << 24) | 0x18BDD6, /* 062F7; IQCAL (0x0B) -- Turn on LO phase tuner=0111 & RX-LO phase = 0111; FA5976A_1.3B */ - (0x0C << 24) | 0x575558, /* 15D55 ; IBSA (0x0C) -- IFPre =11 ; TC5376A_v1.3A for corner */ - (0x0D << 24) | 0x55545A, /* 15555 ; IBSB (0x0D) */ - (0x0E << 24) | 0x5557DC, /* 1555F ; IBSC (0x0E) -- IRLNA & IRLNB (PTAT & Const current)=01/01; FA5976B_1.3F */ - (0x10 << 24) | 0x000C20, /* 00030 ; TMODA (0x10) -- LNA_gain_step=0011 ; LNA=15/16dB */ - (0x11 << 24) | 0x0C0022, /* 03000 ; TMODB (0x11) -- Turn ON RX-Q path Test Switch; To improve IQ path group delay (FA5976A_1.3C) */ - (0x12 << 24) | 0x000024 /* TMODC (0x12) -- Turn OFF Temperature sensor */ -}; - -static u32 w89rf242_channel_data_24[][2] = { - {(0x03 << 24) | 0x025B06, (0x04 << 24) | 0x080408}, /* channe1 01 */ - {(0x03 << 24) | 0x025C46, (0x04 << 24) | 0x080408}, /* channe1 02 */ - {(0x03 << 24) | 0x025D86, (0x04 << 24) | 0x080408}, /* channe1 03 */ - {(0x03 << 24) | 0x025EC6, (0x04 << 24) | 0x080408}, /* channe1 04 */ - {(0x03 << 24) | 0x026006, (0x04 << 24) | 0x080408}, /* channe1 05 */ - {(0x03 << 24) | 0x026146, (0x04 << 24) | 0x080408}, /* channe1 06 */ - {(0x03 << 24) | 0x026286, (0x04 << 24) | 0x080408}, /* channe1 07 */ - {(0x03 << 24) | 0x0263C6, (0x04 << 24) | 0x080408}, /* channe1 08 */ - {(0x03 << 24) | 0x026506, (0x04 << 24) | 0x080408}, /* channe1 09 */ - {(0x03 << 24) | 0x026646, (0x04 << 24) | 0x080408}, /* channe1 10 */ - {(0x03 << 24) | 0x026786, (0x04 << 24) | 0x080408}, /* channe1 11 */ - {(0x03 << 24) | 0x0268C6, (0x04 << 24) | 0x080408}, /* channe1 12 */ - {(0x03 << 24) | 0x026A06, (0x04 << 24) | 0x080408}, /* channe1 13 */ - {(0x03 << 24) | 0x026D06, (0x04 << 24) | 0x080408} /* channe1 14 */ -}; - -static u32 w89rf242_txvga_old_mapping[][2] = { - {0, 0} , /* New <-> Old */ - {1, 1} , - {2, 2} , - {3, 3} , - {4, 4} , - {6, 5} , - {8, 6}, - {10, 7}, - {12, 8}, - {14, 9}, - {16, 10}, - {18, 11}, - {20, 12}, - {22, 13}, - {24, 14}, - {26, 15}, - {28, 16}, - {30, 17}, - {32, 18}, - {34, 19}, -}; - -static u32 w89rf242_txvga_data[][5] = { - /* low gain mode */ - {(0x05 << 24) | 0x24C00A, 0, 0x00292315, 0x0800FEFF, 0x52523131}, /* min gain */ - {(0x05 << 24) | 0x24C80A, 1, 0x00292315, 0x0800FEFF, 0x52523131}, - {(0x05 << 24) | 0x24C04A, 2, 0x00292315, 0x0800FEFF, 0x52523131}, /* (default) +14dBm (ANT) */ - {(0x05 << 24) | 0x24C84A, 3, 0x00292315, 0x0800FEFF, 0x52523131}, - - /* TXVGA=0x10 */ - {(0x05 << 24) | 0x24C40A, 4, 0x00292315, 0x0800FEFF, 0x60603838}, - {(0x05 << 24) | 0x24C40A, 5, 0x00262114, 0x0700FEFF, 0x65653B3B}, - - /* TXVGA=0x11 */ - { (0x05 << 24) | 0x24C44A, 6, 0x00241F13, 0x0700FFFF, 0x58583333}, - { (0x05 << 24) | 0x24C44A, 7, 0x00292315, 0x0800FEFF, 0x5E5E3737}, - - /* TXVGA=0x12 */ - {(0x05 << 24) | 0x24C48A, 8, 0x00262114, 0x0700FEFF, 0x53533030}, - {(0x05 << 24) | 0x24C48A, 9, 0x00241F13, 0x0700FFFF, 0x59593434}, - - /* TXVGA=0x13 */ - {(0x05 << 24) | 0x24C4CA, 10, 0x00292315, 0x0800FEFF, 0x52523030}, - {(0x05 << 24) | 0x24C4CA, 11, 0x00262114, 0x0700FEFF, 0x56563232}, - - /* TXVGA=0x14 */ - {(0x05 << 24) | 0x24C50A, 12, 0x00292315, 0x0800FEFF, 0x54543131}, - {(0x05 << 24) | 0x24C50A, 13, 0x00262114, 0x0700FEFF, 0x58583434}, - - /* TXVGA=0x15 */ - {(0x05 << 24) | 0x24C54A, 14, 0x00292315, 0x0800FEFF, 0x54543131}, - {(0x05 << 24) | 0x24C54A, 15, 0x00262114, 0x0700FEFF, 0x59593434}, - - /* TXVGA=0x16 */ - {(0x05 << 24) | 0x24C58A, 16, 0x00292315, 0x0800FEFF, 0x55553131}, - {(0x05 << 24) | 0x24C58A, 17, 0x00292315, 0x0800FEFF, 0x5B5B3535}, - - /* TXVGA=0x17 */ - {(0x05 << 24) | 0x24C5CA, 18, 0x00262114, 0x0700FEFF, 0x51512F2F}, - {(0x05 << 24) | 0x24C5CA, 19, 0x00241F13, 0x0700FFFF, 0x55553131}, - - /* TXVGA=0x18 */ - {(0x05 << 24) | 0x24C60A, 20, 0x00292315, 0x0800FEFF, 0x4F4F2E2E}, - {(0x05 << 24) | 0x24C60A, 21, 0x00262114, 0x0700FEFF, 0x53533030}, - - /* TXVGA=0x19 */ - {(0x05 << 24) | 0x24C64A, 22, 0x00292315, 0x0800FEFF, 0x4E4E2D2D}, - {(0x05 << 24) | 0x24C64A, 23, 0x00262114, 0x0700FEFF, 0x53533030}, - - /* TXVGA=0x1A */ - {(0x05 << 24) | 0x24C68A, 24, 0x00292315, 0x0800FEFF, 0x50502E2E}, - {(0x05 << 24) | 0x24C68A, 25, 0x00262114, 0x0700FEFF, 0x55553131}, - - /* TXVGA=0x1B */ - {(0x05 << 24) | 0x24C6CA, 26, 0x00262114, 0x0700FEFF, 0x53533030}, - {(0x05 << 24) | 0x24C6CA, 27, 0x00292315, 0x0800FEFF, 0x5A5A3434}, - - /* TXVGA=0x1C */ - {(0x05 << 24) | 0x24C70A, 28, 0x00292315, 0x0800FEFF, 0x55553131}, - {(0x05 << 24) | 0x24C70A, 29, 0x00292315, 0x0800FEFF, 0x5D5D3636}, - - /* TXVGA=0x1D */ - {(0x05 << 24) | 0x24C74A, 30, 0x00292315, 0x0800FEFF, 0x5F5F3737}, - {(0x05 << 24) | 0x24C74A, 31, 0x00262114, 0x0700FEFF, 0x65653B3B}, - - /* TXVGA=0x1E */ - {(0x05 << 24) | 0x24C78A, 32, 0x00292315, 0x0800FEFF, 0x66663B3B}, - {(0x05 << 24) | 0x24C78A, 33, 0x00262114, 0x0700FEFF, 0x70704141}, - - /* TXVGA=0x1F */ - {(0x05 << 24) | 0x24C7CA, 34, 0x00292315, 0x0800FEFF, 0x72724242} -}; - -/* ================================================================================================== */ - - - -/* - * ============================================================================================================= - * Uxx_ReadEthernetAddress -- - * - * Routine Description: - * Reads in the Ethernet address from the IC. - * - * Arguments: - * pHwData - The pHwData structure - * - * Return Value: - * - * The address is stored in EthernetIDAddr. - * ============================================================================================================= - */ -void Uxx_ReadEthernetAddress(struct hw_data *pHwData) -{ - u32 ltmp; - - /* - * Reading Ethernet address from EEPROM and set into hardware due to MAC address maybe change. - * Only unplug and plug again can make hardware read EEPROM again. - */ - Wb35Reg_WriteSync(pHwData, 0x03b4, 0x08000000); /* Start EEPROM access + Read + address(0x0d) */ - Wb35Reg_ReadSync(pHwData, 0x03b4, <mp); - *(u16 *)pHwData->PermanentMacAddress = cpu_to_le16((u16) ltmp); - Wb35Reg_WriteSync(pHwData, 0x03b4, 0x08010000); /* Start EEPROM access + Read + address(0x0d) */ - Wb35Reg_ReadSync(pHwData, 0x03b4, <mp); - *(u16 *)(pHwData->PermanentMacAddress + 2) = cpu_to_le16((u16) ltmp); - Wb35Reg_WriteSync(pHwData, 0x03b4, 0x08020000); /* Start EEPROM access + Read + address(0x0d) */ - Wb35Reg_ReadSync(pHwData, 0x03b4, <mp); - *(u16 *)(pHwData->PermanentMacAddress + 4) = cpu_to_le16((u16) ltmp); - *(u16 *)(pHwData->PermanentMacAddress + 6) = 0; - Wb35Reg_WriteSync(pHwData, 0x03e8, cpu_to_le32(*(u32 *)pHwData->PermanentMacAddress)); - Wb35Reg_WriteSync(pHwData, 0x03ec, cpu_to_le32(*(u32 *)(pHwData->PermanentMacAddress + 4))); -} - - -/* - * =============================================================================================================== - * CardGetMulticastBit -- - * Description: - * For a given multicast address, returns the byte and bit in the card multicast registers that it hashes to. - * Calls CardComputeCrc() to determine the CRC value. - * Arguments: - * Address - the address - * Byte - the byte that it hashes to - * Value - will have a 1 in the relevant bit - * Return Value: - * None. - * ============================================================================================================== - */ -void CardGetMulticastBit(u8 Address[ETH_ALEN], u8 *Byte, u8 *Value) -{ - u32 Crc; - u32 BitNumber; - - /* First compute the CRC. */ - Crc = CardComputeCrc(Address, ETH_ALEN); - - /* The computed CRC is bit0~31 from left to right */ - /* At first we should do right shift 25bits, and read 7bits by using '&', 2^7=128 */ - BitNumber = (u32) ((Crc >> 26) & 0x3f); - - *Byte = (u8) (BitNumber >> 3); /* 900514 original (BitNumber / 8) */ - *Value = (u8) ((u8) 1 << (BitNumber % 8)); -} - -void Uxx_power_on_procedure(struct hw_data *pHwData) -{ - u32 ltmp, loop; - - if (pHwData->phy_type <= RF_MAXIM_V1) - Wb35Reg_WriteSync(pHwData, 0x03d4, 0xffffff38); - else { - Wb35Reg_WriteSync(pHwData, 0x03f4, 0xFF5807FF); - Wb35Reg_WriteSync(pHwData, 0x03d4, 0x80); /* regulator on only */ - msleep(10); - Wb35Reg_WriteSync(pHwData, 0x03d4, 0xb8); /* REG_ON RF_RSTN on, and */ - msleep(10); - ltmp = 0x4968; - if ((pHwData->phy_type == RF_WB_242) || - (RF_WB_242_1 == pHwData->phy_type)) - ltmp = 0x4468; - - Wb35Reg_WriteSync(pHwData, 0x03d0, ltmp); - Wb35Reg_WriteSync(pHwData, 0x03d4, 0xa0); /* PLL_PD REF_PD set to 0 */ - - msleep(20); - Wb35Reg_ReadSync(pHwData, 0x03d0, <mp); - loop = 500; /* Wait for 5 second */ - while (!(ltmp & 0x20) && loop--) { - msleep(10); - if (!Wb35Reg_ReadSync(pHwData, 0x03d0, <mp)) - break; - } - - Wb35Reg_WriteSync(pHwData, 0x03d4, 0xe0); /* MLK_EN */ - } - - Wb35Reg_WriteSync(pHwData, 0x03b0, 1); /* Reset hardware first */ - msleep(10); - - /* Set burst write delay */ - Wb35Reg_WriteSync(pHwData, 0x03f8, 0x7ff); -} - -static void Set_ChanIndep_RfData_al7230_24(struct hw_data *pHwData, u32 *pltmp, - char number) -{ - u8 i; - for (i = 0; i < number; i++) { - pHwData->phy_para[i] = al7230_rf_data_24[i]; - pltmp[i] = (1 << 31) | (0 << 30) | (24 << 24) | (al7230_rf_data_24[i] & 0xffffff); - } -} - -static void Set_ChanIndep_RfData_al7230_50(struct hw_data *pHwData, u32 *pltmp, - char number) -{ - u8 i; - for (i = 0; i < number; i++) { - pHwData->phy_para[i] = al7230_rf_data_50[i]; - pltmp[i] = (1 << 31) | (0 << 30) | (24 << 24) | (al7230_rf_data_50[i] & 0xffffff); - } -} - - -/* - * ============================================================================================================= - * RFSynthesizer_initial -- - * ============================================================================================================= - */ -void RFSynthesizer_initial(struct hw_data *pHwData) -{ - u32 altmp[32]; - u32 *pltmp = altmp; - u32 ltmp; - u8 number = 0x00; /* The number of register vale */ - u8 i; - - /* - * bit[31] SPI Enable. - * 1=perform synthesizer program operation. This bit will - * cleared automatically after the operation is completed. - * bit[30] SPI R/W Control - * 0=write, 1=read - * bit[29:24] SPI Data Format Length - * bit[17:4 ] RF Data bits. - * bit[3 :0 ] RF address. - */ - switch (pHwData->phy_type) { - case RF_MAXIM_2825: - case RF_MAXIM_V1: /* 11g Winbond 2nd BB(with Phy board (v1) + Maxim 331) */ - number = ARRAY_SIZE(max2825_rf_data); - for (i = 0; i < number; i++) { - pHwData->phy_para[i] = max2825_rf_data[i]; /* Backup Rf parameter */ - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2825_rf_data[i], 18); - } - break; - case RF_MAXIM_2827: - number = ARRAY_SIZE(max2827_rf_data); - for (i = 0; i < number; i++) { - pHwData->phy_para[i] = max2827_rf_data[i]; - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2827_rf_data[i], 18); - } - break; - case RF_MAXIM_2828: - number = ARRAY_SIZE(max2828_rf_data); - for (i = 0; i < number; i++) { - pHwData->phy_para[i] = max2828_rf_data[i]; - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2828_rf_data[i], 18); - } - break; - case RF_MAXIM_2829: - number = ARRAY_SIZE(max2829_rf_data); - for (i = 0; i < number; i++) { - pHwData->phy_para[i] = max2829_rf_data[i]; - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2829_rf_data[i], 18); - } - break; - case RF_AIROHA_2230: - number = ARRAY_SIZE(al2230_rf_data); - for (i = 0; i < number; i++) { - pHwData->phy_para[i] = al2230_rf_data[i]; - pltmp[i] = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse(al2230_rf_data[i], 20); - } - break; - case RF_AIROHA_2230S: - number = ARRAY_SIZE(al2230s_rf_data); - for (i = 0; i < number; i++) { - pHwData->phy_para[i] = al2230s_rf_data[i]; - pltmp[i] = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse(al2230s_rf_data[i], 20); - } - break; - case RF_AIROHA_7230: - /* Start to fill RF parameters, PLL_ON should be pulled low. */ - Wb35Reg_WriteSync(pHwData, 0x03dc, 0x00000000); - pr_debug("* PLL_ON low\n"); - number = ARRAY_SIZE(al7230_rf_data_24); - Set_ChanIndep_RfData_al7230_24(pHwData, pltmp, number); - break; - case RF_WB_242: - case RF_WB_242_1: - number = ARRAY_SIZE(w89rf242_rf_data); - for (i = 0; i < number; i++) { - ltmp = w89rf242_rf_data[i]; - if (i == 4) { /* Update the VCO trim from EEPROM */ - ltmp &= ~0xff0; /* Mask bit4 ~bit11 */ - ltmp |= pHwData->VCO_trim << 4; - } - - pHwData->phy_para[i] = ltmp; - pltmp[i] = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse(ltmp, 24); - } - break; - } - - pHwData->phy_number = number; - - /* The 16 is the maximum capability of hardware. Here use 12 */ - if (number > 12) { - for (i = 0; i < 12; i++) /* For Al2230 */ - Wb35Reg_WriteSync(pHwData, 0x0864, pltmp[i]); - - pltmp += 12; - number -= 12; - } - - /* Write to register. number must less and equal than 16 */ - for (i = 0; i < number; i++) - Wb35Reg_WriteSync(pHwData, 0x864, pltmp[i]); - - /* Calibration only 1 time */ - if (pHwData->CalOneTime) - return; - pHwData->CalOneTime = 1; - - switch (pHwData->phy_type) { - case RF_AIROHA_2230: - ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse((0x07 << 20) | 0xE168E, 20); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(10); - ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse(al2230_rf_data[7], 20); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(10); - case RF_AIROHA_2230S: - Wb35Reg_WriteSync(pHwData, 0x03d4, 0x80); /* regulator on only */ - msleep(10); - Wb35Reg_WriteSync(pHwData, 0x03d4, 0xa0); /* PLL_PD REF_PD set to 0 */ - msleep(10); - Wb35Reg_WriteSync(pHwData, 0x03d4, 0xe0); /* MLK_EN */ - Wb35Reg_WriteSync(pHwData, 0x03b0, 1); /* Reset hardware first */ - msleep(10); - /* ========================================================= */ - - /* The follow code doesn't use the burst-write mode */ - ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse((0x0F<<20) | 0xF01A0, 20); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - - ltmp = pHwData->reg.BB5C & 0xfffff000; - Wb35Reg_WriteSync(pHwData, 0x105c, ltmp); - pHwData->reg.BB50 |= 0x13; /* (MASK_IQCAL_MODE|MASK_CALIB_START) */ - Wb35Reg_WriteSync(pHwData, 0x1050, pHwData->reg.BB50); - msleep(5); - - ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse((0x0F << 20) | 0xF01B0, 20); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(5); - - ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse((0x0F << 20) | 0xF01E0, 20); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(5); - - ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse((0x0F << 20) | 0xF01A0, 20); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - - Wb35Reg_WriteSync(pHwData, 0x105c, pHwData->reg.BB5C); - pHwData->reg.BB50 &= ~0x13; /* (MASK_IQCAL_MODE|MASK_CALIB_START); */ - Wb35Reg_WriteSync(pHwData, 0x1050, pHwData->reg.BB50); - break; - case RF_AIROHA_7230: - /* RF parameters have filled completely, PLL_ON should be pulled high */ - Wb35Reg_WriteSync(pHwData, 0x03dc, 0x00000080); - pr_debug("* PLL_ON high\n"); - - /* 2.4GHz */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x9ABA8F; - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(5); - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x3ABA8F; - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(5); - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x1ABA8F; - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(5); - - /* 5GHz */ - Wb35Reg_WriteSync(pHwData, 0x03dc, 0x00000000); - pr_debug("* PLL_ON low\n"); - - number = ARRAY_SIZE(al7230_rf_data_50); - Set_ChanIndep_RfData_al7230_50(pHwData, pltmp, number); - /* Write to register. number must less and equal than 16 */ - for (i = 0; i < number; i++) - Wb35Reg_WriteSync(pHwData, 0x0864, pltmp[i]); - msleep(5); - - Wb35Reg_WriteSync(pHwData, 0x03dc, 0x00000080); - pr_debug("* PLL_ON high\n"); - - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x9ABA8F; - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(5); - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x3ABA8F; - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(5); - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x12BACF; - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(5); - break; - case RF_WB_242: - case RF_WB_242_1: - /* for FA5976A */ - ltmp = pHwData->reg.BB5C & 0xfffff000; - Wb35Reg_WriteSync(pHwData, 0x105c, ltmp); - Wb35Reg_WriteSync(pHwData, 0x1058, 0); - pHwData->reg.BB50 |= 0x3; /* (MASK_IQCAL_MODE|MASK_CALIB_START); */ - Wb35Reg_WriteSync(pHwData, 0x1050, pHwData->reg.BB50); - - /* ----- Calibration (1). VCO frequency calibration */ - /* Calibration (1a.0). Synthesizer reset */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x0F<<24) | 0x00101E, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(5); - /* Calibration (1a). VCO frequency calibration mode ; waiting 2msec VCO calibration time */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFE69c0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(2); - - /* ----- Calibration (2). TX baseband Gm-C filter auto-tuning */ - /* Calibration (2a). turn off ENCAL signal */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xF8EBC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - /* Calibration (2b.0). TX filter auto-tuning BW: TFLBW=101 (TC5376A default) */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x07<<24) | 0x0C68CE, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - /* Calibration (2b). send TX reset signal */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x0F<<24) | 0x00201E, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - /* Calibration (2c). turn-on TX Gm-C filter auto-tuning */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFCEBC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - udelay(150); /* Sleep 150 us */ - /* turn off ENCAL signal */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xF8EBC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - - /* ----- Calibration (3). RX baseband Gm-C filter auto-tuning */ - /* Calibration (3a). turn off ENCAL signal */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFAEDC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - /* Calibration (3b.0). RX filter auto-tuning BW: RFLBW=100 (TC5376A+corner default;) */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x07<<24) | 0x0C68CE, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - /* Calibration (3b). send RX reset signal */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x0F<<24) | 0x00401E, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - /* Calibration (3c). turn-on RX Gm-C filter auto-tuning */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFEEDC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - udelay(150); /* Sleep 150 us */ - /* Calibration (3e). turn off ENCAL signal */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFAEDC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - - /* ----- Calibration (4). TX LO leakage calibration */ - /* Calibration (4a). TX LO leakage calibration */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFD6BC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - udelay(150); /* Sleep 150 us */ - - /* ----- Calibration (5). RX DC offset calibration */ - /* Calibration (5a). turn off ENCAL signal and set to RX SW DC calibration mode */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFAEDC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - /* Calibration (5b). turn off AGC servo-loop & RSSI */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x01<<24) | 0xEBFFC2, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - - /* for LNA=11 -------- */ - /* Calibration (5c-h). RX DC offset current bias ON; & LNA=11; RXVGA=111111 */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x06<<24) | 0x343FCC, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - /* Calibration (5d). turn on RX DC offset cal function; and waiting 2 msec cal time */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFF6DC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(2); - /* Calibration (5f). turn off ENCAL signal */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFAEDC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - - /* for LNA=10 -------- */ - /* Calibration (5c-m). RX DC offset current bias ON; & LNA=10; RXVGA=111111 */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x06<<24) | 0x342FCC, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - /* Calibration (5d). turn on RX DC offset cal function; and waiting 2 msec cal time */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFF6DC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(2); - /* Calibration (5f). turn off ENCAL signal */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFAEDC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - - /* for LNA=01 -------- */ - /* Calibration (5c-m). RX DC offset current bias ON; & LNA=01; RXVGA=111111 */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x06<<24) | 0x341FCC, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - /* Calibration (5d). turn on RX DC offset cal function; and waiting 2 msec cal time */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFF6DC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(2); - /* Calibration (5f). turn off ENCAL signal */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFAEDC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - - /* for LNA=00 -------- */ - /* Calibration (5c-l). RX DC offset current bias ON; & LNA=00; RXVGA=111111 */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x06<<24) | 0x340FCC, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - /* Calibration (5d). turn on RX DC offset cal function; and waiting 2 msec cal time */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFF6DC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(2); - /* Calibration (5f). turn off ENCAL signal */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFAEDC0, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - /* Calibration (5g). turn on AGC servo-loop */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x01<<24) | 0xEFFFC2, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - - /* ----- Calibration (7). Switch RF chip to normal mode */ - /* 0x00 0xF86100 ; 3E184 ; Switch RF chip to normal mode */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xF86100, 24); - Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); - msleep(5); - break; - } -} - -static void BBProcessor_AL7230_2400(struct hw_data *pHwData) -{ - struct wb35_reg *reg = &pHwData->reg; - u32 pltmp[12]; - - pltmp[0] = 0x16A8337A; /* 0x1000 AGC_Ctrl1 */ - pltmp[1] = 0x9AFF9AA6; /* 0x1004 AGC_Ctrl2 */ - pltmp[2] = 0x55D00A04; /* 0x1008 AGC_Ctrl3 */ - pltmp[3] = 0xFFF72031; /* 0x100c AGC_Ctrl4 */ - reg->BB0C = 0xFFF72031; - pltmp[4] = 0x0FacDCC5; /* 0x1010 AGC_Ctrl5 */ - pltmp[5] = 0x00CAA333; /* 0x1014 AGC_Ctrl6 */ - pltmp[6] = 0xF2211111; /* 0x1018 AGC_Ctrl7 */ - pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ - pltmp[8] = 0x06443440; /* 0x1020 AGC_Ctrl9 */ - pltmp[9] = 0xA8002A79; /* 0x1024 AGC_Ctrl10 */ - pltmp[10] = 0x40000528; - pltmp[11] = 0x232D7F30; /* 0x102c A_ACQ_Ctrl */ - reg->BB2C = 0x232D7F30; - Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); - - pltmp[0] = 0x00002c54; /* 0x1030 B_ACQ_Ctrl */ - reg->BB30 = 0x00002c54; - pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ - pltmp[2] = 0x5B2C8769; /* 0x1038 B_TXRX_Ctrl */ - pltmp[3] = 0x00000000; /* 0x103c 11a TX LS filter */ - reg->BB3C = 0x00000000; - pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ - pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ - pltmp[6] = 0x00332C1B; /* 0x1048 11b TX RC filter */ - pltmp[7] = 0x0A00FEFF; /* 0x104c 11b TX RC filter */ - pltmp[8] = 0x2B106208; /* 0x1050 MODE_Ctrl */ - reg->BB50 = 0x2B106208; - pltmp[9] = 0; /* 0x1054 */ - reg->BB54 = 0x00000000; - pltmp[10] = 0x52524242; /* 0x1058 IQ_Alpha */ - reg->BB58 = 0x52524242; - pltmp[11] = 0xAA0AC000; /* 0x105c DC_Cancel */ - Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); -} - -static void BBProcessor_AL7230_5000(struct hw_data *pHwData) -{ - struct wb35_reg *reg = &pHwData->reg; - u32 pltmp[12]; - - pltmp[0] = 0x16AA6678; /* 0x1000 AGC_Ctrl1 */ - pltmp[1] = 0x9AFFA0B2; /* 0x1004 AGC_Ctrl2 */ - pltmp[2] = 0x55D00A04; /* 0x1008 AGC_Ctrl3 */ - pltmp[3] = 0xEFFF233E; /* 0x100c AGC_Ctrl4 */ - reg->BB0C = 0xEFFF233E; - pltmp[4] = 0x0FacDCC5; /* 0x1010 AGC_Ctrl5 */ - pltmp[5] = 0x00CAA333; /* 0x1014 AGC_Ctrl6 */ - pltmp[6] = 0xF2432111; /* 0x1018 AGC_Ctrl7 */ - pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ - pltmp[8] = 0x05C43440; /* 0x1020 AGC_Ctrl9 */ - pltmp[9] = 0x00002A79; /* 0x1024 AGC_Ctrl10 */ - pltmp[10] = 0x40000528; - pltmp[11] = 0x232FDF30;/* 0x102c A_ACQ_Ctrl */ - reg->BB2C = 0x232FDF30; - Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); - - pltmp[0] = 0x80002C7C; /* 0x1030 B_ACQ_Ctrl */ - pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ - pltmp[2] = 0x5B2C8769; /* 0x1038 B_TXRX_Ctrl */ - pltmp[3] = 0x00000000; /* 0x103c 11a TX LS filter */ - reg->BB3C = 0x00000000; - pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ - pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ - pltmp[6] = 0x00332C1B; /* 0x1048 11b TX RC filter */ - pltmp[7] = 0x0A00FEFF; /* 0x104c 11b TX RC filter */ - pltmp[8] = 0x2B107208; /* 0x1050 MODE_Ctrl */ - reg->BB50 = 0x2B107208; - pltmp[9] = 0; /* 0x1054 */ - reg->BB54 = 0x00000000; - pltmp[10] = 0x52524242; /* 0x1058 IQ_Alpha */ - reg->BB58 = 0x52524242; - pltmp[11] = 0xAA0AC000; /* 0x105c DC_Cancel */ - Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); -} - -/* - * =========================================================================== - * BBProcessorPowerupInit -- - * - * Description: - * Initialize the Baseband processor. - * - * Arguments: - * pHwData - Handle of the USB Device. - * - * Return values: - * None. - *============================================================================ - */ -void BBProcessor_initial(struct hw_data *pHwData) -{ - struct wb35_reg *reg = &pHwData->reg; - u32 i, pltmp[12]; - - switch (pHwData->phy_type) { - case RF_MAXIM_V1: /* Initializng the Winbond 2nd BB(with Phy board (v1) + Maxim 331) */ - pltmp[0] = 0x16F47E77; /* 0x1000 AGC_Ctrl1 */ - pltmp[1] = 0x9AFFAEA4; /* 0x1004 AGC_Ctrl2 */ - pltmp[2] = 0x55D00A04; /* 0x1008 AGC_Ctrl3 */ - pltmp[3] = 0xEFFF1A34; /* 0x100c AGC_Ctrl4 */ - reg->BB0C = 0xEFFF1A34; - pltmp[4] = 0x0FABE0B7; /* 0x1010 AGC_Ctrl5 */ - pltmp[5] = 0x00CAA332; /* 0x1014 AGC_Ctrl6 */ - pltmp[6] = 0xF6632111; /* 0x1018 AGC_Ctrl7 */ - pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ - pltmp[8] = 0x04CC3640; /* 0x1020 AGC_Ctrl9 */ - pltmp[9] = 0x00002A79; /* 0x1024 AGC_Ctrl10 */ - pltmp[10] = (pHwData->phy_type == 3) ? 0x40000a28 : 0x40000228; /* 0x1028 MAXIM_331(b31=0) + WBRF_V1(b11=1) : MAXIM_331(b31=0) + WBRF_V2(b11=0) */ - pltmp[11] = 0x232FDF30; /* 0x102c A_ACQ_Ctrl */ - reg->BB2C = 0x232FDF30; /* Modify for 33's 1.0.95.xxx version, antenna 1 */ - Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); - - pltmp[0] = 0x00002C54; /* 0x1030 B_ACQ_Ctrl */ - reg->BB30 = 0x00002C54; - pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ - pltmp[2] = 0x5B6C8769; /* 0x1038 B_TXRX_Ctrl */ - pltmp[3] = 0x00000000; /* 0x103c 11a TX LS filter */ - reg->BB3C = 0x00000000; - pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ - pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ - pltmp[6] = 0x00453B24; /* 0x1048 11b TX RC filter */ - pltmp[7] = 0x0E00FEFF; /* 0x104c 11b TX RC filter */ - pltmp[8] = 0x27106208; /* 0x1050 MODE_Ctrl */ - reg->BB50 = 0x27106208; - pltmp[9] = 0; /* 0x1054 */ - reg->BB54 = 0x00000000; - pltmp[10] = 0x64646464; /* 0x1058 IQ_Alpha */ - reg->BB58 = 0x64646464; - pltmp[11] = 0xAA0AC000; /* 0x105c DC_Cancel */ - Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); - - Wb35Reg_Write(pHwData, 0x1070, 0x00000045); - break; - - case RF_MAXIM_2825: - case RF_MAXIM_2827: - case RF_MAXIM_2828: - pltmp[0] = 0x16b47e77; /* 0x1000 AGC_Ctrl1 */ - pltmp[1] = 0x9affaea4; /* 0x1004 AGC_Ctrl2 */ - pltmp[2] = 0x55d00a04; /* 0x1008 AGC_Ctrl3 */ - pltmp[3] = 0xefff1a34; /* 0x100c AGC_Ctrl4 */ - reg->BB0C = 0xefff1a34; - pltmp[4] = 0x0fabe0b7; /* 0x1010 AGC_Ctrl5 */ - pltmp[5] = 0x00caa332; /* 0x1014 AGC_Ctrl6 */ - pltmp[6] = 0xf6632111; /* 0x1018 AGC_Ctrl7 */ - pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ - pltmp[8] = 0x04CC3640; /* 0x1020 AGC_Ctrl9 */ - pltmp[9] = 0x00002A79; /* 0x1024 AGC_Ctrl10 */ - pltmp[10] = 0x40000528; - pltmp[11] = 0x232fdf30; /* 0x102c A_ACQ_Ctrl */ - reg->BB2C = 0x232fdf30; /* antenna 1 */ - Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); - - pltmp[0] = 0x00002C54; /* 0x1030 B_ACQ_Ctrl */ - reg->BB30 = 0x00002C54; - pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ - pltmp[2] = 0x5B6C8769; /* 0x1038 B_TXRX_Ctrl */ - pltmp[3] = 0x00000000; /* 0x103c 11a TX LS filter */ - reg->BB3C = 0x00000000; - pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ - pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ - pltmp[6] = 0x00453B24; /* 0x1048 11b TX RC filter */ - pltmp[7] = 0x0D00FDFF; /* 0x104c 11b TX RC filter */ - pltmp[8] = 0x27106208; /* 0x1050 MODE_Ctrl */ - reg->BB50 = 0x27106208; - pltmp[9] = 0; /* 0x1054 */ - reg->BB54 = 0x00000000; - pltmp[10] = 0x64646464; /* 0x1058 IQ_Alpha */ - reg->BB58 = 0x64646464; - pltmp[11] = 0xAA28C000; /* 0x105c DC_Cancel */ - Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); - - Wb35Reg_Write(pHwData, 0x1070, 0x00000045); - break; - - case RF_MAXIM_2829: - pltmp[0] = 0x16b47e77; /* 0x1000 AGC_Ctrl1 */ - pltmp[1] = 0x9affaea4; /* 0x1004 AGC_Ctrl2 */ - pltmp[2] = 0x55d00a04; /* 0x1008 AGC_Ctrl3 */ - pltmp[3] = 0xf4ff1632; /* 0x100c AGC_Ctrl4 */ - reg->BB0C = 0xf4ff1632; - pltmp[4] = 0x0fabe0b7; /* 0x1010 AGC_Ctrl5 */ - pltmp[5] = 0x00caa332; /* 0x1014 AGC_Ctrl6 */ - pltmp[6] = 0xf8632112; /* 0x1018 AGC_Ctrl7 */ - pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ - pltmp[8] = 0x04CC3640; /* 0x1020 AGC_Ctrl9 */ - pltmp[9] = 0x00002A79; /* 0x1024 AGC_Ctrl10 */ - pltmp[10] = 0x40000528; - pltmp[11] = 0x232fdf30; /* 0x102c A_ACQ_Ctrl */ - reg->BB2C = 0x232fdf30; /* antenna 1 */ - Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); - - pltmp[0] = 0x00002C54; /* 0x1030 B_ACQ_Ctrl */ - reg->BB30 = 0x00002C54; - pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ - pltmp[2] = 0x5b2c8769; /* 0x1038 B_TXRX_Ctrl */ - pltmp[3] = 0x00000000; /* 0x103c 11a TX LS filter */ - reg->BB3C = 0x00000000; - pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ - pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ - pltmp[6] = 0x002c2617; /* 0x1048 11b TX RC filter */ - pltmp[7] = 0x0800feff; /* 0x104c 11b TX RC filter */ - pltmp[8] = 0x27106208; /* 0x1050 MODE_Ctrl */ - reg->BB50 = 0x27106208; - pltmp[9] = 0; /* 0x1054 */ - reg->BB54 = 0x00000000; - pltmp[10] = 0x64644a4a; /* 0x1058 IQ_Alpha */ - reg->BB58 = 0x64646464; - pltmp[11] = 0xAA28C000; /* 0x105c DC_Cancel */ - Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); - Wb35Reg_Write(pHwData, 0x1070, 0x00000045); - break; - case RF_AIROHA_2230: - pltmp[0] = 0X16764A77; /* 0x1000 AGC_Ctrl1 */ - pltmp[1] = 0x9affafb2; /* 0x1004 AGC_Ctrl2 */ - pltmp[2] = 0x55d00a04; /* 0x1008 AGC_Ctrl3 */ - pltmp[3] = 0xFFFd203c; /* 0x100c AGC_Ctrl4 */ - reg->BB0C = 0xFFFd203c; - pltmp[4] = 0X0FBFDCc5; /* 0x1010 AGC_Ctrl5 */ - pltmp[5] = 0x00caa332; /* 0x1014 AGC_Ctrl6 */ - pltmp[6] = 0XF6632111; /* 0x1018 AGC_Ctrl7 */ - pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ - pltmp[8] = 0x04C43640; /* 0x1020 AGC_Ctrl9 */ - pltmp[9] = 0x00002A79; /* 0x1024 AGC_Ctrl10 */ - pltmp[10] = 0X40000528; - pltmp[11] = 0x232dfF30; /* 0x102c A_ACQ_Ctrl */ - reg->BB2C = 0x232dfF30; /* antenna 1 */ - Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); - - pltmp[0] = 0x00002C54; /* 0x1030 B_ACQ_Ctrl */ - reg->BB30 = 0x00002C54; - pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ - pltmp[2] = 0x5B2C8769; /* 0x1038 B_TXRX_Ctrl */ - pltmp[3] = 0x00000000; /* 0x103c 11a TX LS filter */ - reg->BB3C = 0x00000000; - pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ - pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ - pltmp[6] = BB48_DEFAULT_AL2230_11G; /* 0x1048 11b TX RC filter */ - reg->BB48 = BB48_DEFAULT_AL2230_11G; /* 20051221 ch14 */ - pltmp[7] = BB4C_DEFAULT_AL2230_11G; /* 0x104c 11b TX RC filter */ - reg->BB4C = BB4C_DEFAULT_AL2230_11G; - pltmp[8] = 0x27106200; /* 0x1050 MODE_Ctrl */ - reg->BB50 = 0x27106200; - pltmp[9] = 0; /* 0x1054 */ - reg->BB54 = 0x00000000; - pltmp[10] = 0x52524242; /* 0x1058 IQ_Alpha */ - reg->BB58 = 0x52524242; - pltmp[11] = 0xAA0AC000; /* 0x105c DC_Cancel */ - Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); - - Wb35Reg_Write(pHwData, 0x1070, 0x00000045); - break; - case RF_AIROHA_2230S: - pltmp[0] = 0X16764A77; /* 0x1000 AGC_Ctrl1 */ - pltmp[1] = 0x9affafb2; /* 0x1004 AGC_Ctrl2 */ - pltmp[2] = 0x55d00a04; /* 0x1008 AGC_Ctrl3 */ - pltmp[3] = 0xFFFd203c; /* 0x100c AGC_Ctrl4 */ - reg->BB0C = 0xFFFd203c; - pltmp[4] = 0X0FBFDCc5; /* 0x1010 AGC_Ctrl5 */ - pltmp[5] = 0x00caa332; /* 0x1014 AGC_Ctrl6 */ - pltmp[6] = 0XF6632111; /* 0x1018 AGC_Ctrl7 */ - pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ - pltmp[8] = 0x04C43640; /* 0x1020 AGC_Ctrl9 */ - pltmp[9] = 0x00002A79; /* 0x1024 AGC_Ctrl10 */ - pltmp[10] = 0X40000528; - pltmp[11] = 0x232dfF30; /* 0x102c A_ACQ_Ctrl */ - reg->BB2C = 0x232dfF30; /* antenna 1 */ - Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); - - pltmp[0] = 0x00002C54; /* 0x1030 B_ACQ_Ctrl */ - reg->BB30 = 0x00002C54; - pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ - pltmp[2] = 0x5B2C8769; /* 0x1038 B_TXRX_Ctrl */ - pltmp[3] = 0x00000000; /* 0x103c 11a TX LS filter */ - reg->BB3C = 0x00000000; - pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ - pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ - pltmp[6] = BB48_DEFAULT_AL2230_11G; /* 0x1048 11b TX RC filter */ - reg->BB48 = BB48_DEFAULT_AL2230_11G; /* ch14 */ - pltmp[7] = BB4C_DEFAULT_AL2230_11G; /* 0x104c 11b TX RC filter */ - reg->BB4C = BB4C_DEFAULT_AL2230_11G; - pltmp[8] = 0x27106200; /* 0x1050 MODE_Ctrl */ - reg->BB50 = 0x27106200; - pltmp[9] = 0; /* 0x1054 */ - reg->BB54 = 0x00000000; - pltmp[10] = 0x52523232; /* 0x1058 IQ_Alpha */ - reg->BB58 = 0x52523232; - pltmp[11] = 0xAA0AC000; /* 0x105c DC_Cancel */ - Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); - - Wb35Reg_Write(pHwData, 0x1070, 0x00000045); - break; - case RF_AIROHA_7230: - BBProcessor_AL7230_2400(pHwData); - - Wb35Reg_Write(pHwData, 0x1070, 0x00000045); - break; - case RF_WB_242: - case RF_WB_242_1: - pltmp[0] = 0x16A8525D; /* 0x1000 AGC_Ctrl1 */ - pltmp[1] = 0x9AFF9ABA; /* 0x1004 AGC_Ctrl2 */ - pltmp[2] = 0x55D00A04; /* 0x1008 AGC_Ctrl3 */ - pltmp[3] = 0xEEE91C32; /* 0x100c AGC_Ctrl4 */ - reg->BB0C = 0xEEE91C32; - pltmp[4] = 0x0FACDCC5; /* 0x1010 AGC_Ctrl5 */ - pltmp[5] = 0x000AA344; /* 0x1014 AGC_Ctrl6 */ - pltmp[6] = 0x22222221; /* 0x1018 AGC_Ctrl7 */ - pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ - pltmp[8] = 0x04CC3440; /* 0x1020 AGC_Ctrl9 */ - pltmp[9] = 0xA9002A79; /* 0x1024 AGC_Ctrl10 */ - pltmp[10] = 0x40000528; /* 0x1028 */ - pltmp[11] = 0x23457F30; /* 0x102c A_ACQ_Ctrl */ - reg->BB2C = 0x23457F30; - Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); - - pltmp[0] = 0x00002C54; /* 0x1030 B_ACQ_Ctrl */ - reg->BB30 = 0x00002C54; - pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ - pltmp[2] = 0x5B2C8769; /* 0x1038 B_TXRX_Ctrl */ - pltmp[3] = pHwData->BB3c_cal; /* 0x103c 11a TX LS filter */ - reg->BB3C = pHwData->BB3c_cal; - pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ - pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ - pltmp[6] = BB48_DEFAULT_WB242_11G; /* 0x1048 11b TX RC filter */ - reg->BB48 = BB48_DEFAULT_WB242_11G; - pltmp[7] = BB4C_DEFAULT_WB242_11G; /* 0x104c 11b TX RC filter */ - reg->BB4C = BB4C_DEFAULT_WB242_11G; - pltmp[8] = 0x27106208; /* 0x1050 MODE_Ctrl */ - reg->BB50 = 0x27106208; - pltmp[9] = pHwData->BB54_cal; /* 0x1054 */ - reg->BB54 = pHwData->BB54_cal; - pltmp[10] = 0x52523131; /* 0x1058 IQ_Alpha */ - reg->BB58 = 0x52523131; - pltmp[11] = 0xAA0AC000; /* 0x105c DC_Cancel */ - Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); - - Wb35Reg_Write(pHwData, 0x1070, 0x00000045); - break; - } - - /* Fill the LNA table */ - reg->LNAValue[0] = (u8) (reg->BB0C & 0xff); - reg->LNAValue[1] = 0; - reg->LNAValue[2] = (u8) ((reg->BB0C & 0xff00) >> 8); - reg->LNAValue[3] = 0; - - /* Fill SQ3 table */ - for (i = 0; i < MAX_SQ3_FILTER_SIZE; i++) - reg->SQ3_filter[i] = 0x2f; /* half of Bit 0 ~ 6 */ -} - -static inline void set_tx_power_per_channel_max2829(struct hw_data *pHwData, - struct chan_info Channel) -{ - RFSynthesizer_SetPowerIndex(pHwData, 100); -} - -static void set_tx_power_per_channel_al2230(struct hw_data *pHwData, - struct chan_info Channel) -{ - u8 index = 100; - if (pHwData->TxVgaFor24[Channel.ChanNo - 1] != 0xff) - index = pHwData->TxVgaFor24[Channel.ChanNo - 1]; - - RFSynthesizer_SetPowerIndex(pHwData, index); -} - -static void set_tx_power_per_channel_al7230(struct hw_data *pHwData, - struct chan_info Channel) -{ - u8 i, index = 100; - - switch (Channel.band) { - case BAND_TYPE_DSSS: - case BAND_TYPE_OFDM_24: - if (pHwData->TxVgaFor24[Channel.ChanNo - 1] != 0xff) - index = pHwData->TxVgaFor24[Channel.ChanNo - 1]; - break; - case BAND_TYPE_OFDM_5: - for (i = 0; i < 35; i++) { - if (Channel.ChanNo == pHwData->TxVgaFor50[i].ChanNo) { - if (pHwData->TxVgaFor50[i].TxVgaValue != 0xff) - index = pHwData->TxVgaFor50[i].TxVgaValue; - break; - } - } - break; - } - RFSynthesizer_SetPowerIndex(pHwData, index); -} - -static void set_tx_power_per_channel_wb242(struct hw_data *pHwData, - struct chan_info Channel) -{ - u8 index = 100; - - switch (Channel.band) { - case BAND_TYPE_DSSS: - case BAND_TYPE_OFDM_24: - if (pHwData->TxVgaFor24[Channel.ChanNo - 1] != 0xff) - index = pHwData->TxVgaFor24[Channel.ChanNo - 1]; - break; - case BAND_TYPE_OFDM_5: - break; - } - RFSynthesizer_SetPowerIndex(pHwData, index); -} - -/* - * ========================================================================== - * RFSynthesizer_SwitchingChannel -- - * - * Description: - * Swithch the RF channel. - * - * Arguments: - * pHwData - Handle of the USB Device. - * Channel - The channel no. - * - * Return values: - * None. - * =========================================================================== - */ -void RFSynthesizer_SwitchingChannel(struct hw_data *pHwData, struct chan_info Channel) -{ - struct wb35_reg *reg = &pHwData->reg; - u32 pltmp[16]; /* The 16 is the maximum capability of hardware */ - u32 count, ltmp; - u8 i, j, number; - u8 ChnlTmp; - - switch (pHwData->phy_type) { - case RF_MAXIM_2825: - case RF_MAXIM_V1: /* 11g Winbond 2nd BB(with Phy board (v1) + Maxim 331) */ - - if (Channel.band <= BAND_TYPE_OFDM_24) { /* channel 1 ~ 13 */ - for (i = 0; i < 3; i++) - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2825_channel_data_24[Channel.ChanNo-1][i], 18); - Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); - } - RFSynthesizer_SetPowerIndex(pHwData, 100); - break; - case RF_MAXIM_2827: - if (Channel.band <= BAND_TYPE_OFDM_24) { /* channel 1 ~ 13 */ - for (i = 0; i < 3; i++) - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2827_channel_data_24[Channel.ChanNo-1][i], 18); - Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); - } else if (Channel.band == BAND_TYPE_OFDM_5) { /* channel 36 ~ 64 */ - ChnlTmp = (Channel.ChanNo - 36) / 4; - for (i = 0; i < 3; i++) - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2827_channel_data_50[ChnlTmp][i], 18); - Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); - } - RFSynthesizer_SetPowerIndex(pHwData, 100); - break; - case RF_MAXIM_2828: - if (Channel.band <= BAND_TYPE_OFDM_24) { /* channel 1 ~ 13 */ - for (i = 0; i < 3; i++) - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2828_channel_data_24[Channel.ChanNo-1][i], 18); - Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); - } else if (Channel.band == BAND_TYPE_OFDM_5) { /* channel 36 ~ 64 */ - ChnlTmp = (Channel.ChanNo - 36) / 4; - for (i = 0; i < 3; i++) - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2828_channel_data_50[ChnlTmp][i], 18); - Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); - } - RFSynthesizer_SetPowerIndex(pHwData, 100); - break; - case RF_MAXIM_2829: - if (Channel.band <= BAND_TYPE_OFDM_24) { - for (i = 0; i < 3; i++) - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2829_channel_data_24[Channel.ChanNo-1][i], 18); - Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); - } else if (Channel.band == BAND_TYPE_OFDM_5) { - count = ARRAY_SIZE(max2829_channel_data_50); - - for (i = 0; i < count; i++) { - if (max2829_channel_data_50[i][0] == Channel.ChanNo) { - for (j = 0; j < 3; j++) - pltmp[j] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2829_channel_data_50[i][j+1], 18); - Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); - - if ((max2829_channel_data_50[i][3] & 0x3FFFF) == 0x2A946) { - ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse((5 << 18) | 0x2A906, 18); - Wb35Reg_Write(pHwData, 0x0864, ltmp); - } else { /* 0x2A9C6 */ - ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse((5 << 18) | 0x2A986, 18); - Wb35Reg_Write(pHwData, 0x0864, ltmp); - } - } - } - } - set_tx_power_per_channel_max2829(pHwData, Channel); - break; - case RF_AIROHA_2230: - case RF_AIROHA_2230S: - if (Channel.band <= BAND_TYPE_OFDM_24) { /* channel 1 ~ 14 */ - for (i = 0; i < 2; i++) - pltmp[i] = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse(al2230_channel_data_24[Channel.ChanNo-1][i], 20); - Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 2, NO_INCREMENT); - } - set_tx_power_per_channel_al2230(pHwData, Channel); - break; - case RF_AIROHA_7230: - /* Channel independent registers */ - if (Channel.band != pHwData->band) { - if (Channel.band <= BAND_TYPE_OFDM_24) { - /* Update BB register */ - BBProcessor_AL7230_2400(pHwData); - - number = ARRAY_SIZE(al7230_rf_data_24); - Set_ChanIndep_RfData_al7230_24(pHwData, pltmp, number); - } else { - /* Update BB register */ - BBProcessor_AL7230_5000(pHwData); - - number = ARRAY_SIZE(al7230_rf_data_50); - Set_ChanIndep_RfData_al7230_50(pHwData, pltmp, number); - } - - /* Write to register. number must less and equal than 16 */ - Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, number, NO_INCREMENT); - pr_debug("Band changed\n"); - } - - if (Channel.band <= BAND_TYPE_OFDM_24) { /* channel 1 ~ 14 */ - for (i = 0; i < 2; i++) - pltmp[i] = (1 << 31) | (0 << 30) | (24 << 24) | (al7230_channel_data_24[Channel.ChanNo-1][i]&0xffffff); - Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 2, NO_INCREMENT); - } else if (Channel.band == BAND_TYPE_OFDM_5) { - /* Update Reg12 */ - if ((Channel.ChanNo > 64) && (Channel.ChanNo <= 165)) { - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x00143c; - Wb35Reg_Write(pHwData, 0x0864, ltmp); - } else { /* reg12 = 0x00147c at Channel 4920 ~ 5320 */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x00147c; - Wb35Reg_Write(pHwData, 0x0864, ltmp); - } - - count = ARRAY_SIZE(al7230_channel_data_5); - - for (i = 0; i < count; i++) { - if (al7230_channel_data_5[i][0] == Channel.ChanNo) { - for (j = 0; j < 3; j++) - pltmp[j] = (1 << 31) | (0 << 30) | (24 << 24) | (al7230_channel_data_5[i][j+1] & 0xffffff); - Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); - } - } - } - set_tx_power_per_channel_al7230(pHwData, Channel); - break; - case RF_WB_242: - case RF_WB_242_1: - - if (Channel.band <= BAND_TYPE_OFDM_24) { /* channel 1 ~ 14 */ - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse(w89rf242_channel_data_24[Channel.ChanNo-1][0], 24); - Wb35Reg_Write(pHwData, 0x864, ltmp); - } - set_tx_power_per_channel_wb242(pHwData, Channel); - break; - } - - if (Channel.band <= BAND_TYPE_OFDM_24) { - /* BB: select 2.4 GHz, bit[12-11]=00 */ - reg->BB50 &= ~(BIT(11) | BIT(12)); - Wb35Reg_Write(pHwData, 0x1050, reg->BB50); /* MODE_Ctrl */ - /* MAC: select 2.4 GHz, bit[5]=0 */ - reg->M78_ERPInformation &= ~BIT(5); - Wb35Reg_Write(pHwData, 0x0878, reg->M78_ERPInformation); - /* enable 11b Baseband */ - reg->BB30 &= ~BIT(31); - Wb35Reg_Write(pHwData, 0x1030, reg->BB30); - } else if (Channel.band == BAND_TYPE_OFDM_5) { - /* BB: select 5 GHz */ - reg->BB50 &= ~(BIT(11) | BIT(12)); - if (Channel.ChanNo <= 64) - reg->BB50 |= BIT(12); /* 10-5.25GHz */ - else if ((Channel.ChanNo >= 100) && (Channel.ChanNo <= 124)) - reg->BB50 |= BIT(11); /* 01-5.48GHz */ - else if ((Channel.ChanNo >= 128) && (Channel.ChanNo <= 161)) - reg->BB50 |= (BIT(12) | BIT(11)); /* 11-5.775GHz */ - else /* Chan 184 ~ 196 will use bit[12-11] = 10 in version sh-src-1.2.25 */ - reg->BB50 |= BIT(12); - Wb35Reg_Write(pHwData, 0x1050, reg->BB50); /* MODE_Ctrl */ - - /* (1) M78 should alway use 2.4G setting when using RF_AIROHA_7230 */ - /* (2) BB30 has been updated previously. */ - if (pHwData->phy_type != RF_AIROHA_7230) { - /* MAC: select 5 GHz, bit[5]=1 */ - reg->M78_ERPInformation |= BIT(5); - Wb35Reg_Write(pHwData, 0x0878, reg->M78_ERPInformation); - - /* disable 11b Baseband */ - reg->BB30 |= BIT(31); - Wb35Reg_Write(pHwData, 0x1030, reg->BB30); - } - } -} - -/* - * Set the tx power directly from DUT GUI, not from the EEPROM. - * Return the current setting - */ -u8 RFSynthesizer_SetPowerIndex(struct hw_data *pHwData, u8 PowerIndex) -{ - u32 Band = pHwData->band; - u8 index = 0; - - if (pHwData->power_index == PowerIndex) - return PowerIndex; - - if (RF_MAXIM_2825 == pHwData->phy_type) { - /* Channel 1 - 13 */ - index = RFSynthesizer_SetMaxim2825Power(pHwData, PowerIndex); - } else if (RF_MAXIM_2827 == pHwData->phy_type) { - if (Band <= BAND_TYPE_OFDM_24) /* Channel 1 - 13 */ - index = RFSynthesizer_SetMaxim2827_24Power(pHwData, PowerIndex); - else /* Channel 36 - 64 */ - index = RFSynthesizer_SetMaxim2827_50Power(pHwData, PowerIndex); - } else if (RF_MAXIM_2828 == pHwData->phy_type) { - if (Band <= BAND_TYPE_OFDM_24) /* Channel 1 - 13 */ - index = RFSynthesizer_SetMaxim2828_24Power(pHwData, PowerIndex); - else /* Channel 36 - 64 */ - index = RFSynthesizer_SetMaxim2828_50Power(pHwData, PowerIndex); - } else if (RF_AIROHA_2230 == pHwData->phy_type) { - /* Power index: 0 ~ 63 --- Channel 1 - 14 */ - index = RFSynthesizer_SetAiroha2230Power(pHwData, PowerIndex); - index = (u8) al2230_txvga_data[index][1]; - } else if (RF_AIROHA_2230S == pHwData->phy_type) { - /* Power index: 0 ~ 63 --- Channel 1 - 14 */ - index = RFSynthesizer_SetAiroha2230Power(pHwData, PowerIndex); - index = (u8) al2230_txvga_data[index][1]; - } else if (RF_AIROHA_7230 == pHwData->phy_type) { - /* Power index: 0 ~ 63 */ - index = RFSynthesizer_SetAiroha7230Power(pHwData, PowerIndex); - index = (u8)al7230_txvga_data[index][1]; - } else if ((RF_WB_242 == pHwData->phy_type) || - (RF_WB_242_1 == pHwData->phy_type)) { - /* Power index: 0 ~ 19 for original. New range is 0 ~ 33 */ - index = RFSynthesizer_SetWinbond242Power(pHwData, PowerIndex); - index = (u8)w89rf242_txvga_data[index][1]; - } - - pHwData->power_index = index; /* Backup current */ - return index; -} - -/* -- Sub function */ -u8 RFSynthesizer_SetMaxim2828_24Power(struct hw_data *pHwData, u8 index) -{ - u32 PowerData; - if (index > 1) - index = 1; - PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2828_power_data_24[index], 18); - Wb35Reg_Write(pHwData, 0x0864, PowerData); - return index; -} - -u8 RFSynthesizer_SetMaxim2828_50Power(struct hw_data *pHwData, u8 index) -{ - u32 PowerData; - if (index > 1) - index = 1; - PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2828_power_data_50[index], 18); - Wb35Reg_Write(pHwData, 0x0864, PowerData); - return index; -} - -u8 RFSynthesizer_SetMaxim2827_24Power(struct hw_data *pHwData, u8 index) -{ - u32 PowerData; - if (index > 1) - index = 1; - PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2827_power_data_24[index], 18); - Wb35Reg_Write(pHwData, 0x0864, PowerData); - return index; -} - -u8 RFSynthesizer_SetMaxim2827_50Power(struct hw_data *pHwData, u8 index) -{ - u32 PowerData; - if (index > 1) - index = 1; - PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2827_power_data_50[index], 18); - Wb35Reg_Write(pHwData, 0x0864, PowerData); - return index; -} - -u8 RFSynthesizer_SetMaxim2825Power(struct hw_data *pHwData, u8 index) -{ - u32 PowerData; - if (index > 1) - index = 1; - PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2825_power_data_24[index], 18); - Wb35Reg_Write(pHwData, 0x0864, PowerData); - return index; -} - -u8 RFSynthesizer_SetAiroha2230Power(struct hw_data *pHwData, u8 index) -{ - u32 PowerData; - u8 i, count; - - count = ARRAY_SIZE(al2230_txvga_data); - for (i = 0; i < count; i++) { - if (al2230_txvga_data[i][1] >= index) - break; - } - if (i == count) - i--; - - PowerData = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse(al2230_txvga_data[i][0], 20); - Wb35Reg_Write(pHwData, 0x0864, PowerData); - return i; -} - -u8 RFSynthesizer_SetAiroha7230Power(struct hw_data *pHwData, u8 index) -{ - u32 PowerData; - u8 i, count; - - count = ARRAY_SIZE(al7230_txvga_data); - for (i = 0; i < count; i++) { - if (al7230_txvga_data[i][1] >= index) - break; - } - if (i == count) - i--; - PowerData = (1 << 31) | (0 << 30) | (24 << 24) | (al7230_txvga_data[i][0] & 0xffffff); - Wb35Reg_Write(pHwData, 0x0864, PowerData); - return i; -} - -u8 RFSynthesizer_SetWinbond242Power(struct hw_data *pHwData, u8 index) -{ - u32 PowerData; - u8 i, count; - - count = ARRAY_SIZE(w89rf242_txvga_data); - for (i = 0; i < count; i++) { - if (w89rf242_txvga_data[i][1] >= index) - break; - } - if (i == count) - i--; - - /* Set TxVga into RF */ - PowerData = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse(w89rf242_txvga_data[i][0], 24); - Wb35Reg_Write(pHwData, 0x0864, PowerData); - - /* Update BB48 BB4C BB58 for high precision txvga */ - Wb35Reg_Write(pHwData, 0x1048, w89rf242_txvga_data[i][2]); - Wb35Reg_Write(pHwData, 0x104c, w89rf242_txvga_data[i][3]); - Wb35Reg_Write(pHwData, 0x1058, w89rf242_txvga_data[i][4]); - - return i; -} - -/* - * =========================================================================== - * Dxx_initial -- - * Mxx_initial -- - * - * Routine Description: - * Initial the hardware setting and module variable - * =========================================================================== - */ -void Dxx_initial(struct hw_data *pHwData) -{ - struct wb35_reg *reg = &pHwData->reg; - - /* - * Old IC: Single mode only. - * New IC: operation decide by Software set bit[4]. 1:multiple 0: single - */ - reg->D00_DmaControl = 0xc0000004; /* Txon, Rxon, multiple Rx for new 4k DMA */ - /* Txon, Rxon, single Rx for old 8k ASIC */ - if (!HAL_USB_MODE_BURST(pHwData)) - reg->D00_DmaControl = 0xc0000000; /* Txon, Rxon, single Rx for new 4k DMA */ - - Wb35Reg_WriteSync(pHwData, 0x0400, reg->D00_DmaControl); -} - -void Mxx_initial(struct hw_data *pHwData) -{ - struct wb35_reg *reg = &pHwData->reg; - u32 tmp; - u32 pltmp[11]; - u16 i; - - - /* - * ====================================================== - * Initial Mxx register - * ====================================================== - */ - - /* M00 bit set */ - reg->M00_MacControl = 0x80000000; /* Solve beacon sequence number stop by hardware */ - - /* M24 disable enter power save, BB RxOn and enable NAV attack */ - reg->M24_MacControl = 0x08040042; - pltmp[0] = reg->M24_MacControl; - - pltmp[1] = 0; /* Skip M28, because no initialize value is required. */ - - /* M2C CWmin and CWmax setting */ - pHwData->cwmin = DEFAULT_CWMIN; - pHwData->cwmax = DEFAULT_CWMAX; - reg->M2C_MacControl = DEFAULT_CWMIN << 10; - reg->M2C_MacControl |= DEFAULT_CWMAX; - pltmp[2] = reg->M2C_MacControl; - - /* M30 BSSID */ - pltmp[3] = *(u32 *)pHwData->bssid; - - /* M34 */ - pHwData->AID = DEFAULT_AID; - tmp = *(u16 *) (pHwData->bssid + 4); - tmp |= DEFAULT_AID << 16; - pltmp[4] = tmp; - - /* M38 */ - reg->M38_MacControl = (DEFAULT_RATE_RETRY_LIMIT << 8) | (DEFAULT_LONG_RETRY_LIMIT << 4) | DEFAULT_SHORT_RETRY_LIMIT; - pltmp[5] = reg->M38_MacControl; - - /* M3C */ - tmp = (DEFAULT_PIFST << 26) | (DEFAULT_EIFST << 16) | (DEFAULT_DIFST << 8) | (DEFAULT_SIFST << 4) | DEFAULT_OSIFST; - reg->M3C_MacControl = tmp; - pltmp[6] = tmp; - - /* M40 */ - pHwData->slot_time_select = DEFAULT_SLOT_TIME; - tmp = (DEFAULT_ATIMWD << 16) | DEFAULT_SLOT_TIME; - reg->M40_MacControl = tmp; - pltmp[7] = tmp; - - /* M44 */ - tmp = DEFAULT_MAX_TX_MSDU_LIFE_TIME << 10; /* *1024 */ - reg->M44_MacControl = tmp; - pltmp[8] = tmp; - - /* M48 */ - pHwData->BeaconPeriod = DEFAULT_BEACON_INTERVAL; - pHwData->ProbeDelay = DEFAULT_PROBE_DELAY_TIME; - tmp = (DEFAULT_BEACON_INTERVAL << 16) | DEFAULT_PROBE_DELAY_TIME; - reg->M48_MacControl = tmp; - pltmp[9] = tmp; - - /* M4C */ - reg->M4C_MacStatus = (DEFAULT_PROTOCOL_VERSION << 30) | (DEFAULT_MAC_POWER_STATE << 28) | (DEFAULT_DTIM_ALERT_TIME << 24); - pltmp[10] = reg->M4C_MacStatus; - - for (i = 0; i < 11; i++) - Wb35Reg_WriteSync(pHwData, 0x0824 + i * 4, pltmp[i]); - - /* M60 */ - Wb35Reg_WriteSync(pHwData, 0x0860, 0x12481248); - reg->M60_MacControl = 0x12481248; - - /* M68 */ - Wb35Reg_WriteSync(pHwData, 0x0868, 0x00050900); - reg->M68_MacControl = 0x00050900; - - /* M98 */ - Wb35Reg_WriteSync(pHwData, 0x0898, 0xffff8888); - reg->M98_MacControl = 0xffff8888; -} - - -void Uxx_power_off_procedure(struct hw_data *pHwData) -{ - /* SW, PMU reset and turn off clock */ - Wb35Reg_WriteSync(pHwData, 0x03b0, 3); - Wb35Reg_WriteSync(pHwData, 0x03f0, 0xf9); -} - -/*Decide the TxVga of every channel */ -void GetTxVgaFromEEPROM(struct hw_data *pHwData) -{ - u32 i, j, ltmp; - u16 Value[MAX_TXVGA_EEPROM]; - u8 *pctmp; - u8 ctmp = 0; - - /* Get the entire TxVga setting in EEPROM */ - for (i = 0; i < MAX_TXVGA_EEPROM; i++) { - Wb35Reg_WriteSync(pHwData, 0x03b4, 0x08100000 + 0x00010000 * i); - Wb35Reg_ReadSync(pHwData, 0x03b4, <mp); - Value[i] = (u16) (ltmp & 0xffff); /* Get 16 bit available */ - Value[i] = cpu_to_le16(Value[i]); /* [7:0]2412 [7:0]2417 .... */ - } - - /* Adjust the filed which fills with reserved value. */ - pctmp = (u8 *) Value; - for (i = 0; i < (MAX_TXVGA_EEPROM * 2); i++) { - if (pctmp[i] != 0xff) - ctmp = pctmp[i]; - else - pctmp[i] = ctmp; - } - - /* Adjust WB_242 to WB_242_1 TxVga scale */ - if (pHwData->phy_type == RF_WB_242) { - for (i = 0; i < 4; i++) { /* Only 2412 2437 2462 2484 case must be modified */ - for (j = 0; j < ARRAY_SIZE(w89rf242_txvga_old_mapping); j++) { - if (pctmp[i] < (u8) w89rf242_txvga_old_mapping[j][1]) { - pctmp[i] = (u8) w89rf242_txvga_old_mapping[j][0]; - break; - } - } - - if (j == ARRAY_SIZE(w89rf242_txvga_old_mapping)) - pctmp[i] = (u8)w89rf242_txvga_old_mapping[j-1][0]; - } - } - - memcpy(pHwData->TxVgaSettingInEEPROM, pctmp, MAX_TXVGA_EEPROM * 2); /* MAX_TXVGA_EEPROM is u16 count */ - EEPROMTxVgaAdjust(pHwData); -} - -/* - * This function will affect the TxVga parameter in HAL. If hal_set_current_channel - * or RFSynthesizer_SetPowerIndex be called, new TxVga will take effect. - * TxVgaSettingInEEPROM of sHwData is an u8 array point to EEPROM contain for IS89C35 - * This function will use default TxVgaSettingInEEPROM data to calculate new TxVga. - */ -void EEPROMTxVgaAdjust(struct hw_data *pHwData) -{ - u8 *pTxVga = pHwData->TxVgaSettingInEEPROM; - s16 i, stmp; - - /* -- 2.4G -- */ - /* channel 1 ~ 5 */ - stmp = pTxVga[1] - pTxVga[0]; - for (i = 0; i < 5; i++) - pHwData->TxVgaFor24[i] = pTxVga[0] + stmp * i / 4; - /* channel 6 ~ 10 */ - stmp = pTxVga[2] - pTxVga[1]; - for (i = 5; i < 10; i++) - pHwData->TxVgaFor24[i] = pTxVga[1] + stmp * (i - 5) / 4; - /* channel 11 ~ 13 */ - stmp = pTxVga[3] - pTxVga[2]; - for (i = 10; i < 13; i++) - pHwData->TxVgaFor24[i] = pTxVga[2] + stmp * (i - 10) / 2; - /* channel 14 */ - pHwData->TxVgaFor24[13] = pTxVga[3]; - - /* -- 5G -- */ - if (pHwData->phy_type == RF_AIROHA_7230) { - /* channel 184 */ - pHwData->TxVgaFor50[0].ChanNo = 184; - pHwData->TxVgaFor50[0].TxVgaValue = pTxVga[4]; - /* channel 196 */ - pHwData->TxVgaFor50[3].ChanNo = 196; - pHwData->TxVgaFor50[3].TxVgaValue = pTxVga[5]; - /* interpolate */ - pHwData->TxVgaFor50[1].ChanNo = 188; - pHwData->TxVgaFor50[2].ChanNo = 192; - stmp = pTxVga[5] - pTxVga[4]; - pHwData->TxVgaFor50[2].TxVgaValue = pTxVga[5] - stmp / 3; - pHwData->TxVgaFor50[1].TxVgaValue = pTxVga[5] - stmp * 2 / 3; - - /* channel 16 */ - pHwData->TxVgaFor50[6].ChanNo = 16; - pHwData->TxVgaFor50[6].TxVgaValue = pTxVga[6]; - pHwData->TxVgaFor50[4].ChanNo = 8; - pHwData->TxVgaFor50[4].TxVgaValue = pTxVga[6]; - pHwData->TxVgaFor50[5].ChanNo = 12; - pHwData->TxVgaFor50[5].TxVgaValue = pTxVga[6]; - - /* channel 36 */ - pHwData->TxVgaFor50[8].ChanNo = 36; - pHwData->TxVgaFor50[8].TxVgaValue = pTxVga[7]; - pHwData->TxVgaFor50[7].ChanNo = 34; - pHwData->TxVgaFor50[7].TxVgaValue = pTxVga[7]; - pHwData->TxVgaFor50[9].ChanNo = 38; - pHwData->TxVgaFor50[9].TxVgaValue = pTxVga[7]; - - /* channel 40 */ - pHwData->TxVgaFor50[10].ChanNo = 40; - pHwData->TxVgaFor50[10].TxVgaValue = pTxVga[8]; - /* channel 48 */ - pHwData->TxVgaFor50[14].ChanNo = 48; - pHwData->TxVgaFor50[14].TxVgaValue = pTxVga[9]; - /* interpolate */ - pHwData->TxVgaFor50[11].ChanNo = 42; - pHwData->TxVgaFor50[12].ChanNo = 44; - pHwData->TxVgaFor50[13].ChanNo = 46; - stmp = pTxVga[9] - pTxVga[8]; - pHwData->TxVgaFor50[13].TxVgaValue = pTxVga[9] - stmp / 4; - pHwData->TxVgaFor50[12].TxVgaValue = pTxVga[9] - stmp * 2 / 4; - pHwData->TxVgaFor50[11].TxVgaValue = pTxVga[9] - stmp * 3 / 4; - - /* channel 52 */ - pHwData->TxVgaFor50[15].ChanNo = 52; - pHwData->TxVgaFor50[15].TxVgaValue = pTxVga[10]; - /* channel 64 */ - pHwData->TxVgaFor50[18].ChanNo = 64; - pHwData->TxVgaFor50[18].TxVgaValue = pTxVga[11]; - /* interpolate */ - pHwData->TxVgaFor50[16].ChanNo = 56; - pHwData->TxVgaFor50[17].ChanNo = 60; - stmp = pTxVga[11] - pTxVga[10]; - pHwData->TxVgaFor50[17].TxVgaValue = pTxVga[11] - stmp / 3; - pHwData->TxVgaFor50[16].TxVgaValue = pTxVga[11] - stmp * 2 / 3; - - /* channel 100 */ - pHwData->TxVgaFor50[19].ChanNo = 100; - pHwData->TxVgaFor50[19].TxVgaValue = pTxVga[12]; - /* channel 112 */ - pHwData->TxVgaFor50[22].ChanNo = 112; - pHwData->TxVgaFor50[22].TxVgaValue = pTxVga[13]; - /* interpolate */ - pHwData->TxVgaFor50[20].ChanNo = 104; - pHwData->TxVgaFor50[21].ChanNo = 108; - stmp = pTxVga[13] - pTxVga[12]; - pHwData->TxVgaFor50[21].TxVgaValue = pTxVga[13] - stmp / 3; - pHwData->TxVgaFor50[20].TxVgaValue = pTxVga[13] - stmp * 2 / 3; - - /* channel 128 */ - pHwData->TxVgaFor50[26].ChanNo = 128; - pHwData->TxVgaFor50[26].TxVgaValue = pTxVga[14]; - /* interpolate */ - pHwData->TxVgaFor50[23].ChanNo = 116; - pHwData->TxVgaFor50[24].ChanNo = 120; - pHwData->TxVgaFor50[25].ChanNo = 124; - stmp = pTxVga[14] - pTxVga[13]; - pHwData->TxVgaFor50[25].TxVgaValue = pTxVga[14] - stmp / 4; - pHwData->TxVgaFor50[24].TxVgaValue = pTxVga[14] - stmp * 2 / 4; - pHwData->TxVgaFor50[23].TxVgaValue = pTxVga[14] - stmp * 3 / 4; - - /* channel 140 */ - pHwData->TxVgaFor50[29].ChanNo = 140; - pHwData->TxVgaFor50[29].TxVgaValue = pTxVga[15]; - /* interpolate */ - pHwData->TxVgaFor50[27].ChanNo = 132; - pHwData->TxVgaFor50[28].ChanNo = 136; - stmp = pTxVga[15] - pTxVga[14]; - pHwData->TxVgaFor50[28].TxVgaValue = pTxVga[15] - stmp / 3; - pHwData->TxVgaFor50[27].TxVgaValue = pTxVga[15] - stmp * 2 / 3; - - /* channel 149 */ - pHwData->TxVgaFor50[30].ChanNo = 149; - pHwData->TxVgaFor50[30].TxVgaValue = pTxVga[16]; - /* channel 165 */ - pHwData->TxVgaFor50[34].ChanNo = 165; - pHwData->TxVgaFor50[34].TxVgaValue = pTxVga[17]; - /* interpolate */ - pHwData->TxVgaFor50[31].ChanNo = 153; - pHwData->TxVgaFor50[32].ChanNo = 157; - pHwData->TxVgaFor50[33].ChanNo = 161; - stmp = pTxVga[17] - pTxVga[16]; - pHwData->TxVgaFor50[33].TxVgaValue = pTxVga[17] - stmp / 4; - pHwData->TxVgaFor50[32].TxVgaValue = pTxVga[17] - stmp * 2 / 4; - pHwData->TxVgaFor50[31].TxVgaValue = pTxVga[17] - stmp * 3 / 4; - } -} - -void BBProcessor_RateChanging(struct hw_data *pHwData, u8 rate) -{ - struct wb35_reg *reg = &pHwData->reg; - unsigned char Is11bRate; - - Is11bRate = (rate % 6) ? 1 : 0; - switch (pHwData->phy_type) { - case RF_AIROHA_2230: - case RF_AIROHA_2230S: - if (Is11bRate) { - if ((reg->BB48 != BB48_DEFAULT_AL2230_11B) && - (reg->BB4C != BB4C_DEFAULT_AL2230_11B)) { - Wb35Reg_Write(pHwData, 0x1048, BB48_DEFAULT_AL2230_11B); - Wb35Reg_Write(pHwData, 0x104c, BB4C_DEFAULT_AL2230_11B); - } - } else { - if ((reg->BB48 != BB48_DEFAULT_AL2230_11G) && - (reg->BB4C != BB4C_DEFAULT_AL2230_11G)) { - Wb35Reg_Write(pHwData, 0x1048, BB48_DEFAULT_AL2230_11G); - Wb35Reg_Write(pHwData, 0x104c, BB4C_DEFAULT_AL2230_11G); - } - } - break; - case RF_WB_242: - if (Is11bRate) { - if ((reg->BB48 != BB48_DEFAULT_WB242_11B) && - (reg->BB4C != BB4C_DEFAULT_WB242_11B)) { - reg->BB48 = BB48_DEFAULT_WB242_11B; - reg->BB4C = BB4C_DEFAULT_WB242_11B; - Wb35Reg_Write(pHwData, 0x1048, BB48_DEFAULT_WB242_11B); - Wb35Reg_Write(pHwData, 0x104c, BB4C_DEFAULT_WB242_11B); - } - } else { - if ((reg->BB48 != BB48_DEFAULT_WB242_11G) && - (reg->BB4C != BB4C_DEFAULT_WB242_11G)) { - reg->BB48 = BB48_DEFAULT_WB242_11G; - reg->BB4C = BB4C_DEFAULT_WB242_11G; - Wb35Reg_Write(pHwData, 0x1048, BB48_DEFAULT_WB242_11G); - Wb35Reg_Write(pHwData, 0x104c, BB4C_DEFAULT_WB242_11G); - } - } - break; - } -} - diff --git a/drivers/staging/winbond/sme_api.h b/drivers/staging/winbond/sme_api.h deleted file mode 100644 index 652ae7085a5f..000000000000 --- a/drivers/staging/winbond/sme_api.h +++ /dev/null @@ -1,191 +0,0 @@ -/* - * sme_api.h - * - * Copyright(C) 2002 Winbond Electronics Corp. - */ - -#ifndef __SME_API_H__ -#define __SME_API_H__ - -#include - -#include "localpara.h" - -/****************** CONSTANT AND MACRO SECTION ******************************/ - -#define MEDIA_STATE_DISCONNECTED 0 -#define MEDIA_STATE_CONNECTED 1 - -/* ARRAY CHECK */ -#define MAX_POWER_TO_DB 32 - -/****************** TYPE DEFINITION SECTION *********************************/ - -/****************** EXPORTED FUNCTION DECLARATION SECTION *******************/ - -/* OID_802_11_BSSID */ -s8 sme_get_bssid(void *pcore_data, u8 *pbssid); -s8 sme_get_desired_bssid(void *pcore_data, u8 *pbssid); /* Unused */ -s8 sme_set_desired_bssid(void *pcore_data, u8 *pbssid); - -/* OID_802_11_SSID */ -s8 sme_get_ssid(void *pcore_data, u8 *pssid, u8 *pssid_len); -s8 sme_get_desired_ssid(void *pcore_data, u8 *pssid, u8 *pssid_len);/* Unused */ -s8 sme_set_desired_ssid(void *pcore_data, u8 *pssid, u8 ssid_len); - -/* OID_802_11_INFRASTRUCTURE_MODE */ -s8 sme_get_bss_type(void *pcore_data, u8 *pbss_type); -s8 sme_get_desired_bss_type(void *pcore_data, u8 *pbss_type); /* Unused */ -s8 sme_set_desired_bss_type(void *pcore_data, u8 bss_type); - -/* OID_802_11_FRAGMENTATION_THRESHOLD */ -s8 sme_get_fragment_threshold(void *pcore_data, u32 *pthreshold); -s8 sme_set_fragment_threshold(void *pcore_data, u32 threshold); - -/* OID_802_11_RTS_THRESHOLD */ -s8 sme_get_rts_threshold(void *pcore_data, u32 *pthreshold); -s8 sme_set_rts_threshold(void *pcore_data, u32 threshold); - -/* OID_802_11_CONFIGURATION */ -s8 sme_get_beacon_period(void *pcore_data, u16 *pbeacon_period); -s8 sme_set_beacon_period(void *pcore_data, u16 beacon_period); - -s8 sme_get_atim_window(void *pcore_data, u16 *patim_window); -s8 sme_set_atim_window(void *pcore_data, u16 atim_window); - -s8 sme_get_current_channel(void *pcore_data, u8 *pcurrent_channel); -s8 sme_get_current_band(void *pcore_data, u8 *pcurrent_band); -s8 sme_set_current_channel(void *pcore_data, u8 current_channel); - -/* OID_802_11_BSSID_LIST */ -s8 sme_get_scan_bss_count(void *pcore_data, u8 *pcount); -s8 sme_get_scan_bss(void *pcore_data, u8 index, void **ppbss); - -s8 sme_get_connected_bss(void *pcore_data, void **ppbss_now); - -/* OID_802_11_AUTHENTICATION_MODE */ -s8 sme_get_auth_mode(void *pcore_data, u8 *pauth_mode); -s8 sme_set_auth_mode(void *pcore_data, u8 auth_mode); - -/* OID_802_11_WEP_STATUS / OID_802_11_ENCRYPTION_STATUS */ -s8 sme_get_wep_mode(void *pcore_data, u8 *pwep_mode); -s8 sme_set_wep_mode(void *pcore_data, u8 wep_mode); - -/* OID_GEN_VENDOR_ID */ -/* OID_802_3_PERMANENT_ADDRESS */ -s8 sme_get_permanent_mac_addr(void *pcore_data, u8 *pmac_addr); - -/* OID_802_3_CURRENT_ADDRESS */ -s8 sme_get_current_mac_addr(void *pcore_data, u8 *pmac_addr); - -/* OID_802_11_NETWORK_TYPE_IN_USE */ -s8 sme_get_network_type_in_use(void *pcore_data, u8 *ptype); -s8 sme_set_network_type_in_use(void *pcore_data, u8 type); - -/* OID_802_11_SUPPORTED_RATES */ -s8 sme_get_supported_rate(void *pcore_data, u8 *prates); - -/* OID_802_11_ADD_WEP */ -s8 sme_set_add_wep(void *pcore_data, u32 key_index, u32 key_len, - u8 *Address, u8 *key); - -/* OID_802_11_REMOVE_WEP */ -s8 sme_set_remove_wep(void *pcre_data, u32 key_index); - -/* OID_802_11_DISASSOCIATE */ -s8 sme_set_disassociate(void *pcore_data); - -/* OID_802_11_POWER_MODE */ -s8 sme_get_power_mode(void *pcore_data, u8 *pmode); -s8 sme_set_power_mode(void *pcore_data, u8 mode); - -/* OID_802_11_BSSID_LIST_SCAN */ -s8 sme_set_bssid_list_scan(void *pcore_data, void *pscan_para); - -/* OID_802_11_RELOAD_DEFAULTS */ -s8 sme_set_reload_defaults(void *pcore_data, u8 reload_type); - - -/*------------------------- non-standard ----------------------------------*/ -s8 sme_get_connect_status(void *pcore_data, u8 *pstatus); -/*--------------------------------------------------------------------------*/ - -void sme_get_encryption_status(void *pcore_data, u8 *EncryptStatus); -void sme_set_encryption_status(void *pcore_data, u8 EncryptStatus); -s8 sme_add_key(void *pcore_data, - u32 key_index, - u8 key_len, - u8 key_type, - u8 *key_bssid, - u8 *ptx_tsc, - u8 *prx_tsc, - u8 *key_material); -void sme_remove_default_key(void *pcore_data, int index); -void sme_remove_mapping_key(void *pcore_data, u8 *pmac_addr); -void sme_clear_all_mapping_key(void *pcore_data); -void sme_clear_all_default_key(void *pcore_data); - - - -s8 sme_set_preamble_mode(void *pcore_data, u8 mode); -s8 sme_get_preamble_mode(void *pcore_data, u8 *mode); -s8 sme_get_preamble_type(void *pcore_data, u8 *type); -s8 sme_set_slottime_mode(void *pcore_data, u8 mode); -s8 sme_get_slottime_mode(void *pcore_data, u8 *mode); -s8 sme_get_slottime_type(void *pcore_data, u8 *type); -s8 sme_set_txrate_policy(void *pcore_data, u8 policy); -s8 sme_get_txrate_policy(void *pcore_data, u8 *policy); -s8 sme_get_cwmin_value(void *pcore_data, u8 *cwmin); -s8 sme_get_cwmax_value(void *pcore_data, u16 *cwmax); -s8 sme_get_ms_radio_mode(void *pcore_data, u8 *pMsRadioOff); -s8 sme_set_ms_radio_mode(void *pcore_data, u8 boMsRadioOff); - -void sme_get_tx_power_level(void *pcore_data, u32 *TxPower); -u8 sme_set_tx_power_level(void *pcore_data, u32 TxPower); -void sme_get_antenna_count(void *pcore_data, u32 *AntennaCount); -void sme_get_rx_antenna(void *pcore_data, u32 *RxAntenna); -u8 sme_set_rx_antenna(void *pcore_data, u32 RxAntenna); -void sme_get_tx_antenna(void *pcore_data, u32 *TxAntenna); -s8 sme_set_tx_antenna(void *pcore_data, u32 TxAntenna); -s8 sme_set_IBSS_chan(void *pcore_data, struct chan_info chan); -s8 sme_set_IE_append(void *pcore_data, u8 *buffer, u16 buf_len); - -/* ================== Local functions ====================== */ -static const u32 PowerDbToMw[] = { - 56, /* mW, MAX - 0, 17.5 dbm */ - 40, /* mW, MAX - 1, 16.0 dbm */ - 30, /* mW, MAX - 2, 14.8 dbm */ - 20, /* mW, MAX - 3, 13.0 dbm */ - 15, /* mW, MAX - 4, 11.8 dbm */ - 12, /* mW, MAX - 5, 10.6 dbm */ - 9, /* mW, MAX - 6, 9.4 dbm */ - 7, /* mW, MAX - 7, 8.3 dbm */ - 5, /* mW, MAX - 8, 6.4 dbm */ - 4, /* mW, MAX - 9, 5.3 dbm */ - 3, /* mW, MAX - 10, 4.0 dbm */ - 2, /* mW, MAX - 11, ? dbm */ - 2, /* mW, MAX - 12, ? dbm */ - 2, /* mW, MAX - 13, ? dbm */ - 2, /* mW, MAX - 14, ? dbm */ - 2, /* mW, MAX - 15, ? dbm */ - 2, /* mW, MAX - 16, ? dbm */ - 2, /* mW, MAX - 17, ? dbm */ - 2, /* mW, MAX - 18, ? dbm */ - 1, /* mW, MAX - 19, ? dbm */ - 1, /* mW, MAX - 20, ? dbm */ - 1, /* mW, MAX - 21, ? dbm */ - 1, /* mW, MAX - 22, ? dbm */ - 1, /* mW, MAX - 23, ? dbm */ - 1, /* mW, MAX - 24, ? dbm */ - 1, /* mW, MAX - 25, ? dbm */ - 1, /* mW, MAX - 26, ? dbm */ - 1, /* mW, MAX - 27, ? dbm */ - 1, /* mW, MAX - 28, ? dbm */ - 1, /* mW, MAX - 29, ? dbm */ - 1, /* mW, MAX - 30, ? dbm */ - 1 /* mW, MAX - 31, ? dbm */ -}; - -#endif /* __SME_API_H__ */ - - diff --git a/drivers/staging/winbond/wb35reg.c b/drivers/staging/winbond/wb35reg.c deleted file mode 100644 index bbc5ddcce6f5..000000000000 --- a/drivers/staging/winbond/wb35reg.c +++ /dev/null @@ -1,806 +0,0 @@ -#include "wb35reg_f.h" -#include "phy_calibration.h" - -#include -#include - -/* - * true : read command process successfully - * false : register not support - * RegisterNo : start base - * pRegisterData : data point - * NumberOfData : number of register data - * Flag : AUTO_INCREMENT - RegisterNo will auto increment 4 - * NO_INCREMENT - Function will write data into the same register - */ -unsigned char Wb35Reg_BurstWrite(struct hw_data *pHwData, u16 RegisterNo, - u32 *pRegisterData, u8 NumberOfData, u8 Flag) -{ - struct wb35_reg *reg = &pHwData->reg; - struct urb *urb = NULL; - struct wb35_reg_queue *reg_queue = NULL; - u16 UrbSize; - struct usb_ctrlrequest *dr; - u16 i, DataSize = NumberOfData * 4; - - /* Module shutdown */ - if (pHwData->SurpriseRemove) - return false; - - /* Trying to use burst write function if use new hardware */ - UrbSize = sizeof(struct wb35_reg_queue) + DataSize + sizeof(struct usb_ctrlrequest); - reg_queue = kzalloc(UrbSize, GFP_ATOMIC); - if (reg_queue == NULL) - return false; - - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (urb == NULL) { - kfree(reg_queue); - return false; - } - - reg_queue->DIRECT = 2; /* burst write register */ - reg_queue->INDEX = RegisterNo; - reg_queue->pBuffer = (u32 *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue)); - memcpy(reg_queue->pBuffer, pRegisterData, DataSize); - /* the function for reversing register data from little endian to big endian */ - for (i = 0; i < NumberOfData; i++) - reg_queue->pBuffer[i] = cpu_to_le32(reg_queue->pBuffer[i]); - - dr = (struct usb_ctrlrequest *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue) + DataSize); - dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE; - dr->bRequest = 0x04; /* USB or vendor-defined request code, burst mode */ - dr->wValue = cpu_to_le16(Flag); /* 0: Register number auto-increment, 1: No auto increment */ - dr->wIndex = cpu_to_le16(RegisterNo); - dr->wLength = cpu_to_le16(DataSize); - reg_queue->Next = NULL; - reg_queue->pUsbReq = dr; - reg_queue->urb = urb; - - spin_lock_irq(®->EP0VM_spin_lock); - if (reg->reg_first == NULL) - reg->reg_first = reg_queue; - else - reg->reg_last->Next = reg_queue; - reg->reg_last = reg_queue; - - spin_unlock_irq(®->EP0VM_spin_lock); - - /* Start EP0VM */ - Wb35Reg_EP0VM_start(pHwData); - - return true; -} - -void Wb35Reg_Update(struct hw_data *pHwData, u16 RegisterNo, u32 RegisterValue) -{ - struct wb35_reg *reg = &pHwData->reg; - switch (RegisterNo) { - case 0x3b0: - reg->U1B0 = RegisterValue; - break; - case 0x3bc: - reg->U1BC_LEDConfigure = RegisterValue; - break; - case 0x400: - reg->D00_DmaControl = RegisterValue; - break; - case 0x800: - reg->M00_MacControl = RegisterValue; - break; - case 0x804: - reg->M04_MulticastAddress1 = RegisterValue; - break; - case 0x808: - reg->M08_MulticastAddress2 = RegisterValue; - break; - case 0x824: - reg->M24_MacControl = RegisterValue; - break; - case 0x828: - reg->M28_MacControl = RegisterValue; - break; - case 0x82c: - reg->M2C_MacControl = RegisterValue; - break; - case 0x838: - reg->M38_MacControl = RegisterValue; - break; - case 0x840: - reg->M40_MacControl = RegisterValue; - break; - case 0x844: - reg->M44_MacControl = RegisterValue; - break; - case 0x848: - reg->M48_MacControl = RegisterValue; - break; - case 0x84c: - reg->M4C_MacStatus = RegisterValue; - break; - case 0x860: - reg->M60_MacControl = RegisterValue; - break; - case 0x868: - reg->M68_MacControl = RegisterValue; - break; - case 0x870: - reg->M70_MacControl = RegisterValue; - break; - case 0x874: - reg->M74_MacControl = RegisterValue; - break; - case 0x878: - reg->M78_ERPInformation = RegisterValue; - break; - case 0x87C: - reg->M7C_MacControl = RegisterValue; - break; - case 0x880: - reg->M80_MacControl = RegisterValue; - break; - case 0x884: - reg->M84_MacControl = RegisterValue; - break; - case 0x888: - reg->M88_MacControl = RegisterValue; - break; - case 0x898: - reg->M98_MacControl = RegisterValue; - break; - case 0x100c: - reg->BB0C = RegisterValue; - break; - case 0x102c: - reg->BB2C = RegisterValue; - break; - case 0x1030: - reg->BB30 = RegisterValue; - break; - case 0x103c: - reg->BB3C = RegisterValue; - break; - case 0x1048: - reg->BB48 = RegisterValue; - break; - case 0x104c: - reg->BB4C = RegisterValue; - break; - case 0x1050: - reg->BB50 = RegisterValue; - break; - case 0x1054: - reg->BB54 = RegisterValue; - break; - case 0x1058: - reg->BB58 = RegisterValue; - break; - case 0x105c: - reg->BB5C = RegisterValue; - break; - case 0x1060: - reg->BB60 = RegisterValue; - break; - } -} - -/* - * true : read command process successfully - * false : register not support - */ -unsigned char Wb35Reg_WriteSync(struct hw_data *pHwData, u16 RegisterNo, - u32 RegisterValue) -{ - struct wb35_reg *reg = &pHwData->reg; - int ret = -1; - - /* Module shutdown */ - if (pHwData->SurpriseRemove) - return false; - - RegisterValue = cpu_to_le32(RegisterValue); - - /* update the register by send usb message */ - reg->SyncIoPause = 1; - - /* Wait until EP0VM stop */ - while (reg->EP0vm_state != VM_STOP) - msleep(10); - - /* Sync IoCallDriver */ - reg->EP0vm_state = VM_RUNNING; - ret = usb_control_msg(pHwData->udev, - usb_sndctrlpipe(pHwData->udev, 0), - 0x03, - USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, - 0x0, RegisterNo, &RegisterValue, 4, HZ * 100); - reg->EP0vm_state = VM_STOP; - reg->SyncIoPause = 0; - - Wb35Reg_EP0VM_start(pHwData); - - if (ret < 0) { - pr_debug("EP0 Write register usb message sending error\n"); - pHwData->SurpriseRemove = 1; - return false; - } - return true; -} - -/* - * true : read command process successfully - * false : register not support - */ -unsigned char Wb35Reg_Write(struct hw_data *pHwData, u16 RegisterNo, - u32 RegisterValue) -{ - struct wb35_reg *reg = &pHwData->reg; - struct usb_ctrlrequest *dr; - struct urb *urb = NULL; - struct wb35_reg_queue *reg_queue = NULL; - u16 UrbSize; - - /* Module shutdown */ - if (pHwData->SurpriseRemove) - return false; - - /* update the register by send urb request */ - UrbSize = sizeof(struct wb35_reg_queue) + sizeof(struct usb_ctrlrequest); - reg_queue = kzalloc(UrbSize, GFP_ATOMIC); - if (reg_queue == NULL) - return false; - - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (urb == NULL) { - kfree(reg_queue); - return false; - } - - reg_queue->DIRECT = 1; /* burst write register */ - reg_queue->INDEX = RegisterNo; - reg_queue->VALUE = cpu_to_le32(RegisterValue); - reg_queue->RESERVED_VALID = false; - dr = (struct usb_ctrlrequest *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue)); - dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE; - dr->bRequest = 0x03; /* USB or vendor-defined request code, burst mode */ - dr->wValue = cpu_to_le16(0x0); - dr->wIndex = cpu_to_le16(RegisterNo); - dr->wLength = cpu_to_le16(4); - - /* Enter the sending queue */ - reg_queue->Next = NULL; - reg_queue->pUsbReq = dr; - reg_queue->urb = urb; - - spin_lock_irq(®->EP0VM_spin_lock); - if (reg->reg_first == NULL) - reg->reg_first = reg_queue; - else - reg->reg_last->Next = reg_queue; - reg->reg_last = reg_queue; - - spin_unlock_irq(®->EP0VM_spin_lock); - - /* Start EP0VM */ - Wb35Reg_EP0VM_start(pHwData); - - return true; -} - -/* - * This command will be executed with a user defined value. When it completes, - * this value is useful. For example, hal_set_current_channel will use it. - * true : read command process successfully - * false : register not supported - */ -unsigned char Wb35Reg_WriteWithCallbackValue(struct hw_data *pHwData, - u16 RegisterNo, - u32 RegisterValue, - s8 *pValue, - s8 Len) -{ - struct wb35_reg *reg = &pHwData->reg; - struct usb_ctrlrequest *dr; - struct urb *urb = NULL; - struct wb35_reg_queue *reg_queue = NULL; - u16 UrbSize; - - /* Module shutdown */ - if (pHwData->SurpriseRemove) - return false; - - /* update the register by send urb request */ - UrbSize = sizeof(struct wb35_reg_queue) + sizeof(struct usb_ctrlrequest); - reg_queue = kzalloc(UrbSize, GFP_ATOMIC); - if (reg_queue == NULL) - return false; - - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (urb == NULL) { - kfree(reg_queue); - return false; - } - - reg_queue->DIRECT = 1; /* burst write register */ - reg_queue->INDEX = RegisterNo; - reg_queue->VALUE = cpu_to_le32(RegisterValue); - /* NOTE : Users must guarantee the size of value will not exceed the buffer size. */ - memcpy(reg_queue->RESERVED, pValue, Len); - reg_queue->RESERVED_VALID = true; - dr = (struct usb_ctrlrequest *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue)); - dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE; - dr->bRequest = 0x03; /* USB or vendor-defined request code, burst mode */ - dr->wValue = cpu_to_le16(0x0); - dr->wIndex = cpu_to_le16(RegisterNo); - dr->wLength = cpu_to_le16(4); - - /* Enter the sending queue */ - reg_queue->Next = NULL; - reg_queue->pUsbReq = dr; - reg_queue->urb = urb; - spin_lock_irq(®->EP0VM_spin_lock); - if (reg->reg_first == NULL) - reg->reg_first = reg_queue; - else - reg->reg_last->Next = reg_queue; - reg->reg_last = reg_queue; - - spin_unlock_irq(®->EP0VM_spin_lock); - - /* Start EP0VM */ - Wb35Reg_EP0VM_start(pHwData); - - return true; -} - -/* - * true : read command process successfully - * false : register not support - * pRegisterValue : It must be a resident buffer due to - * asynchronous read register. - */ -unsigned char Wb35Reg_ReadSync(struct hw_data *pHwData, u16 RegisterNo, - u32 *pRegisterValue) -{ - struct wb35_reg *reg = &pHwData->reg; - u32 *pltmp = pRegisterValue; - int ret = -1; - - /* Module shutdown */ - if (pHwData->SurpriseRemove) - return false; - - /* Read the register by send usb message */ - reg->SyncIoPause = 1; - - /* Wait until EP0VM stop */ - while (reg->EP0vm_state != VM_STOP) - msleep(10); - - reg->EP0vm_state = VM_RUNNING; - ret = usb_control_msg(pHwData->udev, - usb_rcvctrlpipe(pHwData->udev, 0), - 0x01, - USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, - 0x0, RegisterNo, pltmp, 4, HZ * 100); - - *pRegisterValue = cpu_to_le32(*pltmp); - - reg->EP0vm_state = VM_STOP; - - Wb35Reg_Update(pHwData, RegisterNo, *pRegisterValue); - reg->SyncIoPause = 0; - - Wb35Reg_EP0VM_start(pHwData); - - if (ret < 0) { - pr_debug("EP0 Read register usb message sending error\n"); - pHwData->SurpriseRemove = 1; - return false; - } - return true; -} - -/* - * true : read command process successfully - * false : register not support - * pRegisterValue : It must be a resident buffer due to - * asynchronous read register. - */ -unsigned char Wb35Reg_Read(struct hw_data *pHwData, u16 RegisterNo, - u32 *pRegisterValue) -{ - struct wb35_reg *reg = &pHwData->reg; - struct usb_ctrlrequest *dr; - struct urb *urb; - struct wb35_reg_queue *reg_queue; - u16 UrbSize; - - /* Module shutdown */ - if (pHwData->SurpriseRemove) - return false; - - /* update the variable by send Urb to read register */ - UrbSize = sizeof(struct wb35_reg_queue) + sizeof(struct usb_ctrlrequest); - reg_queue = kzalloc(UrbSize, GFP_ATOMIC); - if (reg_queue == NULL) - return false; - - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (urb == NULL) { - kfree(reg_queue); - return false; - } - reg_queue->DIRECT = 0; /* read register */ - reg_queue->INDEX = RegisterNo; - reg_queue->pBuffer = pRegisterValue; - dr = (struct usb_ctrlrequest *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue)); - dr->bRequestType = USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN; - dr->bRequest = 0x01; /* USB or vendor-defined request code, burst mode */ - dr->wValue = cpu_to_le16(0x0); - dr->wIndex = cpu_to_le16(RegisterNo); - dr->wLength = cpu_to_le16(4); - - /* Enter the sending queue */ - reg_queue->Next = NULL; - reg_queue->pUsbReq = dr; - reg_queue->urb = urb; - spin_lock_irq(®->EP0VM_spin_lock); - if (reg->reg_first == NULL) - reg->reg_first = reg_queue; - else - reg->reg_last->Next = reg_queue; - reg->reg_last = reg_queue; - - spin_unlock_irq(®->EP0VM_spin_lock); - - /* Start EP0VM */ - Wb35Reg_EP0VM_start(pHwData); - - return true; -} - - -void Wb35Reg_EP0VM_start(struct hw_data *pHwData) -{ - struct wb35_reg *reg = &pHwData->reg; - - if (atomic_inc_return(®->RegFireCount) == 1) { - reg->EP0vm_state = VM_RUNNING; - Wb35Reg_EP0VM(pHwData); - } else - atomic_dec(®->RegFireCount); -} - -void Wb35Reg_EP0VM(struct hw_data *pHwData) -{ - struct wb35_reg *reg = &pHwData->reg; - struct urb *urb; - struct usb_ctrlrequest *dr; - u32 *pBuffer; - int ret = -1; - struct wb35_reg_queue *reg_queue; - - - if (reg->SyncIoPause) - goto cleanup; - - if (pHwData->SurpriseRemove) - goto cleanup; - - /* Get the register data and send to USB through Irp */ - spin_lock_irq(®->EP0VM_spin_lock); - reg_queue = reg->reg_first; - spin_unlock_irq(®->EP0VM_spin_lock); - - if (!reg_queue) - goto cleanup; - - /* Get an Urb, send it */ - urb = (struct urb *)reg_queue->urb; - - dr = reg_queue->pUsbReq; - urb = reg_queue->urb; - pBuffer = reg_queue->pBuffer; - if (reg_queue->DIRECT == 1) /* output */ - pBuffer = ®_queue->VALUE; - - usb_fill_control_urb(urb, pHwData->udev, - REG_DIRECTION(pHwData->udev, reg_queue), - (u8 *)dr, pBuffer, cpu_to_le16(dr->wLength), - Wb35Reg_EP0VM_complete, (void *)pHwData); - - reg->EP0vm_state = VM_RUNNING; - - ret = usb_submit_urb(urb, GFP_ATOMIC); - - if (ret < 0) { - pr_debug("EP0 Irp sending error\n"); - goto cleanup; - } - return; - - cleanup: - reg->EP0vm_state = VM_STOP; - atomic_dec(®->RegFireCount); -} - - -void Wb35Reg_EP0VM_complete(struct urb *urb) -{ - struct hw_data *pHwData = (struct hw_data *)urb->context; - struct wb35_reg *reg = &pHwData->reg; - struct wb35_reg_queue *reg_queue; - - - /* Variable setting */ - reg->EP0vm_state = VM_COMPLETED; - reg->EP0VM_status = urb->status; - - if (pHwData->SurpriseRemove) { /* Let WbWlanHalt to handle surprise remove */ - reg->EP0vm_state = VM_STOP; - atomic_dec(®->RegFireCount); - } else { - /* Complete to send, remove the URB from the first */ - spin_lock_irq(®->EP0VM_spin_lock); - reg_queue = reg->reg_first; - if (reg_queue == reg->reg_last) - reg->reg_last = NULL; - reg->reg_first = reg->reg_first->Next; - spin_unlock_irq(®->EP0VM_spin_lock); - - if (reg->EP0VM_status) { - pr_debug("EP0 IoCompleteRoutine return error\n"); - reg->EP0vm_state = VM_STOP; - pHwData->SurpriseRemove = 1; - } else { - /* Success. Update the result */ - - /* Start the next send */ - Wb35Reg_EP0VM(pHwData); - } - - kfree(reg_queue); - } - - usb_free_urb(urb); -} - - -void Wb35Reg_destroy(struct hw_data *pHwData) -{ - struct wb35_reg *reg = &pHwData->reg; - struct urb *urb; - struct wb35_reg_queue *reg_queue; - - Uxx_power_off_procedure(pHwData); - - /* Wait for Reg operation completed */ - do { - msleep(10); /* Delay for waiting function enter */ - } while (reg->EP0vm_state != VM_STOP); - msleep(10); /* Delay for waiting function enter */ - - /* Release all the data in RegQueue */ - spin_lock_irq(®->EP0VM_spin_lock); - reg_queue = reg->reg_first; - while (reg_queue) { - if (reg_queue == reg->reg_last) - reg->reg_last = NULL; - reg->reg_first = reg->reg_first->Next; - - urb = reg_queue->urb; - spin_unlock_irq(®->EP0VM_spin_lock); - if (urb) { - usb_free_urb(urb); - kfree(reg_queue); - } else { - pr_debug("EP0 queue release error\n"); - } - spin_lock_irq(®->EP0VM_spin_lock); - - reg_queue = reg->reg_first; - } - spin_unlock_irq(®->EP0VM_spin_lock); -} - -/* - * ======================================================================= - * The function can be run in passive-level only. - * ========================================================================= - */ -unsigned char Wb35Reg_initial(struct hw_data *pHwData) -{ - struct wb35_reg *reg = &pHwData->reg; - u32 ltmp; - u32 SoftwareSet, VCO_trim, TxVga, Region_ScanInterval; - - /* Spin lock is acquired for read and write IRP command */ - spin_lock_init(®->EP0VM_spin_lock); - - /* Getting RF module type from EEPROM */ - Wb35Reg_WriteSync(pHwData, 0x03b4, 0x080d0000); /* Start EEPROM access + Read + address(0x0d) */ - Wb35Reg_ReadSync(pHwData, 0x03b4, <mp); - - /* Update RF module type and determine the PHY type by inf or EEPROM */ - reg->EEPROMPhyType = (u8)(ltmp & 0xff); - /* - * 0 V MAX2825, 1 V MAX2827, 2 V MAX2828, 3 V MAX2829 - * 16V AL2230, 17 - AL7230, 18 - AL2230S - * 32 Reserved - * 33 - W89RF242(TxVGA 0~19), 34 - W89RF242(TxVGA 0~34) - */ - if (reg->EEPROMPhyType != RF_DECIDE_BY_INF) { - if ((reg->EEPROMPhyType == RF_MAXIM_2825) || - (reg->EEPROMPhyType == RF_MAXIM_2827) || - (reg->EEPROMPhyType == RF_MAXIM_2828) || - (reg->EEPROMPhyType == RF_MAXIM_2829) || - (reg->EEPROMPhyType == RF_MAXIM_V1) || - (reg->EEPROMPhyType == RF_AIROHA_2230) || - (reg->EEPROMPhyType == RF_AIROHA_2230S) || - (reg->EEPROMPhyType == RF_AIROHA_7230) || - (reg->EEPROMPhyType == RF_WB_242) || - (reg->EEPROMPhyType == RF_WB_242_1)) - pHwData->phy_type = reg->EEPROMPhyType; - } - - /* Power On procedure running. The relative parameter will be set according to phy_type */ - Uxx_power_on_procedure(pHwData); - - /* Reading MAC address */ - Uxx_ReadEthernetAddress(pHwData); - - /* Read VCO trim for RF parameter */ - Wb35Reg_WriteSync(pHwData, 0x03b4, 0x08200000); - Wb35Reg_ReadSync(pHwData, 0x03b4, &VCO_trim); - - /* Read Antenna On/Off of software flag */ - Wb35Reg_WriteSync(pHwData, 0x03b4, 0x08210000); - Wb35Reg_ReadSync(pHwData, 0x03b4, &SoftwareSet); - - /* Read TXVGA */ - Wb35Reg_WriteSync(pHwData, 0x03b4, 0x08100000); - Wb35Reg_ReadSync(pHwData, 0x03b4, &TxVga); - - /* Get Scan interval setting from EEPROM offset 0x1c */ - Wb35Reg_WriteSync(pHwData, 0x03b4, 0x081d0000); - Wb35Reg_ReadSync(pHwData, 0x03b4, &Region_ScanInterval); - - /* Update Ethernet address */ - memcpy(pHwData->CurrentMacAddress, pHwData->PermanentMacAddress, ETH_ALEN); - - /* Update software variable */ - pHwData->SoftwareSet = (u16)(SoftwareSet & 0xffff); - TxVga &= 0x000000ff; - pHwData->PowerIndexFromEEPROM = (u8)TxVga; - pHwData->VCO_trim = (u8)VCO_trim & 0xff; - if (pHwData->VCO_trim == 0xff) - pHwData->VCO_trim = 0x28; - - reg->EEPROMRegion = (u8)(Region_ScanInterval >> 8); - if (reg->EEPROMRegion < 1 || reg->EEPROMRegion > 6) - reg->EEPROMRegion = REGION_AUTO; - - /* For Get Tx VGA from EEPROM */ - GetTxVgaFromEEPROM(pHwData); - - /* Set Scan Interval */ - pHwData->Scan_Interval = (u8)(Region_ScanInterval & 0xff) * 10; - if ((pHwData->Scan_Interval == 2550) || (pHwData->Scan_Interval < 10)) /* Is default setting 0xff * 10 */ - pHwData->Scan_Interval = SCAN_MAX_CHNL_TIME; - - /* Initial register */ - RFSynthesizer_initial(pHwData); - - BBProcessor_initial(pHwData); /* Async write, must wait until complete */ - - Wb35Reg_phy_calibration(pHwData); - - Mxx_initial(pHwData); - Dxx_initial(pHwData); - - if (pHwData->SurpriseRemove) - return false; - else - return true; /* Initial fail */ -} - -/* - * ================================================================ - * CardComputeCrc -- - * - * Description: - * Runs the AUTODIN II CRC algorithm on the buffers Buffer length. - * - * Arguments: - * Buffer - the input buffer - * Length - the length of Buffer - * - * Return Value: - * The 32-bit CRC value. - * =================================================================== - */ -u32 CardComputeCrc(u8 *Buffer, u32 Length) -{ - u32 Crc, Carry; - u32 i, j; - u8 CurByte; - - Crc = 0xffffffff; - - for (i = 0; i < Length; i++) { - CurByte = Buffer[i]; - for (j = 0; j < 8; j++) { - Carry = ((Crc & 0x80000000) ? 1 : 0) ^ (CurByte & 0x01); - Crc <<= 1; - CurByte >>= 1; - if (Carry) - Crc = (Crc ^ 0x04c11db6) | Carry; - } - } - return Crc; -} - - -/* - * ================================================================== - * BitReverse -- - * Reverse the bits in the input argument, dwData, which is - * regarded as a string of bits with the length, DataLength. - * - * Arguments: - * dwData : - * DataLength : - * - * Return: - * The converted value. - * ================================================================== - */ -u32 BitReverse(u32 dwData, u32 DataLength) -{ - u32 HalfLength, i, j; - u32 BitA, BitB; - - if (DataLength <= 0) - return 0; /* No conversion is done. */ - dwData = dwData & (0xffffffff >> (32 - DataLength)); - - HalfLength = DataLength / 2; - for (i = 0, j = DataLength - 1; i < HalfLength; i++, j--) { - BitA = GetBit(dwData, i); - BitB = GetBit(dwData, j); - if (BitA && !BitB) { - dwData = ClearBit(dwData, i); - dwData = SetBit(dwData, j); - } else if (!BitA && BitB) { - dwData = SetBit(dwData, i); - dwData = ClearBit(dwData, j); - } else { - /* Do nothing since these two bits are of the save values. */ - } - } - return dwData; -} - -void Wb35Reg_phy_calibration(struct hw_data *pHwData) -{ - u32 BB3c, BB54; - - if ((pHwData->phy_type == RF_WB_242) || - (pHwData->phy_type == RF_WB_242_1)) { - phy_calibration_winbond(pHwData, 2412); /* Sync operation */ - Wb35Reg_ReadSync(pHwData, 0x103c, &BB3c); - Wb35Reg_ReadSync(pHwData, 0x1054, &BB54); - - pHwData->BB3c_cal = BB3c; - pHwData->BB54_cal = BB54; - - RFSynthesizer_initial(pHwData); - BBProcessor_initial(pHwData); /* Async operation */ - - Wb35Reg_WriteSync(pHwData, 0x103c, BB3c); - Wb35Reg_WriteSync(pHwData, 0x1054, BB54); - } -} - - diff --git a/drivers/staging/winbond/wb35reg_f.h b/drivers/staging/winbond/wb35reg_f.h deleted file mode 100644 index 95dc98096845..000000000000 --- a/drivers/staging/winbond/wb35reg_f.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef __WINBOND_WB35REG_F_H -#define __WINBOND_WB35REG_F_H - -#include "wbhal.h" - -/* - * ==================================== - * Interface function declare - * ==================================== - */ -unsigned char Wb35Reg_initial(struct hw_data *hw_data); -void Uxx_power_on_procedure(struct hw_data *hw_data); -void Uxx_power_off_procedure(struct hw_data *hw_data); -void Uxx_ReadEthernetAddress(struct hw_data *hw_data); -void Dxx_initial(struct hw_data *hw_data); -void Mxx_initial(struct hw_data *hw_data); -void RFSynthesizer_initial(struct hw_data *hw_data); -void RFSynthesizer_SwitchingChannel(struct hw_data *hw_data, struct chan_info channel); -void BBProcessor_initial(struct hw_data *hw_data); -void BBProcessor_RateChanging(struct hw_data *hw_data, u8 rate); -u8 RFSynthesizer_SetPowerIndex(struct hw_data *hw_data, u8 power_index); -u8 RFSynthesizer_SetMaxim2828_24Power(struct hw_data *, u8 index); -u8 RFSynthesizer_SetMaxim2828_50Power(struct hw_data *, u8 index); -u8 RFSynthesizer_SetMaxim2827_24Power(struct hw_data *, u8 index); -u8 RFSynthesizer_SetMaxim2827_50Power(struct hw_data *, u8 index); -u8 RFSynthesizer_SetMaxim2825Power(struct hw_data *, u8 index); -u8 RFSynthesizer_SetAiroha2230Power(struct hw_data *, u8 index); -u8 RFSynthesizer_SetAiroha7230Power(struct hw_data *, u8 index); -u8 RFSynthesizer_SetWinbond242Power(struct hw_data *, u8 index); -void GetTxVgaFromEEPROM(struct hw_data *hw_data); -void EEPROMTxVgaAdjust(struct hw_data *hw_data); - -#define RFWriteControlData(_A, _V) Wb35Reg_Write(_A, 0x0864, _V) - -void Wb35Reg_destroy(struct hw_data *hw_data); - -unsigned char Wb35Reg_Read(struct hw_data *hw_data, u16 register_no, u32 *register_value); -unsigned char Wb35Reg_ReadSync(struct hw_data *hw_data, u16 register_no, u32 *register_value); -unsigned char Wb35Reg_Write(struct hw_data *hw_data, u16 register_no, u32 register_value); -unsigned char Wb35Reg_WriteSync(struct hw_data *hw_data, u16 register_no, u32 register_value); -unsigned char Wb35Reg_WriteWithCallbackValue(struct hw_data *hw_data, - u16 register_no, - u32 register_value, - s8 *value, - s8 len); -unsigned char Wb35Reg_BurstWrite(struct hw_data *hw_data, - u16 register_no, - u32 *register_data, - u8 number_of_data, - u8 flag); - -void Wb35Reg_EP0VM(struct hw_data *hw_data); -void Wb35Reg_EP0VM_start(struct hw_data *hw_data); -void Wb35Reg_EP0VM_complete(struct urb *urb); - -u32 BitReverse(u32 data, u32 data_length); - -void CardGetMulticastBit(u8 address[MAC_ADDR_LENGTH], u8 *byte, u8 *value); -u32 CardComputeCrc(u8 *buffer, u32 length); - -void Wb35Reg_phy_calibration(struct hw_data *hw_data); -void Wb35Reg_Update(struct hw_data *hw_data, u16 register_no, u32 register_value); -unsigned char adjust_TXVGA_for_iq_mag(struct hw_data *hw_data); - -#endif diff --git a/drivers/staging/winbond/wb35reg_s.h b/drivers/staging/winbond/wb35reg_s.h deleted file mode 100644 index dc79faa4029f..000000000000 --- a/drivers/staging/winbond/wb35reg_s.h +++ /dev/null @@ -1,240 +0,0 @@ -#ifndef __WINBOND_WB35REG_S_H -#define __WINBOND_WB35REG_S_H - -#include -#include -#include - -struct hw_data; - -/* ========================================================================= - * - * HAL setting function - * - * ======================================== - * |Uxx| |Dxx| |Mxx| |BB| |RF| - * ======================================== - * | | - * Wb35Reg_Read Wb35Reg_Write - * - * ---------------------------------------- - * WbUsb_CallUSBDASync supplied By WbUsb module - * ========================================================================== - */ -#define GetBit(dwData, i) (dwData & (0x00000001 << i)) -#define SetBit(dwData, i) (dwData | (0x00000001 << i)) -#define ClearBit(dwData, i) (dwData & ~(0x00000001 << i)) - -#define IGNORE_INCREMENT 0 -#define AUTO_INCREMENT 0 -#define NO_INCREMENT 1 -#define REG_DIRECTION(_x, _y) ((_y)->DIRECT == 0 ? usb_rcvctrlpipe(_x, 0) : usb_sndctrlpipe(_x, 0)) -#define REG_BUF_SIZE(_x) ((_x)->bRequest == 0x04 ? cpu_to_le16((_x)->wLength) : 4) - -#define BB48_DEFAULT_AL2230_11B 0x0033447c -#define BB4C_DEFAULT_AL2230_11B 0x0A00FEFF -#define BB48_DEFAULT_AL2230_11G 0x00332C1B -#define BB4C_DEFAULT_AL2230_11G 0x0A00FEFF - - -#define BB48_DEFAULT_WB242_11B 0x00292315 /* backoff 2dB */ -#define BB4C_DEFAULT_WB242_11B 0x0800FEFF /* backoff 2dB */ -#define BB48_DEFAULT_WB242_11G 0x00453B24 -#define BB4C_DEFAULT_WB242_11G 0x0E00FEFF - -/* - * ==================================== - * Default setting for Mxx - * ==================================== - */ -#define DEFAULT_CWMIN 31 /* (M2C) CWmin. Its value is in the range 0-31. */ -#define DEFAULT_CWMAX 1023 /* (M2C) CWmax. Its value is in the range 0-1023. */ -#define DEFAULT_AID 1 /* (M34) AID. Its value is in the range 1-2007. */ - -#define DEFAULT_RATE_RETRY_LIMIT 2 /* (M38) as named */ - -#define DEFAULT_LONG_RETRY_LIMIT 7 /* (M38) LongRetryLimit. Its value is in the range 0-15. */ -#define DEFAULT_SHORT_RETRY_LIMIT 7 /* (M38) ShortRetryLimit. Its value is in the range 0-15. */ -#define DEFAULT_PIFST 25 /* (M3C) PIFS Time. Its value is in the range 0-65535. */ -#define DEFAULT_EIFST 354 /* (M3C) EIFS Time. Its value is in the range 0-1048575. */ -#define DEFAULT_DIFST 45 /* (M3C) DIFS Time. Its value is in the range 0-65535. */ -#define DEFAULT_SIFST 5 /* (M3C) SIFS Time. Its value is in the range 0-65535. */ -#define DEFAULT_OSIFST 10 /* (M3C) Original SIFS Time. Its value is in the range 0-15. */ -#define DEFAULT_ATIMWD 0 /* (M40) ATIM Window. Its value is in the range 0-65535. */ -#define DEFAULT_SLOT_TIME 20 /* (M40) ($) SlotTime. Its value is in the range 0-255. */ -#define DEFAULT_MAX_TX_MSDU_LIFE_TIME 512 /* (M44) MaxTxMSDULifeTime. Its value is in the range 0-4294967295. */ -#define DEFAULT_BEACON_INTERVAL 500 /* (M48) Beacon Interval. Its value is in the range 0-65535. */ -#define DEFAULT_PROBE_DELAY_TIME 200 /* (M48) Probe Delay Time. Its value is in the range 0-65535. */ -#define DEFAULT_PROTOCOL_VERSION 0 /* (M4C) */ -#define DEFAULT_MAC_POWER_STATE 2 /* (M4C) 2: MAC at power active */ -#define DEFAULT_DTIM_ALERT_TIME 0 - - -struct wb35_reg_queue { - struct urb *urb; - void *pUsbReq; - void *Next; - union { - u32 VALUE; - u32 *pBuffer; - }; - u8 RESERVED[4]; /* space reserved for communication */ - u16 INDEX; /* For storing the register index */ - u8 RESERVED_VALID; /* Indicate whether the RESERVED space is valid at this command. */ - u8 DIRECT; /* 0:In 1:Out */ -}; - -/* - * ==================================== - * Internal variable for module - * ==================================== - */ -#define MAX_SQ3_FILTER_SIZE 5 -struct wb35_reg { - /* - * ============================ - * Register Bank backup - * ============================ - */ - u32 U1B0; /* bit16 record the h/w radio on/off status */ - u32 U1BC_LEDConfigure; - u32 D00_DmaControl; - u32 M00_MacControl; - union { - struct { - u32 M04_MulticastAddress1; - u32 M08_MulticastAddress2; - }; - u8 Multicast[8]; /* contents of card multicast registers */ - }; - - u32 M24_MacControl; - u32 M28_MacControl; - u32 M2C_MacControl; - u32 M38_MacControl; - u32 M3C_MacControl; - u32 M40_MacControl; - u32 M44_MacControl; - u32 M48_MacControl; - u32 M4C_MacStatus; - u32 M60_MacControl; - u32 M68_MacControl; - u32 M70_MacControl; - u32 M74_MacControl; - u32 M78_ERPInformation; - u32 M7C_MacControl; - u32 M80_MacControl; - u32 M84_MacControl; - u32 M88_MacControl; - u32 M98_MacControl; - - /* Baseband register */ - u32 BB0C; /* Used for LNA calculation */ - u32 BB2C; - u32 BB30; /* 11b acquisition control register */ - u32 BB3C; - u32 BB48; - u32 BB4C; - u32 BB50; /* mode control register */ - u32 BB54; - u32 BB58; /* IQ_ALPHA */ - u32 BB5C; /* For test */ - u32 BB60; /* for WTO read value */ - - /* VM */ - spinlock_t EP0VM_spin_lock; /* 4B */ - u32 EP0VM_status; /* $$ */ - struct wb35_reg_queue *reg_first; - struct wb35_reg_queue *reg_last; - atomic_t RegFireCount; - - /* Hardware status */ - u8 EP0vm_state; - u8 mac_power_save; - u8 EEPROMPhyType; /* - * 0 ~ 15 for Maxim (0 ĄV MAX2825, 1 ĄV MAX2827, 2 ĄV MAX2828, 3 ĄV MAX2829), - * 16 ~ 31 for Airoha (16 ĄV AL2230, 11 - AL7230) - * 32 ~ Reserved - * 33 ~ 47 For WB242 ( 33 - WB242, 34 - WB242 with new Txvga 0.5 db step) - * 48 ~ 255 ARE RESERVED. - */ - u8 EEPROMRegion; /* Region setting in EEPROM */ - - u32 SyncIoPause; /* If user use the Sync Io to access Hw, then pause the async access */ - - u8 LNAValue[4]; /* Table for speed up running */ - u32 SQ3_filter[MAX_SQ3_FILTER_SIZE]; - u32 SQ3_index; -}; - -/* ===================================================================== - * Function declaration - * ===================================================================== - */ -void hal_remove_mapping_key(struct hw_data *hw_data, u8 *mac_addr); -void hal_remove_default_key(struct hw_data *hw_data, u32 index); -unsigned char hal_set_mapping_key(struct hw_data *adapter, u8 *mac_addr, - u8 null_key, u8 wep_on, u8 *tx_tsc, - u8 *rx_tsc, u8 key_type, u8 key_len, - u8 *key_data); -unsigned char hal_set_default_key(struct hw_data *adapter, u8 index, - u8 null_key, u8 wep_on, u8 *tx_tsc, - u8 *rx_tsc, u8 key_type, u8 key_len, - u8 *key_data); -void hal_clear_all_default_key(struct hw_data *hw_data); -void hal_clear_all_group_key(struct hw_data *hw_data); -void hal_clear_all_mapping_key(struct hw_data *hw_data); -void hal_clear_all_key(struct hw_data *hw_data); -void hal_set_power_save_mode(struct hw_data *hw_data, unsigned char power_save, - unsigned char wakeup, unsigned char dtim); -void hal_get_power_save_mode(struct hw_data *hw_data, u8 *in_pwr_save); -void hal_set_slot_time(struct hw_data *hw_data, u8 type); - -#define hal_set_atim_window(_A, _ATM) - -void hal_start_bss(struct hw_data *hw_data, u8 mac_op_mode); - -/* 0:BSS STA 1:IBSS STA */ -void hal_join_request(struct hw_data *hw_data, u8 bss_type); - -void hal_stop_sync_bss(struct hw_data *hw_data); -void hal_resume_sync_bss(struct hw_data *hw_data); -void hal_set_aid(struct hw_data *hw_data, u16 aid); -void hal_set_bssid(struct hw_data *hw_data, u8 *bssid); -void hal_get_bssid(struct hw_data *hw_data, u8 *bssid); -void hal_set_listen_interval(struct hw_data *hw_data, u16 listen_interval); -void hal_set_cap_info(struct hw_data *hw_data, u16 capability_info); -void hal_set_ssid(struct hw_data *hw_data, u8 *ssid, u8 ssid_len); -void hal_start_tx0(struct hw_data *hw_data); - -#define hal_get_cwmin(_A) ((_A)->cwmin) - -void hal_set_cwmax(struct hw_data *hw_data, u16 cwin_max); - -#define hal_get_cwmax(_A) ((_A)->cwmax) - -void hal_set_rsn_wpa(struct hw_data *hw_data, u32 *rsn_ie_bitmap, - u32 *rsn_oui_type , unsigned char desired_auth_mode); -void hal_set_connect_info(struct hw_data *hw_data, unsigned char bo_connect); -u8 hal_get_est_sq3(struct hw_data *hw_data, u8 count); -void hal_descriptor_indicate(struct hw_data *hw_data, - struct wb35_descriptor *des); -u8 hal_get_antenna_number(struct hw_data *hw_data); -u32 hal_get_bss_pk_cnt(struct hw_data *hw_data); - -#define hal_get_region_from_EEPROM(_A) ((_A)->reg.EEPROMRegion) -#define hal_get_tx_buffer(_A, _B) Wb35Tx_get_tx_buffer(_A, _B) -#define hal_software_set(_A) (_A->SoftwareSet) -#define hal_driver_init_OK(_A) (_A->IsInitOK) -#define hal_rssi_boundary_high(_A) (_A->RSSI_high) -#define hal_rssi_boundary_low(_A) (_A->RSSI_low) -#define hal_scan_interval(_A) (_A->Scan_Interval) - -#define PHY_DEBUG(msg, args...) - -/* return 100ms count */ -#define hal_get_time_count(_P) (_P->time_count / 10) - -#define hal_ibss_disconnect(_A) (hal_stop_sync_bss(_A)) - -#endif diff --git a/drivers/staging/winbond/wb35rx.c b/drivers/staging/winbond/wb35rx.c deleted file mode 100644 index f006b166aebc..000000000000 --- a/drivers/staging/winbond/wb35rx.c +++ /dev/null @@ -1,358 +0,0 @@ -/* - * ============================================================================ - * Copyright (c) 1996-2002 Winbond Electronic Corporation - * - * Module Name: - * Wb35Rx.c - * - * Abstract: - * Processing the Rx message from down layer - * - * ============================================================================ - */ -#include -#include - -#include "core.h" -#include "wb35rx_f.h" - -static void packet_came(struct ieee80211_hw *hw, char *pRxBufferAddress, - int PacketSize) -{ - struct wbsoft_priv *priv = hw->priv; - struct sk_buff *skb; - struct ieee80211_rx_status rx_status = {0}; - - if (!priv->enabled) - return; - - skb = dev_alloc_skb(PacketSize); - if (!skb) { - printk("Not enough memory for packet, FIXME\n"); - return; - } - - memcpy(skb_put(skb, PacketSize), pRxBufferAddress, PacketSize); - - memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status)); - ieee80211_rx_irqsafe(hw, skb); -} - -static void Wb35Rx_adjust(struct wb35_descriptor *pRxDes) -{ - u32 *pRxBufferAddress; - u32 DecryptionMethod; - u32 i; - u16 BufferSize; - - DecryptionMethod = pRxDes->R01.R01_decryption_method; - pRxBufferAddress = pRxDes->buffer_address[0]; - BufferSize = pRxDes->buffer_size[0]; - - /* Adjust the last part of data. Only data left */ - BufferSize -= 4; /* For CRC-32 */ - if (DecryptionMethod) - BufferSize -= 4; - if (DecryptionMethod == 3) /* For CCMP */ - BufferSize -= 4; - - /* Adjust the IV field which after 802.11 header and ICV field. */ - if (DecryptionMethod == 1) { /* For WEP */ - for (i = 6; i > 0; i--) - pRxBufferAddress[i] = pRxBufferAddress[i - 1]; - pRxDes->buffer_address[0] = pRxBufferAddress + 1; - BufferSize -= 4; /* 4 byte for IV */ - } else if (DecryptionMethod) { /* For TKIP and CCMP */ - for (i = 7; i > 1; i--) - pRxBufferAddress[i] = pRxBufferAddress[i - 2]; - /* Update the descriptor, shift 8 byte */ - pRxDes->buffer_address[0] = pRxBufferAddress + 2; - BufferSize -= 8; /* 8 byte for IV + ICV */ - } - pRxDes->buffer_size[0] = BufferSize; -} - -static u16 Wb35Rx_indicate(struct ieee80211_hw *hw) -{ - struct wbsoft_priv *priv = hw->priv; - struct hw_data *pHwData = &priv->sHwData; - struct wb35_descriptor RxDes; - struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; - u8 *pRxBufferAddress; - u16 PacketSize; - u16 stmp, BufferSize, stmp2 = 0; - u32 RxBufferId; - - /* Only one thread be allowed to run into the following */ - do { - RxBufferId = pWb35Rx->RxProcessIndex; - if (pWb35Rx->RxOwner[RxBufferId]) /* Owner by VM */ - break; - - pWb35Rx->RxProcessIndex++; - pWb35Rx->RxProcessIndex %= MAX_USB_RX_BUFFER_NUMBER; - - pRxBufferAddress = pWb35Rx->pDRx; - BufferSize = pWb35Rx->RxBufferSize[RxBufferId]; - - /* Parse the bulkin buffer */ - while (BufferSize >= 4) { - /* Is ending? */ - if ((cpu_to_le32(*(u32 *)pRxBufferAddress) & 0x0fffffff) == - RX_END_TAG) - break; - - /* Get the R00 R01 first */ - RxDes.R00.value = le32_to_cpu(*(u32 *)pRxBufferAddress); - PacketSize = (u16)RxDes.R00.R00_receive_byte_count; - RxDes.R01.value = le32_to_cpu(*((u32 *)(pRxBufferAddress + 4))); - /* For new DMA 4k */ - if ((PacketSize & 0x03) > 0) - PacketSize -= 4; - - /* Basic check for Rx length. Is length valid? */ - if (PacketSize > MAX_PACKET_SIZE) { - pr_debug("Serious ERROR : Rx data size too long, size =%d\n", - PacketSize); - pWb35Rx->EP3vm_state = VM_STOP; - pWb35Rx->Ep3ErrorCount2++; - break; - } - - /* - * Wb35Rx_indicate() is called synchronously so it isn't - * necessary to set "RxDes.Desctriptor_ID = RxBufferID;" - */ - /* subtract 8 byte for 35's USB header length */ - BufferSize -= 8; - pRxBufferAddress += 8; - - RxDes.buffer_address[0] = pRxBufferAddress; - RxDes.buffer_size[0] = PacketSize; - RxDes.buffer_number = 1; - RxDes.buffer_start_index = 0; - RxDes.buffer_total_size = RxDes.buffer_size[0]; - Wb35Rx_adjust(&RxDes); - - packet_came(hw, pRxBufferAddress, PacketSize); - - /* Move RxBuffer point to the next */ - stmp = PacketSize + 3; - stmp &= ~0x03; /* 4n alignment */ - pRxBufferAddress += stmp; - BufferSize -= stmp; - stmp2 += stmp; - } - - /* Reclaim resource */ - pWb35Rx->RxOwner[RxBufferId] = 1; - } while (true); - return stmp2; -} - -static void Wb35Rx(struct ieee80211_hw *hw); - -static void Wb35Rx_Complete(struct urb *urb) -{ - struct ieee80211_hw *hw = urb->context; - struct wbsoft_priv *priv = hw->priv; - struct hw_data *pHwData = &priv->sHwData; - struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; - u8 *pRxBufferAddress; - u32 SizeCheck; - u16 BulkLength; - u32 RxBufferId; - struct R00_descriptor R00; - - /* Variable setting */ - pWb35Rx->EP3vm_state = VM_COMPLETED; - pWb35Rx->EP3VM_status = urb->status; /* Store the last result of Irp */ - - RxBufferId = pWb35Rx->CurrentRxBufferId; - - pRxBufferAddress = pWb35Rx->pDRx; - BulkLength = (u16)urb->actual_length; - - /* The IRP is completed */ - pWb35Rx->EP3vm_state = VM_COMPLETED; - - if (pHwData->SurpriseRemove) /* Must be here, or RxBufferId is invalid */ - goto error; - - if (pWb35Rx->rx_halt) - goto error; - - /* Start to process the data only in successful condition */ - pWb35Rx->RxOwner[RxBufferId] = 0; /* Set the owner to driver */ - R00.value = le32_to_cpu(*(u32 *)pRxBufferAddress); - - /* The URB is completed, check the result */ - if (pWb35Rx->EP3VM_status != 0) { - pr_debug("EP3 IoCompleteRoutine return error\n"); - pWb35Rx->EP3vm_state = VM_STOP; - goto error; - } - - /* For recovering. check if operating in single USB mode */ - if (!HAL_USB_MODE_BURST(pHwData)) { - SizeCheck = R00.R00_receive_byte_count; - if ((SizeCheck & 0x03) > 0) - SizeCheck -= 4; - SizeCheck = (SizeCheck + 3) & ~0x03; - SizeCheck += 12; /* 8 + 4 badbeef */ - if ((BulkLength > 1600) || - (SizeCheck > 1600) || - (BulkLength != SizeCheck) || - (BulkLength == 0)) { /* Add for fail Urb */ - pWb35Rx->EP3vm_state = VM_STOP; - pWb35Rx->Ep3ErrorCount2++; - } - } - - /* Indicating the receiving data */ - pWb35Rx->ByteReceived += BulkLength; - pWb35Rx->RxBufferSize[RxBufferId] = BulkLength; - - if (!pWb35Rx->RxOwner[RxBufferId]) - Wb35Rx_indicate(hw); - - kfree(pWb35Rx->pDRx); - /* Do the next receive */ - Wb35Rx(hw); - return; - -error: - pWb35Rx->RxOwner[RxBufferId] = 1; /* Set the owner to hardware */ - atomic_dec(&pWb35Rx->RxFireCounter); - pWb35Rx->EP3vm_state = VM_STOP; -} - -/* This function cannot reentrain */ -static void Wb35Rx(struct ieee80211_hw *hw) -{ - struct wbsoft_priv *priv = hw->priv; - struct hw_data *pHwData = &priv->sHwData; - struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; - u8 *pRxBufferAddress; - struct urb *urb = pWb35Rx->RxUrb; - int retv; - u32 RxBufferId; - - /* Issuing URB */ - if (pHwData->SurpriseRemove) - goto error; - - if (pWb35Rx->rx_halt) - goto error; - - /* Get RxBuffer's ID */ - RxBufferId = pWb35Rx->RxBufferId; - if (!pWb35Rx->RxOwner[RxBufferId]) { - /* It's impossible to run here. */ - pr_debug("Rx driver fifo unavailable\n"); - goto error; - } - - /* Update buffer point, then start to bulkin the data from USB */ - pWb35Rx->RxBufferId++; - pWb35Rx->RxBufferId %= MAX_USB_RX_BUFFER_NUMBER; - - pWb35Rx->CurrentRxBufferId = RxBufferId; - - pWb35Rx->pDRx = kzalloc(MAX_USB_RX_BUFFER, GFP_ATOMIC); - if (!pWb35Rx->pDRx) { - dev_info(&hw->wiphy->dev, "w35und: Rx memory alloc failed\n"); - goto error; - } - pRxBufferAddress = pWb35Rx->pDRx; - - usb_fill_bulk_urb(urb, pHwData->udev, - usb_rcvbulkpipe(pHwData->udev, 3), - pRxBufferAddress, MAX_USB_RX_BUFFER, - Wb35Rx_Complete, hw); - - pWb35Rx->EP3vm_state = VM_RUNNING; - - retv = usb_submit_urb(urb, GFP_ATOMIC); - - if (retv != 0) { - dev_info(&hw->wiphy->dev, "Rx URB sending error\n"); - goto error; - } - return; - -error: - /* VM stop */ - pWb35Rx->EP3vm_state = VM_STOP; - atomic_dec(&pWb35Rx->RxFireCounter); -} - -void Wb35Rx_start(struct ieee80211_hw *hw) -{ - struct wbsoft_priv *priv = hw->priv; - struct hw_data *pHwData = &priv->sHwData; - struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; - - /* Allow only one thread to run into the Wb35Rx() function */ - if (atomic_inc_return(&pWb35Rx->RxFireCounter) == 1) { - pWb35Rx->EP3vm_state = VM_RUNNING; - Wb35Rx(hw); - } else - atomic_dec(&pWb35Rx->RxFireCounter); -} - -static void Wb35Rx_reset_descriptor(struct hw_data *pHwData) -{ - struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; - u32 i; - - pWb35Rx->ByteReceived = 0; - pWb35Rx->RxProcessIndex = 0; - pWb35Rx->RxBufferId = 0; - pWb35Rx->EP3vm_state = VM_STOP; - pWb35Rx->rx_halt = 0; - - /* Initial the Queue. The last buffer is reserved for used - * if the Rx resource is unavailable. - */ - for (i = 0; i < MAX_USB_RX_BUFFER_NUMBER; i++) - pWb35Rx->RxOwner[i] = 1; -} - -unsigned char Wb35Rx_initial(struct hw_data *pHwData) -{ - struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; - - /* Initial the Buffer Queue */ - Wb35Rx_reset_descriptor(pHwData); - - pWb35Rx->RxUrb = usb_alloc_urb(0, GFP_ATOMIC); - return !!pWb35Rx->RxUrb; -} - -void Wb35Rx_stop(struct hw_data *pHwData) -{ - struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; - - /* Canceling the Irp if already sends it out. */ - if (pWb35Rx->EP3vm_state == VM_RUNNING) { - /* Only use unlink, let Wb35Rx_destroy to free them */ - usb_unlink_urb(pWb35Rx->RxUrb); - pr_debug("EP3 Rx stop\n"); - } -} - -/* Needs process context */ -void Wb35Rx_destroy(struct hw_data *pHwData) -{ - struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; - - do { - msleep(10); /* Delay for waiting function enter */ - } while (pWb35Rx->EP3vm_state != VM_STOP); - msleep(10); /* Delay for waiting function exit */ - - usb_free_urb(pWb35Rx->RxUrb); - pr_debug("Wb35Rx_destroy OK\n"); -} - diff --git a/drivers/staging/winbond/wb35rx_f.h b/drivers/staging/winbond/wb35rx_f.h deleted file mode 100644 index 559bdca12e1a..000000000000 --- a/drivers/staging/winbond/wb35rx_f.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef __WINBOND_WB35RX_F_H -#define __WINBOND_WB35RX_F_H - -#include -#include "wbhal.h" - -/* - * Interface function declaration - */ -unsigned char Wb35Rx_initial(struct hw_data *pHwData); -void Wb35Rx_destroy(struct hw_data *pHwData); -void Wb35Rx_stop(struct hw_data *pHwData); -void Wb35Rx_start(struct ieee80211_hw *hw); - -#endif diff --git a/drivers/staging/winbond/wb35rx_s.h b/drivers/staging/winbond/wb35rx_s.h deleted file mode 100644 index 545bc9500723..000000000000 --- a/drivers/staging/winbond/wb35rx_s.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef __WINBOND_35RX_S_H -#define __WINBOND_35RX_S_H - -/* Definition for this module used */ -#define MAX_USB_RX_BUFFER 4096 /* This parameter must be 4096 931130.4.f */ -#define MAX_USB_RX_BUFFER_NUMBER ETHERNET_RX_DESCRIPTORS /* Maximum 254, 255 is RESERVED ID */ -#define RX_INTERFACE 0 /* Interface 1 */ -#define RX_PIPE 2 /* Pipe 3 */ -#define MAX_PACKET_SIZE 1600 /* 1568 = 8 + 1532 + 4 + 24(IV EIV MIC ICV CRC) for check DMA data 931130.4.g */ -#define RX_END_TAG 0x0badbeef - - -/* - * Internal variable for module - */ -struct wb35_rx { - u32 ByteReceived; /* For calculating throughput of BulkIn */ - atomic_t RxFireCounter;/* Does Wb35Rx module fire? */ - - u8 RxBuffer[MAX_USB_RX_BUFFER_NUMBER][((MAX_USB_RX_BUFFER+3) & ~0x03)]; - u16 RxBufferSize[((MAX_USB_RX_BUFFER_NUMBER+1) & ~0x01)]; - u8 RxOwner[((MAX_USB_RX_BUFFER_NUMBER+3) & ~0x03)]; /* Ownership of buffer 0:SW 1:HW */ - - u32 RxProcessIndex; /* The next index to process */ - u32 RxBufferId; - u32 EP3vm_state; - - u32 rx_halt; /* For VM stopping */ - - u16 MoreDataSize; - u16 PacketSize; - - u32 CurrentRxBufferId; /* For complete routine usage */ - u32 Rx3UrbCancel; - - u32 LastR1; /* For RSSI reporting */ - struct urb *RxUrb; - u32 Ep3ErrorCount2; /* 20060625.1 Usbd for Rx DMA error count */ - - int EP3VM_status; - u8 *pDRx; -}; - -#endif /* __WINBOND_35RX_S_H */ diff --git a/drivers/staging/winbond/wb35tx.c b/drivers/staging/winbond/wb35tx.c deleted file mode 100644 index 870cff39a226..000000000000 --- a/drivers/staging/winbond/wb35tx.c +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Copyright (c) 1996-2002 Winbond Electronic Corporation - * - * Module Name: - * Wb35Tx.c - * - * Abstract: - * Processing the Tx message and put into down layer - * - */ -#include -#include - -#include "wb35tx_f.h" -#include "mds_f.h" - -unsigned char -Wb35Tx_get_tx_buffer(struct hw_data *pHwData, u8 **pBuffer) -{ - struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; - - *pBuffer = pWb35Tx->TxBuffer[0]; - return true; -} - -static void Wb35Tx(struct wbsoft_priv *adapter); - -static void Wb35Tx_complete(struct urb *pUrb) -{ - struct wbsoft_priv *adapter = pUrb->context; - struct hw_data *pHwData = &adapter->sHwData; - struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; - struct wb35_mds *pMds = &adapter->Mds; - - printk("wb35: tx complete\n"); - /* Variable setting */ - pWb35Tx->EP4vm_state = VM_COMPLETED; - pWb35Tx->EP4VM_status = pUrb->status; /* Store the last result of Irp */ - /* Set the owner. Free the owner bit always. */ - pMds->TxOwner[pWb35Tx->TxSendIndex] = 0; - pWb35Tx->TxSendIndex++; - pWb35Tx->TxSendIndex %= MAX_USB_TX_BUFFER_NUMBER; - - if (pHwData->SurpriseRemove) /* Let WbWlanHalt handle surprise remove */ - goto error; - - if (pWb35Tx->tx_halt) - goto error; - - /* The URB is completed, check the result */ - if (pWb35Tx->EP4VM_status != 0) { - dev_err(&pUrb->dev->dev, "URB submission failed\n"); - pWb35Tx->EP4vm_state = VM_STOP; - goto error; - } - - Mds_Tx(adapter); - Wb35Tx(adapter); - return; - -error: - atomic_dec(&pWb35Tx->TxFireCounter); - pWb35Tx->EP4vm_state = VM_STOP; -} - -static void Wb35Tx(struct wbsoft_priv *adapter) -{ - struct hw_data *pHwData = &adapter->sHwData; - struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; - u8 *pTxBufferAddress; - struct wb35_mds *pMds = &adapter->Mds; - struct urb *pUrb = (struct urb *)pWb35Tx->Tx4Urb; - int retv; - u32 SendIndex; - - if (pHwData->SurpriseRemove) - goto cleanup; - - if (pWb35Tx->tx_halt) - goto cleanup; - - /* Ownership checking */ - SendIndex = pWb35Tx->TxSendIndex; - /* No more data need to be sent, return immediately */ - if (!pMds->TxOwner[SendIndex]) - goto cleanup; - - pTxBufferAddress = pWb35Tx->TxBuffer[SendIndex]; - - /* Issuing URB */ - usb_fill_bulk_urb(pUrb, pHwData->udev, - usb_sndbulkpipe(pHwData->udev, 4), - pTxBufferAddress, pMds->TxBufferSize[SendIndex], - Wb35Tx_complete, adapter); - - pWb35Tx->EP4vm_state = VM_RUNNING; - retv = usb_submit_urb(pUrb, GFP_ATOMIC); - if (retv < 0) { - dev_err(&pUrb->dev->dev, "EP4 Tx Irp sending error\n"); - goto cleanup; - } - - /* Check if driver needs issue Irp for EP2 */ - pWb35Tx->TxFillCount += pMds->TxCountInBuffer[SendIndex]; - if (pWb35Tx->TxFillCount > 12) - Wb35Tx_EP2VM_start(adapter); - - pWb35Tx->ByteTransfer += pMds->TxBufferSize[SendIndex]; - return; - - cleanup: - pWb35Tx->EP4vm_state = VM_STOP; - atomic_dec(&pWb35Tx->TxFireCounter); -} - -void Wb35Tx_start(struct wbsoft_priv *adapter) -{ - struct hw_data *pHwData = &adapter->sHwData; - struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; - - /* Allow only one thread to run into function */ - if (atomic_inc_return(&pWb35Tx->TxFireCounter) == 1) { - pWb35Tx->EP4vm_state = VM_RUNNING; - Wb35Tx(adapter); - } else - atomic_dec(&pWb35Tx->TxFireCounter); -} - -unsigned char Wb35Tx_initial(struct hw_data *pHwData) -{ - struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; - - pWb35Tx->Tx4Urb = usb_alloc_urb(0, GFP_ATOMIC); - if (!pWb35Tx->Tx4Urb) - return false; - - pWb35Tx->Tx2Urb = usb_alloc_urb(0, GFP_ATOMIC); - if (!pWb35Tx->Tx2Urb) { - usb_free_urb(pWb35Tx->Tx4Urb); - return false; - } - - return true; -} - -void Wb35Tx_stop(struct hw_data *pHwData) -{ - struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; - - /* Try to cancel the Trp of EP2 */ - if (pWb35Tx->EP2vm_state == VM_RUNNING) - /* Only use unlink, let Wb35Tx_destroy free them */ - usb_unlink_urb(pWb35Tx->Tx2Urb); - pr_debug("EP2 Tx stop\n"); - - /* Try to cancel the Irp of EP4 */ - if (pWb35Tx->EP4vm_state == VM_RUNNING) - /* Only use unlink, let Wb35Tx_destroy free them */ - usb_unlink_urb(pWb35Tx->Tx4Urb); - pr_debug("EP4 Tx stop\n"); -} - -void Wb35Tx_destroy(struct hw_data *pHwData) -{ - struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; - - /* Wait for VM stop */ - do { - msleep(10); /* Delay for waiting function enter 940623.1.a */ - } while ((pWb35Tx->EP2vm_state != VM_STOP) && (pWb35Tx->EP4vm_state != VM_STOP)); - msleep(10); /* Delay for waiting function enter 940623.1.b */ - - usb_free_urb(pWb35Tx->Tx4Urb); - usb_free_urb(pWb35Tx->Tx2Urb); - - pr_debug("Wb35Tx_destroy OK\n"); -} - -void Wb35Tx_CurrentTime(struct wbsoft_priv *adapter, u32 TimeCount) -{ - struct hw_data *pHwData = &adapter->sHwData; - struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; - bool Trigger = false; - - if (pWb35Tx->TxTimer > TimeCount) - Trigger = true; - else if (TimeCount > (pWb35Tx->TxTimer+500)) - Trigger = true; - - if (Trigger) { - pWb35Tx->TxTimer = TimeCount; - Wb35Tx_EP2VM_start(adapter); - } -} - -static void Wb35Tx_EP2VM(struct wbsoft_priv *adapter); - -static void Wb35Tx_EP2VM_complete(struct urb *pUrb) -{ - struct wbsoft_priv *adapter = pUrb->context; - struct hw_data *pHwData = &adapter->sHwData; - struct T02_descriptor T02, TSTATUS; - struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; - u32 *pltmp = (u32 *)pWb35Tx->EP2_buf; - u32 i; - u16 InterruptInLength; - - /* Variable setting */ - pWb35Tx->EP2vm_state = VM_COMPLETED; - pWb35Tx->EP2VM_status = pUrb->status; - - /* For Linux 2.4. Interrupt will always trigger */ - if (pHwData->SurpriseRemove) /* Let WbWlanHalt handle surprise remove */ - goto error; - - if (pWb35Tx->tx_halt) - goto error; - - /* The Urb is completed, check the result */ - if (pWb35Tx->EP2VM_status != 0) { - dev_err(&pUrb->dev->dev, "EP2 IoCompleteRoutine return error\n"); - pWb35Tx->EP2vm_state = VM_STOP; - goto error; - } - - /* Update the Tx result */ - InterruptInLength = pUrb->actual_length; - /* Modify for minimum memory access and DWORD alignment. */ - T02.value = cpu_to_le32(pltmp[0]) >> 8; /* [31:8] -> [24:0] */ - InterruptInLength -= 1; /* 20051221.1.c Modify the follow for more stable */ - InterruptInLength >>= 2; /* InterruptInLength/4 */ - for (i = 1; i <= InterruptInLength; i++) { - T02.value |= ((cpu_to_le32(pltmp[i]) & 0xff) << 24); - - TSTATUS.value = T02.value; /* 20061009 anson's endian */ - Mds_SendComplete(adapter, &TSTATUS); - T02.value = cpu_to_le32(pltmp[i]) >> 8; - } - - return; -error: - atomic_dec(&pWb35Tx->TxResultCount); - pWb35Tx->EP2vm_state = VM_STOP; -} - -static void Wb35Tx_EP2VM(struct wbsoft_priv *adapter) -{ - struct hw_data *pHwData = &adapter->sHwData; - struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; - struct urb *pUrb = (struct urb *)pWb35Tx->Tx2Urb; - u32 *pltmp = (u32 *)pWb35Tx->EP2_buf; - int retv; - - if (pHwData->SurpriseRemove) - goto error; - - if (pWb35Tx->tx_halt) - goto error; - - /* Issuing URB */ - usb_fill_int_urb(pUrb, pHwData->udev, usb_rcvintpipe(pHwData->udev, 2), - pltmp, MAX_INTERRUPT_LENGTH, Wb35Tx_EP2VM_complete, - adapter, 32); - - pWb35Tx->EP2vm_state = VM_RUNNING; - retv = usb_submit_urb(pUrb, GFP_ATOMIC); - - if (retv < 0) { - pr_debug("EP2 Tx Irp sending error\n"); - goto error; - } - - return; -error: - pWb35Tx->EP2vm_state = VM_STOP; - atomic_dec(&pWb35Tx->TxResultCount); -} - -void Wb35Tx_EP2VM_start(struct wbsoft_priv *adapter) -{ - struct hw_data *pHwData = &adapter->sHwData; - struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; - - /* Allow only one thread to run into function */ - if (atomic_inc_return(&pWb35Tx->TxResultCount) == 1) { - pWb35Tx->EP2vm_state = VM_RUNNING; - Wb35Tx_EP2VM(adapter); - } else - atomic_dec(&pWb35Tx->TxResultCount); -} diff --git a/drivers/staging/winbond/wb35tx_f.h b/drivers/staging/winbond/wb35tx_f.h deleted file mode 100644 index 018fd35e815d..000000000000 --- a/drivers/staging/winbond/wb35tx_f.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef __WINBOND_WB35TX_F_H -#define __WINBOND_WB35TX_F_H - -#include "core.h" - -/* - * ==================================== - * Interface function declare - * ==================================== - */ -unsigned char Wb35Tx_initial(struct hw_data *hw_data); -void Wb35Tx_destroy(struct hw_data *hw_data); -unsigned char Wb35Tx_get_tx_buffer(struct hw_data *hw_data, u8 **buffer); - -void Wb35Tx_EP2VM_start(struct wbsoft_priv *adapter); - -void Wb35Tx_start(struct wbsoft_priv *adapter); -void Wb35Tx_stop(struct hw_data *hw_data); - -void Wb35Tx_CurrentTime(struct wbsoft_priv *adapter, u32 time_count); - -#endif diff --git a/drivers/staging/winbond/wb35tx_s.h b/drivers/staging/winbond/wb35tx_s.h deleted file mode 100644 index dc120085d528..000000000000 --- a/drivers/staging/winbond/wb35tx_s.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef __WINBOND_WB35_TX_S_H -#define __WINBOND_WB35_TX_S_H - -#include "mds_s.h" - -/* IS89C35 Tx related definition */ -#define TX_INTERFACE 0 /* Interface 1 */ -#define TX_PIPE 3 /* Endpoint 4 */ -#define TX_INTERRUPT 1 /* Endpoint 2 */ -#define MAX_INTERRUPT_LENGTH 64 /* It must be 64 for EP2 hardware */ - -/* Internal variable for module */ -struct wb35_tx { - /* For Tx buffer */ - u8 TxBuffer[MAX_USB_TX_BUFFER_NUMBER][MAX_USB_TX_BUFFER]; - - /* For Interrupt pipe */ - u8 EP2_buf[MAX_INTERRUPT_LENGTH]; - - atomic_t TxResultCount; /* For thread control of EP2 931130.4.m */ - atomic_t TxFireCounter; /* For thread control of EP4 931130.4.n */ - u32 ByteTransfer; - - u32 TxSendIndex; /* The next index of Mds array to be sent */ - u32 EP2vm_state; /* for EP2vm state */ - u32 EP4vm_state; /* for EP4vm state */ - u32 tx_halt; /* Stopping VM */ - - struct urb *Tx4Urb; - struct urb *Tx2Urb; - - int EP2VM_status; - int EP4VM_status; - - u32 TxFillCount; /* 20060928 */ - u32 TxTimer; /* 20060928 Add if sending packet is greater than 13 */ -}; - -#endif diff --git a/drivers/staging/winbond/wbhal.h b/drivers/staging/winbond/wbhal.h deleted file mode 100644 index 289ee549146d..000000000000 --- a/drivers/staging/winbond/wbhal.h +++ /dev/null @@ -1,513 +0,0 @@ -#ifndef __WINBOND_WBHAL_S_H -#define __WINBOND_WBHAL_S_H - -#include -#include /* for ETH_ALEN */ - -#define HAL_LED_SET_MASK 0x001c -#define HAL_LED_SET_SHIFT 2 - -/* supported RF type */ -#define RF_MAXIM_2825 0 -#define RF_MAXIM_2827 1 -#define RF_MAXIM_2828 2 -#define RF_MAXIM_2829 3 -#define RF_MAXIM_V1 15 -#define RF_AIROHA_2230 16 -#define RF_AIROHA_7230 17 -#define RF_AIROHA_2230S 18 -#define RF_WB_242 33 -#define RF_WB_242_1 34 -#define RF_DECIDE_BY_INF 255 - -/* - * ---------------------------------------------------------------- - * The follow define connect to upper layer - * User must modify for connection between HAL and upper layer - * ---------------------------------------------------------------- - */ - -/* - * ============================== - * Common define - * ============================== - */ -/* Bit 5 */ -#define HAL_USB_MODE_BURST(_H) (_H->SoftwareSet & 0x20) - -/* Scan interval */ -#define SCAN_MAX_CHNL_TIME (50) - -/* For TxL2 Frame typr recognise */ -#define FRAME_TYPE_802_3_DATA 0 -#define FRAME_TYPE_802_11_MANAGEMENT 1 -#define FRAME_TYPE_802_11_MANAGEMENT_CHALLENGE 2 -#define FRAME_TYPE_802_11_CONTROL 3 -#define FRAME_TYPE_802_11_DATA 4 -#define FRAME_TYPE_PROMISCUOUS 5 - -/* The follow definition is used for convert the frame------------ */ -#define DOT_11_SEQUENCE_OFFSET 22 /* Sequence control offset */ -#define DOT_3_TYPE_OFFSET 12 -#define DOT_11_MAC_HEADER_SIZE 24 -#define DOT_11_SNAP_SIZE 6 -#define DOT_11_TYPE_OFFSET 30 /* The start offset of 802.11 Frame. Type encapsulation. */ -#define DEFAULT_SIFSTIME 10 -#define DEFAULT_FRAGMENT_THRESHOLD 2346 /* No fragment */ -#define DEFAULT_MSDU_LIFE_TIME 0xffff - -#define LONG_PREAMBLE_PLUS_PLCPHEADER_TIME (144 + 48) -#define SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME (72 + 24) -#define PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION (16 + 4 + 6) -#define Tsym 4 - -/* Frame Type of Bits (2, 3)----------------------------------- */ -#define MAC_TYPE_MANAGEMENT 0x00 -#define MAC_TYPE_CONTROL 0x04 -#define MAC_TYPE_DATA 0x08 -#define MASK_FRAGMENT_NUMBER 0x000F -#define SEQUENCE_NUMBER_SHIFT 4 - -#define HAL_WOL_TYPE_WAKEUP_FRAME 0x01 -#define HAL_WOL_TYPE_MAGIC_PACKET 0x02 - -#define HAL_KEYTYPE_WEP40 0 -#define HAL_KEYTYPE_WEP104 1 -#define HAL_KEYTYPE_TKIP 2 /* 128 bit key */ -#define HAL_KEYTYPE_AES_CCMP 3 /* 128 bit key */ - -/* For VM state */ -enum { - VM_STOP = 0, - VM_RUNNING, - VM_COMPLETED -}; - -/* - * ================================ - * Normal Key table format - * ================================ - */ - -/* The order of KEY index is MAPPING_KEY_START_INDEX > GROUP_KEY_START_INDEX */ -#define MAX_KEY_TABLE 24 /* 24 entry for storing key data */ -#define GROUP_KEY_START_INDEX 4 -#define MAPPING_KEY_START_INDEX 8 - -/* - * ========================================= - * Descriptor - * ========================================= - */ -#define MAX_DESCRIPTOR_BUFFER_INDEX 8 /* Have to multiple of 2 */ -#define FLAG_ERROR_TX_MASK 0x000000bf -#define FLAG_ERROR_RX_MASK 0x0000083f - -#define FLAG_BAND_RX_MASK 0x10000000 /* Bit 28 */ - -struct R00_descriptor { - union { - u32 value; -#ifdef _BIG_ENDIAN_ - struct { - u32 R00_packet_or_buffer_status:1; - u32 R00_packet_in_fifo:1; - u32 R00_RESERVED:2; - u32 R00_receive_byte_count:12; - u32 R00_receive_time_index:16; - }; -#else - struct { - u32 R00_receive_time_index:16; - u32 R00_receive_byte_count:12; - u32 R00_RESERVED:2; - u32 R00_packet_in_fifo:1; - u32 R00_packet_or_buffer_status:1; - }; -#endif - }; -}; - -struct T00_descriptor { - union { - u32 value; -#ifdef _BIG_ENDIAN_ - struct { - u32 T00_first_mpdu:1; /* for hardware use */ - u32 T00_last_mpdu:1; /* for hardware use */ - u32 T00_IsLastMpdu:1;/* 0:not 1:Yes for software used */ - u32 T00_IgnoreResult:1;/* The same mechanism with T00 setting. */ - u32 T00_RESERVED_ID:2;/* 3 bit ID reserved */ - u32 T00_tx_packet_id:4; - u32 T00_RESERVED:4; - u32 T00_header_length:6; - u32 T00_frame_length:12; - }; -#else - struct { - u32 T00_frame_length:12; - u32 T00_header_length:6; - u32 T00_RESERVED:4; - u32 T00_tx_packet_id:4; - u32 T00_RESERVED_ID:2; /* 3 bit ID reserved */ - u32 T00_IgnoreResult:1; /* The same mechanism with T00 setting. */ - u32 T00_IsLastMpdu:1; /* 0:not 1:Yes for software used */ - u32 T00_last_mpdu:1; /* for hardware use */ - u32 T00_first_mpdu:1; /* for hardware use */ - }; -#endif - }; -}; - -struct R01_descriptor { - union { - u32 value; -#ifdef _BIG_ENDIAN_ - struct { - u32 R01_RESERVED:3; - u32 R01_mod_type:1; - u32 R01_pre_type:1; - u32 R01_data_rate:3; - u32 R01_AGC_state:8; - u32 R01_LNA_state:2; - u32 R01_decryption_method:2; - u32 R01_mic_error:1; - u32 R01_replay:1; - u32 R01_broadcast_frame:1; - u32 R01_multicast_frame:1; - u32 R01_directed_frame:1; - u32 R01_receive_frame_antenna_selection:1; - u32 R01_frame_receive_during_atim_window:1; - u32 R01_protocol_version_error:1; - u32 R01_authentication_frame_icv_error:1; - u32 R01_null_key_to_authentication_frame:1; - u32 R01_icv_error:1; - u32 R01_crc_error:1; - }; -#else - struct { - u32 R01_crc_error:1; - u32 R01_icv_error:1; - u32 R01_null_key_to_authentication_frame:1; - u32 R01_authentication_frame_icv_error:1; - u32 R01_protocol_version_error:1; - u32 R01_frame_receive_during_atim_window:1; - u32 R01_receive_frame_antenna_selection:1; - u32 R01_directed_frame:1; - u32 R01_multicast_frame:1; - u32 R01_broadcast_frame:1; - u32 R01_replay:1; - u32 R01_mic_error:1; - u32 R01_decryption_method:2; - u32 R01_LNA_state:2; - u32 R01_AGC_state:8; - u32 R01_data_rate:3; - u32 R01_pre_type:1; - u32 R01_mod_type:1; - u32 R01_RESERVED:3; - }; -#endif - }; -}; - -struct T01_descriptor { - union { - u32 value; -#ifdef _BIG_ENDIAN_ - struct { - u32 T01_rts_cts_duration:16; - u32 T01_fall_back_rate:3; - u32 T01_add_rts:1; - u32 T01_add_cts:1; - u32 T01_modulation_type:1; - u32 T01_plcp_header_length:1; - u32 T01_transmit_rate:3; - u32 T01_wep_id:2; - u32 T01_add_challenge_text:1; - u32 T01_inhibit_crc:1; - u32 T01_loop_back_wep_mode:1; - u32 T01_retry_abort_enable:1; - }; -#else - struct { - u32 T01_retry_abort_enable:1; - u32 T01_loop_back_wep_mode:1; - u32 T01_inhibit_crc:1; - u32 T01_add_challenge_text:1; - u32 T01_wep_id:2; - u32 T01_transmit_rate:3; - u32 T01_plcp_header_length:1; - u32 T01_modulation_type:1; - u32 T01_add_cts:1; - u32 T01_add_rts:1; - u32 T01_fall_back_rate:3; - u32 T01_rts_cts_duration:16; - }; -#endif - }; -}; - -struct T02_descriptor { - union { - u32 value; -#ifdef _BIG_ENDIAN_ - struct { - u32 T02_IsLastMpdu:1; /* The same mechanism with T00 setting */ - u32 T02_IgnoreResult:1; /* The same mechanism with T00 setting. */ - u32 T02_RESERVED_ID:2; /* The same mechanism with T00 setting */ - u32 T02_Tx_PktID:4; - u32 T02_MPDU_Cnt:4; - u32 T02_RTS_Cnt:4; - u32 T02_RESERVED:7; - u32 T02_transmit_complete:1; - u32 T02_transmit_abort_due_to_TBTT:1; - u32 T02_effective_transmission_rate:1; - u32 T02_transmit_without_encryption_due_to_wep_on_false:1; - u32 T02_discard_due_to_null_wep_key:1; - u32 T02_RESERVED_1:1; - u32 T02_out_of_MaxTxMSDULiftTime:1; - u32 T02_transmit_abort:1; - u32 T02_transmit_fail:1; - }; -#else - struct { - u32 T02_transmit_fail:1; - u32 T02_transmit_abort:1; - u32 T02_out_of_MaxTxMSDULiftTime:1; - u32 T02_RESERVED_1:1; - u32 T02_discard_due_to_null_wep_key:1; - u32 T02_transmit_without_encryption_due_to_wep_on_false:1; - u32 T02_effective_transmission_rate:1; - u32 T02_transmit_abort_due_to_TBTT:1; - u32 T02_transmit_complete:1; - u32 T02_RESERVED:7; - u32 T02_RTS_Cnt:4; - u32 T02_MPDU_Cnt:4; - u32 T02_Tx_PktID:4; - u32 T02_RESERVED_ID:2; /* The same mechanism with T00 setting */ - u32 T02_IgnoreResult:1; /* The same mechanism with T00 setting. */ - u32 T02_IsLastMpdu:1; /* The same mechanism with T00 setting */ - }; -#endif - }; -}; - -struct wb35_descriptor { /* Skip length = 8 DWORD */ - /* ID for descriptor ---, The field doesn't be cleard in the operation of Descriptor definition */ - u8 Descriptor_ID; - /* ----------------------The above region doesn't be cleared by DESCRIPTOR_RESET------ */ - u8 RESERVED[3]; - - u16 FragmentThreshold; - u8 InternalUsed; /* Only can be used by operation of descriptor definition */ - u8 Type; /* 0: 802.3 1:802.11 data frame 2:802.11 management frame */ - - u8 PreambleMode;/* 0: short 1:long */ - u8 TxRate; - u8 FragmentCount; - u8 EapFix; /* For speed up key install */ - - /* For R00 and T00 ------------------------------ */ - union { - struct R00_descriptor R00; - struct T00_descriptor T00; - }; - - /* For R01 and T01 ------------------------------ */ - union { - struct R01_descriptor R01; - struct T01_descriptor T01; - }; - - /* For R02 and T02 ------------------------------ */ - union { - u32 R02; - struct T02_descriptor T02; - }; - - /* For R03 and T03 ------------------------------ */ - /* For software used */ - union { - u32 R03; - u32 T03; - struct { - u8 buffer_number; - u8 buffer_start_index; - u16 buffer_total_size; - }; - }; - - /* For storing the buffer */ - u16 buffer_size[MAX_DESCRIPTOR_BUFFER_INDEX]; - void *buffer_address[MAX_DESCRIPTOR_BUFFER_INDEX]; -}; - -#define MAX_TXVGA_EEPROM 9 /* How many word(u16) of EEPROM will be used for TxVGA */ -#define MAX_RF_PARAMETER 32 - -struct txvga_for_50 { - u8 ChanNo; - u8 TxVgaValue; -}; - -/* - * ============================================== - * Device related include - * ============================================== - */ - -#include "wb35reg_s.h" -#include "wb35tx_s.h" -#include "wb35rx_s.h" - -/* For Hal using ============================================ */ -struct hw_data { - /* For compatible with 33 */ - u32 revision; - u32 BB3c_cal; /* The value for Tx calibration comes from EEPROM */ - u32 BB54_cal; /* The value for Rx calibration comes from EEPROM */ - - /* For surprise remove */ - u32 SurpriseRemove; /* 0: Normal 1: Surprise remove */ - u8 IsKeyPreSet; - u8 CalOneTime; - - u8 VCO_trim; - - u32 FragCount; - u32 DMAFix; /* V1_DMA_FIX The variable can be removed if driver want to save mem space for V2. */ - - /* - * =============================================== - * Definition for MAC address - * =============================================== - */ - u8 PermanentMacAddress[ETH_ALEN + 2]; /* The Ethernet addr that are stored in EEPROM. + 2 to 8-byte alignment */ - u8 CurrentMacAddress[ETH_ALEN + 2]; /* The Enthernet addr that are in used. + 2 to 8-byte alignment */ - - /* - * ========================================= - * Definition for 802.11 - * ========================================= - */ - u8 *bssid_pointer; /* Used by hal_get_bssid for return value */ - u8 bssid[8]; /* Only 6 byte will be used. 8 byte is required for read buffer */ - u8 ssid[32]; /* maximum ssid length is 32 byte */ - - u16 AID; - u8 ssid_length; - u8 Channel; - - u16 ListenInterval; - u16 CapabilityInformation; - - u16 BeaconPeriod; - u16 ProbeDelay; - - u8 bss_type;/* 0: IBSS_NET or 1:ESS_NET */ - u8 preamble;/* 0: short preamble, 1: long preamble */ - u8 slot_time_select; /* 9 or 20 value */ - u8 phy_type; /* Phy select */ - - u32 phy_para[MAX_RF_PARAMETER]; - u32 phy_number; - - u32 CurrentRadioSw; /* 0:On 1:Off */ - u32 CurrentRadioHw; /* 0:On 1:Off */ - - u8 *power_save_point; /* Used by hal_get_power_save_mode for return value */ - u8 cwmin; - u8 desired_power_save; - u8 dtim; /* Is running dtim */ - u8 mapping_key_replace_index; /* In Key table, the next index be replaced */ - - u16 MaxReceiveLifeTime; - u16 FragmentThreshold; - u16 FragmentThreshold_tmp; - u16 cwmax; - - u8 Key_slot[MAX_KEY_TABLE][8]; /* Ownership record for key slot. For Alignment */ - u32 Key_content[MAX_KEY_TABLE][12]; /* 10DW for each entry + 2 for burst command (Off and On valid bit) */ - u8 CurrentDefaultKeyIndex; - u32 CurrentDefaultKeyLength; - - /* - * ================================================== - * Variable for each module - * ================================================== - */ - struct usb_device *udev; - struct wb35_reg reg; /* Need Wb35Reg.h */ - struct wb35_tx Wb35Tx; /* Need Wb35Tx.h */ - struct wb35_rx Wb35Rx; /* Need Wb35Rx.h */ - - struct timer_list LEDTimer; /* For LED */ - - u32 LEDpoint; /* For LED */ - - u32 dto_tx_retry_count; - u32 dto_tx_frag_count; - u32 rx_ok_count[13]; /* index=0: total rx ok */ - u32 rx_err_count[13]; /* index=0: total rx err */ - - /* for Tx debug */ - u32 tx_TBTT_start_count; - u32 tx_ETR_count; - u32 tx_WepOn_false_count; - u32 tx_Null_key_count; - u32 tx_retry_count[8]; - - u8 PowerIndexFromEEPROM; /* For 2412MHz */ - u8 power_index; - u8 IsWaitJoinComplete; /* TRUE: set join request */ - u8 band; - - u16 SoftwareSet; - u16 Reserved_s; - - u32 IsInitOK; /* 0: Driver starting 1: Driver init OK */ - - /* For Phy calibration */ - s32 iq_rsdl_gain_tx_d2; - s32 iq_rsdl_phase_tx_d2; - u32 txvga_setting_for_cal; - - u8 TxVgaSettingInEEPROM[(((MAX_TXVGA_EEPROM * 2) + 3) & ~0x03)]; /* For EEPROM value */ - u8 TxVgaFor24[16]; /* Max is 14, 2 for alignment */ - struct txvga_for_50 TxVgaFor50[36]; /* 35 channels in 5G. 35x2 = 70 byte. 2 for alignments */ - - u16 Scan_Interval; - u16 RESERVED6; - - /* LED control */ - u32 LED_control; - /* - * LED_control 4 byte: Gray_Led_1[3] Gray_Led_0[2] Led[1] Led[0] - * Gray_Led - * For Led gray setting - * Led - * 0: normal control, - * LED behavior will decide by EEPROM setting - * 1: Turn off specific LED - * 2: Always on specific LED - * 3: slow blinking specific LED - * 4: fast blinking specific LED - * 5: WPS led control is set. Led0 is Red, Led1 id Green - * - * Led[1] is parameter for WPS LED mode - * 1:InProgress - * 2: Error - * 3: Session overlap - * 4: Success control - */ - u32 LED_LinkOn; /* Turn LED on control */ - u32 LED_Scanning; /* Let LED in scan process control */ - u32 LED_Blinking; /* Temp variable for shining */ - u32 RxByteCountLast; - u32 TxByteCountLast; - - /* For global timer */ - u32 time_count; /* TICK_TIME_100ms 1 = 100ms */ -}; - -#endif diff --git a/drivers/staging/winbond/wbusb.c b/drivers/staging/winbond/wbusb.c deleted file mode 100644 index 0d29624416c3..000000000000 --- a/drivers/staging/winbond/wbusb.c +++ /dev/null @@ -1,853 +0,0 @@ -/* - * Copyright 2008 Pavel Machek - * - * Distribute under GPLv2. - * - * The original driver was written by: - * Jeff Lee - * - * and was adapted to the 2.6 kernel by: - * Costantino Leandro (Rxart Desktop) - */ -#include -#include -#include - -#include "core.h" -#include "mds_f.h" -#include "mto.h" -#include "wbhal.h" -#include "wb35reg_f.h" -#include "wb35tx_f.h" -#include "wb35rx_f.h" - -MODULE_DESCRIPTION("IS89C35 802.11bg WLAN USB Driver"); -MODULE_LICENSE("GPL"); -MODULE_VERSION("0.1"); - -static const struct usb_device_id wb35_table[] = { - { USB_DEVICE(0x0416, 0x0035) }, - { USB_DEVICE(0x18E8, 0x6201) }, - { USB_DEVICE(0x18E8, 0x6206) }, - { USB_DEVICE(0x18E8, 0x6217) }, - { USB_DEVICE(0x18E8, 0x6230) }, - { USB_DEVICE(0x18E8, 0x6233) }, - { USB_DEVICE(0x1131, 0x2035) }, - { 0, } -}; - -MODULE_DEVICE_TABLE(usb, wb35_table); - -static struct ieee80211_rate wbsoft_rates[] = { - { .bitrate = 10, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, -}; - -static struct ieee80211_channel wbsoft_channels[] = { - { .center_freq = 2412 }, -}; - -static struct ieee80211_supported_band wbsoft_band_2GHz = { - .channels = wbsoft_channels, - .n_channels = ARRAY_SIZE(wbsoft_channels), - .bitrates = wbsoft_rates, - .n_bitrates = ARRAY_SIZE(wbsoft_rates), -}; - -static void hal_set_beacon_period(struct hw_data *pHwData, u16 beacon_period) -{ - u32 tmp; - - if (pHwData->SurpriseRemove) - return; - - pHwData->BeaconPeriod = beacon_period; - tmp = pHwData->BeaconPeriod << 16; - tmp |= pHwData->ProbeDelay; - Wb35Reg_Write(pHwData, 0x0848, tmp); -} - -static int wbsoft_add_interface(struct ieee80211_hw *dev, - struct ieee80211_vif *vif) -{ - struct wbsoft_priv *priv = dev->priv; - - hal_set_beacon_period(&priv->sHwData, vif->bss_conf.beacon_int); - - return 0; -} - -static void wbsoft_remove_interface(struct ieee80211_hw *dev, - struct ieee80211_vif *vif) -{ -} - -static void wbsoft_stop(struct ieee80211_hw *hw) -{ -} - -static int wbsoft_get_stats(struct ieee80211_hw *hw, - struct ieee80211_low_level_stats *stats) -{ - return 0; -} - -static u64 wbsoft_prepare_multicast(struct ieee80211_hw *hw, - struct netdev_hw_addr_list *mc_list) -{ - return netdev_hw_addr_list_count(mc_list); -} - -static void wbsoft_configure_filter(struct ieee80211_hw *dev, - unsigned int changed_flags, - unsigned int *total_flags, - u64 multicast) -{ - unsigned int new_flags; - - new_flags = 0; - - if (*total_flags & FIF_PROMISC_IN_BSS) - new_flags |= FIF_PROMISC_IN_BSS; - else if ((*total_flags & FIF_ALLMULTI) || (multicast > 32)) - new_flags |= FIF_ALLMULTI; - - dev->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS; - - *total_flags = new_flags; -} - -static void wbsoft_tx(struct ieee80211_hw *dev, - struct ieee80211_tx_control *control, - struct sk_buff *skb) -{ - struct wbsoft_priv *priv = dev->priv; - - if (priv->sMlmeFrame.is_in_used != PACKET_FREE_TO_USE) { - priv->sMlmeFrame.wNumTxMMPDUDiscarded++; - kfree_skb(skb); - return; - } - - priv->sMlmeFrame.is_in_used = PACKET_COME_FROM_MLME; - - priv->sMlmeFrame.pMMPDU = skb->data; - priv->sMlmeFrame.data_type = FRAME_TYPE_802_11_MANAGEMENT; - priv->sMlmeFrame.len = skb->len; - priv->sMlmeFrame.wNumTxMMPDU++; - - /* - * H/W will enter power save by set the register. S/W don't send null - * frame with PWRMgt bit enbled to enter power save now. - */ - - Mds_Tx(priv); -} - -static int wbsoft_start(struct ieee80211_hw *dev) -{ - struct wbsoft_priv *priv = dev->priv; - - priv->enabled = true; - - return 0; -} - -static void hal_set_radio_mode(struct hw_data *pHwData, unsigned char radio_off) -{ - struct wb35_reg *reg = &pHwData->reg; - - if (pHwData->SurpriseRemove) - return; - - if (radio_off) { /* disable Baseband receive off */ - pHwData->CurrentRadioSw = 1; /* off */ - reg->M24_MacControl &= 0xffffffbf; - } else { - pHwData->CurrentRadioSw = 0; /* on */ - reg->M24_MacControl |= 0x00000040; - } - Wb35Reg_Write(pHwData, 0x0824, reg->M24_MacControl); -} - -static void hal_set_current_channel_ex(struct hw_data *pHwData, struct chan_info channel) -{ - struct wb35_reg *reg = &pHwData->reg; - - if (pHwData->SurpriseRemove) - return; - - RFSynthesizer_SwitchingChannel(pHwData, channel); /* Switch channel */ - pHwData->Channel = channel.ChanNo; - pHwData->band = channel.band; - reg->M28_MacControl &= ~0xff; /* Clean channel information field */ - reg->M28_MacControl |= channel.ChanNo; - Wb35Reg_WriteWithCallbackValue(pHwData, 0x0828, reg->M28_MacControl, - (s8 *) &channel, - sizeof(struct chan_info)); -} - -static void hal_set_current_channel(struct hw_data *pHwData, struct chan_info channel) -{ - hal_set_current_channel_ex(pHwData, channel); -} - -static void hal_set_accept_broadcast(struct hw_data *pHwData, u8 enable) -{ - struct wb35_reg *reg = &pHwData->reg; - - if (pHwData->SurpriseRemove) - return; - - reg->M00_MacControl &= ~0x02000000; /* The HW value */ - - if (enable) - reg->M00_MacControl |= 0x02000000; /* The HW value */ - - Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl); -} - -/* For wep key error detection, we need to accept broadcast packets to be received temporary. */ -static void hal_set_accept_promiscuous(struct hw_data *pHwData, u8 enable) -{ - struct wb35_reg *reg = &pHwData->reg; - - if (pHwData->SurpriseRemove) - return; - - if (enable) { - reg->M00_MacControl |= 0x00400000; - Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl); - } else { - reg->M00_MacControl &= ~0x00400000; - Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl); - } -} - -static void hal_set_accept_multicast(struct hw_data *pHwData, u8 enable) -{ - struct wb35_reg *reg = &pHwData->reg; - - if (pHwData->SurpriseRemove) - return; - - reg->M00_MacControl &= ~0x01000000; /* The HW value */ - if (enable) - reg->M00_MacControl |= 0x01000000; /* The HW value */ - Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl); -} - -static void hal_set_accept_beacon(struct hw_data *pHwData, u8 enable) -{ - struct wb35_reg *reg = &pHwData->reg; - - if (pHwData->SurpriseRemove) - return; - - if (!enable) /* Due to SME and MLME are not suitable for 35 */ - return; - - reg->M00_MacControl &= ~0x04000000; /* The HW value */ - if (enable) - reg->M00_MacControl |= 0x04000000; /* The HW value */ - - Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl); -} - -static int wbsoft_config(struct ieee80211_hw *dev, u32 changed) -{ - struct wbsoft_priv *priv = dev->priv; - struct chan_info ch; - - /* Should use channel_num, or something, as that is already pre-translated */ - ch.band = 1; - ch.ChanNo = 1; - - hal_set_current_channel(&priv->sHwData, ch); - hal_set_accept_broadcast(&priv->sHwData, 1); - hal_set_accept_promiscuous(&priv->sHwData, 1); - hal_set_accept_multicast(&priv->sHwData, 1); - hal_set_accept_beacon(&priv->sHwData, 1); - hal_set_radio_mode(&priv->sHwData, 0); - - return 0; -} - -static u64 wbsoft_get_tsf(struct ieee80211_hw *dev, struct ieee80211_vif *vif) -{ - return 0; -} - -static const struct ieee80211_ops wbsoft_ops = { - .tx = wbsoft_tx, - .start = wbsoft_start, - .stop = wbsoft_stop, - .add_interface = wbsoft_add_interface, - .remove_interface = wbsoft_remove_interface, - .config = wbsoft_config, - .prepare_multicast = wbsoft_prepare_multicast, - .configure_filter = wbsoft_configure_filter, - .get_stats = wbsoft_get_stats, - .get_tsf = wbsoft_get_tsf, -}; - -static void hal_set_ethernet_address(struct hw_data *pHwData, u8 *current_address) -{ - u32 ltmp[2]; - - if (pHwData->SurpriseRemove) - return; - - memcpy(pHwData->CurrentMacAddress, current_address, ETH_ALEN); - - ltmp[0] = cpu_to_le32(*(u32 *) pHwData->CurrentMacAddress); - ltmp[1] = cpu_to_le32(*(u32 *) (pHwData->CurrentMacAddress + 4)) & 0xffff; - - Wb35Reg_BurstWrite(pHwData, 0x03e8, ltmp, 2, AUTO_INCREMENT); -} - -static void hal_get_permanent_address(struct hw_data *pHwData, u8 *pethernet_address) -{ - if (pHwData->SurpriseRemove) - return; - - memcpy(pethernet_address, pHwData->PermanentMacAddress, 6); -} - -static void hal_stop(struct hw_data *pHwData) -{ - struct wb35_reg *reg = &pHwData->reg; - - pHwData->Wb35Rx.rx_halt = 1; - Wb35Rx_stop(pHwData); - - pHwData->Wb35Tx.tx_halt = 1; - Wb35Tx_stop(pHwData); - - reg->D00_DmaControl &= ~0xc0000000; /* Tx Off, Rx Off */ - Wb35Reg_Write(pHwData, 0x0400, reg->D00_DmaControl); -} - -static unsigned char hal_idle(struct hw_data *pHwData) -{ - struct wb35_reg *reg = &pHwData->reg; - - if (!pHwData->SurpriseRemove && reg->EP0vm_state != VM_STOP) - return false; - - return true; -} - -u8 hal_get_antenna_number(struct hw_data *pHwData) -{ - struct wb35_reg *reg = &pHwData->reg; - - if ((reg->BB2C & BIT(11)) == 0) - return 0; - else - return 1; -} - -/* 0 : radio on; 1: radio off */ -static u8 hal_get_hw_radio_off(struct hw_data *pHwData) -{ - struct wb35_reg *reg = &pHwData->reg; - - if (pHwData->SurpriseRemove) - return 1; - - /* read the bit16 of register U1B0 */ - Wb35Reg_Read(pHwData, 0x3b0, ®->U1B0); - if ((reg->U1B0 & 0x00010000)) { - pHwData->CurrentRadioHw = 1; - return 1; - } else { - pHwData->CurrentRadioHw = 0; - return 0; - } -} - -static u8 LED_GRAY[20] = { - 0, 3, 4, 6, 8, 10, 11, 12, 13, 14, 15, 14, 13, 12, 11, 10, 8, 6, 4, 2 -}; - -static u8 LED_GRAY2[30] = { - 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 15, 14, 13, 12, 11, 10, 9, 8 -}; - -static void hal_led_control(unsigned long data) -{ - struct wbsoft_priv *adapter = (struct wbsoft_priv *)data; - struct hw_data *pHwData = &adapter->sHwData; - struct wb35_reg *reg = &pHwData->reg; - u32 LEDSet = (pHwData->SoftwareSet & HAL_LED_SET_MASK) >> HAL_LED_SET_SHIFT; - u32 TimeInterval = 500, ltmp, ltmp2; - ltmp = 0; - - if (pHwData->SurpriseRemove) - return; - - if (pHwData->LED_control) { - ltmp2 = pHwData->LED_control & 0xff; - if (ltmp2 == 5) { /* 5 is WPS mode */ - TimeInterval = 100; - ltmp2 = (pHwData->LED_control >> 8) & 0xff; - switch (ltmp2) { - case 1: /* [0.2 On][0.1 Off]... */ - pHwData->LED_Blinking %= 3; - ltmp = 0x1010; /* Led 1 & 0 Green and Red */ - if (pHwData->LED_Blinking == 2) /* Turn off */ - ltmp = 0; - break; - case 2: /* [0.1 On][0.1 Off]... */ - pHwData->LED_Blinking %= 2; - ltmp = 0x0010; /* Led 0 red color */ - if (pHwData->LED_Blinking) /* Turn off */ - ltmp = 0; - break; - case 3: /* [0.1 On][0.1 Off][0.1 On][0.1 Off][0.1 On][0.1 Off][0.1 On][0.1 Off][0.1 On][0.1 Off][0.5 Off]... */ - pHwData->LED_Blinking %= 15; - ltmp = 0x0010; /* Led 0 red color */ - if ((pHwData->LED_Blinking >= 9) || (pHwData->LED_Blinking % 2)) /* Turn off 0.6 sec */ - ltmp = 0; - break; - case 4: /* [300 On][ off ] */ - ltmp = 0x1000; /* Led 1 Green color */ - if (pHwData->LED_Blinking >= 3000) - ltmp = 0; /* led maybe on after 300sec * 32bit counter overlap. */ - break; - } - pHwData->LED_Blinking++; - - reg->U1BC_LEDConfigure = ltmp; - if (LEDSet != 7) { /* Only 111 mode has 2 LEDs on PCB. */ - reg->U1BC_LEDConfigure |= (ltmp & 0xff) << 8; /* Copy LED result to each LED control register */ - reg->U1BC_LEDConfigure |= (ltmp & 0xff00) >> 8; - } - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); - } - } else if (pHwData->CurrentRadioSw || pHwData->CurrentRadioHw) { /* If radio off */ - if (reg->U1BC_LEDConfigure & 0x1010) { - reg->U1BC_LEDConfigure &= ~0x1010; - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); - } - } else { - switch (LEDSet) { - case 4: /* [100] Only 1 Led be placed on PCB and use pin 21 of IC. Use LED_0 for showing */ - if (!pHwData->LED_LinkOn) { /* Blink only if not Link On */ - /* Blinking if scanning is on progress */ - if (pHwData->LED_Scanning) { - if (pHwData->LED_Blinking == 0) { - reg->U1BC_LEDConfigure |= 0x10; - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 On */ - pHwData->LED_Blinking = 1; - TimeInterval = 300; - } else { - reg->U1BC_LEDConfigure &= ~0x10; - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 Off */ - pHwData->LED_Blinking = 0; - TimeInterval = 300; - } - } else { - /* Turn Off LED_0 */ - if (reg->U1BC_LEDConfigure & 0x10) { - reg->U1BC_LEDConfigure &= ~0x10; - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 Off */ - } - } - } else { - /* Turn On LED_0 */ - if ((reg->U1BC_LEDConfigure & 0x10) == 0) { - reg->U1BC_LEDConfigure |= 0x10; - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 Off */ - } - } - break; - case 6: /* [110] Only 1 Led be placed on PCB and use pin 21 of IC. Use LED_0 for showing */ - if (!pHwData->LED_LinkOn) { /* Blink only if not Link On */ - /* Blinking if scanning is on progress */ - if (pHwData->LED_Scanning) { - if (pHwData->LED_Blinking == 0) { - reg->U1BC_LEDConfigure &= ~0xf; - reg->U1BC_LEDConfigure |= 0x10; - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 On */ - pHwData->LED_Blinking = 1; - TimeInterval = 300; - } else { - reg->U1BC_LEDConfigure &= ~0x1f; - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 Off */ - pHwData->LED_Blinking = 0; - TimeInterval = 300; - } - } else { - /* Gray blinking if in disconnect state and not scanning */ - ltmp = reg->U1BC_LEDConfigure; - reg->U1BC_LEDConfigure &= ~0x1f; - if (LED_GRAY2[(pHwData->LED_Blinking % 30)]) { - reg->U1BC_LEDConfigure |= 0x10; - reg->U1BC_LEDConfigure |= - LED_GRAY2[(pHwData->LED_Blinking % 30)]; - } - pHwData->LED_Blinking++; - if (reg->U1BC_LEDConfigure != ltmp) - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 Off */ - TimeInterval = 100; - } - } else { - /* Turn On LED_0 */ - if ((reg->U1BC_LEDConfigure & 0x10) == 0) { - reg->U1BC_LEDConfigure |= 0x10; - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 Off */ - } - } - break; - case 5: /* [101] Only 1 Led be placed on PCB and use LED_1 for showing */ - if (!pHwData->LED_LinkOn) { /* Blink only if not Link On */ - /* Blinking if scanning is on progress */ - if (pHwData->LED_Scanning) { - if (pHwData->LED_Blinking == 0) { - reg->U1BC_LEDConfigure |= 0x1000; - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_1 On */ - pHwData->LED_Blinking = 1; - TimeInterval = 300; - } else { - reg->U1BC_LEDConfigure &= ~0x1000; - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_1 Off */ - pHwData->LED_Blinking = 0; - TimeInterval = 300; - } - } else { - /* Turn Off LED_1 */ - if (reg->U1BC_LEDConfigure & 0x1000) { - reg->U1BC_LEDConfigure &= ~0x1000; - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_1 Off */ - } - } - } else { - /* Is transmitting/receiving ?? */ - if ((adapter->RxByteCount != - pHwData->RxByteCountLast) - || (adapter->TxByteCount != - pHwData->TxByteCountLast)) { - if ((reg->U1BC_LEDConfigure & 0x3000) != - 0x3000) { - reg->U1BC_LEDConfigure |= 0x3000; - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_1 On */ - } - /* Update variable */ - pHwData->RxByteCountLast = - adapter->RxByteCount; - pHwData->TxByteCountLast = - adapter->TxByteCount; - TimeInterval = 200; - } else { - /* Turn On LED_1 and blinking if transmitting/receiving */ - if ((reg->U1BC_LEDConfigure & 0x3000) != - 0x1000) { - reg->U1BC_LEDConfigure &= - ~0x3000; - reg->U1BC_LEDConfigure |= - 0x1000; - Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_1 On */ - } - } - } - break; - default: /* Default setting. 2 LED be placed on PCB. LED_0: Link On LED_1 Active */ - if ((reg->U1BC_LEDConfigure & 0x3000) != 0x3000) { - reg->U1BC_LEDConfigure |= 0x3000; /* LED_1 is always on and event enable */ - Wb35Reg_Write(pHwData, 0x03bc, - reg->U1BC_LEDConfigure); - } - - if (pHwData->LED_Blinking) { - /* Gray blinking */ - reg->U1BC_LEDConfigure &= ~0x0f; - reg->U1BC_LEDConfigure |= 0x10; - reg->U1BC_LEDConfigure |= - LED_GRAY[(pHwData->LED_Blinking - 1) % 20]; - Wb35Reg_Write(pHwData, 0x03bc, - reg->U1BC_LEDConfigure); - - pHwData->LED_Blinking += 2; - if (pHwData->LED_Blinking < 40) - TimeInterval = 100; - else { - pHwData->LED_Blinking = 0; /* Stop blinking */ - reg->U1BC_LEDConfigure &= ~0x0f; - Wb35Reg_Write(pHwData, 0x03bc, - reg->U1BC_LEDConfigure); - } - break; - } - - if (pHwData->LED_LinkOn) { - if (!(reg->U1BC_LEDConfigure & 0x10)) { /* Check the LED_0 */ - /* Try to turn ON LED_0 after gray blinking */ - reg->U1BC_LEDConfigure |= 0x10; - pHwData->LED_Blinking = 1; /* Start blinking */ - TimeInterval = 50; - } - } else { - if (reg->U1BC_LEDConfigure & 0x10) { /* Check the LED_0 */ - reg->U1BC_LEDConfigure &= ~0x10; - Wb35Reg_Write(pHwData, 0x03bc, - reg->U1BC_LEDConfigure); - } - } - break; - } - } - - pHwData->time_count += TimeInterval; - Wb35Tx_CurrentTime(adapter, pHwData->time_count); - pHwData->LEDTimer.expires = jiffies + msecs_to_jiffies(TimeInterval); - add_timer(&pHwData->LEDTimer); -} - -static int hal_init_hardware(struct ieee80211_hw *hw) -{ - struct wbsoft_priv *priv = hw->priv; - struct hw_data *pHwData = &priv->sHwData; - u16 SoftwareSet; - - pHwData->MaxReceiveLifeTime = DEFAULT_MSDU_LIFE_TIME; - pHwData->FragmentThreshold = DEFAULT_FRAGMENT_THRESHOLD; - - if (!Wb35Reg_initial(pHwData)) - goto error_reg_destroy; - - if (!Wb35Tx_initial(pHwData)) - goto error_tx_destroy; - - if (!Wb35Rx_initial(pHwData)) - goto error_rx_destroy; - - init_timer(&pHwData->LEDTimer); - pHwData->LEDTimer.function = hal_led_control; - pHwData->LEDTimer.data = (unsigned long)priv; - pHwData->LEDTimer.expires = jiffies + msecs_to_jiffies(1000); - add_timer(&pHwData->LEDTimer); - - SoftwareSet = hal_software_set(pHwData); - - Wb35Rx_start(hw); - Wb35Tx_EP2VM_start(priv); - - return 0; - -error_rx_destroy: - Wb35Rx_destroy(pHwData); -error_tx_destroy: - Wb35Tx_destroy(pHwData); -error_reg_destroy: - Wb35Reg_destroy(pHwData); - - pHwData->SurpriseRemove = 1; - return -EINVAL; -} - -static int wb35_hw_init(struct ieee80211_hw *hw) -{ - struct wbsoft_priv *priv = hw->priv; - struct hw_data *pHwData = &priv->sHwData; - u8 EEPROM_region; - u8 HwRadioOff; - u8 *pMacAddr2; - u8 *pMacAddr; - int err; - - pHwData->phy_type = RF_DECIDE_BY_INF; - - priv->Mds.TxRTSThreshold = DEFAULT_RTSThreshold; - priv->Mds.TxFragmentThreshold = DEFAULT_FRAGMENT_THRESHOLD; - - priv->sLocalPara.region_INF = REGION_AUTO; - priv->sLocalPara.TxRateMode = RATE_AUTO; - priv->sLocalPara.bMacOperationMode = MODE_802_11_BG; - priv->sLocalPara.MTUsize = MAX_ETHERNET_PACKET_SIZE; - priv->sLocalPara.bPreambleMode = AUTO_MODE; - priv->sLocalPara.bWepKeyError = false; - priv->sLocalPara.bToSelfPacketReceived = false; - priv->sLocalPara.WepKeyDetectTimerCount = 2 * 100; /* 2 seconds */ - - priv->sLocalPara.RadioOffStatus.boSwRadioOff = false; - - err = hal_init_hardware(hw); - if (err) - goto error; - - EEPROM_region = hal_get_region_from_EEPROM(pHwData); - if (EEPROM_region != REGION_AUTO) - priv->sLocalPara.region = EEPROM_region; - else { - if (priv->sLocalPara.region_INF != REGION_AUTO) - priv->sLocalPara.region = priv->sLocalPara.region_INF; - else - priv->sLocalPara.region = REGION_USA; /* default setting */ - } - - Mds_initial(priv); - - /* - * If no user-defined address in the registry, use the address - * "burned" on the NIC instead. - */ - pMacAddr = priv->sLocalPara.ThisMacAddress; - pMacAddr2 = priv->sLocalPara.PermanentAddress; - - /* Reading ethernet address from EEPROM */ - hal_get_permanent_address(pHwData, priv->sLocalPara.PermanentAddress); - if (memcmp(pMacAddr, "\x00\x00\x00\x00\x00\x00", MAC_ADDR_LENGTH) == 0) - memcpy(pMacAddr, pMacAddr2, MAC_ADDR_LENGTH); - else { - /* Set the user define MAC address */ - hal_set_ethernet_address(pHwData, - priv->sLocalPara.ThisMacAddress); - } - - priv->sLocalPara.bAntennaNo = hal_get_antenna_number(pHwData); - hal_get_hw_radio_off(pHwData); - - /* Waiting for HAL setting OK */ - while (!hal_idle(pHwData)) - msleep(10); - - MTO_Init(priv); - - HwRadioOff = hal_get_hw_radio_off(pHwData); - priv->sLocalPara.RadioOffStatus.boHwRadioOff = !!HwRadioOff; - - hal_set_radio_mode(pHwData, - (unsigned char)(priv->sLocalPara.RadioOffStatus. - boSwRadioOff - || priv->sLocalPara.RadioOffStatus. - boHwRadioOff)); - - /* Notify hal that the driver is ready now. */ - hal_driver_init_OK(pHwData) = 1; - -error: - return err; -} - -static int wb35_probe(struct usb_interface *intf, - const struct usb_device_id *id_table) -{ - struct usb_device *udev = interface_to_usbdev(intf); - struct usb_endpoint_descriptor *endpoint; - struct usb_host_interface *interface; - struct ieee80211_hw *dev; - struct wbsoft_priv *priv; - int err; - u32 ltmp; - - usb_get_dev(udev); - - /* Check the device if it already be opened */ - err = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - 0x01, - USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, - 0x0, 0x400, <mp, 4, HZ * 100); - if (err < 0) - goto error; - - /* Is already initialized? */ - ltmp = cpu_to_le32(ltmp); - if (ltmp) { - err = -EBUSY; - goto error; - } - - dev = ieee80211_alloc_hw(sizeof(*priv), &wbsoft_ops); - if (!dev) { - err = -ENOMEM; - goto error; - } - - priv = dev->priv; - - priv->sHwData.udev = udev; - - interface = intf->cur_altsetting; - endpoint = &interface->endpoint[0].desc; - - err = wb35_hw_init(dev); - if (err) - goto error_free_hw; - - SET_IEEE80211_DEV(dev, &udev->dev); - { - struct hw_data *pHwData = &priv->sHwData; - unsigned char dev_addr[MAX_ADDR_LEN]; - hal_get_permanent_address(pHwData, dev_addr); - SET_IEEE80211_PERM_ADDR(dev, dev_addr); - } - - dev->extra_tx_headroom = 12; /* FIXME */ - dev->flags = IEEE80211_HW_SIGNAL_UNSPEC; - dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); - - dev->max_signal = 100; - dev->queues = 1; - - dev->wiphy->bands[IEEE80211_BAND_2GHZ] = &wbsoft_band_2GHz; - - err = ieee80211_register_hw(dev); - if (err) - goto error_free_hw; - - usb_set_intfdata(intf, dev); - - return 0; - -error_free_hw: - ieee80211_free_hw(dev); -error: - usb_put_dev(udev); - return err; -} - -static void hal_halt(struct hw_data *pHwData) -{ - del_timer_sync(&pHwData->LEDTimer); - /* XXX: Wait for Timer DPC exit. */ - msleep(100); - Wb35Rx_destroy(pHwData); - Wb35Tx_destroy(pHwData); - Wb35Reg_destroy(pHwData); -} - -static void wb35_hw_halt(struct wbsoft_priv *adapter) -{ - /* Turn off Rx and Tx hardware ability */ - hal_stop(&adapter->sHwData); - /* Waiting Irp completed */ - msleep(100); - - hal_halt(&adapter->sHwData); -} - -static void wb35_disconnect(struct usb_interface *intf) -{ - struct ieee80211_hw *hw = usb_get_intfdata(intf); - struct wbsoft_priv *priv = hw->priv; - - wb35_hw_halt(priv); - - ieee80211_stop_queues(hw); - ieee80211_unregister_hw(hw); - ieee80211_free_hw(hw); - - usb_set_intfdata(intf, NULL); - usb_put_dev(interface_to_usbdev(intf)); -} - -static struct usb_driver wb35_driver = { - .name = "w35und", - .id_table = wb35_table, - .probe = wb35_probe, - .disconnect = wb35_disconnect, -}; - -module_usb_driver(wb35_driver); -- cgit v1.2.3 From de1c4400bf0a34ae4fba96343e42b46c8c621a6e Mon Sep 17 00:00:00 2001 From: Kristina Martšenko Date: Mon, 30 Jun 2014 22:16:55 +0300 Subject: staging: wlags49_h2(5): remove driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove the driver as it hasn't been cleaned up and it doesn't look like anyone is going to work on it anymore. Signed-off-by: Kristina Martšenko Cc: Henk de Groot Cc: David Kilroy Signed-off-by: Greg Kroah-Hartman --- MAINTAINERS | 6 - drivers/staging/Kconfig | 4 - drivers/staging/Makefile | 2 - drivers/staging/wlags49_h2/Kconfig | 11 - drivers/staging/wlags49_h2/Makefile | 53 - drivers/staging/wlags49_h2/README.ubuntu | 180 - drivers/staging/wlags49_h2/README.wlags49 | 641 ---- drivers/staging/wlags49_h2/TODO | 33 - drivers/staging/wlags49_h2/WARNING.txt | 3 - drivers/staging/wlags49_h2/ap_h2.c | 3337 ------------------ drivers/staging/wlags49_h2/ap_h25.c | 4094 ---------------------- drivers/staging/wlags49_h2/debug.h | 199 -- drivers/staging/wlags49_h2/dhf.c | 380 --- drivers/staging/wlags49_h2/dhf.h | 225 -- drivers/staging/wlags49_h2/dhfcfg.h | 158 - drivers/staging/wlags49_h2/hcf.c | 4748 -------------------------- drivers/staging/wlags49_h2/hcf.h | 394 --- drivers/staging/wlags49_h2/hcfcfg.h | 785 ----- drivers/staging/wlags49_h2/hcfdef.h | 752 ----- drivers/staging/wlags49_h2/man/wlags49.4 | 734 ---- drivers/staging/wlags49_h2/mdd.h | 1155 ------- drivers/staging/wlags49_h2/mmd.c | 250 -- drivers/staging/wlags49_h2/mmd.h | 77 - drivers/staging/wlags49_h2/sta_h2.c | 4480 ------------------------ drivers/staging/wlags49_h2/sta_h25.c | 5255 ----------------------------- drivers/staging/wlags49_h2/wl_cs.c | 441 --- drivers/staging/wlags49_h2/wl_cs.h | 89 - drivers/staging/wlags49_h2/wl_enc.c | 217 -- drivers/staging/wlags49_h2/wl_enc.h | 118 - drivers/staging/wlags49_h2/wl_if.h | 221 -- drivers/staging/wlags49_h2/wl_internal.h | 1040 ------ drivers/staging/wlags49_h2/wl_main.c | 3702 -------------------- drivers/staging/wlags49_h2/wl_main.h | 138 - drivers/staging/wlags49_h2/wl_netdev.c | 1950 ----------- drivers/staging/wlags49_h2/wl_netdev.h | 154 - drivers/staging/wlags49_h2/wl_priv.c | 1928 ----------- drivers/staging/wlags49_h2/wl_priv.h | 127 - drivers/staging/wlags49_h2/wl_profile.c | 995 ------ drivers/staging/wlags49_h2/wl_profile.h | 87 - drivers/staging/wlags49_h2/wl_util.c | 1367 -------- drivers/staging/wlags49_h2/wl_util.h | 96 - drivers/staging/wlags49_h2/wl_version.h | 146 - drivers/staging/wlags49_h2/wl_wext.c | 3794 --------------------- drivers/staging/wlags49_h2/wl_wext.h | 88 - drivers/staging/wlags49_h25/Kconfig | 11 - drivers/staging/wlags49_h25/Makefile | 52 - drivers/staging/wlags49_h25/README.txt | 30 - drivers/staging/wlags49_h25/TODO | 33 - drivers/staging/wlags49_h25/ap_h25.c | 2 - drivers/staging/wlags49_h25/debug.h | 2 - drivers/staging/wlags49_h25/dhf.c | 2 - drivers/staging/wlags49_h25/dhf.h | 2 - drivers/staging/wlags49_h25/dhfcfg.h | 2 - drivers/staging/wlags49_h25/hcf.c | 2 - drivers/staging/wlags49_h25/hcf.h | 2 - drivers/staging/wlags49_h25/hcfcfg.h | 2 - drivers/staging/wlags49_h25/hcfdef.h | 2 - drivers/staging/wlags49_h25/mdd.h | 2 - drivers/staging/wlags49_h25/mmd.c | 2 - drivers/staging/wlags49_h25/mmd.h | 2 - drivers/staging/wlags49_h25/sta_h25.c | 2 - drivers/staging/wlags49_h25/wl_cs.c | 2 - drivers/staging/wlags49_h25/wl_cs.h | 2 - drivers/staging/wlags49_h25/wl_enc.c | 2 - drivers/staging/wlags49_h25/wl_enc.h | 2 - drivers/staging/wlags49_h25/wl_if.h | 2 - drivers/staging/wlags49_h25/wl_internal.h | 2 - drivers/staging/wlags49_h25/wl_main.c | 2 - drivers/staging/wlags49_h25/wl_main.h | 2 - drivers/staging/wlags49_h25/wl_netdev.c | 2 - drivers/staging/wlags49_h25/wl_netdev.h | 2 - drivers/staging/wlags49_h25/wl_priv.c | 2 - drivers/staging/wlags49_h25/wl_priv.h | 2 - drivers/staging/wlags49_h25/wl_profile.c | 2 - drivers/staging/wlags49_h25/wl_profile.h | 2 - drivers/staging/wlags49_h25/wl_util.c | 2 - drivers/staging/wlags49_h25/wl_util.h | 2 - drivers/staging/wlags49_h25/wl_version.h | 2 - drivers/staging/wlags49_h25/wl_wext.c | 2 - drivers/staging/wlags49_h25/wl_wext.h | 2 - 80 files changed, 44844 deletions(-) delete mode 100644 drivers/staging/wlags49_h2/Kconfig delete mode 100644 drivers/staging/wlags49_h2/Makefile delete mode 100644 drivers/staging/wlags49_h2/README.ubuntu delete mode 100644 drivers/staging/wlags49_h2/README.wlags49 delete mode 100644 drivers/staging/wlags49_h2/TODO delete mode 100644 drivers/staging/wlags49_h2/WARNING.txt delete mode 100644 drivers/staging/wlags49_h2/ap_h2.c delete mode 100644 drivers/staging/wlags49_h2/ap_h25.c delete mode 100644 drivers/staging/wlags49_h2/debug.h delete mode 100644 drivers/staging/wlags49_h2/dhf.c delete mode 100644 drivers/staging/wlags49_h2/dhf.h delete mode 100644 drivers/staging/wlags49_h2/dhfcfg.h delete mode 100644 drivers/staging/wlags49_h2/hcf.c delete mode 100644 drivers/staging/wlags49_h2/hcf.h delete mode 100644 drivers/staging/wlags49_h2/hcfcfg.h delete mode 100644 drivers/staging/wlags49_h2/hcfdef.h delete mode 100644 drivers/staging/wlags49_h2/man/wlags49.4 delete mode 100644 drivers/staging/wlags49_h2/mdd.h delete mode 100644 drivers/staging/wlags49_h2/mmd.c delete mode 100644 drivers/staging/wlags49_h2/mmd.h delete mode 100644 drivers/staging/wlags49_h2/sta_h2.c delete mode 100644 drivers/staging/wlags49_h2/sta_h25.c delete mode 100644 drivers/staging/wlags49_h2/wl_cs.c delete mode 100644 drivers/staging/wlags49_h2/wl_cs.h delete mode 100644 drivers/staging/wlags49_h2/wl_enc.c delete mode 100644 drivers/staging/wlags49_h2/wl_enc.h delete mode 100644 drivers/staging/wlags49_h2/wl_if.h delete mode 100644 drivers/staging/wlags49_h2/wl_internal.h delete mode 100644 drivers/staging/wlags49_h2/wl_main.c delete mode 100644 drivers/staging/wlags49_h2/wl_main.h delete mode 100644 drivers/staging/wlags49_h2/wl_netdev.c delete mode 100644 drivers/staging/wlags49_h2/wl_netdev.h delete mode 100644 drivers/staging/wlags49_h2/wl_priv.c delete mode 100644 drivers/staging/wlags49_h2/wl_priv.h delete mode 100644 drivers/staging/wlags49_h2/wl_profile.c delete mode 100644 drivers/staging/wlags49_h2/wl_profile.h delete mode 100644 drivers/staging/wlags49_h2/wl_util.c delete mode 100644 drivers/staging/wlags49_h2/wl_util.h delete mode 100644 drivers/staging/wlags49_h2/wl_version.h delete mode 100644 drivers/staging/wlags49_h2/wl_wext.c delete mode 100644 drivers/staging/wlags49_h2/wl_wext.h delete mode 100644 drivers/staging/wlags49_h25/Kconfig delete mode 100644 drivers/staging/wlags49_h25/Makefile delete mode 100644 drivers/staging/wlags49_h25/README.txt delete mode 100644 drivers/staging/wlags49_h25/TODO delete mode 100644 drivers/staging/wlags49_h25/ap_h25.c delete mode 100644 drivers/staging/wlags49_h25/debug.h delete mode 100644 drivers/staging/wlags49_h25/dhf.c delete mode 100644 drivers/staging/wlags49_h25/dhf.h delete mode 100644 drivers/staging/wlags49_h25/dhfcfg.h delete mode 100644 drivers/staging/wlags49_h25/hcf.c delete mode 100644 drivers/staging/wlags49_h25/hcf.h delete mode 100644 drivers/staging/wlags49_h25/hcfcfg.h delete mode 100644 drivers/staging/wlags49_h25/hcfdef.h delete mode 100644 drivers/staging/wlags49_h25/mdd.h delete mode 100644 drivers/staging/wlags49_h25/mmd.c delete mode 100644 drivers/staging/wlags49_h25/mmd.h delete mode 100644 drivers/staging/wlags49_h25/sta_h25.c delete mode 100644 drivers/staging/wlags49_h25/wl_cs.c delete mode 100644 drivers/staging/wlags49_h25/wl_cs.h delete mode 100644 drivers/staging/wlags49_h25/wl_enc.c delete mode 100644 drivers/staging/wlags49_h25/wl_enc.h delete mode 100644 drivers/staging/wlags49_h25/wl_if.h delete mode 100644 drivers/staging/wlags49_h25/wl_internal.h delete mode 100644 drivers/staging/wlags49_h25/wl_main.c delete mode 100644 drivers/staging/wlags49_h25/wl_main.h delete mode 100644 drivers/staging/wlags49_h25/wl_netdev.c delete mode 100644 drivers/staging/wlags49_h25/wl_netdev.h delete mode 100644 drivers/staging/wlags49_h25/wl_priv.c delete mode 100644 drivers/staging/wlags49_h25/wl_priv.h delete mode 100644 drivers/staging/wlags49_h25/wl_profile.c delete mode 100644 drivers/staging/wlags49_h25/wl_profile.h delete mode 100644 drivers/staging/wlags49_h25/wl_util.c delete mode 100644 drivers/staging/wlags49_h25/wl_util.h delete mode 100644 drivers/staging/wlags49_h25/wl_version.h delete mode 100644 drivers/staging/wlags49_h25/wl_wext.c delete mode 100644 drivers/staging/wlags49_h25/wl_wext.h (limited to 'MAINTAINERS') diff --git a/MAINTAINERS b/MAINTAINERS index 4c7cff443a5e..a8bf1cb1e701 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8496,12 +8496,6 @@ L: devel@driverdev.osuosl.org S: Supported F: drivers/staging/ -STAGING - AGERE HERMES II and II.5 WIRELESS DRIVERS -M: Henk de Groot -S: Odd Fixes -F: drivers/staging/wlags49_h2/ -F: drivers/staging/wlags49_h25/ - STAGING - ASUS OLED M: Jakub Schmidtke S: Odd Fixes diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index c7e34a28c6f1..ba76ab17902b 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -74,10 +74,6 @@ source "drivers/staging/sep/Kconfig" source "drivers/staging/iio/Kconfig" -source "drivers/staging/wlags49_h2/Kconfig" - -source "drivers/staging/wlags49_h25/Kconfig" - source "drivers/staging/cxt1e1/Kconfig" source "drivers/staging/xgifb/Kconfig" diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index 8ad1689da19d..22bb98e46d36 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -31,8 +31,6 @@ obj-$(CONFIG_VT6656) += vt6656/ obj-$(CONFIG_VME_BUS) += vme/ obj-$(CONFIG_DX_SEP) += sep/ obj-$(CONFIG_IIO) += iio/ -obj-$(CONFIG_WLAGS49_H2) += wlags49_h2/ -obj-$(CONFIG_WLAGS49_H25) += wlags49_h25/ obj-$(CONFIG_CXT1E1) += cxt1e1/ obj-$(CONFIG_FB_XGI) += xgifb/ obj-$(CONFIG_TIDSPBRIDGE) += tidspbridge/ diff --git a/drivers/staging/wlags49_h2/Kconfig b/drivers/staging/wlags49_h2/Kconfig deleted file mode 100644 index 3efcbf8afedf..000000000000 --- a/drivers/staging/wlags49_h2/Kconfig +++ /dev/null @@ -1,11 +0,0 @@ -config WLAGS49_H2 - tristate "Agere Systems HERMES II Wireless PC Card Model 0110" - depends on WLAN && PCMCIA - select WIRELESS_EXT - select WEXT_SPY - select WEXT_PRIV - ---help--- - Driver for wireless cards using Agere's HERMES II chipset - which are identified with Manufacture ID: 0156,0003 - The software is a modified version of wl_lkm_722_abg.tar.gz - from the Agere Systems website, addapted for Ubuntu 9.04. diff --git a/drivers/staging/wlags49_h2/Makefile b/drivers/staging/wlags49_h2/Makefile deleted file mode 100644 index 6eeb5d1845eb..000000000000 --- a/drivers/staging/wlags49_h2/Makefile +++ /dev/null @@ -1,53 +0,0 @@ -# -# Makefile for wlags49_h2_cs.ko and wlags49_h25_cs.ko -# -# Default build for Hermes-II base cards (possibly identified with -# "manfid: 0x0156, 0x0003" in "pccardctl ident" output), comment -# -DHERMES25 below -# -# If you want to build for Hermes-II.5 base cards (possibly identified with -# "manfid: 0x0156, 0x0004" in "pccardctl ident" output), uncomment -# -DHERMES25 below -# -# If you want to build AP support (untested), comment out -DSTA_ONLY - -ccflags-y := -I$(KERNELDIR)/include -ccflags-y += -I$(src) \ - -DBUS_PCMCIA \ - -DUSE_WEXT \ - -DSTA_ONLY \ - -DWVLAN_49 \ -# -DHERMES25 \ -# -DDBG \ -# -DDBG_LVL=5 \ -# -DUSE_UIL \ -# -DUSE_PROFILE \ - -ifeq ($(findstring HERMES25,$(ccflags-y)),) -WLNAME := wlags49_h2_cs -$(WLNAME)-y := sta_h2.o -ifeq ($(findstring STA_ONLY,$(ccflags-y)),) -$(WLNAME)-y += ap_h2.o -endif -else -WLNAME=wlags49_h25_cs -$(WLNAME)-y := sta_h25.o -ifeq ($(findstring STA_ONLY,$(ccflags-y)),) -$(WLNAME)-y += ap_h25.o -endif -endif - - -obj-m += $(WLNAME).o - -$(WLNAME)-y += wl_profile.o \ - wl_wext.o \ - wl_priv.o \ - wl_main.o \ - wl_enc.o \ - wl_util.o \ - wl_netdev.o \ - wl_cs.o \ - mmd.o \ - hcf.o \ - dhf.o diff --git a/drivers/staging/wlags49_h2/README.ubuntu b/drivers/staging/wlags49_h2/README.ubuntu deleted file mode 100644 index bfad7dc7725f..000000000000 --- a/drivers/staging/wlags49_h2/README.ubuntu +++ /dev/null @@ -1,180 +0,0 @@ -======================================================================= -WLAN driver for cards using the HERMES II and HERMES II.5 chipset - -HERMES II Card - -PCMCIA Info: "Agere Systems" "Wireless PC Card Model 0110" - Manufacture ID: 0156,0003 - -HERMES II.5 Card - -PCMCIA Info: "Linksys" "WCF54G_Wireless-G_CompactFlash_Card" - Manufacture ID: 0156,0004 - -Based on Agere Systems Linux LKM Wireless Driver Source Code, -Version 7.22; complies with Open Source BSD License. -======================================================================= - -DESCRIPTION - -The software is a modified version of wl_lkm_722_abg.tar.gz from the -Agere Systems website, addapted for Ubuntu 9.04. - -Modified for kernel 2.6 by Henk de Groot -Based on 7.18 version by Andrey Borzenkov $Revision: 39 $ - -INSTALLATION - -Unpack in a new directory. - -Open a terminal screen. - -Change directory to the source directory - -Type command - -make - -and wait until it is finshed. Now you have build the module -wlags49_h2_cs; this module is meant for a HERMES II card. - -The driver is tested with a Thomson SpeedTouch 110 Wireless PC Card. -For the test Station mode was used with WEP. The driver is supposed -to support WAP and as accesspoint that is NOT tested. - -If you have a card using the HERMES II.5 chip you have to make -changes to the Makefile and uncomment -DHERMES25. This will build -driver wlags49_h25_cs. - -Note: You can determine the type with command "pccardctrl info" - MANIFID: 0156,0002 = HERMES - not supported by this driver - MANIFID: 0156,0003 = HERMES II (Wireless B) - MANIFID: 0156,0004 = HERMES II.5 (Wireless B/G) - -After successful compile type command - -sudo make install - -to install the module. - -Now the card should be recognized. It should be able to configure -and use the card with NetworkManager. Wpa_supplicant also works, as does -manual configuration using the iwconfig/iwlist programs. - -Note: I only tested Station mode with WEP but if I didn't break anything -WPA and AP mode should also work; note however that WPA was experimental -in the original Agere driver! - -Note: to compile as AP change the makefile and remove the line --DSTA_ONLY \ - -(or comment it, but in that case make sure to move it after all the - flags you want to use) - -CHANGES - -The HCF functions to control the card are virtually unchanged, the only -changes are meant to fix compiler warnings. The only real change is in -HCF_WAIT_WHILE which now has a udelay(2) added to give a small delay. - -The linux driver files (wl_xxxx.c) are changed in the following ways: -- Addaptations of Andrey Borzenkov applied to 7.22 source -- Alterations to avoid most HCF_ASSERTs --- Switching interrupts off and on in the HCF --- Bugfixes, things that were apparently wrong like reporting link status - change which checked a variable that was not changed in HCF anymore. --- Used on WEP but setting keys via SIOCSIWENCODEEXT was not supported --- Recovery actions added - -The major problem was the order in which calls can be made. The original -looks like a traditional UNIX driver. To call an "ioctl" function you -have to "open" the device first to get a handle and after "close" no -"ioctl" function can be called anymore. With the 2.6 driver this all -changed; the former ioctl functions are now called before "open" and -after "close", which was not expected. One of the problems was enable/ -disable of interrupts in the HCF. Interrupt handling starts at "open" -so if a former "ioctl" routine is called before "open" or after "close" -then nothing should be done with interrupt switching in the HCF. Once -this was solved most HCF_ASSERTS went away. - -The last point, recovery actions added, needs some clarification. -Starting the card works most of the time, but unfortunately not always. -At a few times recovery code was added; when the card starts to -misbehave or the communication between the HCF and the card is -out of sync and the HCF enters DEFUNCT mode everything is reset and -reinitialized. Note, hcf.c contains a lot of documentation. It takes -some time but slowly some things become clear. Also some unresolved -issues are mentioned in hcf.c, so there are still unknown bugs. - -The card problems are almost in all cases when starting up and before -the first association with an AP, once the card is in operation it -seems to stay that way; when debugging no HCF_ASSERTS appear anymore. -Note: some HCF_ASSERTS still appear, in a number of cases it is a real -error, for example at card removal the missing card is detected. - -LICENSE - -The Agere Systems license applies. This is why I include the original -README.wlags49. The instructions in that file are bogus now. I also -include the man page. Even though setting parameters on the module -does not work anymore but it provides some information about all the -settings. - -I have no personal contact with Agere, but others have. Agere -agreed to make their software available under the BSD license. -This driver is based on the 7.22 version. - -The following was mailed by Agere to Andrey Borzenkov about this: - - --- Begin Message --- - - * From: TJ - * Date: Mon, 05 Feb 2007 19:28:59 +0000 - - Hi Andrey, - - I've got some good news for you/us/the world of Hermes :) - - I got a reply from the legal representative at Agere confirming that - their source-code is BSD licensed, and I've included the contents of the - email here. - - I hope this re-assures you so that your excellent work on the drivers - can be made widely available for other hackers to work with. - - Regards, - - TJ. - - --------- - On Mon, 2007-02-05 at 13:54 -0500, Pathare, Viren M (Viren) wrote: - - - "I would like to confirm that the two drivers; Linux LKM Wireless Driver - Source Code, Version 7.18 and Linux LKM Wireless Driver Source Code, - Version 7.22 comply with Open Source BSD License. Therefore the source - code can be distributed in unmodified or modified form consistent with - the terms of the license. - - The Linux driver architecture was based on two modules, the MSF (Module - specific functions) and the HCF (Hardware Control Functions). Included - in the HCF is run-time firmware (binary format) which is downloaded into - the RAM of the Hermes 1/2/2.5 WMAC. - - This hex coded firmware is not based on any open source software and - hence it is not subject to any Open Source License. The firmware was - developed by Agere and runs on the DISC processor embedded within the - Hermes 1/2/2.5 Wireless MAC devices. - - Hope this helps. - - Sincerely, - - Viren Pathare - Intellectual Property Licensing Manager - Agere" - - - - --- End Message --- - diff --git a/drivers/staging/wlags49_h2/README.wlags49 b/drivers/staging/wlags49_h2/README.wlags49 deleted file mode 100644 index f65acd6f5f54..000000000000 --- a/drivers/staging/wlags49_h2/README.wlags49 +++ /dev/null @@ -1,641 +0,0 @@ -============================================================================== -Agere Systems Inc. July 2004 -Readme for Linux Driver Source for Wavelan Version: 7.22-abg -============================================================================== - -This text file includes update information, installation instructions, -limitations to the current version of the product, and suggestions to solve -known issues or problems. - - -TABLE OF CONTENTS. - -1. DESCRIPTION -2. SYSTEM REQUIREMENTS -3. NEW IN THIS RELEASE -4. INSTALLATION NOTES -5. TECHNICAL CONSTRAINTS -6. KNOWN ISSUES -7. TECHNICAL SUPPORT - ------------------------------------------------------------------------------- -1. DESCRIPTION - - With this package, you can build and install a Wireless driver for a - specific Linux kernel. - - The driver in this package supports the network interface cards based on: - - WL60010, a.k.a. Hermes-II - - WL60040, a.k.a. Hermes-II.5 - - Although derived from the Hermes-I/II Linux driver, this release ONLY - Supports Hermes-II/II.5 chipsets. Hermes-I is no longer supported. - - The software is distributed in a compressed source file archive: - - wl_lkm_7_22_abg.tar.gz - - Because this release supports more than one Hermes CPU and bus - architecture, a naming convention is used for the resulting binaries that - can be built from this source code. Driver binaries are named as follows: - - wlags49__.o - - where 'wlags49' denotes an Agere WaveLan Linux build, - - is: 'h2' for Hermes-II, 'h25' for Hermes-II.5 - - is: 'cs' for Card Services (PCMCIA, Compact Flash), PCI for - PCI or MiniPCI. - - For example, a driver built for Hermes-II Card Services (PCMCIA/Compact - Flash) is named wlags49_h2_cs.o, whereas a driver built for Hermes-II - MiniPCI is named wlags49_h2_pci.o. - The following software is included with this distribution: - - General information: - * README.wlags49 This file - * LICENSE.wlags49 License - * wlags49.mk Top level Makefile - * Build Script to build driver - * Install Script to install driver - - Driver source: - * wireless/ MSF source - * hcf/ HCF and F/W source - * wireless/wlags49_cs.mk Driver Makefile, PC Card - * wireless/wlags49_pci.mk Driver Makefile, PCI - * include/hcf/debug.h Driver debug support - * include/hcf/hcfcfg.h Header to configure HCF - * include/wireless/*.h Driver source headers - - Driver online manual page: - * man/wlags49.4 Driver manual page - - PCMCIA configuration update: - * etc/wlags49.conf Add-on config file - * etc/wlags49.mk config update Makefile - * etc/wlags49.patch config update patch file - - The driver is build up of 2 modules: - - a higher module called Module Specific Functions (MSF), which contains - the functions of the driver that are network driver interface and - Operating System specific. - - a lower module called Hardware Control Functions (HCF), which contains - the functions to interface to the Network Interface Card (NIC). The HCF - provides for all WaveLAN NIC types one standard interface to the MSF. - This I/F is called the Wireless Connection Interface (WCI) and is the - subject of a separate document (025726). - - The HCF directory contains firmware images to allow the card to operate in - either station (STA) or Access Point (AP) mode. In the build process, the - files fw_h2.c and fw_h25.c are used for Hermes-II and Hermes-II.5 - respectively. The firmware images in this release are identified as: - - HII Station F/W: fw_h2.c.sta - - HII.5 Station F/W: fw_h25.c.sta - - HII AccesPoint F/W: fw_h2.c.ap - - HII.5 AccesPoint F/W: fw_h25.c.ap - To build a STA or AP mode driver, the suffix .sta or .ap must be removed. - The files as distributed by this release build STA drivers by default. - ------------------------------------------------------------------------------- -2. SYSTEM REQUIREMENTS - -2.1 Operating System - - This software can be compiled and installed with Linux kernel versions - 2.4.x. Although this driver should compile for other CPUs as well, as of - the date of this release, no CPU architectures other than x86 have been - verified. - - wl_lkm_7_22_abg is tested with the following Linux Distributions: - * Red Hat version 9.0 - * Suse version 9.0 - - If you're building for PC Card or Compact Flash, you need the Card Services - from David Hinds. - - wl_lkm_7_22_abg is tested with: - * pcmcia-cs-3.2.7.tar.gz - -2.2 Free Disk Space - - To compile the software you need to have the full set of Linux kernel - source files installed, as well as a sane build environment which includes - all tools necessary for compiling and linking code. Depending on the exact - version of the kernel, you need approximately 150 MB of free disk space. - Once compiled, the driver uses about 150-200 KB. Please note, this size is - approximate and can vary depending on which version of the driver is built. - In addition, adding debug tracing support increases this size. - ------------------------------------------------------------------------------- -3. NEW IN THIS RELEASE - -Version 7.22 abg - July 28, 2004 - ------------------------------------------------------------------------------- -4. INSTALLATION NOTES - - The driver files for the Linux driver are not "ready" for direct - installation onto any Linux computer. To build and install the driver you - need some expertise on the Linux operating system in general and the type - and version installed of the kernel installed on your computer. With this - knowledge you can use the driver source files provided to build your own - Linux driver for your specific computer and kernel. - -4.1 Before you start - - 1) Determine the type and version of the Linux kernel of your computer and - check whether it meets the system requirements listed in section 2 of this - README. - - 2) If you're building for PC Card or Compact Flash, read the Linux - PCMCIA-HOWTO by David Hinds. This document is probably provided on the - CD-ROM of your Linux distribution. You can download the latest version - from: - - http://pcmcia-cs.sourceforge.net - - Please read the section titled "Prerequisites and kernel setup" of the - PCMCIA-HOWTO. - -4.2 Build the driver for PC Card / Compact Flash - - 1) Obtain a copy of the Linux PCMCIA package from a CD-ROM of your Linux - distribution or download the latest version. - For your convenience, the Agere Systems Wireless CD-ROM contains a copy of - the PCMCIA package in sub-directory: Xtras/Linux/PCMCIA - - 2) To unpack the Linux PCMCIA package, copy it to the current working - directory and type: - % tar xzvf pcmcia-cs-x.y.z.tar.gz - % mv pcmcia-cs-x.y.z pcmcia-cs - - Note: If you use the archive supplied on the CDROM, use archive name - "pc3_2_1.tgz" instead of "pcmcia-cs-3.2.7.tar.gz". - - Note: even though PCMCIA code exists in the kernel source tree, the PCMCIA - Card Services package needs to be unpacked locally to build drivers based - on it. - - 3) Extract the wlags49 distribution archive on top of the Linux PCMCIA - package. - % cd pcmcia-cs - % tar xzvf ../wl_lkm_7_22_abg.tar.gz - - 4) To build and install the driver, follow the procedure below: - % ./Configure - - Answer the presented questions. Usually the default answers are OK and - pressing "Enter" is enough. - On newer RedHat systems, however, you should specify "/usr/src/linux-2.4" - as the Linux source directory instead of the default "/usr/src/linux". - - For more detailed information on configuration, building and installing, - see the PCMCIA-HOWTO. - - To build the default drivers, which support Hermes-II in station mode, run - the Build script: - % ./Build - - This script determines whether your system uses in-kernel PCMCIA and either - builds the full PCMCIA package or just the driver. - - Before installing the driver with the Install script, you must become - 'root': - % su - .. - % ./Install - - This script determines whether your system uses in-kernel PCMCIA and either - installs the full PCMCIA package or just the driver. - - 5) If it becomes necessary to clean the build, issue the following - commands: - % make clean - % make -C lib clean - -4.3 Build the driver for PCI - - 1) Extract the wlags49 to the current working directory. - % tar xzvf wl_lkm_7_22.tar.gz - - Note: there is no need to unpack the driver source into a PCMCIA build - directory. - - 2) To build the PCI driver: - % make -f wlags49.mk wlags49_h2_pci - or - % make -f wlags49.mk wlags49_h25_pci - - 3) Install the driver. - % insmod ./wireless/wlags49_h25.o - - 4) If it becomes necessary to clean the build. - % make -f wlags49.mk pci_clean - -4.4 Configure your Wireless PC Card - - There are 3 ways to configure the driver - - module parameters (/etc/pcmcia/config.opts) - - wireless extension (/etc/pcmcia/wireless.opts) - - Agere configuration file (/etc/agere/iwconfig-eth#) - - -4.4.1 Configure through /etc/pcmcia/config.opts - - To use this method, make sure that /etc/pcmcia/wireless.opts file is either - absent or contains blank parameter values as shown below. - - *,*,*,00:60:1D:*|*,*,*,00:02:2D:*) - INFO="" - ESSID="" - MODE="" - KEY="" - ;; - - 1) To configure the Wireless PC Card, please refer to: - * The online manual page (wlags49.4) - % man wlags49 - * The network adapter sections of the PCMCIA documentation. - % more PCMCIA-HOWTO - - 2) Use an editor to configure the module parameters: - # vi /etc/pcmcia/config.opts - - a) To connect your computer to a wireless infrastructure that includes - access points such as the AP-1000 or AP-500, you need to identify the - network name of the wireless infrastructure. - - For example if your infrastructure uses the network name "My Network", - edit the config.opts file to include the following: - - module "" opts "network_name=My\ Network" - - Notice that the space character needs to be escaped with a backslash. - - b) To connect your computer to a Residential Gateway RG-1000, you need - to know the RG ID (=network_name) and the encryption key. You can find - the RG ID on a small label on the rear of the unit. - - For example if your RG-1000 has ID 225ccf and you did not change the - encryption key yet, edit the config.opts file to include the following: - - module "" opts "network_name=\"225ccf\" key_1=\"25ccf\" - enable_encryption=Y" - - If you changed your encryption key, you should specify this key as key_1 - on the parameter line. - - c) To connect your computer to a peer-to-peer network, in an environment - without access points, the IBSS mode is recommended. - - For example to connect to a peer-to-peer network called "My Network", - enter the following in the config.opts file: - - module "" opts "create_ibss=Y network_name=My\ Network" - - d) Optionally you can also include a "Station Name" value that can be - used to indentify your computer on the wireless network. - - For example if you wish to name your computer "Wave1" when connecting it - to a wireless infrastructure, edit the config.opts file to include the - following: - - module "" opts "network_name=Ocean station_name=Wave1" - - e) To connect your computer to an Ad-Hoc workgroup of wireless - computers, enter the following in the config.opts file: - - module "" opts "port_type=3" - - Note that the "Ad-Hoc Demo Mode" is not the recommended mode for a - peer-to-peer network. The configuration of this non-interoperable mode - is only explained here for special applications (e.g. research, or - compatibility with other / previous WaveLAN/IEEE products). - - The IBSS mode described in c) is the preferred and interoperable mode - for creating a peer-to-peer network. - - 3) Use an editor to modify the network options for your adapter. - # vi /etc/pcmcia/network.opts - - The parameters need to be correct for the connected network. Check with - your system administrator for the correct network information. Refer to - the PCMCIA-HOWTO for more configuration information. - - For example: - *,*,*,*) - IF_PORT="" - BOOTP="n" - IPADDR="10.0.0.5" - NETMASK="255.255.255.0" - NETWORK="10.0.0.0" - BROADCAST="10.0.0.255" - GATEWAY="10.0.0.1" - DOMAIN="domain.org" - DNS_1="dns1.domain.org" - ;; - - RedHat and Suse do not use the network.opts to configure the driver. - Instead RedHat uses a GUI-based tool called 'neat' ('net.cfg' in older - versions) and SuSE Linux uses 'YaST'. These tools creates scripts, like - ifcfg-eth0, in the directory /etc/sysconfig/network-scripts. Using the - default GNOME menu, you can start netcfg from: Programs->System->Network - Configuration. - - 4) Restart the PCMCIA services. - # /etc/rc.d/rc.pcmcia restart - or - # /etc/rc.d/init.d/pcmcia restart - - - For a more detailed description about the various configuration options and - definitions, please consult the Wireless documentation. - -4.4.2 Configure through /etc/pcmcia/wireless.opts - - This driver has support for the "Wireless Extensions". This interface - allows the "Wireless Tools" to get statistics from the driver and allows to - change the configuration of the driver on the fly. - - The latest versions of the PCMCIA package contain scripts that use the - wireless extension to configure the driver as an alternative to the - configuration through module parameters as described in section 4.4.1. - Read the /etc/pcmcia/wireless.opts file for the theory of operation. When - the driver is configured, go to section 4.4.1 step 3 to configure the - network parameters. - - For more information, refer to the following WEB pages: - http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Linux.Wireless.Extensions.html - http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html - -4.4.3 Configure through /etc/agere/iwconfig-eth# - - In addition to using either the module options or the wireless extensions - methods to configure a wireless device, this version of the software also - supports an Agere specific implementation. This was done because: - * Module options configures multiple devices the same. - * Wireless extensions parameters do not cover all of the available options - in the driver. - - For each wireless ethernet device (identified by eth, where n is a - positive integer), a file /etc/agere/iwconfig-eth can be created which - contains configuration information for a wireless device. For example, the - file /etc/agere/iwconfig-eth1 is the config file for eth1. This file should - contain Key/Value pairs in the format: - - = - - where is the parameter to configure and is the value to - assign it. For example, if the config file /etc/agere/iwconfig-eth1 - described above contains the following: - - DesiredSSID=some_network - EnableEncryption=Y - Key1=net01 - TxKey=1 - - this configures eth1 to associate to the ESSID 'some_network' with - encryption on, where the the first encryption key is 'net01' and the key to - use for encryption is Key 1. - - Note that this only works on Agere hardware which uses this driver. For - other wireless drivers, or non-wireless devices, this file can be present, - but has no effect. - - Please refer to the man page for more information on this configuration - file and the parameters that can be set. - - -4.5 Configuring your Wireless PCI card - - Note that the above method of configuring the card using - /etc/pcmcia/config.opts is only valid for PCMCIA/CF cards. For [mini]PCI - and CardBus cards, refer to your system's documentation on modules.conf to - load the driver with the proper options for a given wireless ethernet - interface. In addition, network configuration tools like 'netcfg', 'neat', - or 'YaST' (see Section 4.4.1, Step 3) can be used to configure the miniPCI - card. Lastly, the Agere configuration file described in Section 4.4.3 may - also be used for [mini]PCI and CardBus devices. - -4.6 Troubleshooting - - When the Wireless PC Card is inserted, the card manager emit beeps in - different tones to indicate success or failure of particular configuration - steps. - a) Two high beeps - - The card was identified and configured successfully. - b) One high beep followed by a low beep - - The card was identified, but could not be configured. - - Examine the system log (dmesg) for PCMCIA error or warning messages. - c) One low beep - - The card could not be identified. - - Execute "cardctl ident" to display the adapter PnP information. - Verify the PnP information matches an entry in the PCMCIA - configuration file (/etc/pcmcia/config). - - Examine the system log (dmesg) for PCMCIA error or warning messages. - - The Wireless PC Card has two LEDs that indicate the state of the adapter - and network. - * Power LED (toward the middle of the adapter) - - This LED indicates power has been applied, and the card is - functional. In normal operation mode with Card Power Management - disabled, it is steady-on. With Card Power Management enabled, it - blinks rapidly (several times per second). - * Transmit/Receive LED (closer to the edge of the adapter) - - This LED flashes when it detects transmit or receive packets. - - * Both LEDs blink at the same time every 10 seconds. - - The adapter was unable to make contact with the named wireless - network. Verify the network_name, in the config.opts file matches the - network name of the access point. - * LEDs indicate normal operation with the Power LED - steady-on or blinking rapidly and Transmit/Receive LED flashing, but no - traffic. - - If the network is operating in normal mode (ie. port_type = 0 or not - specified), and a network_name has been specified, verify the - workstation network parameters (ifconfig, route, etc.) are correct - for the wireless network. - - If the network is operating in Ad-Hoc (peer-to-peer) mode (ie. - port_type = 3), the adapter needs another workstation/adapter to - communicate with. Verify the network parameters on both of the - workstations (ifconfig, route, etc.) are correct. - - Refer to the online manual page for additional configuration, feature and - support information. - % man wlags49 - or - % man 4 wlags49 - or - % nroff -man wlags49.4 | more - -4.7 Identifying the software - - This section explains how to identify the version of this software once it - is unpacked or installed. - - The Linux Driver Source/Library distribution consist of two main - components, the driver source and the HCF module. - - * To quickly identify the version of the source, type: - % grep DRV.*VERSION include/wireless/wl_version.h - #define DRV_MAJOR_VERSION 7 - #define DRV_MINOR_VERSION 22 - - * To identify the revision of the HCF library contained in the driver, - type: - % grep HCF.Revision hcf/hcf.c - #define HCF_VERSION TEXT( "HCF$Revision: 1.8 $" ) - - To identify a compiled wlags49 driver, go to the directory where the driver - is located. Card Services drivers (wlags49_h2_cs.o and wlags49_h25_cs.o) - are located in: - /lib/modules//pcmcia - - PCI drivers (wlags49_h2.o) are located in: - /lib/modules//kernel/drivers/net - - * To retrieve the version of the source used to compile the driver, type: - % strings .o | grep Agere - v7.22-abg-Beta for PCMCIA - v7.22-abg-Beta for PCI - - * Likewise, to retrieve the revision of the HCF used to compile the driver, - type: - % strings .o | grep Revision - HCF$Revision: 5.15 - - At startup the wlags49 driver reports its version in the system log file - (/var/log/messages). - ------------------------------------------------------------------------------- -5. TECHNICAL CONSTRAINTS - - At the time of release of this software, the following constraints are - identified: - -5.1 Using the ISA adapter - - Description: To allow operation in desktop computers Agere also provides an - optional ISA bus to PC Card adapter (also referred to as "swapbox"). - - This ISA Adapter can be configured for two different I/O Address values: - * 3E2 (factory-set default) - * 3E0 - - Impact: By default the i82365 module of the Linux pcmcia package only - probes at 3E0. - - Actions: - 1) Read the manual page on the probing of the i82365 module, by typing the - command: - man i82365 - - 2) Apply one of the two following options: - a) Change the I/O address strapping of the ISA adapter by replacing the - jumper on the ISA adapter. The correct jumper setting is pictured in - the electronic "Wireless ISA Adapter, Getting Started Guide" provided - on the Wireless Software CD-ROM. This guide is provided in Adobe's - Acrobat PDF format. - - b) Alternatively, you can load the i82365 module with the - "extra_sockets" parameter set to 1. - - On a RedHat 5.x thru 7.x, system, put this in the file - "/etc/sysconfig/pcmcia": - PCMCIA=yes - PCIC=i82365 - PCIC_OPTS="extra_sockets=1" - CORE_OPTS= - CARDMGR_OPTS= - - For other Linux distributions, you are advised to consult the - "PCMCIA-HOWTO" notes for information about changing the I/O Address - probing. - -5.2 Using the PCI Adapter - - Description: To allow operation in desktop computers Agere also provides an - optional PCI bus to PC Card adapter (also referred to as "swapbox"). - - For correct interrupt assignment, the system should support PCIBIOS 2.2. - It is recommended to use PCMCIA package version 3.2.7 or higher. - - The default configuration of the interrupt routing method of the PCI - Adapter's TI CardBus Controller is incorrect. - - Actions: - 1) Read the manual page on the "Options specific for TI CardBus - Controllers" of the i82365 module, by typing the command: - man i82365 - - 2) Load the i82365 module with the "irq_mode" parameter set to 0. - On a RedHat 5.x thru 7.x system, put this in the file - "/etc/sysconfig/pcmcia": - PCMCIA=yes - PCIC=i82365 - PCIC_OPTS="irq_mode=0" - CORE_OPTS= - CARDMGR_OPTS= - - For the location of the PCMCIA scripts on other Linux distributions, you - are advised to consult the "PCMCIA-HOWTO", "Notes about specific Linux - distributions". - ------------------------------------------------------------------------------- -6. KNOWN ISSUES - - This is the current list of known issues for this release, and will be - addressed in the near future: - - 1. This driver release contains a version of Hermes-II.5 firmware which - REQUIRES calibrated cards. If there is no calibration data present in the - PDA of the hardware, the firmware does not operate. - - 2. WDS is not yet supported. - - 3. DMA is not yet supported. - - 4. WPA is not yet supported. - - 5. 32-bits I/O is not yet supported. - - 6. The current Build script also builds the PCI drivers. - - 7. The current Install script also copies the PCI drivers to the lib - directory. - - 8. If F/W files are required from outside this release, the entry points - inside these F/W files have to be renamed from "ap" and "station" to - "fw_image" and they have to be renamed to fw_h2.c and fw_h25.c for - Hermes-II and Hermes-II.5. - ------------------------------------------------------------------------------- -7. TECHNICAL SUPPORT - -7.1 Finding Information - - On the Agere Systems Web Site you can find the most recent device drivers, - software updates and user documentation. - - World Wide Web: http://www.agere.com - -7.2 Contact Technical Support - - If you encounter problems when installing or using this product, or would - like information about our other "Wireless" products, please contact your - local Authorized "Wireless" Reseller or Agere Systems sales office. - - Addresses and telephone numbers of the Agere Systems sales offices are - listed on our Agere Systems web site. - - When contacting Technical Support, please use the Problem Report Form and - send it to us by Fax or E-Mail. The Problem Report Form 'REPORT.TXT' - (Plain text format) is included on the disk. Alternatively, you can - download the Problem Report Form from the Agere Systems web site. - - Include Product Name, Serial Number and software version number with each - request to help the Support Group helping you. - -============================================================================== - END OF FILE diff --git a/drivers/staging/wlags49_h2/TODO b/drivers/staging/wlags49_h2/TODO deleted file mode 100644 index f1a45611b236..000000000000 --- a/drivers/staging/wlags49_h2/TODO +++ /dev/null @@ -1,33 +0,0 @@ -First of all, the best thing would be that this driver becomes obsolete by -adding support for Hermes II and Hermes II.5 cards to the existing orinoco -driver. The orinoco driver currently only supports Hermes I based cards. -Since this will not happen by magic and has not happened until now this -driver provides a stop-gap solution for these type of cards. - -Having said that, the following wishlist comes to mind to make the driver -suitable as fully supported kernel driver. Feel free to expand/enhance the -list. - -TODO: - - verify against a Hermes II.5 card - - verify with WPA encryption (both with H2 and H2.5 cards) - - sometimes the card does not initialize correctly, retry mechanisms - are built in to catch most cases but not all - - once the driver runs it is very stable, but I have the impression - that some of the critical sections take some time. - - the driver is split into a Hermes II and a Hermes II.5 part, it - would be nice to handle both with one module instead of two - - review by the wireless developer community - - verify the code against the coding standards for a proper linux - driver - - resolve license issues (?) - -DONE: - - verified against a Hermes II card (Thomson Speedtouch 110 PCMCIA - card) - - verified with WEP encryption - -Please send any patches or complaints about this driver to Greg -Kroah-Hartman and Cc: Henk de Groot -Don't bother the upstream wireless kernel developers about it, they -want nothing to do with it. diff --git a/drivers/staging/wlags49_h2/WARNING.txt b/drivers/staging/wlags49_h2/WARNING.txt deleted file mode 100644 index 5d12973ba19c..000000000000 --- a/drivers/staging/wlags49_h2/WARNING.txt +++ /dev/null @@ -1,3 +0,0 @@ -These sources are shared with the wlags49_h25 driver. Some files are even -exclusively used by that driver. Do not delete them here without looking -at that other driver. diff --git a/drivers/staging/wlags49_h2/ap_h2.c b/drivers/staging/wlags49_h2/ap_h2.c deleted file mode 100644 index 3a08d421c735..000000000000 --- a/drivers/staging/wlags49_h2/ap_h2.c +++ /dev/null @@ -1,3337 +0,0 @@ -/* - * File: ap_h24.236 - * - * Abstract: This file contains memory image 'fw_image'. - * - * Contents: Total size of the memory image: 51010 bytes. - * Total number of blocks: 4 blocks. - * Block 1 : load address 00000060, 326 bytes. - * Block 2 : load address 00000C16, 6424 bytes. - * Block 3 : load address 001E252E, 444 bytes. - * Block 4 : load address 001F4000, 43816 bytes. - * - * Identity: component id: 32 (variant 2) version 2.36 - * - * Compatibility: - * supplying interface 8 (variant 2) : 2 - 4 - * acting on interface 1 (variant 4) : 6 - 7 - * acting on interface 1 (variant 5) : 6 - 7 - * acting on interface 1 (variant 6) : 6 - 7 - * acting on interface 2 (variant 2) : 1 - 2 - * - * Generated: by g:\fw\fupu3.exe version 4.26 - * - * Commandline: g:\fw\fupu3.exe /f=4 /n=fw_image /i=t2023600.hex - */ - - -#include "hcfcfg.h" /* to get hcf_16 etc defined as well as */ - /* possible settings which inluence mdd.h or dhf.h */ -#include "mdd.h" /* to get COMP_ID_STA etc defined */ -#include "dhf.h" /* used to be "fhfmem.h", to get memblock,plugrecord, */ - -static const hcf_8 fw_image_1_data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x0D, 0x00, 0x00, - 0x3A, 0x0C, 0x00, 0x00, 0x3A, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x02, 0x00, 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, 0xC8, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, - 0x0A, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xEA, 0x00, 0x00, 0xFF, 0x07, 0x02, 0x00, 0x64, 0x00, 0x64, 0x00, 0x10, 0x27, 0x10, 0x27, - 0x14, 0x00, 0xD0, 0x07, 0xD0, 0x07, 0x10, 0x27, 0x2F, 0x00, 0x32, 0x00, 0x32, 0x00, 0x05, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x10, 0x27, 0x05, 0x00, 0x00, 0x02, 0x00, 0x02, 0x13, 0x00, 0x0A, 0x00, - 0x07, 0x00, 0x03, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x09, 0x2B, 0x09, 0x2B, 0x09, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x14, 0x01, 0x00, 0x40, 0x00, 0x32, 0x00, 0x32, 0x00, - 0x0A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - -}; /* fw_image_1_data */ - -static const hcf_8 fw_image_2_data[] = { - 0x9B, 0xA7, 0x00, 0x0A, 0x10, 0x01, 0x68, 0xA4, 0xB0, 0x01, 0x84, 0x01, 0x30, 0x33, 0x31, 0x33, - 0x44, 0x44, 0x30, 0x33, 0x31, 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x32, 0x33, 0x90, 0x00, - 0x78, 0x04, 0xAE, 0xE4, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, - 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0xC6, 0x84, 0xF8, 0x99, 0xEE, - 0x8D, 0xF6, 0x0D, 0xFF, 0xBD, 0xD6, 0xB1, 0xDE, 0x54, 0x91, 0x50, 0x60, 0x03, 0x02, 0xA9, 0xCE, - 0x7D, 0x56, 0x19, 0xE7, 0x62, 0xB5, 0xE6, 0x4D, 0x9A, 0xEC, 0x45, 0x8F, 0x9D, 0x1F, 0x40, 0x89, - 0x87, 0xFA, 0x15, 0xEF, 0xEB, 0xB2, 0xC9, 0x8E, 0x0B, 0xFB, 0xEC, 0x41, 0x67, 0xB3, 0xFD, 0x5F, - 0xEA, 0x45, 0xBF, 0x23, 0xF7, 0x53, 0x96, 0xE4, 0x5B, 0x9B, 0xC2, 0x75, 0x1C, 0xE1, 0xAE, 0x3D, - 0x6A, 0x4C, 0x5A, 0x6C, 0x41, 0x7E, 0x02, 0xF5, 0x4F, 0x83, 0x5C, 0x68, 0xF4, 0x51, 0x34, 0xD1, - 0x08, 0xF9, 0x93, 0xE2, 0x73, 0xAB, 0x53, 0x62, 0x3F, 0x2A, 0x0C, 0x08, 0x52, 0x95, 0x65, 0x46, - 0x5E, 0x9D, 0x28, 0x30, 0xA1, 0x37, 0x0F, 0x0A, 0xB5, 0x2F, 0x09, 0x0E, 0x36, 0x24, 0x9B, 0x1B, - 0x3D, 0xDF, 0x26, 0xCD, 0x69, 0x4E, 0xCD, 0x7F, 0x9F, 0xEA, 0x1B, 0x12, 0x9E, 0x1D, 0x74, 0x58, - 0x2E, 0x34, 0x2D, 0x36, 0xB2, 0xDC, 0xEE, 0xB4, 0xFB, 0x5B, 0xF6, 0xA4, 0x4D, 0x76, 0x61, 0xB7, - 0xCE, 0x7D, 0x7B, 0x52, 0x3E, 0xDD, 0x71, 0x5E, 0x97, 0x13, 0xF5, 0xA6, 0x68, 0xB9, 0x00, 0x00, - 0x2C, 0xC1, 0x60, 0x40, 0x1F, 0xE3, 0xC8, 0x79, 0xED, 0xB6, 0xBE, 0xD4, 0x46, 0x8D, 0xD9, 0x67, - 0x4B, 0x72, 0xDE, 0x94, 0xD4, 0x98, 0xE8, 0xB0, 0x4A, 0x85, 0x6B, 0xBB, 0x2A, 0xC5, 0xE5, 0x4F, - 0x16, 0xED, 0xC5, 0x86, 0xD7, 0x9A, 0x55, 0x66, 0x94, 0x11, 0xCF, 0x8A, 0x10, 0xE9, 0x06, 0x04, - 0x81, 0xFE, 0xF0, 0xA0, 0x44, 0x78, 0xBA, 0x25, 0xE3, 0x4B, 0xF3, 0xA2, 0xFE, 0x5D, 0xC0, 0x80, - 0x8A, 0x05, 0xAD, 0x3F, 0xBC, 0x21, 0x48, 0x70, 0x04, 0xF1, 0xDF, 0x63, 0xC1, 0x77, 0x75, 0xAF, - 0x63, 0x42, 0x30, 0x20, 0x1A, 0xE5, 0x0E, 0xFD, 0x6D, 0xBF, 0x4C, 0x81, 0x14, 0x18, 0x35, 0x26, - 0x2F, 0xC3, 0xE1, 0xBE, 0xA2, 0x35, 0xCC, 0x88, 0x39, 0x2E, 0x57, 0x93, 0xF2, 0x55, 0x82, 0xFC, - 0x47, 0x7A, 0xAC, 0xC8, 0xE7, 0xBA, 0x2B, 0x32, 0x95, 0xE6, 0xA0, 0xC0, 0x98, 0x19, 0xD1, 0x9E, - 0x7F, 0xA3, 0x66, 0x44, 0x7E, 0x54, 0xAB, 0x3B, 0x83, 0x0B, 0xCA, 0x8C, 0x29, 0xC7, 0xD3, 0x6B, - 0x3C, 0x28, 0x79, 0xA7, 0xE2, 0xBC, 0x1D, 0x16, 0x76, 0xAD, 0x3B, 0xDB, 0x56, 0x64, 0x4E, 0x74, - 0x1E, 0x14, 0xDB, 0x92, 0x0A, 0x0C, 0x6C, 0x48, 0xE4, 0xB8, 0x5D, 0x9F, 0x6E, 0xBD, 0xEF, 0x43, - 0xA6, 0xC4, 0xA8, 0x39, 0xA4, 0x31, 0x37, 0xD3, 0x8B, 0xF2, 0x32, 0xD5, 0x43, 0x8B, 0x59, 0x6E, - 0xB7, 0xDA, 0x8C, 0x01, 0x64, 0xB1, 0xD2, 0x9C, 0xE0, 0x49, 0xB4, 0xD8, 0xFA, 0xAC, 0x07, 0xF3, - 0x25, 0xCF, 0xAF, 0xCA, 0x8E, 0xF4, 0xE9, 0x47, 0x18, 0x10, 0xD5, 0x6F, 0x88, 0xF0, 0x6F, 0x4A, - 0x72, 0x5C, 0x24, 0x38, 0xF1, 0x57, 0xC7, 0x73, 0x51, 0x97, 0x23, 0xCB, 0x7C, 0xA1, 0x9C, 0xE8, - 0x21, 0x3E, 0xDD, 0x96, 0xDC, 0x61, 0x86, 0x0D, 0x85, 0x0F, 0x90, 0xE0, 0x42, 0x7C, 0xC4, 0x71, - 0xAA, 0xCC, 0xD8, 0x90, 0x05, 0x06, 0x01, 0xF7, 0x12, 0x1C, 0xA3, 0xC2, 0x5F, 0x6A, 0xF9, 0xAE, - 0xD0, 0x69, 0x91, 0x17, 0x58, 0x99, 0x27, 0x3A, 0xB9, 0x27, 0x38, 0xD9, 0x13, 0xEB, 0xB3, 0x2B, - 0x33, 0x22, 0xBB, 0xD2, 0x70, 0xA9, 0x89, 0x07, 0xA7, 0x33, 0xB6, 0x2D, 0x22, 0x3C, 0x92, 0x15, - 0x20, 0xC9, 0x49, 0x87, 0xFF, 0xAA, 0x78, 0x50, 0x7A, 0xA5, 0x8F, 0x03, 0xF8, 0x59, 0x80, 0x09, - 0x17, 0x1A, 0xDA, 0x65, 0x31, 0xD7, 0xC6, 0x84, 0xB8, 0xD0, 0xC3, 0x82, 0xB0, 0x29, 0x77, 0x5A, - 0x11, 0x1E, 0xCB, 0x7B, 0xFC, 0xA8, 0xD6, 0x6D, 0x3A, 0x2C, 0x00, 0x30, 0x00, 0x31, 0x00, 0x33, - 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3A, 0x00, 0x3B, - 0x00, 0x3C, 0x00, 0x3D, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x3F, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x02, 0x14, - 0x05, 0x32, 0x0B, 0x37, 0x08, 0x50, 0x0B, 0x6E, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x3F, 0x00, - 0x0C, 0x00, 0x30, 0x00, 0x03, 0x00, 0x0F, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x02, 0x00, 0x04, 0x00, - 0x0A, 0x00, 0x0B, 0x00, 0x10, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x63, 0x00, 0x20, 0x00, 0x63, 0x00, 0x63, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x10, - 0x9E, 0x10, 0x56, 0x10, 0x98, 0x10, 0x5C, 0x10, 0x92, 0x10, 0x62, 0x10, 0x8C, 0x10, 0x68, 0x10, - 0x86, 0x10, 0x6E, 0x10, 0x80, 0x10, 0x74, 0x10, 0x7A, 0x10, 0x07, 0x01, 0x00, 0x00, 0x0A, 0x22, - 0x00, 0x04, 0x08, 0x01, 0x00, 0x00, 0x0A, 0x26, 0x00, 0x04, 0x09, 0x01, 0x00, 0x00, 0x0A, 0x2A, - 0x00, 0x04, 0x0A, 0x01, 0x00, 0x00, 0x0A, 0x2E, 0x00, 0x04, 0x0B, 0x01, 0x00, 0x00, 0x10, 0x24, - 0x04, 0x04, 0x0C, 0x01, 0x00, 0x00, 0x10, 0x28, 0x04, 0x04, 0x0D, 0x01, 0x00, 0x00, 0x10, 0x2C, - 0x04, 0x04, 0x0E, 0x01, 0x00, 0x00, 0x10, 0x30, 0x04, 0x04, 0x0F, 0x01, 0x00, 0x00, 0x16, 0x34, - 0x08, 0x04, 0x10, 0x01, 0x00, 0x00, 0x16, 0x38, 0x08, 0x04, 0x11, 0x01, 0x00, 0x00, 0x16, 0x3C, - 0x08, 0x04, 0x12, 0x01, 0x00, 0x00, 0x16, 0x40, 0x08, 0x04, 0x13, 0x01, 0x00, 0x00, 0x17, 0x64, - 0x0C, 0x0B, 0x14, 0x01, 0x00, 0x00, 0x17, 0x68, 0x0C, 0x0B, 0x15, 0x01, 0x00, 0x00, 0x17, 0x6C, - 0x0C, 0x0B, 0x16, 0x01, 0x00, 0x00, 0x17, 0x70, 0x0C, 0x0B, 0x17, 0x01, 0x00, 0x00, 0x17, 0x74, - 0x0C, 0x0B, 0x18, 0x01, 0x00, 0x00, 0x17, 0x78, 0x0C, 0x0B, 0x19, 0x01, 0x00, 0x00, 0x17, 0x7C, - 0x0C, 0x0B, 0x1A, 0x01, 0x00, 0x00, 0x17, 0x80, 0x0C, 0x0B, 0x1B, 0x01, 0x00, 0x00, 0x17, 0x84, - 0x0C, 0x0B, 0x1C, 0x01, 0x00, 0x00, 0x17, 0x88, 0x0C, 0x0B, 0x1D, 0x01, 0x00, 0x00, 0x17, 0x8C, - 0x0C, 0x0B, 0x1E, 0x01, 0x00, 0x00, 0x1D, 0x95, 0x17, 0x04, 0x1F, 0x01, 0x00, 0x00, 0x1D, 0x99, - 0x17, 0x04, 0x20, 0x01, 0x00, 0x00, 0x1D, 0x9D, 0x17, 0x04, 0x21, 0x01, 0x00, 0x00, 0x1D, 0xA1, - 0x17, 0x04, 0x22, 0x01, 0x00, 0x00, 0x0E, 0xA5, 0x00, 0x00, 0xC0, 0x10, 0xE0, 0x10, 0x00, 0x11, - 0x20, 0x11, 0x78, 0x11, 0xC8, 0x10, 0xE8, 0x10, 0x08, 0x11, 0x28, 0x11, 0x80, 0x11, 0xD0, 0x10, - 0xF0, 0x10, 0x10, 0x11, 0x30, 0x11, 0x88, 0x11, 0xD8, 0x10, 0xF8, 0x10, 0x18, 0x11, 0x38, 0x11, - 0x90, 0x11, 0x40, 0x11, 0x48, 0x11, 0x50, 0x11, 0x58, 0x11, 0x60, 0x11, 0x68, 0x11, 0x70, 0x11, - 0x98, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0x14, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1, 0xEB, 0xBA, 0xEB, - 0xDF, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, - 0x57, 0xEB, 0x90, 0xF1, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0xD6, 0xED, - 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, - 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x2F, 0xEE, - 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, - 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0xA4, 0xED, 0xBE, 0xED, - 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x57, 0xEB, 0x7F, 0xF4, 0x19, 0xEC, - 0x2C, 0xEC, 0xDC, 0xEC, 0xE0, 0xEC, 0x57, 0xEB, 0x57, 0xEB, 0x8F, 0xED, 0x84, 0xE3, 0x59, 0xE3, - 0xD7, 0xE3, 0x28, 0xE4, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xEB, 0xF6, 0xEB, 0x72, 0xF0, 0x72, 0xF0, - 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0x89, 0xEE, 0x45, 0xF0, 0x5A, 0x00, 0x02, 0x00, 0xF9, 0xFF, - 0x89, 0xEE, 0x9F, 0xEE, 0xCC, 0x00, 0x02, 0x00, 0xF7, 0xFF, 0x89, 0xEE, 0x9F, 0xEE, 0xB6, 0x1F, - 0x06, 0x00, 0xF0, 0xFF, 0x89, 0xEE, 0x73, 0xEE, 0x00, 0x00, 0x00, 0x02, 0xF6, 0xFF, 0x89, 0xEE, - 0x9F, 0xEE, 0x6C, 0x00, 0x02, 0x00, 0xF4, 0xFF, 0x89, 0xEE, 0x9F, 0xEE, 0x6A, 0x01, 0x02, 0x00, - 0xF5, 0xFF, 0x89, 0xEE, 0x4E, 0xF0, 0xA8, 0x1F, 0x02, 0x00, 0xE0, 0xFF, 0x89, 0xEE, 0x9F, 0xEE, - 0xEE, 0x21, 0x02, 0x00, 0xE1, 0xFF, 0x89, 0xEE, 0x9F, 0xEE, 0xF0, 0x21, 0x02, 0x00, 0xE2, 0xFF, - 0x89, 0xEE, 0x9F, 0xEE, 0xF2, 0x21, 0x02, 0x00, 0xE3, 0xFF, 0x89, 0xEE, 0x9F, 0xEE, 0xEA, 0x21, - 0x02, 0x00, 0x03, 0xFC, 0x89, 0xEE, 0xE5, 0xEF, 0x7C, 0x21, 0x02, 0x00, 0x04, 0xFC, 0x89, 0xEE, - 0x99, 0xEE, 0xBE, 0x1F, 0x22, 0x00, 0x06, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0xA6, 0x1F, 0x02, 0x00, - 0x07, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0x02, 0x20, 0x02, 0x00, 0x0E, 0xFC, 0x89, 0xEE, 0xF7, 0xEF, - 0x0C, 0x20, 0x22, 0x00, 0xB1, 0xFC, 0x89, 0xEE, 0x58, 0xF2, 0x2C, 0x21, 0x02, 0x00, 0x20, 0xFC, - 0x89, 0xEE, 0x9F, 0xEE, 0x32, 0x20, 0x02, 0x00, 0x25, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0x3C, 0x20, - 0x02, 0x00, 0x26, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0x3E, 0x20, 0x02, 0x00, 0x27, 0xFC, 0x89, 0xEE, - 0x9F, 0xEE, 0x40, 0x20, 0x02, 0x00, 0xB2, 0xFC, 0x89, 0xEE, 0x99, 0xEE, 0x50, 0x21, 0x22, 0x00, - 0xC1, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0x98, 0x21, 0x20, 0x00, 0xB0, 0xFC, 0x69, 0xEE, 0x5D, 0xF2, - 0x00, 0x00, 0x00, 0x00, 0xC4, 0xFC, 0x69, 0xEE, 0x68, 0xF0, 0x00, 0x00, 0x08, 0x00, 0xC8, 0xFC, - 0x69, 0xEE, 0x63, 0xF0, 0x00, 0x00, 0x08, 0x00, 0xB4, 0xFC, 0x69, 0xEE, 0x9B, 0xF2, 0x00, 0x00, - 0x00, 0x00, 0xB6, 0xFC, 0x69, 0xEE, 0x4E, 0xF3, 0x00, 0x00, 0x00, 0x00, 0xB7, 0xFC, 0x69, 0xEE, - 0x90, 0xF3, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFC, 0x69, 0xEE, 0xED, 0xF3, 0x00, 0x00, 0x00, 0x00, - 0xB5, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0xE6, 0x21, 0x02, 0x00, 0xB9, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, - 0xE8, 0x21, 0x02, 0x00, 0x90, 0xFD, 0x89, 0xEE, 0x73, 0xEE, 0xEC, 0x21, 0x02, 0x00, 0x23, 0xFC, - 0x89, 0xEE, 0x9F, 0xEE, 0x38, 0x20, 0x02, 0x00, 0x29, 0xFC, 0x48, 0xEF, 0xF5, 0xEE, 0x00, 0x00, - 0x00, 0x00, 0xC2, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0x74, 0x21, 0x02, 0x00, 0x32, 0xFC, 0x89, 0xEE, - 0x9F, 0xEE, 0x60, 0x01, 0x02, 0x00, 0x33, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0x62, 0x01, 0x02, 0x00, - 0x10, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0xAE, 0x1F, 0x02, 0x00, 0x11, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, - 0x46, 0x20, 0x06, 0x00, 0x12, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0x4C, 0x20, 0x06, 0x00, 0x13, 0xFC, - 0x89, 0xEE, 0x9F, 0xEE, 0x52, 0x20, 0x06, 0x00, 0x14, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0x58, 0x20, - 0x06, 0x00, 0x15, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0x5E, 0x20, 0x06, 0x00, 0x16, 0xFC, 0x89, 0xEE, - 0x9F, 0xEE, 0x64, 0x20, 0x06, 0x00, 0x17, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0x2E, 0x20, 0x02, 0x00, - 0x83, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0x6E, 0x01, 0x02, 0x00, 0x97, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, - 0x6C, 0x01, 0x02, 0x00, 0x98, 0xFC, 0x31, 0xF0, 0x1F, 0xF0, 0xE4, 0x00, 0x02, 0x00, 0x99, 0xFC, - 0x31, 0xF0, 0x1F, 0xF0, 0xE4, 0x02, 0x02, 0x00, 0x9A, 0xFC, 0x31, 0xF0, 0x1F, 0xF0, 0xE4, 0x04, - 0x02, 0x00, 0x9B, 0xFC, 0x31, 0xF0, 0x1F, 0xF0, 0xE4, 0x06, 0x02, 0x00, 0x9C, 0xFC, 0x31, 0xF0, - 0x1F, 0xF0, 0xE4, 0x08, 0x02, 0x00, 0x9D, 0xFC, 0x31, 0xF0, 0x1F, 0xF0, 0xE4, 0x0A, 0x02, 0x00, - 0x18, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0x30, 0x20, 0x02, 0x00, 0x22, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, - 0x36, 0x20, 0x02, 0x00, 0x24, 0xFC, 0x89, 0xEE, 0x9F, 0xEE, 0x3A, 0x20, 0x02, 0x00, 0xC0, 0xFC, - 0x69, 0xEE, 0x61, 0xF0, 0x00, 0x00, 0x06, 0x00, 0x9E, 0xFC, 0x89, 0xEE, 0x17, 0xF0, 0x70, 0x01, - 0x02, 0x00, 0x9F, 0xFC, 0x31, 0xF0, 0x1F, 0xF0, 0xE6, 0x00, 0x02, 0x00, 0xA0, 0xFC, 0x31, 0xF0, - 0x1F, 0xF0, 0xE6, 0x02, 0x02, 0x00, 0xA1, 0xFC, 0x31, 0xF0, 0x1F, 0xF0, 0xE6, 0x04, 0x02, 0x00, - 0xA2, 0xFC, 0x31, 0xF0, 0x1F, 0xF0, 0xE6, 0x06, 0x02, 0x00, 0xA3, 0xFC, 0x31, 0xF0, 0x1F, 0xF0, - 0xE6, 0x08, 0x02, 0x00, 0xA4, 0xFC, 0x31, 0xF0, 0x1F, 0xF0, 0xE6, 0x0A, 0x02, 0x00, 0x20, 0xFD, - 0xBA, 0xEE, 0x73, 0xEE, 0x53, 0xF5, 0x08, 0x00, 0x21, 0xFD, 0xBA, 0xEE, 0x73, 0xEE, 0x57, 0xF5, - 0x0A, 0x00, 0x22, 0xFD, 0xBA, 0xEE, 0x73, 0xEE, 0x5C, 0xF5, 0x16, 0x00, 0x23, 0xFD, 0xBA, 0xEE, - 0x73, 0xEE, 0x67, 0xF5, 0x0A, 0x00, 0x10, 0xFD, 0x89, 0xEE, 0x73, 0xEE, 0x34, 0x01, 0x02, 0x00, - 0x45, 0xFD, 0x89, 0xEE, 0x73, 0xEE, 0xCC, 0x00, 0x02, 0x00, 0x47, 0xFD, 0x89, 0xEE, 0x73, 0xEE, - 0x38, 0x01, 0x02, 0x00, 0x48, 0xFD, 0x9E, 0xEF, 0x73, 0xEE, 0x60, 0x01, 0x02, 0x00, 0x49, 0xFD, - 0x9E, 0xEF, 0x73, 0xEE, 0x62, 0x01, 0x02, 0x00, 0x4A, 0xFD, 0x89, 0xEE, 0x73, 0xEE, 0x58, 0x01, - 0x02, 0x00, 0x4B, 0xFD, 0x89, 0xEE, 0x73, 0xEE, 0x5A, 0x01, 0x02, 0x00, 0x4D, 0xFD, 0xBA, 0xEE, - 0x73, 0xEE, 0x6C, 0xF5, 0x04, 0x00, 0x4F, 0xFD, 0xB2, 0xEF, 0x73, 0xEE, 0x80, 0x21, 0x02, 0x00, - 0xC0, 0xFD, 0xBA, 0xEE, 0x73, 0xEE, 0x6E, 0xF5, 0x02, 0x00, 0xC2, 0xFD, 0xA8, 0xEF, 0x73, 0xEE, - 0x00, 0x00, 0x02, 0x00, 0xC3, 0xFD, 0xBA, 0xEE, 0x73, 0xEE, 0x6F, 0xF5, 0x02, 0x00, 0x40, 0xFD, - 0xB2, 0xEE, 0x73, 0xEE, 0x78, 0x01, 0x02, 0x00, 0x24, 0xFD, 0xD8, 0xEF, 0x73, 0xEE, 0x00, 0x00, - 0x02, 0x00, 0x91, 0xFD, 0x89, 0xEE, 0x73, 0xEE, 0x86, 0x1B, 0x02, 0x00, 0x93, 0xFD, 0x89, 0xEE, - 0x73, 0xEE, 0x8C, 0x1B, 0x02, 0x00, 0xC1, 0xFD, 0x89, 0xEE, 0x73, 0xEE, 0xCA, 0x00, 0x02, 0x00, - 0xC6, 0xFD, 0xE7, 0xEE, 0x73, 0xEE, 0x8E, 0x21, 0x0A, 0x00, 0x89, 0xFD, 0x5F, 0xEF, 0x73, 0xEE, - 0x00, 0x00, 0x00, 0x00, 0x8A, 0xFD, 0xD7, 0xEE, 0x73, 0xEE, 0xC0, 0x21, 0x24, 0x00, 0x46, 0xFD, - 0x89, 0xEE, 0x73, 0xEE, 0x7A, 0x01, 0x06, 0x00, 0x86, 0xFD, 0x89, 0xEE, 0x73, 0xEE, 0xB6, 0x1F, - 0x06, 0x00, 0x87, 0xFD, 0x89, 0xEE, 0x73, 0xEE, 0xB8, 0x21, 0x06, 0x00, 0x8B, 0xFD, 0x7A, 0xF3, - 0x73, 0xEE, 0x00, 0x00, 0x12, 0x00, 0x8E, 0xFD, 0x89, 0xEE, 0x73, 0xEE, 0xB8, 0x12, 0x02, 0x00, - 0x80, 0xFD, 0xBC, 0xEF, 0x73, 0xEE, 0x1C, 0x00, 0x02, 0x00, 0x81, 0xFD, 0xBC, 0xEF, 0x73, 0xEE, - 0x1C, 0x02, 0x02, 0x00, 0x82, 0xFD, 0xBC, 0xEF, 0x73, 0xEE, 0x1C, 0x04, 0x02, 0x00, 0x83, 0xFD, - 0xBC, 0xEF, 0x73, 0xEE, 0x1C, 0x06, 0x02, 0x00, 0x84, 0xFD, 0xBC, 0xEF, 0x73, 0xEE, 0x1C, 0x08, - 0x02, 0x00, 0x85, 0xFD, 0xBC, 0xEF, 0x73, 0xEE, 0x1C, 0x0A, 0x02, 0x00, 0x00, 0xF1, 0x46, 0x00, - 0x2D, 0xEE, 0xF8, 0x00, 0x00, 0x03, 0x8A, 0xEA, 0x1F, 0x00, 0x36, 0x01, 0xCA, 0x00, 0x96, 0x01, - 0xCE, 0x00, 0xFC, 0x00, 0x78, 0x01, 0xDA, 0x1E, 0x1A, 0x01, 0x86, 0x1B, 0xC8, 0x00, 0x00, 0x00, - 0xCE, 0x12, 0x00, 0x00, 0xD2, 0x14, 0x14, 0x01, 0x03, 0x00, 0xAE, 0x00, 0xE4, 0x00, 0x3C, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x77, 0xB4, 0xEA, 0xB3, 0x26, 0xB5, 0x2F, 0xB5, 0xFB, 0xB3, 0xA4, 0xB4, 0x69, 0xB4, 0xE7, 0xC5, - 0x4A, 0xC5, 0xE7, 0xC5, 0xBE, 0xC5, 0x54, 0xC5, 0x48, 0xC5, 0x06, 0xC6, 0x17, 0xC6, 0x17, 0xC6, - 0x17, 0xC6, 0x20, 0xC6, 0x3B, 0xC6, 0x98, 0xC6, 0xB4, 0xC6, 0xBF, 0xC5, 0xD2, 0xC5, 0xA6, 0xC5, - 0x10, 0x00, 0x12, 0x00, 0x13, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x30, 0x00, 0x31, 0x00, - 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, - 0x3A, 0x00, 0x00, 0x00, 0x14, 0x01, 0x14, 0x01, 0x14, 0x01, 0x14, 0x01, 0x14, 0x01, 0x14, 0x01, - 0x14, 0x01, 0x14, 0x01, 0xF3, 0x02, 0xAD, 0x03, 0x60, 0x04, 0x04, 0x05, 0x07, 0x06, 0x08, 0x07, - 0x0A, 0x08, 0x16, 0x09, 0x44, 0x0A, 0x04, 0x0B, 0x40, 0x0C, 0x80, 0x0D, 0x00, 0x0E, 0x84, 0x0F, - 0x01, 0x10, 0x10, 0x11, 0x02, 0x14, 0x40, 0x20, 0x32, 0x21, 0x32, 0x22, 0x04, 0x23, 0x01, 0x24, - 0x0F, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2A, 0x01, 0x2B, 0x06, 0x2C, - 0x00, 0x38, 0x00, 0x39, 0xD6, 0x3A, 0x00, 0x3B, 0x00, 0x3C, 0x14, 0x3D, 0x7F, 0x3E, 0x00, 0x3F, - 0x68, 0x40, 0x75, 0x41, 0x07, 0x42, 0x07, 0x43, 0x00, 0x45, 0x3B, 0x4A, 0x00, 0x4B, 0x00, 0x4C, - 0x0F, 0x4D, 0x02, 0x75, 0x00, 0x76, 0x80, 0x00, 0x08, 0x01, 0x09, 0x01, 0x09, 0x01, 0x0A, 0x01, - 0x0A, 0x01, 0x0B, 0x01, 0x0B, 0x01, 0x0C, 0x01, 0x0C, 0x01, 0x0D, 0x01, 0x0D, 0x01, 0x0E, 0x01, - 0x0E, 0x01, 0x0F, 0x01, 0x0F, 0x01, 0x10, 0x01, 0x10, 0x01, 0x11, 0x01, 0x11, 0x01, 0x12, 0x01, - 0x12, 0x01, 0x13, 0x01, 0x13, 0x01, 0x14, 0x01, 0x14, 0x01, 0x15, 0x01, 0x15, 0x01, 0x16, 0x01, - 0x16, 0x01, 0x17, 0x01, 0x17, 0x01, 0x18, 0x01, 0x18, 0x01, 0x19, 0x01, 0x19, 0x01, 0x4D, 0x01, - 0x4D, 0x01, 0x4E, 0x01, 0x4E, 0x01, 0x4F, 0x01, 0x4F, 0x01, 0x50, 0x01, 0x50, 0x01, 0x51, 0x01, - 0x51, 0x01, 0x52, 0x01, 0x52, 0x01, 0x53, 0x01, 0x53, 0x01, 0x54, 0x01, 0x54, 0x01, 0x65, 0x01, - 0x65, 0x01, 0x66, 0x01, 0x66, 0x01, 0x67, 0x01, 0x67, 0x01, 0x68, 0x01, 0x68, 0x01, 0x69, 0x01, - 0x69, 0x01, 0x6A, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x6B, 0x01, 0x6C, 0x01, 0x6C, 0x01, 0x6D, 0x01, - 0x6D, 0x01, 0x6E, 0x01, 0x6E, 0x01, 0x6F, 0x01, 0x6F, 0x01, 0x70, 0x01, 0x70, 0x01, 0x71, 0x01, - 0x71, 0x01, 0x72, 0x01, 0x72, 0x01, 0x73, 0x01, 0x73, 0x01, 0x74, 0x01, 0x74, 0x01, 0x75, 0x01, - 0x75, 0x01, 0x76, 0x01, 0x76, 0x01, 0x77, 0x01, 0x77, 0x01, 0x78, 0x01, 0x78, 0x01, 0x79, 0x01, - 0x79, 0x01, 0x7A, 0x01, 0x7A, 0x01, 0x7B, 0x01, 0x7B, 0x01, 0x7C, 0x01, 0x7C, 0x01, 0x7D, 0x01, - 0x7D, 0x01, 0x7E, 0x01, 0x7E, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, - 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, - 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, - 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, - 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, - 0x80, 0x12, 0x80, 0x12, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, - 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, - 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, - 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x22, 0x46, 0x22, 0x46, - 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, - 0x22, 0x46, 0x23, 0x46, 0x23, 0x46, 0x23, 0x46, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, - 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, - 0x1C, 0x47, 0x1D, 0x47, 0x9A, 0x48, 0xDA, 0x48, 0x1A, 0x48, 0x5A, 0x48, 0x9A, 0x48, 0xDA, 0x48, - 0x1A, 0x48, 0x5A, 0x48, 0x9A, 0x48, 0xDA, 0x48, 0x1A, 0x48, 0x5A, 0x48, 0x9A, 0x48, 0x33, 0x48, - 0x78, 0x49, 0x78, 0x49, 0x79, 0x49, 0x79, 0x49, 0x79, 0x49, 0x79, 0x49, 0x7A, 0x49, 0x7A, 0x49, - 0x7A, 0x49, 0x7A, 0x49, 0x7B, 0x49, 0x7B, 0x49, 0x7B, 0x49, 0x7C, 0x49, 0x32, 0x00, 0x46, 0x00, - 0x5A, 0x00, 0x6E, 0x00, 0x82, 0x00, 0x96, 0x00, 0xAA, 0x00, 0xBE, 0x00, 0xD2, 0x00, 0xE6, 0x00, - 0xFA, 0x00, 0x0E, 0x01, 0x22, 0x01, 0x52, 0x01, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, - 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 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, 0x03, 0x00, 0x15, 0x00, 0x6E, 0x6F, 0x6E, 0x2D, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x53, 0x53, 0x49, 0x44, 0x20, 0x21, 0x21, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x00, 0x00, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x09, 0x00, 0x00, - 0x01, 0x00, 0x64, 0x00, 0x64, 0x00, 0x00, 0x00, 0x48, 0x45, 0x52, 0x4D, 0x45, 0x53, 0x20, 0x32, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x15, 0x00, 0x6E, 0x6F, 0x6E, 0x2D, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x53, 0x53, 0x49, 0x44, 0x20, 0x21, 0x21, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x00, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x09, 0x00, 0x00, - 0x01, 0x00, 0x64, 0x00, 0x64, 0x00, 0x00, 0x00, 0x48, 0x45, 0x52, 0x4D, 0x45, 0x53, 0x20, 0x32, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x69, 0x72, 0x73, 0x74, 0x20, - 0x57, 0x61, 0x76, 0x65, 0x4C, 0x41, 0x4E, 0x20, 0x49, 0x49, 0x20, 0x53, 0x53, 0x49, 0x44, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x02, 0x01, 0x82, 0x84, 0x8B, 0x96, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xDD, 0x00, 0x50, 0xF2, 0x01, - 0x01, 0x00, 0x00, 0x50, 0xF2, 0x05, 0x02, 0x00, 0x00, 0x50, 0xF2, 0x02, 0x00, 0x50, 0xF2, 0x04, - 0x02, 0x00, 0x00, 0x50, 0xF2, 0x00, 0x00, 0x50, 0xF2, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00, - 0x15, 0x00, 0x02, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x04, 0x00, 0x15, 0x00, 0x20, 0x00, 0x11, 0x00, 0x20, 0x00, 0x1E, 0x1F, 0x8E, 0x21, - 0x00, 0x23, 0xDA, 0x22, 0x04, 0x23, 0xC0, 0x21, 0xFF, 0xFF, 0xFF, 0xFF, 0x34, 0x23, 0x00, 0x00, - 0x50, 0x21, 0x8E, 0x21, 0xFF, 0xFF, 0x00, 0x00, 0x1E, 0x1F, 0x8E, 0x21, 0x00, 0x23, 0xFF, 0xFF, - 0x04, 0x23, 0xC0, 0x21, 0xFF, 0xFF, 0xFF, 0xFF, 0x34, 0x23, 0x00, 0x00, 0x8E, 0x21, 0x3C, 0x23, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00, 0x06, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, - 0x00, 0x60, 0x1D, 0x00, 0x00, 0x00, 0x0D, 0x81, 0x00, 0x60, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, - -}; /* fw_image_2_data */ - -static const hcf_8 fw_image_3_data[] = { - 0x3F, 0x41, 0xA5, 0x4C, 0x50, 0x37, 0x04, 0x00, 0x01, 0xB9, 0x41, 0x5F, 0xB5, 0x60, 0x55, 0xE0, - 0x0C, 0x60, 0x10, 0x62, 0xA2, 0xD3, 0x01, 0x60, 0x01, 0x65, 0xD4, 0x80, 0x5A, 0xD1, 0x0F, 0x02, - 0x5A, 0xD3, 0x3E, 0x60, 0x00, 0x66, 0xE0, 0x87, 0x40, 0x4A, 0xEA, 0x60, 0x88, 0x61, 0x64, 0x44, - 0xC8, 0x84, 0x0C, 0x63, 0xAA, 0x46, 0x58, 0xD0, 0xAA, 0x46, 0x59, 0xD8, 0xFB, 0x1F, 0x08, 0x60, - 0x00, 0x63, 0xFA, 0x60, 0x00, 0x65, 0xBD, 0xD3, 0xA3, 0xD3, 0x02, 0xA8, 0xD4, 0x80, 0x61, 0x02, - 0x60, 0x02, 0x26, 0x60, 0x6A, 0x61, 0x3C, 0x60, 0x00, 0x66, 0x41, 0x4B, 0x2B, 0x41, 0x26, 0x60, - 0xB2, 0x7C, 0xD1, 0x80, 0xA1, 0xD2, 0x25, 0x05, 0x59, 0xD0, 0x60, 0x45, 0x59, 0xD2, 0x44, 0x47, - 0xE0, 0x87, 0x40, 0x4A, 0x59, 0xD2, 0x59, 0x8B, 0x40, 0x4C, 0x08, 0x60, 0x00, 0x63, 0xBE, 0xD3, - 0xBD, 0xD1, 0xEC, 0x18, 0xD4, 0x80, 0xEA, 0x18, 0x03, 0x03, 0xC3, 0x83, 0xC3, 0x83, 0xF7, 0x01, - 0x67, 0x44, 0xC0, 0x84, 0xE0, 0x85, 0x2C, 0x44, 0xD4, 0x80, 0x63, 0x41, 0x01, 0x06, 0x65, 0x44, - 0xC8, 0x83, 0xAA, 0x46, 0x59, 0xD1, 0x27, 0xD8, 0x5A, 0x87, 0xFC, 0x1F, 0xAA, 0x46, 0x2B, 0x41, - 0xD5, 0x01, 0x26, 0x60, 0xB2, 0x61, 0x41, 0x4B, 0x2B, 0x41, 0x26, 0x60, 0xEA, 0x7C, 0xD1, 0x80, - 0xA1, 0xD2, 0x27, 0x05, 0x59, 0xD0, 0x60, 0x45, 0x59, 0xD2, 0x44, 0x47, 0xE0, 0x87, 0x40, 0x4A, - 0x59, 0xD2, 0x59, 0x8B, 0x40, 0x4C, 0x08, 0x60, 0x00, 0x63, 0xBE, 0xD3, 0xBD, 0xD1, 0xEC, 0x18, - 0xD4, 0x80, 0xEA, 0x18, 0x03, 0x03, 0xC3, 0x83, 0xC3, 0x83, 0xF7, 0x01, 0x04, 0xA3, 0xA3, 0xD1, - 0x5A, 0x88, 0x2C, 0x43, 0xD3, 0x80, 0xFF, 0xFF, 0x01, 0x06, 0x64, 0x43, 0xCF, 0x83, 0xAA, 0x46, - 0x60, 0xFE, 0x28, 0xD1, 0x5E, 0x88, 0x27, 0xD8, 0x5A, 0x87, 0xFB, 0x1F, 0x20, 0xFE, 0xAA, 0x46, - 0xD3, 0x01, 0xB8, 0xFE, 0xB9, 0xFE, 0xBA, 0xFE, 0xBB, 0xFE, 0xBD, 0xFE, 0xBF, 0xFE, 0x21, 0x60, - 0x80, 0x62, 0xA2, 0xD3, 0x12, 0x63, 0x60, 0x40, 0x01, 0x27, 0x05, 0x00, 0x0B, 0x60, 0xEA, 0x62, - 0x00, 0x64, 0x5A, 0xDB, 0xFE, 0x1F, 0xA2, 0x60, 0x49, 0x78, 0xFF, 0xFF, 0xF1, 0xFF, 0x94, 0x48, - 0x1F, 0x00, 0x04, 0x00, 0xF2, 0xFF, 0x98, 0x48, 0x1F, 0x00, 0x04, 0x00, 0xFB, 0xFF, 0xA0, 0x48, - 0x1F, 0x00, 0x04, 0x00, 0xF1, 0xFF, 0xF2, 0x4D, 0x1F, 0x00, 0x04, 0x00, 0xF2, 0xFF, 0xF6, 0x4D, - 0x1F, 0x00, 0x04, 0x00, 0xFB, 0xFF, 0xFE, 0x4D, 0x1F, 0x00, 0x04, 0x00, 0x86, 0xFD, 0xB6, 0x1F, - 0x00, 0x00, 0x06, 0x00, 0x10, 0xFD, 0x34, 0x01, 0x00, 0x00, 0x02, 0x00, 0x14, 0xFD, 0x7E, 0x21, - 0x00, 0x00, 0x0A, 0x00, 0x20, 0xFA, 0xFA, 0x1D, 0x00, 0x00, 0x0E, 0x00, 0x21, 0xFA, 0xDE, 0x1D, - 0x00, 0x00, 0x0E, 0x00, 0x22, 0xFA, 0x16, 0x1E, 0x00, 0x00, 0x0E, 0x00, 0x23, 0xFA, 0xCA, 0x1C, - 0x00, 0x00, 0x01, 0x00, 0x24, 0xFA, 0xBE, 0x1E, 0x00, 0x00, 0x0E, 0x00, 0x25, 0xFA, 0xDE, 0x1C, - 0x00, 0x00, 0x80, 0x00, 0x26, 0xFA, 0xC4, 0x1C, 0x00, 0x00, 0x01, 0x00, - -}; /* fw_image_3_data */ - -static const hcf_8 fw_image_4_data[] = { - 0xA6, 0x60, 0x25, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA6, 0x60, 0x0B, 0x78, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA6, 0x60, 0x11, 0x78, 0xC4, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA5, 0x60, 0x61, 0x78, 0x43, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x44, 0xFF, 0x20, 0x54, 0xCD, 0xE2, 0xA6, 0x60, 0x23, 0x78, 0x08, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA6, 0x60, 0x25, 0x78, 0x44, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA6, 0x60, 0x25, 0x78, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA6, 0x60, 0x25, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAC, 0x60, 0x81, 0x78, 0x4C, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAC, 0x60, 0x18, 0x78, 0x4C, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC4, 0xE2, 0x84, 0xFF, 0x22, 0x58, 0x82, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA7, 0x60, 0xC4, 0x78, 0x43, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xE4, 0xE2, 0xAC, 0x60, 0x31, 0x78, 0x95, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBF, 0x60, 0x76, 0x78, 0x64, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAC, 0x60, 0x8C, 0x78, 0xA4, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAC, 0x60, 0x72, 0x78, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB2, 0x60, 0xD1, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB2, 0x60, 0xFE, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB1, 0x60, 0x90, 0x78, 0x42, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB1, 0x60, 0xC0, 0x78, 0x43, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB1, 0x60, 0xC0, 0x78, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB4, 0x60, 0x73, 0x78, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB1, 0x60, 0xC3, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x60, 0x83, 0x64, 0x80, 0x29, 0x09, 0xFB, 0xB2, 0x60, 0x99, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC0, 0x60, 0x29, 0x78, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBF, 0x60, 0xB4, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBE, 0x60, 0x78, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBD, 0x60, 0xE8, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB5, 0x60, 0x96, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA1, 0xFF, 0xFF, 0xFF, 0x83, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC0, 0x60, 0x9F, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0x42, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xB0, 0xFF, 0xB1, 0xFF, 0x40, 0xFF, 0x43, 0xFF, 0xC0, 0x60, 0x9A, 0x78, 0x44, 0xFF, 0xFF, 0x01, - 0xC0, 0x60, 0x9F, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xC6, 0x60, 0x66, 0x78, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xC0, 0x60, 0x9A, 0x78, 0x84, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xC0, 0x60, 0x99, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xC7, 0x60, 0x26, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xE5, 0x60, 0x0E, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC7, 0x60, 0x2E, 0x78, 0x42, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC7, 0x60, 0x2E, 0x78, 0x24, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xE3, 0x60, 0x45, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC7, 0x60, 0x2E, 0x78, 0x44, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC7, 0x60, 0x2E, 0x78, 0x84, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC7, 0x60, 0x2E, 0x78, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEB, 0x60, 0x5B, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEB, 0x60, 0x87, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEB, 0x60, 0xA0, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEB, 0x60, 0x84, 0x78, 0x28, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEB, 0x60, 0x84, 0x78, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEB, 0x60, 0x84, 0x78, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEB, 0x60, 0x84, 0x78, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x60, 0x87, 0x64, 0x80, 0x29, 0x09, 0xFB, 0x47, 0xFF, 0xEB, 0x60, 0x84, 0x78, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x87, 0xF3, 0x88, 0xF3, 0xDC, 0x81, 0x00, 0x7C, 0x01, 0x00, 0x00, 0xFA, 0x60, 0x46, 0xFE, 0x63, - 0xA3, 0xD8, 0xFE, 0x1F, 0xCD, 0x81, 0xD8, 0x84, 0xF8, 0x02, 0x87, 0xF3, 0x88, 0xF5, 0xDC, 0x81, - 0x80, 0x67, 0x40, 0x4A, 0x14, 0x60, 0x02, 0x65, 0x01, 0x7C, 0x07, 0x18, 0x2A, 0x43, 0x02, 0xFC, - 0x5F, 0x8A, 0x8E, 0xF8, 0x70, 0xF8, 0x00, 0xF4, 0xF8, 0x01, 0x2E, 0x58, 0xFF, 0xFF, 0x89, 0xF5, - 0x06, 0x64, 0x66, 0x43, 0x00, 0x7C, 0x63, 0x46, 0xFE, 0x63, 0xA3, 0xD8, 0xFE, 0x1F, 0xCC, 0x84, - 0x66, 0x43, 0xDB, 0x83, 0xF8, 0x02, 0x14, 0x60, 0x02, 0x65, 0x09, 0x60, 0x2B, 0x7C, 0x89, 0xF3, - 0x06, 0x61, 0x60, 0x46, 0x01, 0x63, 0x72, 0xF8, 0x00, 0xFC, 0x63, 0x47, 0x06, 0xFA, 0x72, 0xF8, - 0x8E, 0xF8, 0xDF, 0x83, 0x66, 0x44, 0xCD, 0x81, 0x02, 0xA6, 0xF5, 0x02, 0x89, 0xF3, 0x06, 0x61, - 0x60, 0x46, 0x03, 0x7C, 0x73, 0xF8, 0x66, 0x44, 0xCD, 0x81, 0x02, 0xA6, 0xFB, 0x02, 0x2E, 0x58, - 0xFF, 0xFF, 0x3F, 0x40, 0x40, 0x26, 0x0A, 0x00, 0x42, 0x60, 0x09, 0xE0, 0x3F, 0x40, 0x01, 0x2A, - 0x03, 0x00, 0x60, 0x60, 0x1C, 0xE0, 0x02, 0x00, 0x80, 0x60, 0x1C, 0xE0, 0x40, 0xEC, 0x00, 0xED, - 0x02, 0xEE, 0x80, 0x60, 0x58, 0xEC, 0x80, 0x60, 0x00, 0xED, 0x80, 0x60, 0x82, 0xEE, 0xC0, 0x60, - 0x59, 0xEC, 0xC0, 0x60, 0x07, 0xED, 0xAD, 0x4F, 0xFE, 0xB4, 0xA0, 0x5D, 0x00, 0xF3, 0x28, 0xFB, - 0x40, 0x44, 0xA4, 0x60, 0x5D, 0x7C, 0x20, 0xF9, 0xA5, 0x60, 0x48, 0x7C, 0x21, 0xF9, 0xA7, 0x60, - 0x30, 0x7C, 0x22, 0xF9, 0xB0, 0x60, 0xCD, 0x7C, 0x23, 0xF9, 0xB5, 0x60, 0x6C, 0x7C, 0x24, 0xF9, - 0xC0, 0x60, 0x88, 0x7C, 0x25, 0xF9, 0xC6, 0x60, 0xE0, 0x7C, 0x26, 0xF9, 0x91, 0x60, 0x00, 0xE8, - 0x28, 0xE8, 0x44, 0x60, 0x02, 0xE6, 0x00, 0x64, 0x40, 0x52, 0x10, 0x60, 0x04, 0xE6, 0x08, 0x60, - 0x00, 0x63, 0xFA, 0x60, 0x00, 0x65, 0xBD, 0xD3, 0xBD, 0xD3, 0x02, 0xA8, 0xD4, 0x80, 0x47, 0x02, - 0x46, 0x02, 0xDB, 0x83, 0xFA, 0x60, 0x27, 0x65, 0x5B, 0xD3, 0xBF, 0xD1, 0x1A, 0x18, 0xC3, 0x83, - 0xD4, 0x80, 0xC3, 0x83, 0xF9, 0x02, 0xDB, 0x83, 0xD3, 0x83, 0xD3, 0x86, 0x64, 0x41, 0xCD, 0x81, - 0xA6, 0xD1, 0xDA, 0x86, 0x1C, 0x60, 0x68, 0x65, 0x00, 0x60, 0x72, 0x63, 0xA5, 0xD3, 0xDA, 0x85, - 0x90, 0x84, 0xFF, 0x27, 0x02, 0x00, 0xA2, 0xD9, 0x01, 0x00, 0xF8, 0x1F, 0xCD, 0x81, 0xFF, 0xFF, - 0xEF, 0x02, 0x08, 0x60, 0x06, 0x63, 0xFA, 0x60, 0x28, 0x65, 0x5B, 0xD3, 0xBF, 0xD1, 0x0B, 0x18, - 0xC3, 0x83, 0xD4, 0x80, 0xC3, 0x83, 0xF9, 0x02, 0xBF, 0xD3, 0x21, 0x60, 0x72, 0x62, 0x0E, 0xB4, - 0xE0, 0x84, 0xE0, 0x84, 0xA2, 0xDB, 0x08, 0x60, 0x06, 0x63, 0xFD, 0x60, 0x0C, 0x65, 0x5B, 0xD3, - 0xBF, 0xD1, 0x0D, 0x18, 0xC3, 0x83, 0xD4, 0x80, 0xC3, 0x83, 0xF9, 0x02, 0xFA, 0xA3, 0xA3, 0xD3, - 0x02, 0x60, 0x00, 0x65, 0xF7, 0xA0, 0xFC, 0xA0, 0x0A, 0x05, 0x01, 0x05, 0x00, 0x00, 0x21, 0x60, - 0x00, 0x65, 0x3F, 0x43, 0x3F, 0x43, 0x21, 0x60, 0x00, 0x65, 0xC0, 0x60, 0x8F, 0xEE, 0xB7, 0x84, - 0x40, 0x5F, 0x00, 0x60, 0x30, 0xE2, 0x00, 0x60, 0x50, 0xE2, 0x00, 0x60, 0x79, 0xE2, 0x00, 0x60, - 0x90, 0xE2, 0x01, 0x60, 0xD0, 0xE2, 0x01, 0x60, 0xF0, 0xE2, 0x01, 0x60, 0xB0, 0xE2, 0x26, 0x64, - 0x35, 0xFB, 0x01, 0x60, 0x30, 0x64, 0x0A, 0xA4, 0x38, 0xFB, 0x60, 0x45, 0x00, 0x60, 0xF8, 0x64, - 0x0A, 0xA4, 0x39, 0xFB, 0x35, 0xF1, 0x0A, 0x64, 0xC4, 0x84, 0x36, 0xFB, 0xC0, 0x84, 0x0A, 0xA4, - 0x37, 0xFB, 0x09, 0x60, 0x2A, 0x64, 0x99, 0xFB, 0x82, 0xFF, 0x92, 0xFF, 0x5C, 0x41, 0x5C, 0x46, - 0x5C, 0x47, 0x00, 0xE1, 0xA7, 0x60, 0x9B, 0x63, 0x0C, 0x60, 0x16, 0x64, 0xA0, 0xDD, 0x87, 0xFF, - 0x97, 0xFF, 0x0C, 0x60, 0x02, 0x64, 0x40, 0x5A, 0x06, 0xA4, 0x40, 0x5B, 0x5C, 0x5E, 0x5C, 0x51, - 0x1F, 0x60, 0xAA, 0x62, 0xA2, 0xD3, 0x65, 0xFB, 0x21, 0x60, 0xEC, 0x61, 0x27, 0x7C, 0xA1, 0xD9, - 0x25, 0x60, 0x2E, 0x63, 0x7F, 0xA3, 0xE3, 0x87, 0x00, 0x7F, 0x8A, 0xFB, 0x02, 0x60, 0x80, 0x66, - 0x22, 0x60, 0x22, 0x64, 0x77, 0x60, 0x77, 0x63, 0x00, 0xFA, 0x01, 0xFC, 0x00, 0xF0, 0x01, 0xF0, - 0xD0, 0x80, 0xD3, 0x80, 0x1E, 0x02, 0x1D, 0x02, 0x06, 0x60, 0x80, 0x65, 0x45, 0x4A, 0xAA, 0x46, - 0x00, 0xFC, 0x01, 0xFA, 0xAA, 0x46, 0x00, 0xF0, 0x2A, 0x41, 0x50, 0x65, 0xD3, 0x80, 0xCD, 0x84, - 0x13, 0x03, 0x0A, 0x60, 0x80, 0x65, 0x45, 0x4A, 0xAA, 0x46, 0x00, 0xFC, 0x01, 0xFA, 0xAA, 0x46, - 0x00, 0xF0, 0x65, 0x41, 0xC8, 0x65, 0xD3, 0x80, 0xCD, 0x84, 0x06, 0x03, 0x12, 0x60, 0x7F, 0x64, - 0x03, 0x00, 0x10, 0x65, 0x02, 0x60, 0x7F, 0x64, 0x65, 0x43, 0x87, 0xFD, 0x1B, 0x60, 0x72, 0x62, - 0xA2, 0xDD, 0x07, 0x61, 0xC5, 0x81, 0xE1, 0x85, 0xD4, 0x84, 0x8B, 0xFB, 0xDC, 0x84, 0x89, 0xFB, - 0x0C, 0xA4, 0x88, 0xFB, 0x1B, 0x60, 0x74, 0x62, 0xA2, 0xDB, 0xA2, 0x60, 0x58, 0x4E, 0x1F, 0x78, - 0xFF, 0xFF, 0xA2, 0x60, 0x58, 0x4E, 0x00, 0x78, 0xFF, 0xFF, 0x8B, 0xF1, 0x8A, 0xF3, 0x7C, 0x63, - 0x8D, 0xFB, 0x60, 0x46, 0x01, 0xFC, 0xDC, 0x84, 0xD0, 0x80, 0x00, 0xFA, 0xFA, 0x04, 0x8E, 0xFB, - 0x60, 0x46, 0x00, 0x64, 0x00, 0xFA, 0x63, 0x44, 0x80, 0x7F, 0x01, 0xFA, 0x8B, 0xF3, 0x8A, 0xF1, - 0xDC, 0x84, 0xD0, 0x84, 0x8C, 0xFB, 0x03, 0x60, 0x26, 0x61, 0xB3, 0x60, 0x58, 0x4D, 0x64, 0x78, - 0xFF, 0xFF, 0x66, 0x44, 0x2E, 0xFB, 0x82, 0xFF, 0x40, 0x42, 0x87, 0xFF, 0x8C, 0xF3, 0x94, 0xFB, - 0x00, 0x64, 0x12, 0x60, 0xC8, 0x63, 0xA3, 0xDB, 0x00, 0x64, 0x40, 0x50, 0x63, 0xFF, 0x66, 0xFF, - 0x65, 0xFF, 0x64, 0xFF, 0x61, 0xFF, 0x62, 0xFF, 0x49, 0x60, 0x02, 0xE1, 0x52, 0x60, 0x02, 0xE1, - 0x5B, 0x60, 0x02, 0xE1, 0x65, 0x60, 0x02, 0xE1, 0x6C, 0x60, 0x02, 0xE1, 0x76, 0x60, 0x02, 0xE1, - 0x41, 0x60, 0x02, 0xE1, 0x04, 0x65, 0x21, 0x60, 0x7E, 0x64, 0x44, 0xD3, 0xEA, 0x60, 0x58, 0x4E, - 0x78, 0x78, 0xFF, 0xFF, 0x1C, 0x60, 0x04, 0x65, 0x0C, 0x64, 0xA5, 0xDB, 0xA3, 0x60, 0xED, 0x64, - 0x80, 0xFB, 0x2D, 0xFF, 0x0A, 0x61, 0x41, 0x4B, 0x09, 0x60, 0x08, 0x61, 0xB3, 0x60, 0x58, 0x4D, - 0x64, 0x78, 0xFF, 0xFF, 0xF0, 0x67, 0x0E, 0xFA, 0x1B, 0x60, 0xE0, 0x62, 0x1B, 0x60, 0xC4, 0x64, - 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x2B, 0x41, - 0x4D, 0x8B, 0xFF, 0xFF, 0xE9, 0x02, 0x0A, 0x61, 0x41, 0x4B, 0x09, 0x60, 0x08, 0x61, 0xB3, 0x60, - 0x58, 0x4D, 0x64, 0x78, 0xFF, 0xFF, 0x1B, 0x60, 0xE0, 0x62, 0x1B, 0x60, 0xB8, 0x64, 0xA2, 0xDB, - 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x2B, 0x41, 0x4D, 0x8B, - 0xFF, 0xFF, 0xEB, 0x02, 0xEB, 0x60, 0x4E, 0x78, 0xFF, 0xFF, 0x00, 0xEA, 0x00, 0xEB, 0x50, 0x60, - 0x03, 0xEA, 0x51, 0x60, 0x13, 0xEA, 0x52, 0x60, 0x30, 0xEA, 0x53, 0x60, 0x40, 0xEA, 0x54, 0x60, - 0x52, 0xEA, 0x55, 0x60, 0x6D, 0xEA, 0x56, 0x60, 0x71, 0xEA, 0x57, 0x60, 0x8B, 0xEA, 0x58, 0x60, - 0x47, 0xEA, 0x59, 0x60, 0xA0, 0xEA, 0x5A, 0x60, 0xB2, 0xEA, 0x5B, 0x60, 0xC1, 0xEA, 0x5C, 0x60, - 0xD7, 0xEA, 0x5D, 0x60, 0xEB, 0xEA, 0x5E, 0x60, 0xA0, 0xEA, 0x50, 0x60, 0x36, 0xEB, 0x51, 0x60, - 0x37, 0xEB, 0x52, 0x60, 0x20, 0xEB, 0x53, 0x60, 0xE4, 0xEB, 0x54, 0x60, 0x34, 0xEB, 0x55, 0x60, - 0x58, 0xEB, 0x56, 0x60, 0x48, 0xEB, 0x57, 0x60, 0xD0, 0xEB, 0x58, 0x60, 0xC3, 0xEB, 0x59, 0x60, - 0xFC, 0xEB, 0x5A, 0x60, 0x34, 0xEB, 0x5B, 0x60, 0x58, 0xEB, 0x5C, 0x60, 0xC0, 0xEB, 0x5D, 0x60, - 0xD0, 0xEB, 0x5E, 0x60, 0x91, 0xEB, 0x00, 0xEA, 0x00, 0xEB, 0xE0, 0x60, 0x02, 0xEA, 0xE0, 0x60, - 0x03, 0xEB, 0xA0, 0x60, 0x00, 0xEB, 0xB0, 0x60, 0x00, 0xEB, 0xAB, 0x48, 0x40, 0x3B, 0x01, 0x00, - 0xFC, 0x01, 0x00, 0xEB, 0x03, 0x60, 0x02, 0x62, 0x62, 0x44, 0xA2, 0xDB, 0x0F, 0x64, 0x60, 0x7F, - 0xA0, 0x5A, 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0x3F, 0x40, - 0x40, 0x26, 0x08, 0x00, 0x00, 0x60, 0x18, 0x64, 0x00, 0x60, 0x00, 0x65, 0x94, 0x84, 0xA0, 0x50, - 0x1D, 0x60, 0x19, 0xE2, 0x24, 0x44, 0xFF, 0xB4, 0x04, 0xFB, 0x50, 0x60, 0x00, 0x64, 0x05, 0xFB, - 0x10, 0x60, 0x10, 0x75, 0xEB, 0x60, 0x84, 0x78, 0xFF, 0xFF, 0x80, 0xFF, 0x90, 0xFF, 0x98, 0xFF, - 0x23, 0x60, 0x5C, 0x63, 0x20, 0x44, 0xBD, 0xDB, 0x21, 0x44, 0xBD, 0xDB, 0x22, 0x44, 0xBD, 0xDB, - 0x23, 0x44, 0xBD, 0xDB, 0x24, 0x44, 0xBD, 0xDB, 0x25, 0x44, 0xBD, 0xDB, 0x26, 0x44, 0xBD, 0xDB, - 0x27, 0x44, 0xBD, 0xDB, 0x28, 0x44, 0xBD, 0xDB, 0x29, 0x44, 0xBD, 0xDB, 0x2A, 0x44, 0xBD, 0xDB, - 0x2B, 0x44, 0xBD, 0xDB, 0x2C, 0x44, 0xBD, 0xDB, 0x2D, 0x44, 0xBD, 0xDB, 0x2E, 0x44, 0xBD, 0xDB, - 0x2F, 0x44, 0xBD, 0xDB, 0x23, 0x60, 0x50, 0x64, 0xA0, 0xDD, 0x24, 0x60, 0x7C, 0x63, 0x23, 0x60, - 0x52, 0x64, 0xA0, 0xDD, 0x23, 0x60, 0x54, 0x63, 0x30, 0x44, 0xA3, 0xDB, 0x23, 0x60, 0x56, 0x63, - 0x31, 0x44, 0xA3, 0xDB, 0x23, 0x60, 0x58, 0x63, 0x32, 0x44, 0xA3, 0xDB, 0x23, 0x60, 0x5A, 0x63, - 0x33, 0x44, 0xA3, 0xDB, 0x81, 0xFF, 0x91, 0xFF, 0x58, 0x51, 0x48, 0x00, 0x82, 0xFF, 0x92, 0xFF, - 0x58, 0x51, 0x44, 0x00, 0x83, 0xFF, 0x93, 0xFF, 0x58, 0x51, 0x40, 0x00, 0x84, 0xFF, 0x94, 0xFF, - 0x58, 0x51, 0x3C, 0x00, 0x85, 0xFF, 0x95, 0xFF, 0x58, 0x51, 0x38, 0x00, 0x86, 0xFF, 0x96, 0xFF, - 0x58, 0x51, 0x34, 0x00, 0x87, 0xFF, 0x97, 0xFF, 0x58, 0x51, 0x30, 0x00, 0x80, 0xFF, 0x90, 0xFF, - 0x99, 0xFF, 0x23, 0x60, 0x50, 0x64, 0xA0, 0xD1, 0x30, 0x44, 0x64, 0x43, 0xBD, 0xDB, 0x31, 0x44, - 0xBD, 0xDB, 0x32, 0x44, 0xBD, 0xDB, 0x33, 0x44, 0xBD, 0xDB, 0x34, 0x44, 0xBD, 0xDB, 0x35, 0x44, - 0xBD, 0xDB, 0x36, 0x44, 0xBD, 0xDB, 0x37, 0x44, 0xBD, 0xDB, 0x38, 0x44, 0xBD, 0xDB, 0x39, 0x44, - 0xBD, 0xDB, 0x3A, 0x44, 0xBD, 0xDB, 0x3B, 0x44, 0xBD, 0xDB, 0x3C, 0x44, 0xBD, 0xDB, 0x3D, 0x44, - 0xBD, 0xDB, 0x3E, 0x44, 0xBD, 0xDB, 0x3F, 0x44, 0xBD, 0xDB, 0xE3, 0x60, 0x50, 0x64, 0x0A, 0xFB, - 0x40, 0x21, 0xFE, 0x01, 0xA1, 0xFF, 0xFF, 0xFF, 0x78, 0x01, 0xFF, 0xFF, 0x42, 0x50, 0x40, 0x53, - 0x23, 0x60, 0x52, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x40, 0x52, 0x33, 0x44, 0x32, 0x42, 0xA2, 0xDB, - 0xDA, 0x82, 0xA2, 0xDD, 0xDA, 0x83, 0x65, 0x44, 0xBD, 0xDB, 0x61, 0x44, 0xBD, 0xDB, 0x66, 0x44, - 0xBD, 0xDB, 0xBD, 0xD9, 0x30, 0x44, 0xBD, 0xDB, 0x99, 0xFF, 0xA4, 0x4C, 0xBD, 0xDB, 0xA5, 0x4C, - 0xBD, 0xDB, 0xA0, 0x4C, 0xBD, 0xDB, 0xA1, 0x4C, 0xBD, 0xDB, 0x98, 0xFF, 0x23, 0x60, 0x52, 0x64, - 0xA0, 0xDD, 0x23, 0x60, 0x54, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x40, 0x50, 0x23, 0x60, 0x58, 0x62, - 0xA2, 0xD3, 0xFF, 0xFF, 0x40, 0x52, 0x23, 0x60, 0x5A, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x40, 0x53, - 0x31, 0x41, 0x23, 0x60, 0x56, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x40, 0x51, 0x23, 0x60, 0x50, 0x62, - 0xA2, 0xD3, 0xFF, 0xFF, 0x60, 0x43, 0x20, 0x44, 0xBD, 0xDB, 0x21, 0x44, 0xBD, 0xDB, 0x22, 0x44, - 0xBD, 0xDB, 0x23, 0x44, 0xBD, 0xDB, 0x24, 0x44, 0xBD, 0xDB, 0x25, 0x44, 0xBD, 0xDB, 0x26, 0x44, - 0xBD, 0xDB, 0x27, 0x44, 0xBD, 0xDB, 0x28, 0x44, 0xBD, 0xDB, 0x29, 0x44, 0xBD, 0xDB, 0x2A, 0x44, - 0xBD, 0xDB, 0x2B, 0x44, 0xBD, 0xDB, 0x2C, 0x44, 0xBD, 0xDB, 0x2D, 0x44, 0xBD, 0xDB, 0x2E, 0x44, - 0xBD, 0xDB, 0x2F, 0x44, 0xBD, 0xDB, 0x23, 0x60, 0x50, 0x64, 0xA0, 0xDD, 0x61, 0x58, 0xFF, 0xFF, - 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x07, 0x02, 0x62, 0xFF, 0x63, 0xFF, 0x64, 0xFF, 0x65, 0xFF, - 0x66, 0xFF, 0xBF, 0xFE, 0xA1, 0xFF, 0x82, 0xFF, 0x88, 0xFF, 0x6C, 0x40, 0x41, 0xFF, 0xC4, 0xE2, - 0x43, 0xFF, 0x5C, 0x49, 0x08, 0xE1, 0xA5, 0x60, 0x5E, 0x78, 0xFF, 0xFF, 0xA1, 0xFF, 0x98, 0xFF, - 0x80, 0x3E, 0x9F, 0xFE, 0x03, 0x04, 0xA6, 0x60, 0x28, 0x78, 0xFF, 0xFF, 0xE2, 0xFE, 0x40, 0x05, - 0xE0, 0xFE, 0x5B, 0x05, 0xE1, 0xFE, 0xF2, 0x04, 0x29, 0x40, 0x08, 0x26, 0xEF, 0x01, 0x72, 0x44, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x95, 0xF3, 0xE8, 0x85, 0xFF, 0xB7, - 0xE0, 0x84, 0xE0, 0x84, 0xB4, 0x85, 0x73, 0x44, 0xD4, 0x84, 0x10, 0x65, 0xD4, 0x80, 0xFF, 0xFF, - 0x26, 0x04, 0x3F, 0x40, 0x40, 0x26, 0x13, 0x00, 0x0B, 0x60, 0xF8, 0x62, 0xA2, 0xD1, 0x00, 0x60, - 0x10, 0x64, 0x90, 0x84, 0xA0, 0x50, 0xF8, 0xA2, 0xA2, 0xD1, 0x0A, 0x60, 0x19, 0x64, 0x90, 0x84, - 0xA0, 0x52, 0x06, 0xA2, 0xA2, 0xD1, 0x46, 0x60, 0x09, 0x64, 0x90, 0x84, 0xA0, 0x50, 0xD2, 0xF4, - 0x25, 0x60, 0x16, 0x7C, 0x63, 0x40, 0x01, 0x26, 0x08, 0x00, 0xA4, 0xD3, 0xFF, 0xFF, 0x01, 0xB4, - 0xFF, 0xFF, 0x03, 0x02, 0xAD, 0x4F, 0xFE, 0xB4, 0xA0, 0x5D, 0x02, 0xEE, 0xBD, 0xFE, 0xBE, 0x01, - 0x21, 0x46, 0x5E, 0x62, 0x9A, 0xFF, 0x07, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x06, 0x25, 0x10, 0x00, - 0xA2, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x62, 0x62, 0x01, 0x5D, 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, - 0x7A, 0xDC, 0x44, 0xFF, 0x06, 0x25, 0x04, 0x00, 0x0E, 0xE1, 0x02, 0x60, 0x01, 0xE1, 0x9E, 0x01, - 0x62, 0xFF, 0xC4, 0xE2, 0x41, 0xFF, 0x0A, 0xE1, 0x99, 0x01, 0xC8, 0x74, 0xCD, 0xE2, 0x29, 0x44, - 0x08, 0xBC, 0x40, 0x49, 0x05, 0xE1, 0x25, 0x60, 0x18, 0x63, 0xA3, 0xD3, 0xD2, 0xF3, 0x06, 0x18, - 0x28, 0x40, 0x08, 0x2A, 0x05, 0x00, 0x28, 0x40, 0x48, 0x36, 0x02, 0x00, 0x02, 0xBC, 0xD2, 0xFB, - 0x3F, 0x40, 0x01, 0x2B, 0xFF, 0xFF, 0xA1, 0xFF, 0x67, 0x4C, 0x06, 0x61, 0xCD, 0x81, 0x04, 0x25, - 0x30, 0x00, 0x87, 0x4C, 0xFB, 0x02, 0x28, 0x40, 0x40, 0x2B, 0x02, 0x00, 0x15, 0x60, 0x6F, 0x6B, - 0xF3, 0x60, 0xA0, 0x64, 0x04, 0x25, 0x25, 0x00, 0x80, 0x4C, 0x30, 0x64, 0x3A, 0xDB, 0x44, 0xFF, - 0x04, 0x25, 0x1F, 0x00, 0x04, 0x60, 0x00, 0x65, 0x25, 0x44, 0x37, 0x36, 0xB4, 0x84, 0x6E, 0x36, - 0xB4, 0x84, 0x80, 0x4E, 0x24, 0x41, 0x04, 0x25, 0x14, 0x00, 0x61, 0x4C, 0x64, 0xA1, 0x61, 0x54, - 0xA1, 0xFF, 0xFF, 0xFF, 0x04, 0x25, 0x0D, 0x00, 0x67, 0x4E, 0x07, 0x64, 0x1C, 0xFB, 0x00, 0xE1, - 0x02, 0x60, 0x01, 0xE1, 0x53, 0x01, 0x33, 0xF3, 0xFD, 0x11, 0xFC, 0x18, 0x40, 0x64, 0x3A, 0xDB, - 0x0A, 0x00, 0xC4, 0xE2, 0x27, 0x44, 0x20, 0x2A, 0x04, 0x00, 0x42, 0x64, 0x3A, 0xDB, 0x67, 0x4C, - 0x02, 0x00, 0x41, 0x64, 0x3A, 0xDB, 0x62, 0xFF, 0x08, 0xE1, 0xE2, 0xFE, 0x72, 0x52, 0x5C, 0x49, - 0x32, 0x7B, 0x4D, 0xE2, 0x3B, 0x01, 0x08, 0xE1, 0x39, 0x01, 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, - 0x00, 0x60, 0x46, 0x74, 0xCD, 0xE2, 0x04, 0xE1, 0x02, 0x60, 0x00, 0xE1, 0x3F, 0x44, 0x40, 0x26, - 0x0B, 0x00, 0x01, 0x2A, 0x05, 0x00, 0x42, 0x60, 0x09, 0xE0, 0x60, 0x60, 0x1C, 0xE0, 0x04, 0x00, - 0x42, 0x60, 0x09, 0xE0, 0x80, 0x60, 0x1C, 0xE0, 0x04, 0x29, 0xFE, 0x01, 0xC4, 0xE2, 0x43, 0x64, - 0x3A, 0xDB, 0x83, 0xF3, 0xFF, 0xFF, 0x60, 0x41, 0x3F, 0x44, 0x02, 0x27, 0x84, 0x00, 0x20, 0x2B, - 0xFF, 0x01, 0x80, 0xE1, 0x95, 0x60, 0x80, 0xE7, 0x61, 0x40, 0x40, 0x2B, 0x0D, 0x00, 0x05, 0x63, - 0xA7, 0x60, 0x58, 0x4F, 0x1D, 0x78, 0xFF, 0xFF, 0x28, 0x63, 0xFF, 0xFF, 0xFE, 0x1F, 0x01, 0x63, - 0xA7, 0x60, 0x58, 0x4F, 0x1D, 0x78, 0xFF, 0xFF, 0xFF, 0xB1, 0xCD, 0x81, 0xE1, 0x85, 0x1E, 0x60, - 0xA2, 0x64, 0x44, 0xD1, 0xFF, 0xFF, 0x64, 0x43, 0xA7, 0x60, 0x58, 0x4F, 0x1D, 0x78, 0xFF, 0xFF, - 0x00, 0x60, 0x00, 0x63, 0xA7, 0x60, 0x58, 0x4F, 0x1D, 0x78, 0xFF, 0xFF, 0x1E, 0x60, 0xBE, 0x61, - 0x21, 0x60, 0x72, 0x62, 0xA2, 0xD3, 0x45, 0xD1, 0x47, 0xBC, 0xE0, 0x84, 0x62, 0x45, 0x64, 0x5F, - 0xE8, 0x83, 0xA7, 0x60, 0x58, 0x4F, 0x1D, 0x78, 0xFF, 0xFF, 0x82, 0xF3, 0xCD, 0xE2, 0x60, 0x54, - 0x04, 0xE1, 0x04, 0x29, 0xFE, 0x01, 0xC4, 0xE2, 0x15, 0x60, 0xA2, 0xE7, 0x38, 0x69, 0xFF, 0xFF, - 0x68, 0x44, 0x01, 0x16, 0xFD, 0x01, 0x01, 0x2A, 0x36, 0x00, 0x03, 0x60, 0x80, 0x7C, 0xA3, 0x83, - 0x21, 0x60, 0x72, 0x62, 0xA2, 0xD1, 0x43, 0xBB, 0xB3, 0x83, 0x95, 0x60, 0x80, 0xE7, 0xA7, 0x60, - 0x58, 0x4F, 0x1D, 0x78, 0xFF, 0xFF, 0xE3, 0x83, 0x15, 0x60, 0xA2, 0xE7, 0x38, 0x69, 0xFF, 0xFF, - 0x68, 0x41, 0x01, 0x16, 0xFD, 0x01, 0x63, 0x47, 0x61, 0x40, 0x01, 0x2A, 0x03, 0x00, 0x00, 0x3A, - 0xCC, 0x84, 0x02, 0x00, 0x07, 0x3A, 0xDC, 0x84, 0xFF, 0xB4, 0xA5, 0xDB, 0x60, 0x47, 0xE8, 0x84, - 0x47, 0x65, 0x21, 0x60, 0x72, 0x62, 0xA2, 0xD3, 0xB4, 0x85, 0xB4, 0x83, 0x80, 0xE1, 0x95, 0x60, - 0x80, 0xE7, 0xA7, 0x60, 0x58, 0x4F, 0x1D, 0x78, 0xFF, 0xFF, 0x82, 0xF3, 0xCD, 0xE2, 0x60, 0x54, - 0x04, 0x29, 0xFE, 0x01, 0xC4, 0xE2, 0x83, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x2B, 0x04, 0x00, - 0xA6, 0x60, 0xF6, 0x78, 0xFF, 0xFF, 0xFF, 0x01, 0x83, 0xF3, 0x80, 0xE1, 0xCC, 0x84, 0xE0, 0x85, - 0x15, 0x60, 0xA2, 0xE7, 0x1D, 0x60, 0xDE, 0x64, 0x58, 0x4F, 0x4F, 0x00, 0x1D, 0x60, 0xFA, 0x64, - 0x58, 0x4F, 0x4B, 0x00, 0x1E, 0x60, 0x16, 0x64, 0x58, 0x4F, 0x47, 0x00, 0x1E, 0x60, 0x32, 0x64, - 0x58, 0x4F, 0x43, 0x00, 0x1E, 0x60, 0x4E, 0x64, 0x58, 0x4F, 0x3F, 0x00, 0x1E, 0x60, 0x6A, 0x64, - 0x58, 0x4F, 0x3B, 0x00, 0x1E, 0x60, 0x86, 0x64, 0x58, 0x4F, 0x37, 0x00, 0x01, 0x68, 0xFF, 0x6A, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x3F, 0x44, 0x20, 0x27, 0x00, 0x00, 0x3F, 0x40, 0x40, 0x26, - 0x08, 0x00, 0x00, 0x60, 0x18, 0x64, 0x00, 0x60, 0x00, 0x65, 0x94, 0x84, 0xA0, 0x50, 0x1D, 0x60, - 0x19, 0xE2, 0xC4, 0xE2, 0x00, 0x63, 0x82, 0xFD, 0x32, 0x7B, 0x4D, 0xE2, 0xBF, 0xFE, 0xC4, 0xE2, - 0x41, 0xFF, 0xE0, 0xFE, 0xE1, 0xFE, 0xE2, 0xFE, 0x43, 0xFF, 0x44, 0xFF, 0x46, 0xFF, 0x84, 0xF3, - 0x62, 0xFF, 0x60, 0x40, 0x05, 0x36, 0x2D, 0xFF, 0x07, 0x36, 0xD5, 0xFE, 0x08, 0xE1, 0x88, 0x60, - 0x85, 0x71, 0x8D, 0xE2, 0xA5, 0x60, 0x5E, 0x78, 0xFF, 0xFF, 0x50, 0xEC, 0x63, 0x4A, 0xFF, 0xFF, - 0x01, 0x16, 0xFE, 0x01, 0x40, 0xEC, 0x2F, 0x58, 0xFF, 0xFF, 0x44, 0xD3, 0x80, 0x7C, 0x60, 0x48, - 0x60, 0x47, 0x00, 0x7F, 0xB0, 0x8A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x2F, 0x58, 0xFF, 0xFF, - 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x02, 0x02, 0xA1, 0xFF, 0xFF, 0xFF, 0x82, 0xFF, 0x88, 0xFF, - 0x48, 0xE2, 0x01, 0x70, 0xAE, 0xF1, 0x00, 0x6B, 0x89, 0xFF, 0x64, 0x54, 0x88, 0xFF, 0x9F, 0xFE, - 0x02, 0x05, 0x64, 0x44, 0x60, 0x54, 0xCD, 0xE2, 0xC2, 0x64, 0x3A, 0xDB, 0xBC, 0xFF, 0xB5, 0xFF, - 0x1D, 0xFF, 0x26, 0x44, 0x02, 0xB4, 0x40, 0x46, 0x3C, 0x44, 0x00, 0xBC, 0xFF, 0xFF, 0x06, 0x03, - 0x27, 0x40, 0x26, 0x22, 0x03, 0x00, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x27, 0x44, 0x20, 0x2A, - 0x04, 0x00, 0xA0, 0x60, 0x00, 0xEA, 0xB0, 0x60, 0x00, 0xEA, 0x5C, 0x4D, 0x27, 0x44, 0x18, 0xB4, - 0x40, 0x47, 0x00, 0xE1, 0x6C, 0x40, 0x44, 0xE2, 0xC4, 0xE2, 0x47, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, - 0x32, 0xF1, 0x08, 0x29, 0x09, 0x00, 0x64, 0x40, 0x07, 0x22, 0x06, 0x00, 0x43, 0xFF, 0x27, 0x44, - 0x10, 0xBC, 0x40, 0x47, 0x00, 0x64, 0x32, 0xFB, 0x31, 0x41, 0x3C, 0x44, 0x01, 0xB1, 0x00, 0xBC, - 0x0A, 0x02, 0x09, 0x03, 0x32, 0xF3, 0x00, 0x7C, 0x01, 0xB4, 0xFF, 0xFF, 0x04, 0x03, 0x32, 0xF9, - 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x48, 0x60, 0x2D, 0x7D, 0x08, 0x60, 0x00, 0x6B, 0x00, 0x64, - 0x33, 0xFB, 0x0C, 0x60, 0x16, 0x64, 0xA0, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x32, 0xF3, 0x08, 0x29, - 0x0A, 0x00, 0x60, 0x40, 0x07, 0x22, 0x07, 0x00, 0xFE, 0xB4, 0x32, 0xFB, 0x27, 0x44, 0x10, 0xBC, - 0xF7, 0xB4, 0x40, 0x47, 0x43, 0xFF, 0x00, 0x64, 0x3A, 0xDB, 0x01, 0x60, 0x08, 0xE1, 0x31, 0x40, - 0x01, 0x2A, 0x04, 0x00, 0x00, 0x64, 0x33, 0xFB, 0x01, 0x60, 0x0A, 0xE1, 0xE5, 0xFE, 0x13, 0x05, - 0x27, 0x44, 0x10, 0x26, 0x13, 0x00, 0x9F, 0xFE, 0x02, 0x04, 0x02, 0xE1, 0x06, 0x00, 0x3E, 0xE1, - 0x31, 0x44, 0x01, 0x2A, 0x02, 0x00, 0x04, 0x0A, 0xBF, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, - 0xAF, 0x60, 0x19, 0x78, 0xFF, 0xFF, 0xA8, 0x60, 0x09, 0x78, 0xFF, 0xFF, 0x27, 0x44, 0x08, 0x26, - 0xFF, 0xFF, 0xBF, 0x60, 0x2A, 0x78, 0xFF, 0xFF, 0x48, 0xF3, 0x32, 0xF1, 0x00, 0x63, 0x64, 0x40, - 0x03, 0x22, 0x3D, 0x00, 0x31, 0x40, 0x08, 0x26, 0xF4, 0x01, 0xCD, 0xE2, 0x84, 0xE1, 0x70, 0x41, - 0xAD, 0x80, 0x71, 0x40, 0x80, 0x27, 0xED, 0x12, 0x03, 0x03, 0xBF, 0x60, 0x7C, 0x78, 0xFF, 0xFF, - 0xA1, 0xFF, 0xFF, 0xFF, 0xC4, 0xE2, 0x32, 0xFD, 0x60, 0x40, 0x01, 0x2A, 0xDF, 0x01, 0x00, 0x63, - 0x32, 0xFD, 0x6C, 0x40, 0x3C, 0x46, 0x3E, 0xF2, 0x2A, 0xF0, 0x27, 0x41, 0x44, 0x48, 0x20, 0xB9, - 0x01, 0xB4, 0xF7, 0xB1, 0x0A, 0x03, 0x64, 0x40, 0x08, 0x27, 0x07, 0x00, 0x0F, 0x60, 0x92, 0x63, - 0x00, 0x64, 0x45, 0xFB, 0x46, 0xFB, 0xBD, 0xDB, 0xA3, 0xDB, 0xCB, 0x0A, 0x41, 0x47, 0x3F, 0x40, - 0x01, 0x2B, 0x04, 0x00, 0xF6, 0xFE, 0x67, 0x4C, 0x05, 0x60, 0x69, 0x6B, 0x02, 0xE1, 0x01, 0x60, - 0x08, 0xE1, 0xF0, 0xFE, 0x84, 0xFF, 0xBF, 0x60, 0xAD, 0x64, 0x40, 0x42, 0x82, 0xFF, 0xE5, 0xFE, - 0x03, 0x04, 0xAC, 0x60, 0x41, 0x78, 0xFF, 0xFF, 0xE4, 0xFE, 0x0A, 0x04, 0x1D, 0xFF, 0x00, 0xEB, - 0x60, 0x7F, 0xA0, 0x5A, 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, - 0x43, 0xFF, 0xE6, 0xFE, 0x03, 0x05, 0xA7, 0x60, 0x9B, 0x78, 0xFF, 0xFF, 0x3C, 0x44, 0x60, 0x46, - 0x0F, 0xF0, 0x40, 0x42, 0x64, 0x40, 0x01, 0x2A, 0x03, 0x00, 0xAB, 0x60, 0x03, 0x78, 0xFF, 0xFF, - 0x0B, 0x64, 0x3A, 0xDB, 0x1C, 0x42, 0x22, 0x46, 0x13, 0xF2, 0xFF, 0x65, 0x60, 0x47, 0x2A, 0xF2, - 0x40, 0x45, 0x40, 0x48, 0x04, 0x2B, 0x17, 0x00, 0x16, 0xF2, 0x1D, 0xF2, 0x40, 0x43, 0x0F, 0xF2, - 0x40, 0x44, 0x25, 0x5E, 0x3F, 0x40, 0x01, 0x27, 0x40, 0x45, 0x0F, 0x64, 0x14, 0xF0, 0x35, 0xF2, - 0xA0, 0x82, 0x0F, 0xB4, 0xCA, 0x85, 0xD4, 0x80, 0x10, 0xF2, 0x01, 0x02, 0x2B, 0xFA, 0x27, 0x44, - 0x40, 0xBC, 0x40, 0x47, 0x13, 0x00, 0x17, 0xF2, 0x2C, 0xF0, 0x40, 0x43, 0x1B, 0xF2, 0x1D, 0xFA, - 0x40, 0x44, 0x64, 0x40, 0x01, 0x2A, 0x02, 0x00, 0xAB, 0xFC, 0x05, 0x00, 0x28, 0x40, 0xA4, 0x36, - 0x02, 0x00, 0x11, 0xF2, 0x2B, 0xFA, 0x27, 0x44, 0xBF, 0xB4, 0x40, 0x47, 0x28, 0x40, 0x40, 0x2B, - 0xFF, 0xFF, 0xAF, 0x60, 0x2E, 0x78, 0xFF, 0xFF, 0x22, 0x46, 0x2C, 0xF0, 0x27, 0x44, 0xDF, 0xB4, - 0x40, 0x47, 0xB5, 0xFF, 0xBC, 0xFF, 0x47, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0x48, 0x60, 0x2D, 0x7D, - 0x08, 0x60, 0x00, 0x6B, 0x64, 0x40, 0x01, 0x2A, 0x01, 0x00, 0x13, 0x00, 0x2A, 0xF0, 0x01, 0x65, - 0x64, 0x40, 0xA4, 0x3A, 0x04, 0x65, 0x27, 0x44, 0x34, 0x87, 0x36, 0xF3, 0xB4, 0xFF, 0x60, 0x5B, - 0x4D, 0xE2, 0x04, 0x64, 0x3A, 0xDB, 0x01, 0x60, 0x0A, 0xE1, 0x2B, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, - 0x81, 0x3E, 0x06, 0x64, 0x3A, 0xDB, 0x22, 0x46, 0x01, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0xBF, 0x60, - 0x85, 0x78, 0xFF, 0xFF, 0xB5, 0xFF, 0xA1, 0xFF, 0x6C, 0x40, 0x3F, 0x40, 0x01, 0x2B, 0x03, 0x00, - 0x67, 0x4C, 0x05, 0x60, 0x69, 0x6B, 0x02, 0xE1, 0x01, 0x60, 0x08, 0xE1, 0xC4, 0xE2, 0x08, 0x64, - 0x3A, 0xDB, 0xF0, 0xFE, 0x25, 0x46, 0x01, 0xF2, 0x61, 0x45, 0xD4, 0x9E, 0x21, 0x46, 0x16, 0xFA, - 0x2A, 0x44, 0x72, 0x45, 0x24, 0xFA, 0x95, 0xF3, 0x06, 0x04, 0xE4, 0xE2, 0xDC, 0x9C, 0x29, 0x40, - 0x01, 0x26, 0x64, 0x44, 0x95, 0xF9, 0x25, 0xFA, 0x96, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0x96, 0xFB, - 0x28, 0xFA, 0x97, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0x97, 0xFB, 0x29, 0xFA, 0x2D, 0x44, 0x04, 0x2A, - 0x06, 0x00, 0x28, 0x40, 0xA4, 0x36, 0x03, 0x00, 0xA9, 0x60, 0xC9, 0x78, 0xFF, 0xFF, 0x94, 0xFC, - 0x1F, 0x60, 0x9A, 0x65, 0xA5, 0xD1, 0x28, 0x44, 0x08, 0x2A, 0x51, 0x00, 0x03, 0x2B, 0x01, 0x00, - 0x4E, 0x00, 0x64, 0x40, 0x00, 0x36, 0x4B, 0x00, 0x32, 0xF2, 0x2F, 0xF0, 0x50, 0xFE, 0x01, 0x2A, - 0x03, 0x00, 0x01, 0x61, 0x8F, 0xF3, 0x31, 0x00, 0xD0, 0x80, 0x33, 0xF2, 0x30, 0xF0, 0x34, 0xF2, - 0xD0, 0x80, 0x31, 0xF0, 0xFF, 0xFF, 0xD0, 0x80, 0x60, 0x47, 0x34, 0x0C, 0xFF, 0xB4, 0x12, 0x60, - 0xCE, 0x65, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0xFF, 0xFF, 0x31, 0x18, 0x60, 0x43, 0x50, 0xFE, - 0x66, 0x41, 0x32, 0xF0, 0x63, 0x46, 0x03, 0xF2, 0x61, 0x46, 0xD0, 0x80, 0x33, 0xF0, 0x63, 0x46, - 0x04, 0xF2, 0x61, 0x46, 0xD0, 0x80, 0x34, 0xF0, 0x63, 0x46, 0x05, 0xF2, 0xFF, 0xFF, 0xD0, 0x80, - 0xFF, 0xFF, 0x04, 0x0C, 0x00, 0xF2, 0x61, 0x46, 0x1A, 0x18, 0xE8, 0x01, 0x06, 0xF0, 0x8F, 0xF3, - 0x61, 0x46, 0x02, 0x61, 0x64, 0x40, 0x02, 0x2A, 0x12, 0x00, 0xFC, 0xA0, 0xFF, 0xFF, 0x04, 0x0E, - 0x61, 0x44, 0x14, 0xFA, 0x11, 0xFC, 0x0B, 0x00, 0x2C, 0xF2, 0x2F, 0xFA, 0x2D, 0xF2, 0x30, 0xFA, - 0x2E, 0xF2, 0x31, 0xFA, 0x1D, 0xFF, 0x26, 0x44, 0x02, 0xBC, 0x40, 0x46, 0x20, 0x00, 0x26, 0x43, - 0x84, 0xBB, 0xFC, 0xB3, 0x21, 0x46, 0x01, 0x5D, 0x0F, 0xFC, 0x5C, 0x46, 0x25, 0x44, 0x06, 0xFA, - 0x05, 0xFF, 0x27, 0x44, 0x01, 0x2A, 0x13, 0x00, 0x50, 0xFE, 0x28, 0x40, 0x08, 0x3A, 0x12, 0x00, - 0x2F, 0xF2, 0x30, 0xF0, 0x60, 0x43, 0x31, 0xF2, 0x22, 0x46, 0x64, 0x41, 0x2C, 0xF0, 0x2D, 0xF0, - 0xD3, 0x80, 0x2E, 0xF0, 0xD1, 0x80, 0xD0, 0x80, 0x27, 0x44, 0x09, 0x0C, 0x03, 0x00, 0x27, 0x44, - 0x06, 0x22, 0x05, 0x00, 0xB8, 0xB4, 0x40, 0x47, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0xD4, 0x64, - 0x40, 0x48, 0x0D, 0x64, 0x3A, 0xDB, 0x21, 0x46, 0x1C, 0xF2, 0x62, 0xF1, 0xFF, 0xB4, 0xD0, 0x80, - 0xFF, 0xFF, 0x01, 0x06, 0x64, 0x44, 0x40, 0x45, 0x0A, 0x36, 0x70, 0x64, 0x14, 0x36, 0x38, 0x64, - 0x37, 0x3A, 0x03, 0x00, 0x04, 0x7F, 0x40, 0x45, 0x15, 0x64, 0x6E, 0x3A, 0x03, 0x00, 0x84, 0x7F, - 0x40, 0x45, 0x0B, 0x64, 0x40, 0x44, 0x00, 0x63, 0x28, 0x44, 0xA4, 0x36, 0x07, 0x00, 0x04, 0x2B, - 0x05, 0x00, 0x30, 0xF3, 0x24, 0x45, 0xD4, 0x84, 0xCA, 0x65, 0xD4, 0x83, 0xD4, 0x64, 0x1A, 0x00, - 0x0F, 0x64, 0x3A, 0xDB, 0x21, 0x46, 0x70, 0x63, 0x1C, 0xF2, 0xCA, 0x65, 0x40, 0x45, 0x0A, 0x36, - 0x70, 0x64, 0x14, 0x36, 0x38, 0x64, 0x37, 0x3A, 0x03, 0x00, 0x04, 0x7F, 0x40, 0x45, 0x15, 0x64, - 0x6E, 0x3A, 0x03, 0x00, 0x84, 0x7F, 0x40, 0x45, 0x0B, 0x64, 0x40, 0x44, 0x2B, 0xF2, 0xC4, 0x85, - 0xD4, 0x83, 0xC4, 0x64, 0x40, 0x48, 0x2F, 0xF0, 0xB0, 0xF0, 0xB1, 0xF2, 0x00, 0xE1, 0xA1, 0xFF, - 0xFF, 0xFF, 0x80, 0x4E, 0x83, 0x4C, 0x9A, 0xFF, 0x84, 0x4C, 0x85, 0x4C, 0x81, 0x4C, 0xA1, 0xFF, - 0x98, 0xFF, 0x87, 0x4F, 0x87, 0x4C, 0x87, 0x4F, 0x87, 0x4D, 0x87, 0x4C, 0x01, 0x08, 0x01, 0x00, - 0xFF, 0xFF, 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0x6A, 0x44, - 0xBC, 0xFF, 0xC4, 0xE2, 0x0C, 0x74, 0x04, 0xE1, 0xA1, 0xFF, 0x35, 0xF3, 0xC4, 0xE2, 0x60, 0x54, - 0x89, 0xFF, 0x13, 0x74, 0x88, 0xFF, 0xB5, 0xFF, 0x47, 0xFF, 0x29, 0x44, 0xF7, 0xB4, 0x40, 0x49, - 0xB7, 0xFF, 0xB4, 0xFF, 0x48, 0x60, 0x2D, 0x7D, 0x08, 0x60, 0x00, 0x6B, 0x27, 0x44, 0x01, 0x2A, - 0x05, 0x00, 0xFE, 0xB4, 0x40, 0x47, 0xA8, 0x60, 0x89, 0x78, 0xFF, 0xFF, 0xA7, 0x60, 0x8E, 0x78, - 0xFF, 0xFF, 0x28, 0x40, 0xB4, 0x3A, 0x09, 0x00, 0x27, 0x44, 0x07, 0x22, 0x05, 0x00, 0xF8, 0xB4, - 0x40, 0x47, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x9B, 0x01, 0x28, 0x44, 0xD4, 0x36, 0x03, 0x00, - 0xAA, 0x60, 0xEA, 0x78, 0xFF, 0xFF, 0x48, 0xE2, 0x27, 0x44, 0xFB, 0xB4, 0x40, 0x47, 0x21, 0x60, - 0x98, 0x63, 0xA3, 0xD3, 0xB5, 0x60, 0x58, 0x4D, 0xE3, 0x78, 0xFF, 0xFF, 0x34, 0xFB, 0x1C, 0x42, - 0x22, 0x46, 0x2A, 0xF0, 0xF7, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDA, 0x60, 0x40, 0x40, 0x2B, - 0xCC, 0x00, 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x22, 0x26, 0x42, 0x00, 0x01, 0x26, 0x03, 0x00, - 0x04, 0x26, 0x07, 0x00, 0xC2, 0x00, 0x04, 0x2B, 0xC0, 0x00, 0x88, 0xF3, 0xFF, 0xFF, 0x60, 0x46, - 0x01, 0x00, 0x07, 0xF4, 0x47, 0xF2, 0xFF, 0xFF, 0xDC, 0x84, 0x47, 0xFA, 0x0D, 0x60, 0x3E, 0x62, - 0x80, 0xFF, 0xC4, 0x60, 0x78, 0x44, 0x02, 0xA4, 0xA2, 0xDB, 0x7D, 0x78, 0xFF, 0xFF, 0x82, 0xFF, - 0x88, 0xF3, 0x66, 0x5C, 0xD0, 0x80, 0x00, 0x7C, 0x07, 0x03, 0x66, 0x43, 0x22, 0x46, 0x22, 0xF2, - 0x63, 0x46, 0x60, 0x40, 0x01, 0x2A, 0x01, 0x00, 0x3C, 0xF1, 0x47, 0xF0, 0x64, 0x41, 0x64, 0x47, - 0xFF, 0xB4, 0x60, 0x5F, 0x20, 0xBC, 0x80, 0x26, 0x80, 0xAC, 0x60, 0x47, 0x22, 0x46, 0x3A, 0xFA, - 0x64, 0x44, 0x20, 0x7F, 0x34, 0x94, 0x3B, 0xFA, 0x08, 0x60, 0x00, 0xEA, 0x0F, 0x64, 0x60, 0x7F, - 0xA0, 0x5A, 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0x85, 0x00, - 0x2A, 0xF2, 0x00, 0x60, 0x7C, 0x62, 0x60, 0x40, 0x40, 0x2B, 0x27, 0x00, 0xA2, 0xD3, 0x00, 0x61, - 0x60, 0xFE, 0xA0, 0xD3, 0xDE, 0x82, 0xA2, 0xD1, 0xFF, 0xFF, 0x20, 0xFE, 0x64, 0x5F, 0xDC, 0x84, - 0xF1, 0x81, 0xC0, 0x2B, 0x04, 0x00, 0x80, 0x2A, 0x02, 0x00, 0x7F, 0xA4, 0xDC, 0x84, 0xFF, 0x3B, - 0x03, 0x00, 0x60, 0x47, 0xDC, 0x87, 0x01, 0x61, 0xC0, 0x80, 0x00, 0x36, 0xDC, 0x84, 0x4E, 0xDB, - 0x60, 0xFE, 0xDA, 0x82, 0xA2, 0xD1, 0xFF, 0xFF, 0xC1, 0x84, 0xF0, 0x22, 0x10, 0xA4, 0xF0, 0x2A, - 0x01, 0x00, 0x00, 0x64, 0xA2, 0xDB, 0xFF, 0xFF, 0x20, 0xFE, 0x00, 0x60, 0x7C, 0x62, 0xA2, 0xD3, - 0xFF, 0xFF, 0xA0, 0xD3, 0x5A, 0xD1, 0x3A, 0xFA, 0x3B, 0xF8, 0x74, 0x62, 0xA2, 0xD0, 0xFF, 0xFF, - 0x64, 0x44, 0xE0, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xE1, 0x7F, 0x5A, 0xD0, 0xA0, 0x5A, 0x64, 0x44, - 0xE2, 0x7F, 0xA0, 0x5A, 0x00, 0x60, 0x80, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xA0, 0xD1, 0x5A, 0xD1, - 0x64, 0x45, 0x64, 0x44, 0xE3, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xE4, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, - 0x64, 0x44, 0xE5, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xE6, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, - 0xE7, 0x7F, 0xA0, 0x5A, 0x65, 0x40, 0x0D, 0x3A, 0x1C, 0x00, 0x64, 0x47, 0xE8, 0x7F, 0x5A, 0xD1, - 0xA0, 0x5A, 0x64, 0x44, 0xE9, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xEA, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, - 0x64, 0x44, 0xEB, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xEC, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, - 0xED, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xEE, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xEF, 0x7F, - 0xA0, 0x5A, 0x08, 0x60, 0x00, 0xEA, 0x65, 0x44, 0x02, 0xA4, 0x60, 0x7F, 0xA0, 0x5A, 0x80, 0x60, - 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0x0B, 0xF2, 0xFF, 0xFF, 0x7F, 0xB4, - 0x0C, 0xF0, 0x04, 0x02, 0x64, 0x46, 0x00, 0xF0, 0x04, 0x64, 0x22, 0x46, 0x03, 0xFA, 0x60, 0x41, - 0x64, 0x46, 0x01, 0xF2, 0xFC, 0xA1, 0x61, 0x45, 0xD4, 0x84, 0xFF, 0xFF, 0x08, 0x02, 0x00, 0xF0, - 0x04, 0x63, 0x64, 0x46, 0x01, 0xF2, 0x22, 0x46, 0x1A, 0xFA, 0x03, 0xFC, 0x02, 0x00, 0x22, 0x46, - 0x1A, 0xFA, 0x35, 0xF2, 0x04, 0xF8, 0xDC, 0x84, 0x35, 0xFA, 0x14, 0xF2, 0x0F, 0xB5, 0x0F, 0xB4, - 0xCC, 0x84, 0x94, 0x80, 0x04, 0x60, 0x00, 0x65, 0x2A, 0xF2, 0x01, 0x02, 0x94, 0x84, 0x2A, 0xFA, - 0x95, 0xFC, 0x06, 0x00, 0xC4, 0x3A, 0x07, 0x00, 0x27, 0x44, 0xFD, 0xB4, 0x40, 0x47, 0x48, 0xE2, - 0xA8, 0x60, 0x28, 0x78, 0xFF, 0xFF, 0x28, 0x44, 0x04, 0x26, 0x05, 0x00, 0x68, 0x3A, 0x03, 0x00, - 0x32, 0x44, 0x00, 0x27, 0x03, 0x00, 0xA7, 0x60, 0x9B, 0x78, 0xFF, 0xFF, 0x0A, 0x64, 0x3A, 0xDB, - 0xA7, 0x60, 0x9B, 0x78, 0xFF, 0xFF, 0x0E, 0x64, 0x3A, 0xDB, 0x10, 0x60, 0x00, 0x65, 0x3C, 0x46, - 0x2A, 0xF2, 0x13, 0xF0, 0xA4, 0x84, 0xB4, 0xBC, 0x40, 0x48, 0x62, 0xF1, 0x64, 0x47, 0xFF, 0xB4, - 0x60, 0x45, 0xD0, 0x80, 0x70, 0x61, 0x01, 0x06, 0x64, 0x44, 0x0A, 0x36, 0x70, 0x64, 0x14, 0x36, - 0x38, 0x64, 0x37, 0x36, 0x15, 0x64, 0x6E, 0x36, 0x0B, 0x64, 0x40, 0x4E, 0xA0, 0x63, 0x0A, 0x64, - 0x65, 0x40, 0x0A, 0x36, 0x03, 0x00, 0x38, 0x61, 0x14, 0x64, 0xEB, 0x83, 0x40, 0x45, 0x43, 0x44, - 0x02, 0x60, 0x5E, 0x65, 0x2A, 0xF2, 0x2B, 0xF2, 0x60, 0x40, 0x04, 0x2B, 0x04, 0x00, 0x2E, 0x45, - 0xD4, 0x85, 0xC5, 0x84, 0x05, 0x00, 0x1B, 0xF0, 0xC5, 0x84, 0xC0, 0x84, 0x2E, 0x45, 0xC4, 0x84, - 0x60, 0x43, 0x28, 0x44, 0x00, 0xE1, 0xA1, 0xFF, 0x80, 0x4E, 0x83, 0x4C, 0x9A, 0xFF, 0x56, 0x62, - 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0x5C, 0x62, 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0xA1, 0xFF, - 0x98, 0xFF, 0x87, 0x4F, 0x87, 0x4C, 0x87, 0x4F, 0x87, 0x4D, 0x87, 0x4C, 0x01, 0x08, 0x01, 0x00, - 0xFF, 0xFF, 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0x6A, 0x44, - 0xBC, 0xFF, 0xB5, 0xFF, 0x47, 0xFF, 0x27, 0x44, 0x02, 0xBC, 0x40, 0x47, 0x36, 0xF3, 0xB7, 0xFF, - 0xB4, 0xFF, 0x48, 0x60, 0x2D, 0x7D, 0x08, 0x60, 0x00, 0x6B, 0x60, 0x5B, 0x4D, 0xE2, 0xA8, 0x60, - 0x81, 0x78, 0xFF, 0xFF, 0x21, 0x46, 0xB5, 0xFF, 0xBC, 0xFF, 0x47, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, - 0x48, 0x60, 0x2D, 0x7D, 0x08, 0x60, 0x00, 0x6B, 0x26, 0x43, 0x25, 0x44, 0x06, 0xFA, 0x2A, 0x44, - 0x72, 0x45, 0x24, 0xFA, 0x95, 0xF3, 0x06, 0x04, 0xE4, 0xE2, 0xDC, 0x9C, 0x29, 0x40, 0x01, 0x26, - 0x64, 0x44, 0x95, 0xF9, 0x25, 0xFA, 0x96, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0x96, 0xFB, 0x28, 0xFA, - 0x97, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0x97, 0xFB, 0x29, 0xFA, 0x2D, 0x40, 0x01, 0x2A, 0x0E, 0x00, - 0x1D, 0xFF, 0x26, 0x44, 0x02, 0xBC, 0x40, 0x46, 0x27, 0x44, 0x07, 0x22, 0x05, 0x00, 0xF8, 0xB4, - 0x40, 0x47, 0x06, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x30, 0xF1, 0x50, 0x00, 0xFC, 0xB3, 0x32, 0x40, - 0x01, 0x2A, 0x06, 0x00, 0x0A, 0xBB, 0x0F, 0xFC, 0xCB, 0xFE, 0xA7, 0x60, 0x9B, 0x78, 0xFF, 0xFF, - 0x2D, 0x44, 0x04, 0x26, 0x02, 0x00, 0x0F, 0xFC, 0x05, 0xFF, 0x30, 0xF1, 0x27, 0x44, 0x05, 0x22, - 0x2D, 0x00, 0xFA, 0xB4, 0x40, 0x47, 0x2D, 0x44, 0x10, 0x2A, 0x24, 0x00, 0x28, 0x40, 0xD4, 0x3A, - 0x21, 0x00, 0x31, 0x40, 0x08, 0x26, 0x00, 0x7C, 0x2B, 0x44, 0xD0, 0x80, 0x70, 0x45, 0x02, 0x28, - 0x64, 0x44, 0xC4, 0x84, 0xFF, 0xFF, 0x04, 0x24, 0x00, 0xB4, 0x60, 0x50, 0x08, 0x28, 0x01, 0x00, - 0x20, 0x29, 0x6D, 0xE2, 0x12, 0x60, 0xC0, 0x63, 0x1D, 0xF0, 0xC0, 0x64, 0xC0, 0x84, 0xA3, 0xD1, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xC0, 0x84, 0xA3, 0xDB, 0xA8, 0x60, - 0x89, 0x78, 0xFF, 0xFF, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x07, 0x00, 0x02, 0x2A, 0x05, 0x00, - 0xFD, 0xB4, 0x40, 0x47, 0x06, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x05, 0x64, 0x3A, 0xDB, 0x28, 0x44, - 0xA4, 0x3A, 0x04, 0x00, 0x39, 0xF1, 0x25, 0x44, 0x0A, 0x36, 0x38, 0xF1, 0x31, 0x40, 0x08, 0x26, - 0x00, 0x7C, 0x2B, 0x44, 0xD0, 0x80, 0x70, 0x45, 0x02, 0x28, 0x64, 0x44, 0xC4, 0x84, 0xFF, 0xFF, - 0x04, 0x24, 0x00, 0xB4, 0x28, 0x40, 0xE4, 0x36, 0x00, 0xB4, 0x60, 0x50, 0x08, 0x28, 0x01, 0x00, - 0x20, 0x29, 0x6D, 0xE2, 0xA7, 0x60, 0x8E, 0x78, 0xFF, 0xFF, 0x21, 0x46, 0xB5, 0xFF, 0xBC, 0xFF, - 0x47, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0x48, 0x60, 0x2D, 0x7D, 0x08, 0x60, 0x00, 0x6B, 0x27, 0x44, - 0x07, 0x22, 0x05, 0x00, 0xF8, 0xB4, 0x40, 0x47, 0x06, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0xEA, 0x01, - 0x27, 0x44, 0x05, 0x22, 0x09, 0x00, 0xBA, 0xB4, 0x40, 0x47, 0x3C, 0x46, 0x02, 0x64, 0x31, 0xFB, - 0xC0, 0xFE, 0xA7, 0x60, 0x9B, 0x78, 0xFF, 0xFF, 0x27, 0x44, 0x02, 0x2A, 0x06, 0x00, 0xFD, 0xB4, - 0x40, 0x47, 0x06, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0xF4, 0x01, 0xF3, 0x0A, 0x7C, 0x50, 0x6D, 0xE2, - 0xF0, 0x01, 0x72, 0x45, 0xDC, 0x84, 0x95, 0xFB, 0x11, 0x64, 0x3A, 0xDB, 0x96, 0xF3, 0x06, 0x04, - 0xDC, 0x84, 0x96, 0xFB, 0x97, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0x97, 0xFB, 0xA7, 0x60, 0xA6, 0x78, - 0xFF, 0xFF, 0x00, 0x61, 0x12, 0x64, 0x3A, 0xDB, 0x16, 0x60, 0xBA, 0x63, 0xBD, 0xD3, 0x72, 0x45, - 0x44, 0x8A, 0x02, 0x28, 0x02, 0x00, 0xE4, 0xE2, 0xDD, 0x81, 0x02, 0x28, 0x02, 0x00, 0xE4, 0xE2, - 0xDD, 0x81, 0xBD, 0xD3, 0x95, 0xF1, 0x61, 0x45, 0xC0, 0x84, 0x00, 0x61, 0x02, 0x24, 0x01, 0xB9, - 0xC4, 0x84, 0x60, 0x55, 0x2A, 0x52, 0x95, 0xFB, 0x02, 0x24, 0x01, 0xB9, 0xBD, 0xD3, 0x96, 0xF1, - 0x61, 0x45, 0xC0, 0x84, 0x00, 0x61, 0x02, 0x24, 0x01, 0xB9, 0xC4, 0x84, 0x96, 0xFB, 0x02, 0x24, - 0x01, 0xB9, 0xBD, 0xD3, 0x97, 0xF1, 0x61, 0x45, 0xC0, 0x84, 0xC4, 0x84, 0x97, 0xFB, 0xA8, 0x60, - 0x0C, 0x78, 0xFF, 0xFF, 0xAE, 0x01, 0xA1, 0xFF, 0xFF, 0xFF, 0x01, 0x25, 0x09, 0x00, 0x04, 0x25, - 0x03, 0x00, 0x47, 0xFF, 0x32, 0x74, 0xA5, 0x01, 0xC4, 0xE2, 0xAF, 0x60, 0x19, 0x78, 0xFF, 0xFF, - 0x4C, 0x4E, 0x47, 0xFF, 0x32, 0x74, 0xCD, 0xE2, 0xAC, 0x60, 0x8F, 0x78, 0x00, 0x61, 0x10, 0x64, - 0x3A, 0xDB, 0xA7, 0x60, 0x9B, 0x78, 0xFF, 0xFF, 0xA7, 0x60, 0x9B, 0x78, 0xFF, 0xFF, 0x5C, 0x4D, - 0x26, 0x44, 0x02, 0x26, 0x0C, 0x00, 0x3E, 0x46, 0x09, 0xF2, 0x1E, 0x41, 0x03, 0x1B, 0xAE, 0x60, - 0xCB, 0x78, 0xFF, 0xFF, 0x40, 0x5E, 0xFD, 0xFB, 0x21, 0x44, 0x02, 0x64, 0x40, 0x46, 0x41, 0x5D, - 0x21, 0x46, 0x00, 0xF2, 0x46, 0x45, 0x87, 0xFC, 0x4C, 0xE2, 0x01, 0x64, 0x33, 0xFB, 0x01, 0x60, - 0x0E, 0xE1, 0x03, 0xE1, 0x3F, 0x40, 0x01, 0x27, 0x00, 0x00, 0x21, 0x69, 0xB6, 0xFF, 0xA1, 0xFF, - 0x6C, 0x5E, 0xB6, 0xFF, 0xB7, 0xFF, 0x60, 0x5C, 0x20, 0x64, 0x3A, 0xDB, 0x68, 0x43, 0x26, 0xFC, - 0x22, 0x69, 0x64, 0x44, 0xA1, 0xFF, 0xFF, 0xFF, 0x6C, 0x5F, 0x60, 0x43, 0x26, 0xF2, 0xFF, 0xFF, - 0x68, 0x5F, 0x26, 0xFA, 0x3A, 0x69, 0x1D, 0xFC, 0x2E, 0x44, 0x36, 0xF1, 0x1C, 0xFA, 0xC3, 0x94, - 0xCD, 0xE2, 0x2E, 0x44, 0x14, 0x36, 0x12, 0x00, 0x0A, 0x36, 0x0F, 0x00, 0x63, 0x45, 0xE3, 0x83, - 0xE3, 0x83, 0xC7, 0x83, 0xE3, 0x83, 0xC7, 0x83, 0xFF, 0xFF, 0x37, 0x36, 0x05, 0x00, 0x6E, 0x36, - 0x04, 0x00, 0xAE, 0x60, 0xE3, 0x78, 0xFF, 0xFF, 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x83, - 0xFF, 0xFF, 0x80, 0x27, 0xCF, 0x83, 0x1B, 0xFC, 0x01, 0x64, 0x4F, 0xFB, 0xA1, 0xFF, 0x1C, 0xF2, - 0x29, 0x41, 0xF9, 0x81, 0x52, 0x4A, 0x71, 0x89, 0x68, 0x5F, 0x27, 0xFA, 0x6C, 0x40, 0x03, 0x15, - 0xAE, 0x60, 0xF4, 0x78, 0xFF, 0xFF, 0x88, 0x60, 0x85, 0x71, 0x8D, 0xE2, 0x99, 0xF1, 0xFC, 0xA3, - 0xD3, 0x80, 0x43, 0x43, 0x03, 0x04, 0xAE, 0x60, 0xEB, 0x78, 0xFF, 0xFF, 0x32, 0x40, 0x01, 0x2A, - 0x4C, 0x00, 0x9A, 0xFF, 0x23, 0x43, 0x18, 0x61, 0xA1, 0xFF, 0x8C, 0x44, 0xCB, 0x83, 0x2A, 0xFA, - 0x40, 0x48, 0x40, 0x27, 0x04, 0xA1, 0x60, 0x40, 0x03, 0x2B, 0x01, 0x00, 0x06, 0xA1, 0x88, 0xB0, - 0x88, 0x36, 0xD9, 0x81, 0x62, 0x45, 0x23, 0x44, 0x54, 0x94, 0x28, 0x40, 0x04, 0x26, 0x00, 0x64, - 0x3F, 0xFA, 0xC9, 0x81, 0x65, 0x42, 0x7A, 0xDC, 0x00, 0xB9, 0xFD, 0x1C, 0x00, 0xF4, 0x6E, 0x61, - 0x10, 0x62, 0x14, 0x02, 0x05, 0x1D, 0x12, 0x1E, 0x0C, 0x00, 0x00, 0xF4, 0x7C, 0x61, 0x02, 0x62, - 0x7A, 0xDC, 0x63, 0x40, 0xFD, 0x1C, 0xF9, 0x1D, 0xFF, 0xB1, 0x08, 0x1E, 0x02, 0x02, 0x00, 0xF4, - 0x02, 0x62, 0xB6, 0xFF, 0xB7, 0xFF, 0xA1, 0xFF, 0x6C, 0x44, 0x5A, 0xDA, 0x98, 0xFF, 0x01, 0x60, - 0x08, 0xE1, 0x81, 0xE1, 0xA1, 0xFF, 0x6C, 0x40, 0xA1, 0xFF, 0x47, 0xFF, 0x26, 0x44, 0xFD, 0xB4, - 0x84, 0xBC, 0x01, 0x15, 0x7F, 0xB4, 0x40, 0x46, 0xA1, 0xFF, 0x6C, 0x40, 0x14, 0x63, 0x01, 0x11, - 0x01, 0x00, 0xFD, 0x1F, 0xAE, 0x60, 0x61, 0x78, 0xFF, 0xFF, 0x9A, 0xFF, 0x54, 0x63, 0x12, 0x64, - 0x40, 0x46, 0x00, 0x64, 0x0F, 0xFA, 0xA1, 0xFF, 0xCB, 0xF1, 0x12, 0x61, 0x50, 0xFE, 0x8C, 0x44, - 0xCC, 0xF0, 0xBD, 0xDA, 0x40, 0x48, 0x04, 0x26, 0x40, 0x00, 0xA1, 0xFF, 0x8C, 0x44, 0xBD, 0xDA, - 0x30, 0xFB, 0x6C, 0x44, 0xBD, 0xDA, 0xFF, 0xFF, 0x01, 0x26, 0x24, 0x00, 0xD0, 0x80, 0xA1, 0xFF, - 0x8C, 0x44, 0x6C, 0x5C, 0xF2, 0xFE, 0xBD, 0xDA, 0xCD, 0xF3, 0xD4, 0x80, 0xD0, 0x80, 0xBD, 0xD8, - 0x2D, 0x44, 0x15, 0x0C, 0x32, 0x40, 0x02, 0x2A, 0x07, 0x00, 0x28, 0x42, 0x0C, 0xB2, 0x08, 0x3A, - 0x03, 0x00, 0x10, 0xBC, 0x40, 0x4D, 0x4D, 0x00, 0x03, 0x0A, 0xAE, 0x60, 0xF9, 0x78, 0xFF, 0xFF, - 0x11, 0xBC, 0x40, 0x4D, 0x28, 0x45, 0xBF, 0x60, 0xFF, 0x64, 0x24, 0x88, 0x42, 0x00, 0x30, 0xBC, - 0x40, 0x4D, 0x3F, 0x00, 0x20, 0xB9, 0x5C, 0x8E, 0xA1, 0xFF, 0x8C, 0x44, 0xBD, 0xDA, 0xDC, 0x9C, - 0x6C, 0x44, 0xF2, 0xFE, 0xBD, 0xDA, 0x08, 0x28, 0x44, 0x4E, 0xDC, 0x84, 0x2E, 0x5C, 0xB0, 0x84, - 0xEF, 0xB1, 0x08, 0x24, 0x40, 0xB9, 0x41, 0x46, 0x2C, 0x00, 0x8C, 0x44, 0x04, 0x61, 0xBD, 0xDA, - 0x50, 0xFE, 0x80, 0x27, 0x00, 0x64, 0x30, 0xFB, 0x8C, 0x44, 0xBD, 0xDA, 0xD0, 0x80, 0x8C, 0x44, - 0xBD, 0xDA, 0xD4, 0x80, 0x00, 0x65, 0x8C, 0x44, 0xCD, 0xF1, 0xBD, 0xDA, 0xD0, 0x80, 0x28, 0x44, - 0x03, 0x0C, 0xA0, 0x2A, 0x0A, 0x00, 0x11, 0x00, 0x10, 0x65, 0x60, 0x40, 0xC4, 0x36, 0x04, 0x00, - 0xD4, 0x3A, 0x08, 0x00, 0x27, 0x40, 0x40, 0x26, 0x30, 0x65, 0x00, 0x64, 0x3F, 0xFA, 0x46, 0x4E, - 0x35, 0x8D, 0x5F, 0x00, 0x40, 0x26, 0xF9, 0x01, 0x30, 0x65, 0x9D, 0xDC, 0x9D, 0xDC, 0x9D, 0xDC, - 0xF4, 0x01, 0x00, 0xE1, 0x23, 0x43, 0xE8, 0xA3, 0x6A, 0x62, 0x9A, 0xFF, 0xA1, 0xFF, 0x28, 0x44, - 0x03, 0x2B, 0x04, 0x00, 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x28, 0x44, 0x88, 0xB0, 0x88, 0x2A, - 0x03, 0x00, 0x70, 0x62, 0x7A, 0xDC, 0x28, 0x44, 0x40, 0x2B, 0x13, 0x00, 0x72, 0x62, 0x7A, 0xDC, - 0x04, 0xE6, 0x7A, 0xDC, 0x3B, 0xF2, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x2B, 0x02, 0x00, 0x7A, 0xDC, - 0x7A, 0xDC, 0x08, 0x60, 0x00, 0xEB, 0xFC, 0xA3, 0x25, 0xFF, 0x3F, 0xFC, 0x04, 0xA3, 0xB0, 0xFF, - 0x01, 0x00, 0x3F, 0xFC, 0xCF, 0x83, 0xDF, 0x83, 0x04, 0x02, 0x00, 0xF4, 0x10, 0x62, 0x6C, 0x61, - 0x1F, 0x00, 0x27, 0x03, 0xCB, 0x83, 0xFF, 0x60, 0xFE, 0x65, 0x0E, 0xA3, 0xA7, 0x84, 0xF2, 0xA3, - 0x00, 0xF4, 0x10, 0x62, 0x6C, 0x61, 0x7A, 0xDC, 0xFE, 0x1C, 0x03, 0x1D, 0x7C, 0xA8, 0xD9, 0x81, - 0x0A, 0x02, 0x00, 0xF4, 0x02, 0x62, 0xA7, 0x84, 0x7A, 0x61, 0x7A, 0xDC, 0xFE, 0x1C, 0xF9, 0x1D, - 0x7C, 0xA8, 0xD9, 0x81, 0xF6, 0x03, 0xFF, 0xB1, 0x0C, 0x1E, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x62, - 0xA1, 0xFF, 0x01, 0x60, 0x0C, 0xE1, 0xB6, 0xFF, 0xB7, 0xFF, 0xA1, 0xFF, 0xCD, 0x81, 0x6C, 0x44, - 0x5A, 0xDA, 0x98, 0xFF, 0x00, 0xE6, 0x7C, 0x44, 0x33, 0xFB, 0x01, 0x60, 0x0C, 0xE1, 0x83, 0xE1, - 0xA1, 0xFF, 0x8C, 0x44, 0x46, 0x45, 0xA1, 0xFF, 0x14, 0x63, 0x01, 0x10, 0xFE, 0x1F, 0x01, 0x60, - 0x08, 0xE1, 0x0A, 0x64, 0x60, 0x54, 0x47, 0xFF, 0x50, 0x4B, 0x67, 0x50, 0x69, 0xE2, 0x6A, 0x40, - 0x40, 0x2B, 0x01, 0x15, 0x29, 0x00, 0x6C, 0x40, 0x28, 0x40, 0x03, 0x26, 0x15, 0x00, 0x31, 0x40, - 0x20, 0x2A, 0x03, 0x00, 0x28, 0x40, 0x50, 0x3A, 0x0F, 0x00, 0x2D, 0x44, 0x20, 0x2A, 0x0C, 0x00, - 0x2B, 0x44, 0xAC, 0x80, 0x28, 0x40, 0xB4, 0x3A, 0x03, 0x00, 0x02, 0x03, 0x30, 0xFB, 0x04, 0x00, - 0x2B, 0x50, 0xA8, 0x60, 0x92, 0x78, 0x04, 0xE1, 0x04, 0xE1, 0xA1, 0xFF, 0x35, 0xF1, 0x26, 0x44, - 0x64, 0x54, 0xCD, 0xE2, 0x84, 0xBC, 0x2D, 0x40, 0x0C, 0x22, 0xFD, 0xB4, 0x40, 0x46, 0x23, 0x64, - 0x3A, 0xDB, 0xAB, 0x60, 0x6A, 0x78, 0xFF, 0xFF, 0x27, 0x40, 0x26, 0x22, 0x04, 0x00, 0x02, 0x64, - 0x31, 0xFB, 0xC0, 0xFE, 0xFF, 0xFF, 0x6C, 0x40, 0xB7, 0xFF, 0xB4, 0xFF, 0x48, 0x60, 0x2D, 0x7D, - 0x08, 0x60, 0x00, 0x6B, 0x37, 0xF3, 0x2B, 0x45, 0xD4, 0x80, 0xFF, 0xFF, 0x02, 0x28, 0x65, 0x44, - 0x60, 0x50, 0xA0, 0x4C, 0x20, 0xBC, 0xFF, 0xB4, 0xA0, 0x51, 0x35, 0xF1, 0x74, 0x44, 0xC0, 0x94, - 0x32, 0x40, 0x02, 0x2A, 0x18, 0x00, 0x28, 0x44, 0xA4, 0x36, 0x04, 0x00, 0x0C, 0xB4, 0xFF, 0xFF, - 0x04, 0x36, 0x11, 0x00, 0x26, 0x43, 0xFD, 0xB3, 0x04, 0xBB, 0x43, 0x46, 0x01, 0x2A, 0x03, 0x00, - 0x28, 0x47, 0x40, 0xBF, 0x40, 0x48, 0x0A, 0xBB, 0x0F, 0xFC, 0x50, 0x4B, 0x67, 0x50, 0x00, 0x64, - 0x30, 0xFB, 0x05, 0xFF, 0xC6, 0x01, 0x24, 0x64, 0x3A, 0xDB, 0x28, 0x44, 0x04, 0x2A, 0x03, 0x00, - 0xA7, 0x60, 0x8E, 0x78, 0xFF, 0xFF, 0x1D, 0xFF, 0x48, 0xE2, 0x27, 0x44, 0x06, 0x22, 0x05, 0x00, - 0xF9, 0xB4, 0x40, 0x47, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x26, 0x40, 0x10, 0x2A, 0x18, 0x00, - 0x26, 0xF2, 0xFF, 0xFF, 0x60, 0x47, 0xFF, 0xB4, 0xC0, 0xA0, 0xFF, 0xFF, 0x11, 0x0E, 0x98, 0xF1, - 0x1E, 0x60, 0xF8, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, - 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, - 0xAC, 0x60, 0x05, 0x78, 0xFF, 0xFF, 0x98, 0xF1, 0x1E, 0x60, 0xFA, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, - 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, - 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x2A, 0x64, 0x3A, 0xDB, 0x5C, 0x41, 0x87, 0xE1, - 0xA1, 0xFF, 0x6C, 0x40, 0x02, 0x00, 0x29, 0x64, 0x3A, 0xDB, 0x01, 0x60, 0x08, 0xE1, 0x87, 0xE1, - 0xA1, 0xFF, 0x6C, 0x40, 0x11, 0x00, 0x1F, 0x60, 0x0C, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, - 0xFF, 0xFF, 0x08, 0x28, 0xA2, 0xDB, 0xF1, 0x01, 0x01, 0x60, 0x08, 0xE1, 0x21, 0x64, 0x3A, 0xDB, - 0x03, 0x00, 0x01, 0x60, 0x08, 0xE1, 0x6C, 0x40, 0x00, 0x64, 0x33, 0xFB, 0x32, 0x74, 0x40, 0x63, - 0x01, 0x16, 0xFE, 0x01, 0x01, 0x68, 0x01, 0x11, 0x09, 0x00, 0xA7, 0x6A, 0x22, 0x64, 0x3A, 0xDB, - 0x03, 0x60, 0xC9, 0x63, 0x01, 0x11, 0x02, 0x00, 0x6C, 0x40, 0xFC, 0x1F, 0x6C, 0x40, 0xB5, 0xFF, - 0x6C, 0x40, 0xBC, 0xFF, 0x6C, 0x40, 0xB7, 0xFF, 0xB4, 0xFF, 0x48, 0x60, 0x2D, 0x7D, 0x08, 0x60, - 0x00, 0x6B, 0x03, 0x0A, 0xA7, 0x60, 0x9B, 0x78, 0xFF, 0xFF, 0x01, 0x64, 0x4F, 0xFB, 0x27, 0x44, - 0x06, 0x22, 0x06, 0x00, 0xF9, 0xB4, 0x40, 0x47, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x48, 0xE2, - 0x27, 0x64, 0x3A, 0xDB, 0xB3, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x54, 0x62, 0x22, 0x46, - 0xA2, 0xD0, 0x16, 0x63, 0x7C, 0x41, 0x44, 0x48, 0x80, 0x36, 0x04, 0x61, 0x28, 0x40, 0x50, 0x36, - 0x04, 0x61, 0x41, 0x4E, 0x28, 0x44, 0xA4, 0x36, 0x0E, 0x63, 0x12, 0x60, 0xC2, 0x62, 0xA2, 0xD1, - 0x24, 0x44, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xC0, 0x84, 0xA2, 0xDB, - 0x9A, 0xFF, 0xA1, 0xFF, 0x54, 0x62, 0xA2, 0xD2, 0xFF, 0xFF, 0x6A, 0x40, 0x80, 0x4E, 0x7A, 0xD4, - 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0xFF, 0xFF, 0x01, 0x1D, - 0x78, 0x00, 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0x28, 0x40, 0x03, 0x2B, 0x04, 0x00, - 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0x6A, 0x40, 0x70, 0x62, 0x28, 0x44, 0x88, 0xB0, 0x88, 0x36, - 0x7A, 0xD4, 0x28, 0x40, 0x40, 0x2B, 0x0B, 0x00, 0x72, 0x62, 0x7A, 0xD4, 0x7A, 0xD4, 0xA2, 0xD2, - 0xFF, 0xFF, 0x60, 0x40, 0x20, 0x2B, 0x02, 0x00, 0x7A, 0xD4, 0x7A, 0xD4, 0x46, 0x00, 0x23, 0x43, - 0xCF, 0x83, 0xDF, 0x83, 0x02, 0x03, 0x55, 0x03, 0x04, 0x00, 0x03, 0xF0, 0x04, 0xF4, 0x64, 0x42, - 0x37, 0x00, 0x2E, 0x40, 0x04, 0x2A, 0x21, 0x00, 0xA1, 0xFF, 0x02, 0xFE, 0x10, 0x25, 0x42, 0xFE, - 0x72, 0x45, 0x65, 0x4C, 0x95, 0xF3, 0x03, 0x04, 0xE4, 0xE2, 0xDC, 0x84, 0x95, 0xFB, 0xA1, 0xFF, - 0x80, 0x4C, 0x96, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0x96, 0xFB, 0x80, 0x4C, 0x97, 0xF3, 0x02, 0x04, - 0xDC, 0x84, 0x97, 0xFB, 0x80, 0x4C, 0x5C, 0x4E, 0xF8, 0xA3, 0x03, 0xF2, 0x9A, 0xF2, 0x04, 0xF4, - 0xFF, 0xB1, 0xF8, 0xA1, 0x06, 0xA4, 0x60, 0x42, 0x09, 0x00, 0x03, 0xF2, 0x9A, 0xF2, 0x04, 0xF4, - 0xC8, 0x82, 0xFF, 0xB1, 0x03, 0x00, 0x00, 0xF4, 0x81, 0xF2, 0xFF, 0xB1, 0x7A, 0xD4, 0xFF, 0xFF, - 0xFD, 0x1C, 0xF9, 0x1D, 0xFF, 0xB1, 0x17, 0x1E, 0x02, 0x02, 0x00, 0xF4, 0xDA, 0x82, 0xDA, 0x82, - 0xA2, 0xD2, 0xA1, 0xFF, 0x09, 0x74, 0x80, 0x4D, 0x0E, 0x00, 0x03, 0xF2, 0x9A, 0xF2, 0x04, 0xF4, - 0x23, 0x43, 0xA1, 0xFF, 0xA0, 0xD2, 0xFE, 0xA1, 0xCB, 0x83, 0x80, 0x4E, 0xAF, 0x83, 0x02, 0x1D, - 0x02, 0x03, 0xED, 0x01, 0xE3, 0x01, 0xA1, 0xFF, 0x28, 0x40, 0x40, 0x2B, 0x02, 0x00, 0x9C, 0x4E, - 0x9C, 0x4C, 0xA1, 0xFF, 0xDA, 0x83, 0x66, 0x44, 0x22, 0x46, 0x0C, 0xFA, 0x0B, 0xFC, 0x87, 0x4F, - 0x87, 0x4C, 0x87, 0x4F, 0x87, 0x4D, 0x87, 0x4C, 0x01, 0x08, 0x01, 0x00, 0xFF, 0xFF, 0x87, 0x4C, - 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0x6A, 0x44, 0xBC, 0xFF, 0x01, 0x60, - 0x08, 0xE1, 0x0C, 0x74, 0x04, 0xE1, 0xA1, 0xFF, 0x35, 0xF3, 0xC4, 0xE2, 0x60, 0x54, 0x89, 0xFF, - 0x13, 0x74, 0x88, 0xFF, 0x29, 0x44, 0xF7, 0xB4, 0x40, 0x49, 0x34, 0x64, 0x3A, 0xDB, 0x06, 0xE1, - 0x47, 0xFF, 0xA8, 0x60, 0x64, 0x78, 0xFF, 0xFF, 0xFF, 0x01, 0x08, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, - 0x43, 0xFF, 0x01, 0x60, 0x00, 0xE1, 0x28, 0xF3, 0x47, 0xFF, 0x60, 0x40, 0x07, 0x37, 0x4B, 0x00, - 0x05, 0x3B, 0x04, 0x00, 0xFF, 0x0A, 0x80, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x29, 0xF5, 0x2A, 0xF3, - 0x47, 0xFF, 0x3F, 0xF0, 0x01, 0x1B, 0x01, 0x64, 0x60, 0x56, 0xAD, 0xE2, 0xB5, 0xFF, 0x6C, 0x40, - 0x40, 0xE1, 0xA1, 0xFF, 0x00, 0xF4, 0x6E, 0x61, 0x12, 0x62, 0x64, 0x43, 0x01, 0xE1, 0x03, 0x64, - 0xE2, 0xD0, 0xC9, 0x81, 0x64, 0x4C, 0xCC, 0x84, 0xDA, 0x82, 0xFA, 0x02, 0x01, 0x60, 0x00, 0x6B, - 0x9A, 0xFF, 0xCA, 0x82, 0x03, 0x00, 0x00, 0xF4, 0x81, 0xF2, 0xFF, 0xFF, 0x7A, 0xD0, 0xA1, 0xFF, - 0x64, 0x4C, 0xFC, 0x1C, 0xF8, 0x1D, 0x00, 0xB9, 0x06, 0x1E, 0x02, 0x02, 0x00, 0xF4, 0xDA, 0x82, - 0x5A, 0xD2, 0xA1, 0xFF, 0x60, 0x4D, 0x3F, 0x40, 0x02, 0x2B, 0x08, 0x00, 0x28, 0xF3, 0xA5, 0x60, - 0xC4, 0x65, 0x60, 0x40, 0x0E, 0x3B, 0x02, 0x00, 0x80, 0x4C, 0xFE, 0x01, 0xA1, 0xFF, 0x87, 0x4E, - 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0x67, 0x4C, 0xFF, 0xFF, 0xBC, 0xFF, 0x00, 0xE1, - 0xD5, 0xFE, 0xA1, 0xFF, 0xFF, 0xFF, 0x00, 0x64, 0x40, 0x46, 0x60, 0x41, 0xB5, 0xFF, 0xB7, 0xFF, - 0xB4, 0xFF, 0x29, 0xF5, 0x3F, 0xF0, 0x24, 0xF2, 0x44, 0x43, 0x40, 0x44, 0x00, 0xF4, 0xF3, 0x60, - 0xA0, 0x65, 0x10, 0x62, 0x5A, 0xD2, 0xD9, 0x81, 0xD4, 0x80, 0xFF, 0xFF, 0xFB, 0x02, 0x61, 0x45, - 0x24, 0x44, 0xD4, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xFD, 0xA5, 0x48, 0x60, 0x00, 0x64, - 0xC4, 0x9D, 0x0D, 0x60, 0x00, 0x6B, 0x24, 0x44, 0xC0, 0x83, 0xBB, 0xFF, 0x29, 0xF5, 0x01, 0xE1, - 0x00, 0xF4, 0x6C, 0x61, 0x10, 0x62, 0x05, 0x00, 0x00, 0xF4, 0x01, 0xF2, 0xFF, 0xFF, 0x60, 0x41, - 0x04, 0x62, 0xA1, 0xFF, 0xFF, 0xFF, 0x01, 0x10, 0x1A, 0x00, 0x26, 0x44, 0x01, 0x26, 0x0C, 0x00, - 0x24, 0x44, 0xC8, 0x84, 0x40, 0x44, 0x02, 0x03, 0x6C, 0x45, 0xF3, 0x01, 0x03, 0x15, 0x01, 0x64, - 0x05, 0xFA, 0x15, 0x00, 0x6C, 0x45, 0xED, 0x01, 0x23, 0x44, 0xC8, 0x84, 0x40, 0x43, 0x02, 0x03, - 0x6C, 0x45, 0xE7, 0x01, 0x00, 0x64, 0x01, 0x15, 0x01, 0x64, 0x6C, 0x45, 0x05, 0xFB, 0xE2, 0xD2, - 0xDA, 0x82, 0xC9, 0x81, 0x60, 0x4C, 0xDD, 0x1C, 0xD7, 0x03, 0xBC, 0xFF, 0xDA, 0x01, 0x00, 0xE1, - 0xD5, 0xFE, 0xA1, 0xFF, 0xFF, 0xFF, 0x08, 0xE1, 0xA1, 0xFF, 0x67, 0x4C, 0x43, 0xFF, 0xAD, 0x4F, - 0x02, 0xBC, 0x00, 0x7F, 0xA0, 0x5D, 0x01, 0xE1, 0x01, 0x60, 0x69, 0x6B, 0xA5, 0x60, 0xC4, 0x64, - 0x60, 0x4C, 0xBB, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x60, 0x4C, 0xA1, 0xFF, 0xFF, 0xFF, 0x60, 0x4C, - 0xFC, 0x01, 0x29, 0xF3, 0x2A, 0xF1, 0x07, 0xB5, 0x04, 0xE1, 0x65, 0x41, 0x64, 0x54, 0xCD, 0xE2, - 0x95, 0x81, 0xA1, 0x5D, 0xA1, 0xFF, 0xFF, 0xFF, 0xF9, 0x01, 0x00, 0xE1, 0x30, 0x40, 0x02, 0x36, - 0xA1, 0xFF, 0x83, 0xFF, 0x8D, 0xFF, 0x5C, 0x44, 0x5C, 0x43, 0x5C, 0x42, 0x5C, 0x41, 0x5C, 0x40, - 0xAC, 0xFF, 0xAD, 0xFF, 0xE7, 0xE1, 0xB1, 0x60, 0xC0, 0x78, 0xFF, 0xFF, 0x10, 0x61, 0x7F, 0x60, - 0xC0, 0x64, 0xA0, 0x80, 0x7F, 0x67, 0x02, 0x63, 0x26, 0x02, 0x98, 0xFE, 0x1A, 0x05, 0x1B, 0x60, - 0xB8, 0x62, 0xA2, 0xD5, 0x0E, 0xF2, 0x15, 0x18, 0x02, 0x18, 0x09, 0xF4, 0xFB, 0x01, 0x23, 0x44, - 0x00, 0xA8, 0x08, 0x7E, 0x0A, 0x02, 0x66, 0x44, 0x11, 0xFB, 0x46, 0x43, 0x23, 0x47, 0x80, 0xBF, - 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x08, 0xB9, 0x10, 0x7E, 0x00, 0x7F, 0x0E, 0xFA, 0x00, 0x67, - 0x0A, 0x00, 0x20, 0x44, 0xDC, 0x85, 0x0F, 0xB4, 0xF6, 0xA0, 0x7F, 0x67, 0x07, 0x63, 0x03, 0x05, - 0x45, 0x40, 0x00, 0x67, 0xD8, 0xFE, 0xFF, 0x27, 0x05, 0xFD, 0x0A, 0x7E, 0x04, 0xFB, 0x61, 0x55, - 0x4A, 0x00, 0x28, 0xFB, 0x01, 0xF3, 0x29, 0xFB, 0x44, 0x46, 0x40, 0x45, 0x10, 0x61, 0x7E, 0x60, - 0xC0, 0x64, 0xA0, 0x80, 0x7F, 0x67, 0x02, 0x63, 0x31, 0x02, 0xB3, 0x60, 0x58, 0x4F, 0x22, 0x78, - 0xFF, 0xFF, 0x7F, 0x67, 0x03, 0x63, 0x2A, 0x02, 0x26, 0x40, 0x01, 0x2B, 0x24, 0x00, 0x98, 0xFE, - 0x19, 0x05, 0x1B, 0x60, 0xB8, 0x62, 0xA2, 0xD5, 0x0E, 0xF2, 0x14, 0x18, 0x02, 0x18, 0x09, 0xF4, - 0xFB, 0x01, 0x23, 0x44, 0x00, 0xA8, 0x08, 0x7E, 0x0A, 0x02, 0x66, 0x44, 0x11, 0xFB, 0x46, 0x43, - 0x23, 0x47, 0x80, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x08, 0xB9, 0x10, 0x7E, 0x00, 0x7F, - 0x0E, 0xFA, 0x09, 0x00, 0x20, 0x44, 0xDC, 0x85, 0x0F, 0xB4, 0xF6, 0xA0, 0x7F, 0x67, 0x07, 0x63, - 0x05, 0x05, 0x45, 0x40, 0xD8, 0xFE, 0x00, 0x67, 0xD0, 0xFE, 0xD9, 0xFE, 0xFF, 0x27, 0x05, 0xFD, - 0x0B, 0x7E, 0x04, 0xFB, 0x12, 0x60, 0xC8, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0x20, 0xB0, 0x80, 0xBC, - 0x08, 0x28, 0xA3, 0xDB, 0x61, 0x55, 0x63, 0x00, 0x04, 0xB5, 0x82, 0xB5, 0x25, 0x02, 0x04, 0x03, - 0x20, 0x44, 0x7F, 0xB4, 0x40, 0x40, 0xA3, 0xD3, 0x99, 0xFE, 0x04, 0x04, 0x02, 0xBC, 0xFE, 0xB4, - 0xA3, 0xDB, 0x56, 0x00, 0xBC, 0xF3, 0x20, 0x40, 0x80, 0x26, 0x52, 0x00, 0xA3, 0xD3, 0xFF, 0xA0, - 0xF8, 0xB4, 0x02, 0x02, 0xA3, 0xDB, 0x1C, 0x00, 0x04, 0xBC, 0xBF, 0xB4, 0xA3, 0xDB, 0x08, 0xB0, - 0x01, 0x64, 0x08, 0x24, 0x02, 0x64, 0x28, 0xFB, 0x20, 0x44, 0x80, 0xBC, 0x40, 0x40, 0xD0, 0xFE, - 0x3F, 0x00, 0xBF, 0xB4, 0xA3, 0xDB, 0x3C, 0x00, 0x40, 0xB0, 0xFF, 0xFF, 0xFA, 0x02, 0xF8, 0xB4, - 0xA3, 0xDB, 0x08, 0xB5, 0x07, 0x7C, 0x01, 0x02, 0xBC, 0xF9, 0x20, 0x44, 0x7F, 0xB4, 0x40, 0x40, - 0x12, 0x60, 0xC8, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0x20, 0xB5, 0x07, 0xB5, 0x08, 0x28, 0xC4, 0x02, - 0x99, 0xFE, 0x26, 0x05, 0x20, 0x44, 0x80, 0x26, 0x23, 0x00, 0x20, 0x2A, 0x00, 0x00, 0x40, 0x2A, - 0x1F, 0x00, 0xBF, 0xB4, 0x40, 0x40, 0x09, 0x00, 0xA8, 0xFF, 0x20, 0x44, 0x99, 0xFE, 0x02, 0x05, - 0x80, 0x2A, 0x03, 0x00, 0x40, 0xBC, 0x40, 0x40, 0x13, 0x00, 0x00, 0xF1, 0x80, 0xBC, 0x40, 0x40, - 0x64, 0x44, 0xE0, 0x84, 0xE8, 0x84, 0x0A, 0x36, 0x29, 0x01, 0x0B, 0x36, 0x5A, 0x01, 0x28, 0xFB, - 0x01, 0xF1, 0x29, 0xF9, 0x02, 0xF1, 0x2A, 0xF9, 0x03, 0xF1, 0x2B, 0xF9, 0xD0, 0xFE, 0xAE, 0xFF, - 0xA1, 0xFF, 0xFF, 0xFF, 0x82, 0x3E, 0x75, 0x44, 0x02, 0xB0, 0x01, 0xB0, 0x28, 0x02, 0xDC, 0x02, - 0x04, 0xB0, 0x08, 0xB0, 0x0B, 0x02, 0x20, 0x02, 0x40, 0x26, 0xA7, 0xFF, 0x8C, 0xFF, 0x75, 0x40, - 0x80, 0x2B, 0x01, 0x00, 0xAB, 0xFF, 0x75, 0x44, 0x8D, 0xFF, 0xEA, 0x01, 0x0A, 0xF3, 0xAA, 0xFF, - 0x60, 0x40, 0x20, 0x2B, 0x02, 0x00, 0x60, 0xFF, 0x0D, 0x00, 0x01, 0x26, 0x0C, 0x00, 0xC0, 0x60, - 0x00, 0x7C, 0xA0, 0x84, 0x80, 0x3B, 0x02, 0x00, 0xC0, 0x67, 0x03, 0x00, 0x40, 0x3B, 0x02, 0x00, - 0x00, 0x67, 0x0A, 0xFB, 0xD5, 0x01, 0xD4, 0x01, 0xAB, 0xFF, 0x00, 0x00, 0xD1, 0x01, 0x79, 0x63, - 0xFF, 0xFF, 0xFF, 0x1F, 0xA9, 0xFF, 0x77, 0x44, 0x60, 0x57, 0x10, 0x60, 0x00, 0x75, 0x40, 0x4A, - 0x01, 0x2A, 0x1C, 0x00, 0x24, 0x44, 0xAC, 0x86, 0x08, 0xF2, 0x18, 0x03, 0x1B, 0x60, 0xBE, 0x65, - 0xD4, 0x80, 0x0E, 0xF2, 0x02, 0x03, 0xA5, 0xD5, 0x04, 0x00, 0x01, 0xBC, 0x0E, 0xFA, 0x09, 0xF4, - 0xD1, 0xFE, 0x46, 0x44, 0x0B, 0x18, 0x66, 0x44, 0x10, 0xFB, 0x66, 0x47, 0x20, 0xBF, 0x3B, 0x42, - 0x04, 0xA2, 0xA2, 0xDB, 0x0E, 0xF2, 0x01, 0x75, 0x10, 0xBC, 0x0E, 0xFA, 0x2A, 0x44, 0x08, 0x2A, - 0x18, 0x00, 0x23, 0x44, 0x00, 0xA8, 0x5C, 0x43, 0x14, 0x03, 0x1B, 0x60, 0xB8, 0x62, 0xA2, 0xD5, - 0x01, 0x00, 0x09, 0xF4, 0x0E, 0xF2, 0x0D, 0x18, 0x08, 0xB0, 0x18, 0xAC, 0xFA, 0x03, 0x0E, 0xFA, - 0x66, 0x43, 0x11, 0xFD, 0x46, 0x43, 0x23, 0x47, 0x80, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, - 0x08, 0x75, 0x2A, 0x44, 0x06, 0x22, 0x2D, 0x00, 0x22, 0x44, 0x00, 0xA8, 0x60, 0x46, 0x0E, 0xF2, - 0x28, 0x03, 0x10, 0xB0, 0x01, 0xBC, 0x03, 0x02, 0x00, 0x64, 0x40, 0x42, 0x22, 0x00, 0x0E, 0xFA, - 0xD1, 0xFE, 0x1B, 0x60, 0xB2, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x80, 0x00, 0x46, 0x42, 0x19, 0x02, - 0x22, 0x47, 0x40, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x23, 0xF2, 0x66, 0x43, 0x00, 0xA8, - 0x0E, 0xF2, 0x08, 0x02, 0x60, 0x40, 0x02, 0x2A, 0xE4, 0x01, 0x12, 0xFD, 0x10, 0x64, 0x0E, 0xFA, - 0x02, 0x75, 0x07, 0x00, 0x60, 0x40, 0x04, 0x2A, 0xDC, 0x01, 0x12, 0xFD, 0x10, 0x64, 0x0E, 0xFA, - 0x04, 0x75, 0x2A, 0x44, 0x80, 0x2A, 0x19, 0x00, 0x21, 0x44, 0xAC, 0x86, 0x0E, 0xF2, 0x15, 0x03, - 0x01, 0xBC, 0x0E, 0xFA, 0xD1, 0xFE, 0x1B, 0x60, 0xCA, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x56, 0x00, - 0x46, 0x41, 0x0B, 0x02, 0x21, 0x47, 0x10, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x0E, 0xF2, - 0x66, 0x43, 0x08, 0xFD, 0x10, 0xBC, 0x0E, 0xFA, 0x80, 0x75, 0x2A, 0x44, 0x10, 0xB0, 0x20, 0x44, - 0x15, 0x03, 0x7F, 0xB4, 0x40, 0x40, 0x12, 0x60, 0xC8, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0x20, 0xB0, - 0x80, 0xB0, 0x09, 0x03, 0x08, 0x03, 0x40, 0xBC, 0x7F, 0xB4, 0x04, 0xB0, 0xA3, 0xDB, 0x03, 0x03, - 0x20, 0x44, 0x80, 0xBC, 0x40, 0x40, 0xB1, 0x60, 0x90, 0x78, 0xFF, 0xFF, 0xB1, 0x60, 0xC0, 0x78, - 0xFF, 0xFF, 0xE8, 0xFE, 0x14, 0x05, 0xEA, 0xFE, 0x24, 0x05, 0xE9, 0xFE, 0x1C, 0x05, 0xE7, 0xFE, - 0x09, 0x05, 0x47, 0xFF, 0x20, 0x44, 0x0F, 0x22, 0x03, 0x00, 0xCC, 0x84, 0x40, 0x40, 0x0F, 0x22, - 0xB8, 0xFE, 0xEC, 0x01, 0x23, 0x41, 0x00, 0xB9, 0x5C, 0x4A, 0xE8, 0x02, 0x6E, 0x01, 0x24, 0x41, - 0x00, 0xB9, 0x1B, 0x60, 0xBE, 0x65, 0x45, 0x47, 0xE1, 0x02, 0x58, 0x4F, 0x0F, 0x00, 0xDE, 0x02, - 0x5C, 0x4A, 0x46, 0x44, 0x50, 0x01, 0x22, 0x41, 0x00, 0xB9, 0x5C, 0x4A, 0x08, 0x24, 0x81, 0x01, - 0xD5, 0x01, 0x21, 0x41, 0x00, 0xB9, 0x5C, 0x4A, 0xA6, 0x03, 0xD0, 0x01, 0x27, 0xD3, 0x03, 0x00, - 0x10, 0xB0, 0x09, 0xF2, 0x04, 0x03, 0xAC, 0x86, 0x0E, 0xF2, 0xFA, 0x02, 0x08, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x0E, 0xF3, 0x0F, 0x60, 0xFE, 0x65, 0x0C, 0xF3, 0x24, 0x86, 0x24, 0x46, 0x60, 0x40, - 0xFB, 0x3B, 0x07, 0x00, 0x80, 0x26, 0x02, 0x00, 0x23, 0x46, 0x03, 0x4C, 0x46, 0x61, 0x3A, 0x65, - 0x0C, 0x00, 0x2E, 0xF3, 0x40, 0x45, 0xF8, 0x2B, 0x02, 0x00, 0x40, 0x45, 0x03, 0x00, 0x58, 0x4F, - 0x39, 0x00, 0x07, 0x02, 0x58, 0x4F, 0x45, 0x00, 0x04, 0x05, 0x66, 0x50, 0x65, 0x52, 0x61, 0x51, - 0x09, 0x00, 0x26, 0x47, 0x00, 0xBF, 0x0E, 0xFB, 0x2E, 0xF5, 0x05, 0xF0, 0x80, 0x60, 0x64, 0x50, - 0x00, 0x72, 0x7E, 0x71, 0xAC, 0xFF, 0xB1, 0x60, 0xC0, 0x78, 0xFF, 0xFF, 0x8E, 0xFF, 0x0F, 0xF3, - 0x0F, 0x60, 0xFE, 0x65, 0x24, 0x86, 0x0D, 0xF3, 0x2E, 0xF3, 0x40, 0x45, 0xF8, 0x2B, 0x02, 0x00, - 0x40, 0x45, 0x03, 0x00, 0x58, 0x4F, 0x16, 0x00, 0x07, 0x02, 0x58, 0x4F, 0x22, 0x00, 0x04, 0x05, - 0x66, 0x50, 0x65, 0x52, 0x61, 0x51, 0x09, 0x00, 0x26, 0x47, 0x00, 0xBF, 0x0F, 0xFB, 0x2E, 0xF5, - 0x05, 0xF0, 0x80, 0x60, 0x64, 0x50, 0x00, 0x72, 0x7E, 0x71, 0x8D, 0xFF, 0xAD, 0xFF, 0xB1, 0x60, - 0xC0, 0x78, 0xFF, 0xFF, 0x25, 0x44, 0x8A, 0xF1, 0x8B, 0xF1, 0xD0, 0x80, 0xD0, 0x80, 0x07, 0x04, - 0x01, 0x06, 0x05, 0x00, 0x25, 0x46, 0x01, 0xF0, 0x03, 0x67, 0xA0, 0x85, 0x94, 0x80, 0x2F, 0x58, - 0xFF, 0xFF, 0x25, 0x46, 0x26, 0x41, 0x46, 0x63, 0x01, 0xF2, 0xFF, 0xFF, 0xFF, 0xB5, 0xD5, 0x81, - 0x00, 0xF2, 0x05, 0x04, 0x04, 0x63, 0x60, 0x46, 0xF7, 0x1B, 0x42, 0xFE, 0x0D, 0x00, 0x61, 0x44, - 0xC5, 0x81, 0x63, 0x45, 0xC5, 0x81, 0x9C, 0x84, 0xDC, 0x84, 0x01, 0xF2, 0xF0, 0x85, 0xF0, 0x80, - 0x65, 0x44, 0xF8, 0x85, 0xFF, 0xFF, 0x02, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xA2, 0xFF, 0x1B, 0x60, - 0xD0, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xAC, 0x86, 0x0E, 0xF2, 0x07, 0x03, 0x00, 0xA8, 0x09, 0xF2, - 0xFA, 0x02, 0x01, 0x67, 0x0E, 0xFA, 0x08, 0xFE, 0x17, 0x00, 0x8C, 0xF3, 0xFF, 0xFF, 0xD8, 0xA0, - 0x00, 0xB4, 0x12, 0x06, 0x09, 0x60, 0x08, 0x61, 0x41, 0x4A, 0x7C, 0xA1, 0x0E, 0xA1, 0xA2, 0xFF, - 0xB3, 0x60, 0x58, 0x4E, 0x97, 0x78, 0xFF, 0xFF, 0xA3, 0xFF, 0x06, 0x03, 0x2A, 0x43, 0xB3, 0x60, - 0x58, 0x4E, 0xB8, 0x78, 0xFF, 0xFF, 0x08, 0xFE, 0xA3, 0xFF, 0x2D, 0x58, 0xFF, 0xFF, 0x41, 0x4A, - 0x7C, 0xA1, 0x0E, 0xA1, 0xA2, 0xFF, 0xB3, 0x60, 0x58, 0x4E, 0x97, 0x78, 0xFF, 0xFF, 0x07, 0x03, - 0x2A, 0x43, 0xB3, 0x60, 0x58, 0x4E, 0xB8, 0x78, 0xFF, 0xFF, 0x08, 0xFE, 0x0D, 0x00, 0x1B, 0x60, - 0xD0, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xAC, 0x86, 0x0E, 0xF2, 0x06, 0x03, 0x00, 0xA8, 0x09, 0xF2, - 0xFA, 0x02, 0x01, 0x67, 0x0E, 0xFA, 0x08, 0xFE, 0xA3, 0xFF, 0x2D, 0x58, 0xFF, 0xFF, 0x8D, 0xF3, - 0x7C, 0x63, 0x00, 0xBE, 0x40, 0x45, 0x1A, 0x03, 0x00, 0x65, 0x65, 0x44, 0xDC, 0x85, 0x84, 0xA1, - 0x00, 0xF2, 0x06, 0x06, 0x01, 0xFC, 0x00, 0xA8, 0x60, 0x46, 0xF7, 0x02, 0x40, 0x45, 0x0E, 0x00, - 0x8C, 0xF3, 0x00, 0x63, 0xD4, 0x84, 0x8C, 0xFB, 0x80, 0x60, 0x7C, 0x64, 0x01, 0xFA, 0x00, 0xF0, - 0x00, 0xFC, 0xD3, 0x80, 0x8D, 0xF9, 0x02, 0x02, 0x8E, 0xF9, 0x08, 0xFE, 0x2E, 0x58, 0xFF, 0xFF, - 0x66, 0x44, 0x25, 0x46, 0x05, 0xFA, 0x06, 0xFA, 0x01, 0xF0, 0x03, 0x67, 0x02, 0xFC, 0xB0, 0x84, - 0x3A, 0x7E, 0x01, 0xFA, 0x12, 0x64, 0x03, 0xFA, 0x00, 0xF0, 0x04, 0xF8, 0x00, 0x64, 0x0C, 0x61, - 0x10, 0x63, 0x59, 0xDA, 0xFE, 0x1F, 0x2E, 0x58, 0xFF, 0xFF, 0x27, 0x43, 0xE3, 0x81, 0xE9, 0x81, - 0x03, 0x05, 0x16, 0x03, 0x00, 0x61, 0x01, 0x00, 0xE4, 0x63, 0x61, 0x46, 0xBF, 0xD2, 0x27, 0x45, - 0xDC, 0x84, 0xA2, 0xDA, 0xBE, 0xD2, 0x25, 0x46, 0x88, 0xF8, 0x04, 0x1B, 0x25, 0x44, 0x61, 0x46, - 0xA3, 0xDA, 0x04, 0x00, 0x0A, 0xFA, 0x60, 0x46, 0x25, 0x44, 0x09, 0xFA, 0x61, 0x46, 0xBE, 0xDA, - 0x2F, 0x58, 0xFF, 0xFF, 0x25, 0x44, 0x00, 0xA8, 0x07, 0x4B, 0x0C, 0x03, 0x58, 0x4F, 0x33, 0x00, - 0x0B, 0x47, 0x1B, 0x60, 0xC4, 0x65, 0x27, 0x44, 0xD4, 0x80, 0x00, 0x64, 0x01, 0x02, 0x0F, 0xFA, - 0x58, 0x4F, 0xD3, 0x01, 0x70, 0x00, 0x25, 0x43, 0xE3, 0x84, 0x7C, 0x41, 0x02, 0x04, 0xE8, 0x81, - 0xE4, 0x63, 0x61, 0x46, 0xA3, 0xD2, 0x00, 0x7C, 0x40, 0x45, 0xBF, 0xD8, 0xA3, 0xD8, 0xBE, 0xD8, - 0x27, 0x42, 0x5A, 0xD3, 0x25, 0x5C, 0x60, 0x41, 0x02, 0x1B, 0x27, 0xD9, 0x05, 0x00, 0x25, 0x46, - 0x0A, 0xFA, 0x61, 0x46, 0x25, 0x44, 0x09, 0xFA, 0x25, 0x44, 0x27, 0x43, 0x00, 0x61, 0x60, 0x46, - 0x09, 0xF2, 0x08, 0xFC, 0x00, 0xA8, 0xDD, 0x81, 0xFA, 0x02, 0xBF, 0xD1, 0x66, 0x44, 0xBE, 0xDB, - 0xC1, 0x84, 0xBF, 0xDB, 0x48, 0x00, 0x25, 0x46, 0xE4, 0x63, 0x08, 0xF2, 0x89, 0xF2, 0x1E, 0x18, - 0x40, 0x47, 0xE0, 0x84, 0xE8, 0x85, 0x02, 0x05, 0xE8, 0x83, 0x00, 0x65, 0x65, 0x46, 0xBF, 0xD2, - 0x61, 0x5C, 0xCC, 0x84, 0xA2, 0xDA, 0x25, 0x46, 0x0A, 0xF2, 0x00, 0xB9, 0x65, 0x46, 0x08, 0x24, - 0xBE, 0xDA, 0x02, 0x1B, 0xA3, 0xD8, 0x02, 0x00, 0x60, 0x46, 0x89, 0xFA, 0x00, 0xB9, 0x61, 0x46, - 0x08, 0x28, 0x0A, 0xFA, 0x25, 0x46, 0x89, 0xFC, 0x8A, 0xFC, 0x88, 0xFC, 0x2F, 0x58, 0xFF, 0xFF, - 0x00, 0x61, 0x28, 0x65, 0x25, 0x43, 0x8E, 0xF3, 0xAF, 0x83, 0x00, 0xBE, 0x18, 0x03, 0x02, 0x03, - 0x00, 0xFC, 0x01, 0x00, 0x8D, 0xFD, 0x63, 0x46, 0x65, 0x44, 0xCC, 0x85, 0x00, 0xF2, 0x07, 0x02, - 0x8E, 0xF5, 0x00, 0x64, 0x00, 0xFA, 0xDE, 0x60, 0xAF, 0x64, 0x09, 0xFB, 0x08, 0x00, 0x66, 0x43, - 0x00, 0xBE, 0xDD, 0x81, 0xF1, 0x02, 0x8C, 0xF1, 0x8E, 0xFD, 0xC1, 0x84, 0x8C, 0xFB, 0x2E, 0x58, - 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x45, 0x29, 0x43, 0xFC, 0xA3, 0x66, 0x44, 0xBD, 0xDB, 0x25, 0x44, - 0xBD, 0xDB, 0x00, 0x64, 0xBD, 0xDB, 0x03, 0x61, 0x0E, 0x65, 0x1B, 0x60, 0xD8, 0x63, 0x43, 0x49, - 0xA3, 0xD3, 0x06, 0xA3, 0x00, 0xA8, 0xCD, 0x81, 0x04, 0x02, 0xF9, 0x02, 0xB1, 0x60, 0xC0, 0x78, - 0xFF, 0xFF, 0x01, 0x26, 0xE6, 0x01, 0xD4, 0x80, 0x60, 0x45, 0xE3, 0x05, 0xF6, 0xA3, 0xBD, 0xD1, - 0xBD, 0xD1, 0x44, 0x47, 0x44, 0x48, 0x44, 0x45, 0x1C, 0x60, 0x16, 0x64, 0x44, 0xD7, 0xFF, 0xFF, - 0xFF, 0xFF, 0x48, 0xFE, 0x8D, 0xF5, 0x8C, 0xF3, 0x0D, 0x18, 0xCC, 0x84, 0x8C, 0xFB, 0x80, 0x60, - 0x7C, 0x64, 0x01, 0xFA, 0x00, 0x64, 0x00, 0xF0, 0x00, 0xFA, 0xD0, 0x80, 0x8D, 0xF9, 0x02, 0x02, - 0x8E, 0xF9, 0x08, 0xFE, 0x2E, 0x58, 0xFF, 0xFF, 0x1B, 0x60, 0x88, 0x63, 0x0D, 0x65, 0x00, 0x61, - 0x41, 0x48, 0xA3, 0xD3, 0x06, 0xA3, 0xAC, 0x86, 0x00, 0x61, 0x09, 0x03, 0x00, 0xF2, 0x09, 0xF0, - 0xAC, 0x86, 0x00, 0xF2, 0xDD, 0x81, 0xFC, 0x02, 0x64, 0x44, 0xAC, 0x86, 0xF6, 0x01, 0x61, 0x44, - 0x25, 0x46, 0x27, 0xDA, 0x65, 0x44, 0x28, 0x45, 0x45, 0x88, 0xCC, 0x85, 0x5A, 0x87, 0xE9, 0x02, - 0x00, 0x64, 0x27, 0xDA, 0x5A, 0xDA, 0x5A, 0x87, 0x88, 0xF3, 0x87, 0xF1, 0x02, 0xA4, 0x60, 0x46, - 0x60, 0x45, 0x00, 0x61, 0x1E, 0xF2, 0xFF, 0xFF, 0xAC, 0x86, 0x00, 0xF2, 0x04, 0x03, 0xAC, 0x86, - 0x00, 0xF2, 0xDD, 0x81, 0xFC, 0x02, 0x65, 0x44, 0x02, 0xA5, 0x65, 0x46, 0x64, 0x44, 0xCC, 0x9C, - 0xFF, 0xFF, 0xF0, 0x02, 0x61, 0x44, 0x25, 0x46, 0x27, 0xDA, 0x5A, 0x87, 0x28, 0x45, 0x45, 0x88, - 0x88, 0xF3, 0x87, 0xF1, 0x02, 0xA4, 0x60, 0x46, 0x60, 0x45, 0x00, 0x61, 0x72, 0xF2, 0xFF, 0xFF, - 0xAC, 0x86, 0x00, 0xF2, 0x09, 0x03, 0x00, 0xF2, 0x09, 0xF0, 0xAC, 0x86, 0x00, 0xF2, 0xDD, 0x81, - 0xFC, 0x02, 0x64, 0x44, 0xAC, 0x86, 0xF6, 0x01, 0x65, 0x44, 0x02, 0xA5, 0x65, 0x46, 0x64, 0x44, - 0xCC, 0x9C, 0x61, 0x44, 0xEB, 0x02, 0x25, 0x46, 0x27, 0xDA, 0x5A, 0x87, 0x28, 0x45, 0x45, 0x88, - 0x06, 0x60, 0x40, 0x65, 0x8D, 0xF3, 0x01, 0x61, 0xAC, 0x86, 0x00, 0xF2, 0x03, 0x03, 0xD5, 0x80, - 0xDD, 0x81, 0xFA, 0x04, 0xCD, 0x84, 0x25, 0x46, 0x27, 0xDA, 0x28, 0x45, 0xC4, 0x84, 0x5A, 0xDA, - 0xDA, 0x81, 0x8C, 0xF1, 0x59, 0xD8, 0x1B, 0x60, 0x86, 0x64, 0x18, 0x63, 0xA0, 0xD1, 0x06, 0xA4, - 0x59, 0xD8, 0xFC, 0x1F, 0x00, 0x64, 0x59, 0xDA, 0x59, 0xDA, 0x01, 0x60, 0x1C, 0x64, 0x0A, 0x63, - 0x58, 0xD1, 0x59, 0xD8, 0xFD, 0x1F, 0x7E, 0xF1, 0x59, 0xD8, 0x45, 0x01, 0x07, 0x4B, 0xB4, 0x60, - 0x58, 0x4F, 0x23, 0x78, 0xFF, 0xFF, 0x0B, 0x47, 0x58, 0x4F, 0x21, 0x00, 0x3C, 0x01, 0x07, 0x4B, - 0xB4, 0x60, 0x58, 0x4F, 0x23, 0x78, 0xFF, 0xFF, 0x0B, 0x47, 0x27, 0x44, 0x00, 0xBE, 0x08, 0xF0, - 0x15, 0x03, 0x64, 0x42, 0x4A, 0xD3, 0x09, 0xF2, 0xDC, 0x83, 0xA2, 0xDD, 0x25, 0x43, 0x09, 0xFC, - 0x63, 0x46, 0x27, 0x43, 0x0A, 0xFC, 0x09, 0xFA, 0x08, 0xF8, 0x00, 0xA8, 0x66, 0x43, 0x03, 0x02, - 0x64, 0x44, 0x58, 0xDD, 0x03, 0x00, 0x60, 0x46, 0x25, 0x44, 0x0A, 0xFA, 0x1C, 0x01, 0x27, 0x43, - 0xE3, 0x81, 0xE9, 0x81, 0x03, 0x05, 0x16, 0x03, 0x00, 0x61, 0x01, 0x00, 0xE4, 0x63, 0x61, 0x46, - 0xBF, 0xD2, 0x27, 0x45, 0xDC, 0x84, 0xA2, 0xDA, 0xA3, 0xD2, 0x25, 0x46, 0x88, 0xF8, 0x04, 0x1B, - 0x25, 0x44, 0x61, 0x46, 0xBE, 0xDA, 0x04, 0x00, 0x09, 0xFA, 0x60, 0x46, 0x25, 0x44, 0x0A, 0xFA, - 0x61, 0x46, 0xA3, 0xDA, 0x2F, 0x58, 0xFF, 0xFF, 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x03, 0x02, - 0x28, 0xE2, 0x40, 0xFF, 0xA1, 0xFF, 0x84, 0xFF, 0xBF, 0x60, 0xAD, 0x64, 0x40, 0x42, 0xB5, 0x60, - 0xA2, 0x64, 0x40, 0x40, 0x9D, 0xF3, 0x66, 0xFB, 0x0F, 0x60, 0x9A, 0x63, 0xAA, 0xF3, 0xBD, 0xDB, - 0x00, 0x60, 0x9A, 0x64, 0xBD, 0xDB, 0x02, 0x64, 0xBD, 0xDB, 0x04, 0x64, 0xA3, 0xDB, 0x5C, 0x49, - 0x0A, 0x64, 0x40, 0x4B, 0x5C, 0x5C, 0x01, 0x60, 0x39, 0xE2, 0x04, 0x60, 0x00, 0x7A, 0x89, 0xFF, - 0x03, 0x60, 0xFF, 0x73, 0x88, 0xFF, 0xB5, 0x60, 0xA2, 0x78, 0xFF, 0xFF, 0xA0, 0xFE, 0x07, 0x05, - 0xA3, 0xFE, 0x07, 0x05, 0xA1, 0xFE, 0x50, 0x05, 0x60, 0x64, 0x3B, 0xDB, 0x10, 0x00, 0x20, 0x58, - 0xFF, 0xFF, 0xFA, 0x01, 0x12, 0x60, 0xCC, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0xFB, 0xB4, 0xA3, 0xDB, - 0xA0, 0x4C, 0x59, 0xBC, 0xFF, 0xB4, 0xA0, 0x51, 0xA0, 0x4C, 0x7D, 0xB4, 0xA0, 0x51, 0xA1, 0xFF, - 0xFF, 0xFF, 0x83, 0x3E, 0x40, 0x60, 0x0B, 0x65, 0x2B, 0x44, 0x00, 0x63, 0xE8, 0x80, 0xF8, 0x84, - 0x02, 0x24, 0x94, 0x84, 0xF3, 0x83, 0xCD, 0x81, 0xFF, 0xFF, 0xF8, 0x02, 0xDF, 0x83, 0x2F, 0x58, - 0x40, 0x4B, 0x00, 0x62, 0x01, 0x64, 0xD4, 0x80, 0xE0, 0x84, 0x1A, 0x03, 0xD4, 0x80, 0xE0, 0x84, - 0x15, 0x03, 0x61, 0x44, 0x11, 0x61, 0xE0, 0x84, 0xCD, 0x81, 0xFD, 0x04, 0x01, 0x00, 0xE0, 0x84, - 0xF2, 0x82, 0xFF, 0xFF, 0x02, 0x24, 0xC6, 0x82, 0x02, 0x28, 0xD6, 0x82, 0xE2, 0x80, 0xCD, 0x81, - 0x02, 0x28, 0x01, 0xBC, 0xF4, 0x02, 0x01, 0x2A, 0xC6, 0x82, 0x03, 0x00, 0xE9, 0x81, 0xF2, 0x82, - 0x61, 0x44, 0x2D, 0x58, 0xFF, 0xFF, 0x00, 0xA8, 0x10, 0x61, 0x04, 0x03, 0xF0, 0x84, 0xCD, 0x81, - 0xFD, 0x04, 0x61, 0x44, 0x2D, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x3B, 0xDB, 0x16, 0x60, 0xA8, 0x63, - 0xBD, 0xD3, 0xA3, 0xD1, 0x60, 0x40, 0x04, 0x3A, 0x2D, 0x00, 0x00, 0x64, 0x4A, 0xDB, 0x1B, 0x60, - 0x88, 0x63, 0xA3, 0xD3, 0x46, 0x43, 0xAC, 0x86, 0x3C, 0x45, 0x23, 0x03, 0xD4, 0x80, 0x07, 0xF2, - 0x02, 0x02, 0x09, 0xF2, 0xF8, 0x01, 0xD0, 0x80, 0x09, 0xF2, 0xF5, 0x02, 0x60, 0x43, 0x80, 0x67, - 0xB0, 0x81, 0x1B, 0x60, 0xDA, 0x62, 0x61, 0x44, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x09, 0x60, 0x08, 0x65, 0x0E, 0xF2, 0x02, 0xF2, 0x60, 0x40, - 0xF0, 0x37, 0x05, 0x00, 0x90, 0xF3, 0xD4, 0x80, 0xCC, 0x84, 0x01, 0x02, 0x90, 0xFB, 0x63, 0x44, - 0xDA, 0x01, 0x23, 0x46, 0x3C, 0x44, 0xAC, 0x80, 0xFF, 0xFF, 0x89, 0x02, 0x6A, 0xF3, 0x6B, 0xF3, - 0x02, 0xA8, 0x02, 0xA8, 0x08, 0x02, 0x00, 0x64, 0x6C, 0xFB, 0x6A, 0xFB, 0x6B, 0xFB, 0x00, 0x64, - 0x6D, 0xFB, 0xCA, 0xFE, 0x97, 0x00, 0x03, 0x02, 0x00, 0x64, 0x6B, 0xFB, 0xCA, 0xFE, 0x01, 0x64, - 0x3B, 0xDB, 0x1B, 0x60, 0x8E, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x35, 0x03, - 0x2C, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x26, 0x8A, 0x00, 0x2E, 0xF2, 0x12, 0x60, 0xCE, 0x65, - 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, - 0x16, 0x18, 0x61, 0x46, 0x2E, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, - 0x2D, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x2C, 0xF0, 0x63, 0x46, - 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0x88, 0xF3, - 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x63, 0x02, 0x66, 0x45, 0x63, 0x46, 0x06, 0xF2, 0x65, 0x46, - 0x80, 0xB0, 0x09, 0xF2, 0x5C, 0x03, 0xAC, 0x86, 0xCA, 0x01, 0x6B, 0xF3, 0xFF, 0xFF, 0x01, 0xA8, - 0xFF, 0xFF, 0x50, 0x02, 0x1B, 0x60, 0xA0, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, - 0x0F, 0x03, 0x77, 0xF1, 0x07, 0xF2, 0xFF, 0xFF, 0xD0, 0x80, 0x09, 0xF2, 0x03, 0x02, 0xAC, 0x86, - 0x07, 0xF2, 0xFA, 0x02, 0x03, 0x02, 0x00, 0x64, 0x77, 0xFB, 0xEC, 0x01, 0x46, 0x5C, 0x3F, 0x00, - 0x1B, 0x60, 0xA6, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x01, 0x03, 0x37, 0x02, - 0x6C, 0xF3, 0xFF, 0xFF, 0x01, 0xA8, 0xFF, 0xFF, 0x14, 0x02, 0x1B, 0x60, 0x94, 0x62, 0xA2, 0xD3, - 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x0B, 0x03, 0x2A, 0xF0, 0x20, 0x67, 0x09, 0xF2, 0xB0, 0x83, - 0x00, 0xA8, 0x00, 0x64, 0x02, 0x03, 0x2A, 0xFC, 0x01, 0x00, 0x6C, 0xFB, 0x20, 0x00, 0x00, 0x64, - 0x6C, 0xFB, 0x1B, 0x60, 0x88, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x12, 0x03, - 0x2A, 0xF0, 0x08, 0x67, 0xA0, 0x80, 0xFF, 0xFF, 0x12, 0x03, 0x77, 0xF1, 0x07, 0xF2, 0xFF, 0xFF, - 0xD0, 0x80, 0x09, 0xF2, 0x03, 0x02, 0xAC, 0x86, 0x07, 0xF2, 0xFA, 0x02, 0x08, 0x02, 0x00, 0x64, - 0x77, 0xFB, 0xE7, 0x01, 0x00, 0x64, 0x77, 0xFB, 0xB5, 0x60, 0xA2, 0x78, 0xFF, 0xFF, 0x66, 0x44, - 0xFC, 0xFB, 0x46, 0x5C, 0x21, 0x60, 0x98, 0x63, 0xA3, 0xD3, 0xB5, 0x60, 0x58, 0x4D, 0xE3, 0x78, - 0xFF, 0xFF, 0x0D, 0xF2, 0x60, 0x5C, 0x64, 0x5F, 0x0D, 0xFA, 0x07, 0xF0, 0x2A, 0xF2, 0xFF, 0xFF, - 0x77, 0xF9, 0x60, 0x40, 0x08, 0x2B, 0x05, 0x00, 0x00, 0x64, 0x48, 0xFB, 0xB8, 0x60, 0x2D, 0x78, - 0xFF, 0xFF, 0x00, 0x64, 0xD0, 0x80, 0x88, 0xF3, 0x07, 0x02, 0x23, 0xF0, 0x04, 0x64, 0xB0, 0x84, - 0xA2, 0xDA, 0xBD, 0x60, 0x28, 0x78, 0xFF, 0xFF, 0xD0, 0x80, 0xB8, 0xF3, 0x03, 0x03, 0x60, 0x40, - 0x03, 0x3A, 0x00, 0x00, 0x2A, 0xF2, 0x00, 0x63, 0x40, 0x47, 0x50, 0x36, 0x01, 0x00, 0x01, 0x63, - 0x48, 0xFD, 0x4A, 0xF3, 0x35, 0xFA, 0x10, 0xA4, 0x4A, 0xFB, 0x00, 0x64, 0x15, 0xFA, 0x16, 0xFA, - 0x0F, 0xFA, 0xFF, 0xFF, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x0E, 0xF0, 0x63, 0x46, 0x00, 0x7F, - 0x64, 0x5E, 0x4B, 0xFB, 0x64, 0x44, 0x00, 0x7E, 0xBB, 0xFB, 0x07, 0xF0, 0x88, 0xF3, 0xFF, 0xFF, - 0xD0, 0x80, 0xFF, 0xFF, 0x03, 0x03, 0xBB, 0xF3, 0xBA, 0xFB, 0x60, 0x41, 0x03, 0xF2, 0x00, 0xF4, - 0x01, 0xF2, 0xFC, 0xA5, 0x00, 0x7F, 0xD4, 0x84, 0x27, 0x45, 0x3C, 0x46, 0x1A, 0xFA, 0x22, 0x63, - 0x7B, 0x60, 0xFF, 0x64, 0xA4, 0x84, 0x03, 0x2B, 0x1C, 0x63, 0x2A, 0xFA, 0x60, 0x40, 0xA4, 0x36, - 0x14, 0x63, 0x43, 0x4C, 0x00, 0x7C, 0x22, 0xF8, 0x64, 0x41, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, - 0x36, 0xF2, 0x63, 0x46, 0xFF, 0xB4, 0x22, 0xFA, 0x60, 0x40, 0x00, 0x36, 0x8E, 0x00, 0x2A, 0xF2, - 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x3A, 0x89, 0x00, 0x03, 0xF2, 0x00, 0xF4, 0xA0, 0xD2, 0xAA, 0x60, - 0xAA, 0x65, 0x5A, 0xD0, 0xD4, 0x80, 0x03, 0x64, 0x0A, 0x02, 0xD0, 0x80, 0x00, 0x64, 0x5A, 0xD0, - 0x06, 0x02, 0xD0, 0x80, 0xF8, 0x7F, 0xD0, 0x80, 0x01, 0x03, 0x01, 0x02, 0x01, 0x61, 0x62, 0x43, - 0x46, 0x43, 0x3C, 0x46, 0x07, 0xF4, 0x36, 0xF2, 0xFF, 0xFF, 0xA3, 0x46, 0x60, 0x40, 0x22, 0x26, - 0x45, 0x00, 0x60, 0x45, 0x63, 0x42, 0x5A, 0xD0, 0xCD, 0x81, 0x3C, 0x46, 0x14, 0x02, 0x64, 0x44, - 0x88, 0x3A, 0x11, 0x00, 0x8E, 0x3B, 0x0F, 0x00, 0x65, 0x44, 0x01, 0x26, 0x5E, 0x00, 0x04, 0x26, - 0x03, 0x00, 0x10, 0x26, 0x01, 0x00, 0x2D, 0x00, 0xA3, 0x46, 0x37, 0xF2, 0xFF, 0xFF, 0x60, 0x40, - 0x80, 0x2B, 0x53, 0x00, 0x3A, 0x00, 0xA3, 0x46, 0x65, 0x44, 0x01, 0x26, 0x0B, 0x00, 0x04, 0x26, - 0x03, 0x00, 0x10, 0x26, 0x01, 0x00, 0x1D, 0x00, 0x37, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x27, - 0x2C, 0x00, 0x17, 0x00, 0x88, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0x36, 0xF2, 0x66, 0x43, 0xFF, 0xB4, - 0x3C, 0x46, 0x22, 0xF0, 0x60, 0x47, 0xB0, 0x84, 0x22, 0xFA, 0x63, 0x46, 0x37, 0xF0, 0x60, 0x40, - 0x04, 0x27, 0x03, 0x00, 0x10, 0x27, 0x01, 0x00, 0x04, 0x00, 0x64, 0x40, 0x80, 0x27, 0x15, 0x00, - 0x00, 0x00, 0x3C, 0x46, 0x02, 0x65, 0xBC, 0x60, 0x58, 0x78, 0xFF, 0xFF, 0xCD, 0x81, 0x63, 0x42, - 0x5A, 0xD0, 0x3C, 0x46, 0x0A, 0x02, 0x64, 0x44, 0x88, 0x3A, 0x07, 0x00, 0x77, 0x37, 0x1D, 0x00, - 0x78, 0x37, 0x1B, 0x00, 0x8E, 0x37, 0x19, 0x00, 0xF1, 0x01, 0x3C, 0x46, 0x22, 0xF0, 0x80, 0x67, - 0xB0, 0x84, 0xA2, 0xDA, 0xFF, 0xFF, 0x3F, 0xF2, 0x3E, 0xF0, 0x08, 0xA4, 0x60, 0x41, 0x22, 0xF2, - 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x26, 0x03, 0x00, 0x04, 0x26, 0x03, 0x00, 0x06, 0x00, 0x04, 0x2B, - 0x04, 0x00, 0x61, 0x44, 0x64, 0x40, 0x10, 0x26, 0x3F, 0xFA, 0x3C, 0x46, 0x2C, 0xF2, 0x27, 0x40, - 0x01, 0x27, 0x32, 0xF2, 0xB5, 0xF1, 0x60, 0x40, 0x01, 0x26, 0x53, 0x00, 0x09, 0x60, 0x00, 0x64, - 0xD0, 0x80, 0x3F, 0xF2, 0x09, 0x06, 0x2C, 0x45, 0xC4, 0x84, 0xD0, 0x80, 0x40, 0x4A, 0x40, 0x06, - 0x60, 0x43, 0x64, 0x44, 0x54, 0x88, 0x18, 0x00, 0x60, 0x45, 0x1F, 0x60, 0x9C, 0x64, 0xA0, 0xD3, - 0xBB, 0xF3, 0x00, 0xBC, 0x60, 0x47, 0xEC, 0xA0, 0x33, 0x03, 0x32, 0x07, 0x2C, 0x44, 0xC4, 0x81, - 0x02, 0x60, 0x1C, 0x65, 0x45, 0x4A, 0xD5, 0x80, 0x2C, 0x45, 0x2A, 0x06, 0x27, 0x40, 0x04, 0x27, - 0x30, 0x00, 0x2A, 0x43, 0xD7, 0x85, 0x45, 0x48, 0xB6, 0xF1, 0x0F, 0xF2, 0xD3, 0x80, 0x01, 0x65, - 0x01, 0x07, 0x00, 0x65, 0xB4, 0x84, 0x0F, 0xFA, 0x00, 0x63, 0x3F, 0xF2, 0x28, 0x45, 0x60, 0x41, - 0xD4, 0x84, 0xDF, 0x83, 0xFC, 0x07, 0x14, 0xFC, 0x61, 0x44, 0x01, 0x36, 0x02, 0x00, 0x09, 0x3A, - 0x06, 0x00, 0x28, 0x44, 0x48, 0x88, 0x2A, 0x44, 0xC8, 0x83, 0x43, 0x4A, 0xE5, 0x01, 0x17, 0xFA, - 0x04, 0x60, 0x00, 0x64, 0x27, 0x45, 0xB4, 0x84, 0x2A, 0xFA, 0x28, 0x43, 0x16, 0xFC, 0x0D, 0x00, - 0x3F, 0xF2, 0x2C, 0x45, 0xB6, 0xF1, 0xC4, 0x81, 0xD1, 0x80, 0x0F, 0xF2, 0x01, 0x06, 0x01, 0xBC, - 0x0F, 0xFA, 0x3F, 0xF2, 0x17, 0xFA, 0x01, 0x64, 0x14, 0xFA, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, - 0x0E, 0xF0, 0x63, 0x46, 0x00, 0x7F, 0x64, 0x5E, 0x4B, 0xFB, 0x64, 0x44, 0x00, 0x7E, 0xBB, 0xFB, - 0x62, 0xF1, 0x60, 0x43, 0x60, 0x47, 0xD0, 0x80, 0xC0, 0x65, 0x01, 0x06, 0x64, 0x44, 0x0A, 0x36, - 0x70, 0x64, 0x14, 0x36, 0x38, 0x64, 0x37, 0x36, 0x15, 0x64, 0x6E, 0x36, 0x0B, 0x64, 0x44, 0x86, - 0x2A, 0xF2, 0x07, 0xF0, 0x60, 0x40, 0xB0, 0x3A, 0x03, 0x00, 0x40, 0x3B, 0x01, 0x00, 0x12, 0x00, - 0x0C, 0xB4, 0x08, 0x3A, 0x55, 0x00, 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x2B, 0x50, 0x00, - 0x17, 0xF2, 0x22, 0xF0, 0xFF, 0xFF, 0x64, 0x40, 0x22, 0x22, 0x04, 0x00, 0x00, 0xA8, 0x01, 0xA8, - 0x47, 0x03, 0x46, 0x03, 0x3C, 0x46, 0x2A, 0xF0, 0x40, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0x60, 0x45, - 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x43, 0x60, 0x40, 0x01, 0x26, 0x03, 0x00, 0x04, 0x26, 0x0A, 0x00, - 0x02, 0x00, 0x04, 0x27, 0x07, 0x00, 0x65, 0x44, 0x2A, 0x65, 0x60, 0x40, 0x03, 0x2B, 0x24, 0x65, - 0x45, 0x4C, 0x2E, 0x00, 0x65, 0x44, 0x2E, 0x65, 0x60, 0x40, 0x03, 0x2B, 0x28, 0x65, 0x45, 0x4C, - 0x07, 0xF0, 0x88, 0xF3, 0xFF, 0xFF, 0xD0, 0x80, 0x00, 0x7C, 0x03, 0x03, 0x63, 0x40, 0x01, 0x2A, - 0x01, 0x00, 0x3D, 0xF1, 0x2A, 0xF2, 0xFF, 0xFF, 0x08, 0xB0, 0x3E, 0xF2, 0x19, 0x03, 0x60, 0x47, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x03, 0xB4, 0xD0, 0x80, 0xFF, 0xFF, 0x11, 0x03, 0x1B, 0x60, - 0xD4, 0x62, 0x1B, 0x60, 0xAC, 0x64, 0xA2, 0xDB, 0x3C, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0x5C, 0x5C, 0xFC, 0xFC, 0xCE, 0xFE, 0xB5, 0x60, 0xEC, 0x78, 0xFF, 0xFF, - 0xBB, 0xF1, 0x2C, 0x45, 0x64, 0x43, 0x17, 0xF2, 0x4B, 0xF1, 0xC4, 0x84, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x81, 0x63, 0x40, 0x37, 0x37, 0xE1, 0x81, 0x64, 0x45, 0xB5, 0x60, 0x58, 0x4D, 0xC1, 0x78, - 0xFF, 0xFF, 0xAE, 0x82, 0xFC, 0xA2, 0x0A, 0x03, 0x63, 0x40, 0x6E, 0x3B, 0x06, 0x00, 0x60, 0x41, - 0x04, 0x0D, 0x63, 0x44, 0x80, 0x7E, 0xBB, 0xFB, 0x61, 0x44, 0xDC, 0x84, 0x2B, 0xF0, 0x1B, 0xFA, - 0x64, 0x44, 0x80, 0x27, 0x34, 0x00, 0x16, 0xF2, 0x0F, 0xF0, 0xAC, 0x84, 0x2C, 0x45, 0x29, 0x03, - 0x4B, 0xF1, 0xC4, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x81, 0x63, 0x40, 0x37, 0x37, 0xE1, 0x81, - 0x64, 0x45, 0x0F, 0xF0, 0xB5, 0x60, 0x58, 0x4D, 0xC1, 0x78, 0xFF, 0xFF, 0xAE, 0x82, 0xFC, 0xA2, - 0x0A, 0x03, 0x63, 0x40, 0x6E, 0x3B, 0x06, 0x00, 0x60, 0x41, 0x04, 0x0D, 0x80, 0x67, 0xB0, 0x84, - 0x0F, 0xFA, 0x61, 0x44, 0xDC, 0x84, 0x1D, 0xFA, 0xDE, 0x65, 0xC4, 0x85, 0x26, 0x41, 0xE1, 0x81, - 0xC5, 0x84, 0x2B, 0xFA, 0x1B, 0xF0, 0xDE, 0x64, 0xC0, 0x85, 0x26, 0x44, 0xE0, 0x84, 0xC4, 0x84, - 0x10, 0xFA, 0x26, 0x44, 0x2C, 0xF0, 0x0A, 0xA4, 0x64, 0x40, 0x01, 0x26, 0x00, 0x64, 0x11, 0xFA, - 0xBB, 0xF3, 0x13, 0xFA, 0xFF, 0xFF, 0x0D, 0xF2, 0x3E, 0xF0, 0x60, 0x47, 0xFF, 0xB4, 0x64, 0x41, - 0x01, 0xB1, 0x01, 0x63, 0x1D, 0x02, 0x60, 0x41, 0xFF, 0x22, 0x04, 0x00, 0xB5, 0x60, 0x58, 0x4F, - 0xB2, 0x78, 0xFF, 0xFF, 0x0F, 0x60, 0x92, 0x64, 0xA0, 0xDD, 0x21, 0x60, 0x98, 0x62, 0xA2, 0xD3, - 0xB5, 0x60, 0x58, 0x4D, 0xE3, 0x78, 0xFF, 0xFF, 0x60, 0x41, 0x01, 0x63, 0x61, 0x40, 0xFF, 0x22, - 0x04, 0x00, 0xB5, 0x60, 0x58, 0x4F, 0xB2, 0x78, 0xFF, 0xFF, 0x0F, 0x60, 0x94, 0x64, 0xA0, 0xDD, - 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x27, 0x03, 0x00, 0xBA, 0x60, 0x4A, 0x78, 0xFF, 0xFF, - 0x22, 0xF2, 0x46, 0x43, 0x60, 0x40, 0x22, 0x26, 0x8B, 0x00, 0x01, 0x26, 0x05, 0x00, 0x04, 0x26, - 0x0C, 0x00, 0xBA, 0x60, 0x4A, 0x78, 0xFF, 0xFF, 0x04, 0x27, 0x03, 0x00, 0xBA, 0x60, 0x4A, 0x78, - 0xFF, 0xFF, 0x88, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0x02, 0x00, 0x07, 0xF4, 0xFF, 0xFF, 0xA3, 0x46, - 0x2A, 0xF2, 0xA3, 0x46, 0x60, 0x40, 0x08, 0x27, 0x3B, 0x00, 0x88, 0xF3, 0x66, 0x5C, 0xD0, 0x80, - 0x37, 0xF0, 0x08, 0x03, 0x64, 0x40, 0x10, 0x2A, 0x12, 0x00, 0xFF, 0x60, 0xEF, 0x64, 0xA0, 0x84, - 0x37, 0xFA, 0x24, 0x00, 0x3D, 0xF3, 0x01, 0x61, 0x60, 0x43, 0xCF, 0x83, 0xE1, 0x81, 0xFD, 0x0D, - 0xE9, 0x81, 0xA1, 0x80, 0xFF, 0xFF, 0x03, 0x03, 0x91, 0x84, 0x37, 0xFA, 0x17, 0x00, 0x47, 0xF2, - 0xFF, 0xFF, 0x10, 0xA0, 0xFF, 0xFF, 0x02, 0x04, 0xFF, 0x60, 0xFF, 0x64, 0xDC, 0x84, 0x47, 0xFA, - 0x46, 0xF2, 0x16, 0x04, 0xDC, 0x84, 0x46, 0xFA, 0x45, 0xF2, 0x08, 0x04, 0xDC, 0x84, 0x45, 0xFA, - 0x05, 0x04, 0x37, 0xF2, 0xFF, 0xFF, 0xE0, 0x84, 0xE8, 0x84, 0x37, 0xFA, 0x0D, 0x60, 0x3E, 0x62, - 0x80, 0xFF, 0x78, 0x44, 0x03, 0xA4, 0xA2, 0xDB, 0xC4, 0x60, 0x05, 0x78, 0xFF, 0xFF, 0x84, 0xFF, - 0x0D, 0x60, 0x3E, 0x62, 0x80, 0xFF, 0x78, 0x44, 0x03, 0xA4, 0xA2, 0xDB, 0xC4, 0x60, 0x7D, 0x78, - 0xFF, 0xFF, 0x84, 0xFF, 0x88, 0xF3, 0x66, 0x5C, 0xD0, 0x80, 0x00, 0x7C, 0x07, 0x03, 0x66, 0x43, - 0x3C, 0x46, 0x22, 0xF2, 0x63, 0x46, 0x60, 0x40, 0x01, 0x2A, 0x01, 0x00, 0x3C, 0xF1, 0x47, 0xF0, - 0x64, 0x41, 0x64, 0x47, 0xFF, 0xB4, 0x60, 0x5F, 0x20, 0xBC, 0x80, 0x26, 0x80, 0xAC, 0x60, 0x47, - 0xA3, 0x46, 0x3A, 0xFA, 0x64, 0x44, 0x20, 0x7F, 0x34, 0x94, 0x3B, 0xFA, 0xA3, 0x46, 0x46, 0xF2, - 0x45, 0xF0, 0xA3, 0x46, 0x3C, 0xFA, 0x3D, 0xF8, 0x08, 0x60, 0x00, 0xEA, 0x0F, 0x64, 0x60, 0x7F, - 0xA0, 0x5A, 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0x8A, 0x00, - 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x27, 0x35, 0x00, 0x2A, 0xF2, 0x00, 0x60, 0x7C, 0x62, - 0x60, 0x40, 0x40, 0x2B, 0x27, 0x00, 0xA2, 0xD3, 0x00, 0x61, 0x60, 0xFE, 0xA0, 0xD3, 0xDE, 0x82, - 0xA2, 0xD1, 0xFF, 0xFF, 0x20, 0xFE, 0x64, 0x5F, 0xDC, 0x84, 0xF1, 0x81, 0xC0, 0x2B, 0x04, 0x00, - 0x80, 0x2A, 0x02, 0x00, 0x7F, 0xA4, 0xDC, 0x84, 0xFF, 0x3B, 0x03, 0x00, 0x60, 0x47, 0xDC, 0x87, - 0x01, 0x61, 0xC0, 0x80, 0x00, 0x36, 0xDC, 0x84, 0x4E, 0xDB, 0x60, 0xFE, 0xDA, 0x82, 0xA2, 0xD1, - 0xFF, 0xFF, 0xC1, 0x84, 0xF0, 0x22, 0x10, 0xA4, 0xF0, 0x2A, 0x01, 0x00, 0x00, 0x64, 0xA2, 0xDB, - 0xFF, 0xFF, 0x20, 0xFE, 0x00, 0x60, 0x7C, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xA0, 0xD3, 0x5A, 0xD1, - 0x3A, 0xFA, 0x3B, 0xF8, 0x74, 0x62, 0xA2, 0xD0, 0xFF, 0xFF, 0x64, 0x44, 0xE0, 0x7F, 0xA0, 0x5A, - 0x64, 0x47, 0xE1, 0x7F, 0x5A, 0xD0, 0xA0, 0x5A, 0x64, 0x44, 0xE2, 0x7F, 0xA0, 0x5A, 0x00, 0x60, - 0x80, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xA0, 0xD1, 0x5A, 0xD1, 0x64, 0x45, 0x64, 0x44, 0xE3, 0x7F, - 0xA0, 0x5A, 0x64, 0x47, 0xE4, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xE5, 0x7F, 0xA0, 0x5A, - 0x64, 0x47, 0xE6, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xE7, 0x7F, 0xA0, 0x5A, 0x65, 0x40, - 0x0D, 0x3A, 0x1C, 0x00, 0x64, 0x47, 0xE8, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xE9, 0x7F, - 0xA0, 0x5A, 0x64, 0x47, 0xEA, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xEB, 0x7F, 0xA0, 0x5A, - 0x64, 0x47, 0xEC, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xED, 0x7F, 0xA0, 0x5A, 0x64, 0x47, - 0xEE, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xEF, 0x7F, 0xA0, 0x5A, 0x08, 0x60, 0x00, 0xEA, - 0x65, 0x44, 0x02, 0xA4, 0x60, 0x7F, 0xA0, 0x5A, 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, - 0xD1, 0x60, 0x00, 0xEA, 0x02, 0x64, 0x3B, 0xDB, 0xBD, 0x60, 0xEB, 0x78, 0xFF, 0xFF, 0x66, 0x44, - 0xFC, 0xFB, 0x07, 0xF0, 0x00, 0x64, 0xD0, 0x80, 0x88, 0xF3, 0x17, 0x03, 0xD0, 0x80, 0x66, 0x41, - 0x64, 0x46, 0x6F, 0xF2, 0x61, 0x46, 0x6D, 0x03, 0x60, 0x40, 0x00, 0x36, 0x6A, 0x00, 0x47, 0xF1, - 0x07, 0xF0, 0x64, 0x40, 0x02, 0x26, 0x01, 0x00, 0x0B, 0x00, 0x03, 0x12, 0xBB, 0x60, 0x4E, 0x78, - 0xFF, 0xFF, 0xFC, 0x0A, 0xBC, 0x60, 0x48, 0x78, 0xFF, 0xFF, 0xBC, 0x60, 0x48, 0x78, 0xFF, 0xFF, - 0x3E, 0xF2, 0x60, 0x45, 0x60, 0x47, 0x07, 0xB0, 0x00, 0x3A, 0x01, 0x00, 0xA6, 0x00, 0x65, 0x44, - 0x60, 0x40, 0x01, 0x36, 0x4E, 0x00, 0x02, 0x36, 0x4F, 0x00, 0x03, 0x36, 0x2D, 0x00, 0x04, 0x36, - 0x3E, 0x00, 0x52, 0x00, 0x00, 0x64, 0x4C, 0xFB, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, - 0x05, 0x7E, 0x6F, 0xFA, 0x61, 0x46, 0x00, 0x65, 0x65, 0x43, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, - 0x8C, 0xFA, 0x00, 0xA8, 0x6F, 0xF2, 0x15, 0x03, 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, 0x00, 0xBB, - 0xFF, 0xA0, 0x07, 0x03, 0x0E, 0x06, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, - 0x08, 0x00, 0xB9, 0x81, 0xE8, 0x84, 0xD9, 0x81, 0xFD, 0x04, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, - 0x0E, 0xFA, 0x0C, 0xF4, 0xFF, 0xFF, 0x1D, 0x00, 0x4C, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, 0x4C, 0xFB, - 0xAB, 0xF3, 0x60, 0x45, 0xD4, 0x80, 0xFF, 0xFF, 0x14, 0x02, 0x1C, 0x60, 0x0C, 0x62, 0x0F, 0x60, - 0x96, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0xC3, 0x01, 0x4C, 0xF3, - 0x66, 0x41, 0xDC, 0x84, 0x4C, 0xFB, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, 0x03, 0x7E, 0x6F, 0xFA, - 0x61, 0x46, 0xBC, 0x60, 0x48, 0x78, 0xFF, 0xFF, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, - 0x01, 0x7E, 0x6F, 0xFA, 0x61, 0x46, 0xF5, 0x01, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0x8C, 0xFA, - 0x60, 0x47, 0x70, 0xF2, 0xFF, 0xB5, 0x08, 0x18, 0xE4, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x03, 0x02, - 0xFB, 0x04, 0x01, 0x64, 0x01, 0x00, 0x00, 0x64, 0x0C, 0xF4, 0x00, 0xA8, 0xFF, 0xFF, 0xE4, 0x02, - 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, 0x60, 0x47, 0x70, 0xF2, 0xFF, 0xB5, 0x61, 0x46, - 0x00, 0xA8, 0xFF, 0xFF, 0x29, 0x03, 0xE0, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0xFC, 0x03, 0x66, 0x41, - 0x64, 0x46, 0x70, 0xFA, 0x61, 0x46, 0x01, 0x65, 0x65, 0x43, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, - 0x8C, 0xFA, 0x00, 0xA8, 0x6F, 0xF2, 0x15, 0x03, 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, 0x00, 0xBB, - 0xFF, 0xA0, 0x07, 0x03, 0x0E, 0x06, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, - 0x08, 0x00, 0xB9, 0x81, 0xE8, 0x84, 0xD9, 0x81, 0xFD, 0x04, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, - 0x0E, 0xFA, 0x0C, 0xF4, 0xFF, 0xFF, 0xA3, 0x01, 0xA2, 0x01, 0x65, 0x44, 0x60, 0x40, 0x01, 0x36, - 0xA8, 0x01, 0x02, 0x36, 0x01, 0x00, 0xA5, 0x01, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, - 0x01, 0x7E, 0x6F, 0xFA, 0x61, 0x46, 0x00, 0x65, 0x65, 0x43, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, - 0x8C, 0xFA, 0x00, 0xA8, 0x6F, 0xF2, 0x15, 0x03, 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, 0x00, 0xBB, - 0xFF, 0xA0, 0x07, 0x03, 0x0E, 0x06, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, - 0x08, 0x00, 0xB9, 0x81, 0xE8, 0x84, 0xD9, 0x81, 0xFD, 0x04, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, - 0x0E, 0xFA, 0x0C, 0xF4, 0xFF, 0xFF, 0xBC, 0x60, 0x48, 0x78, 0xFF, 0xFF, 0x3E, 0xF2, 0x60, 0x45, - 0x60, 0x47, 0x07, 0xB0, 0x00, 0x3A, 0x01, 0x00, 0xA3, 0x00, 0x65, 0x44, 0x60, 0x40, 0x01, 0x36, - 0x0B, 0x00, 0x02, 0x36, 0x14, 0x00, 0x03, 0x36, 0x47, 0x00, 0x04, 0x36, 0x5E, 0x00, 0x05, 0x36, - 0x0E, 0x00, 0xBC, 0x60, 0x48, 0x78, 0xFF, 0xFF, 0x07, 0xF0, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, - 0xFF, 0xFF, 0x02, 0x7E, 0x6F, 0xFA, 0x61, 0x46, 0xBC, 0x60, 0x48, 0x78, 0xFF, 0xFF, 0x07, 0xF0, - 0x01, 0x65, 0x65, 0x43, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, 0x8C, 0xFA, 0x00, 0xA8, 0x6F, 0xF2, - 0x15, 0x03, 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, 0x00, 0xBB, 0xFF, 0xA0, 0x07, 0x03, 0x0E, 0x06, - 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, 0x08, 0x00, 0xB9, 0x81, 0xE8, 0x84, - 0xD9, 0x81, 0xFD, 0x04, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, 0x0C, 0xF4, 0xFF, 0xFF, - 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0x00, 0x63, 0x03, 0x7E, 0x6F, 0xFA, 0x61, 0x46, 0x4C, 0xFD, - 0x1C, 0x60, 0x0C, 0x62, 0x0F, 0x60, 0x96, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0xBC, 0x60, 0x48, 0x78, 0xFF, 0xFF, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, 0x4C, 0xF3, - 0x02, 0xB0, 0x61, 0x46, 0xCC, 0x84, 0x05, 0x03, 0x04, 0x28, 0x4C, 0xFB, 0xBC, 0x60, 0x48, 0x78, - 0xFF, 0xFF, 0x04, 0x28, 0x4C, 0xFB, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, 0x04, 0x7E, - 0x6F, 0xFA, 0x61, 0x46, 0xBC, 0x60, 0x48, 0x78, 0xFF, 0xFF, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, - 0xFF, 0xFF, 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, 0x61, 0x46, 0xFF, 0xA0, 0xFF, 0xFF, 0x2F, 0x06, - 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, 0x29, 0x00, 0x64, 0x46, 0x70, 0xFA, - 0x01, 0x65, 0x65, 0x43, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, 0x8C, 0xFA, 0x00, 0xA8, 0x6F, 0xF2, - 0x15, 0x03, 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, 0x00, 0xBB, 0xFF, 0xA0, 0x07, 0x03, 0x0E, 0x06, - 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, 0x08, 0x00, 0xB9, 0x81, 0xE8, 0x84, - 0xD9, 0x81, 0xFD, 0x04, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, 0x0C, 0xF4, 0xFF, 0xFF, - 0x6F, 0xF2, 0x00, 0x63, 0x03, 0x7E, 0x6F, 0xFA, 0x3C, 0x46, 0x4C, 0xFD, 0x51, 0x00, 0x50, 0x00, - 0x65, 0x44, 0x60, 0x40, 0x01, 0x36, 0x03, 0x00, 0x02, 0x36, 0x12, 0x00, 0x49, 0x00, 0x66, 0x41, - 0x64, 0x46, 0x70, 0xF2, 0x61, 0x46, 0x01, 0xB0, 0xFF, 0xFF, 0x42, 0x02, 0x07, 0xF0, 0x66, 0x41, - 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, 0x02, 0x7E, 0x6F, 0xFA, 0x61, 0x46, 0x39, 0x00, 0x38, 0x00, - 0x07, 0xF0, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, 0x01, 0x7E, 0x6F, 0xFA, 0x60, 0x47, - 0xFF, 0xB5, 0x70, 0xF2, 0x61, 0x46, 0xFF, 0xA0, 0xFF, 0xFF, 0xF1, 0x06, 0xE8, 0x84, 0xA4, 0x80, - 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, 0xEB, 0x01, 0x66, 0x41, 0x64, 0x46, 0x70, 0xFA, 0x61, 0x46, - 0x00, 0x65, 0x65, 0x43, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, 0x8C, 0xFA, 0x00, 0xA8, 0x6F, 0xF2, - 0x15, 0x03, 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, 0x00, 0xBB, 0xFF, 0xA0, 0x07, 0x03, 0x0E, 0x06, - 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, 0x08, 0x00, 0xB9, 0x81, 0xE8, 0x84, - 0xD9, 0x81, 0xFD, 0x04, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, 0x0C, 0xF4, 0xFF, 0xFF, - 0x03, 0x64, 0x3B, 0xDB, 0xCA, 0xFE, 0x47, 0xF1, 0x01, 0x65, 0x32, 0x40, 0x04, 0x27, 0x08, 0x00, - 0x2C, 0xF2, 0x64, 0x45, 0x02, 0x22, 0x04, 0x00, 0x60, 0x40, 0x01, 0x26, 0x01, 0x00, 0xEC, 0x00, - 0x14, 0xF2, 0x65, 0x40, 0x01, 0x26, 0x1D, 0x00, 0x60, 0x45, 0x05, 0x64, 0x3B, 0xDB, 0x65, 0x44, - 0xCC, 0x85, 0x98, 0xF1, 0x1E, 0x60, 0xDE, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xD8, 0x80, 0xC4, 0x84, - 0x0B, 0x03, 0x07, 0x05, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x09, 0x04, 0xC6, 0xFE, - 0x07, 0x00, 0x00, 0x64, 0xB8, 0x84, 0xA2, 0xDB, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, - 0xAF, 0x00, 0x60, 0x41, 0x2A, 0xF0, 0x00, 0x60, 0x0C, 0x64, 0xA0, 0x84, 0x04, 0x36, 0x02, 0x00, - 0x0C, 0x3A, 0x01, 0x00, 0xA5, 0x00, 0x61, 0x45, 0x60, 0x41, 0x98, 0xF1, 0x1E, 0x60, 0xDE, 0x64, - 0xA0, 0xD3, 0xFF, 0xFF, 0xD8, 0x80, 0xC4, 0x84, 0x0B, 0x03, 0x07, 0x05, 0xDC, 0x80, 0xD0, 0x80, - 0x04, 0x03, 0xA2, 0xDB, 0x09, 0x04, 0xC6, 0xFE, 0x07, 0x00, 0x00, 0x64, 0xB8, 0x84, 0xA2, 0xDB, - 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x61, 0x40, 0x08, 0x36, 0x01, 0x00, 0x88, 0x00, - 0x14, 0xF2, 0x1C, 0x65, 0x60, 0x41, 0x00, 0x63, 0xCD, 0x81, 0xC7, 0x83, 0xFD, 0x02, 0x3F, 0xF0, - 0x2C, 0xF2, 0xC3, 0x83, 0x60, 0x40, 0x01, 0x2A, 0x29, 0x00, 0x98, 0xF1, 0x1E, 0x60, 0xDC, 0x64, - 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, - 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x98, 0xF1, 0x1E, 0x60, - 0xE2, 0x64, 0xA0, 0xD3, 0x63, 0x45, 0xD8, 0x80, 0xC4, 0x84, 0x0B, 0x03, 0x07, 0x05, 0xDC, 0x80, - 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x09, 0x04, 0xC6, 0xFE, 0x07, 0x00, 0x00, 0x64, 0xB8, 0x84, - 0xA2, 0xDB, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x52, 0x00, 0x98, 0xF1, 0x1E, 0x60, - 0xDA, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, - 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x98, 0xF1, - 0x1E, 0x60, 0xE0, 0x64, 0xA0, 0xD3, 0x63, 0x45, 0xD8, 0x80, 0xC4, 0x84, 0x0B, 0x03, 0x07, 0x05, - 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x09, 0x04, 0xC6, 0xFE, 0x07, 0x00, 0x00, 0x64, - 0xB8, 0x84, 0xA2, 0xDB, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x15, 0xF2, 0xFF, 0xFF, - 0x0F, 0xB4, 0x00, 0xA8, 0x01, 0xA8, 0x24, 0x03, 0x12, 0x03, 0x98, 0xF1, 0x1E, 0x60, 0xE8, 0x64, - 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, - 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x11, 0x00, 0x98, 0xF1, - 0x1E, 0x60, 0xE6, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, - 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, - 0x04, 0x64, 0x3B, 0xDB, 0x07, 0xF0, 0x66, 0x41, 0x64, 0x46, 0x06, 0xF0, 0xFF, 0x60, 0x5F, 0x64, - 0xA0, 0x84, 0x06, 0xFA, 0x61, 0x46, 0x1B, 0x60, 0xD4, 0x62, 0x1B, 0x60, 0xAC, 0x64, 0xA2, 0xDB, - 0x3C, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x5C, 0x5C, 0xFC, 0xFC, - 0xCE, 0xFE, 0xB5, 0x60, 0xEC, 0x78, 0xFF, 0xFF, 0x1F, 0x60, 0x64, 0x62, 0xA2, 0xD3, 0x07, 0xF4, - 0x06, 0xF2, 0x02, 0xA8, 0x3C, 0x46, 0x10, 0x03, 0x10, 0xB0, 0x2A, 0xF2, 0x0D, 0x03, 0x0E, 0xF2, - 0x0C, 0xB0, 0x60, 0x40, 0xF0, 0x37, 0x20, 0xBC, 0x02, 0x03, 0xFE, 0x7F, 0x0E, 0xFA, 0x23, 0xF0, - 0x10, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0xCC, 0x01, 0x0F, 0xF0, 0x15, 0xF2, 0x64, 0x41, 0x01, 0x2A, - 0x02, 0x00, 0xB1, 0xF1, 0x09, 0x00, 0x03, 0x65, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x06, 0xF0, - 0x63, 0x46, 0xB0, 0xF1, 0x64, 0x40, 0x10, 0x2A, 0x64, 0x45, 0xDC, 0x84, 0xD4, 0x80, 0x15, 0xFA, - 0x3B, 0x07, 0x61, 0x40, 0x01, 0x2A, 0x09, 0x00, 0x1F, 0x60, 0x0E, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, - 0xDC, 0x84, 0xFF, 0xFF, 0x08, 0x28, 0xA2, 0xDB, 0x08, 0x00, 0x1F, 0x60, 0x10, 0x64, 0xA0, 0xD3, - 0xFF, 0xFF, 0xDC, 0x84, 0xFF, 0xFF, 0x08, 0x28, 0xA2, 0xDB, 0x2A, 0xF0, 0x08, 0x67, 0xB0, 0x84, - 0xA2, 0xDA, 0x08, 0xF0, 0x1B, 0x60, 0x8E, 0x64, 0xD0, 0x80, 0x07, 0xF2, 0x46, 0x43, 0x88, 0xF1, - 0x06, 0x03, 0x60, 0x46, 0x86, 0xF4, 0xD0, 0x80, 0x80, 0xBB, 0x01, 0x03, 0x06, 0xFC, 0x23, 0x46, - 0x3E, 0xF2, 0x00, 0x63, 0x01, 0xB0, 0x43, 0x5C, 0xFC, 0xFC, 0x0B, 0x03, 0x1B, 0x60, 0xDA, 0x62, - 0x1B, 0x60, 0xA6, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xB5, 0x60, 0xEC, 0x78, 0xFF, 0xFF, 0x00, 0x64, 0x49, 0xFB, 0x98, 0xF1, 0x1E, 0x60, - 0xE8, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, - 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x98, 0xF1, - 0x1E, 0x60, 0xEA, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, - 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, - 0x21, 0x60, 0x98, 0x63, 0xA3, 0xD3, 0xB5, 0x60, 0x58, 0x4D, 0xE3, 0x78, 0xFF, 0xFF, 0x0D, 0xF2, - 0x60, 0x5C, 0x64, 0x5F, 0x0D, 0xFA, 0x23, 0xF0, 0x01, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0x07, 0xF0, - 0x66, 0x41, 0x64, 0x46, 0x06, 0xF2, 0x7F, 0x65, 0xA4, 0x9E, 0x06, 0xFA, 0x61, 0x46, 0x40, 0x01, - 0xBE, 0x60, 0x70, 0x78, 0xFF, 0xFF, 0x21, 0x64, 0x3B, 0xDB, 0x31, 0xF3, 0x01, 0x63, 0xC4, 0xB4, - 0x31, 0xFB, 0x32, 0xFD, 0xBE, 0x60, 0x1C, 0x62, 0x42, 0x40, 0xA0, 0x4C, 0x40, 0xBC, 0x7D, 0xB4, - 0xA0, 0x51, 0xA0, 0xFE, 0x1A, 0xFF, 0x1B, 0x60, 0xA0, 0x64, 0x08, 0xF0, 0x07, 0xF0, 0xD0, 0x80, - 0x1B, 0x60, 0xA6, 0x62, 0x14, 0x02, 0xA2, 0xD3, 0x01, 0x63, 0xAC, 0x86, 0x07, 0xF2, 0x0F, 0x03, - 0xD0, 0x80, 0x09, 0xF2, 0xFA, 0x02, 0x23, 0xFC, 0x1B, 0x60, 0xD4, 0x62, 0x1B, 0x60, 0xAC, 0x64, - 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x3C, 0x46, - 0x06, 0x64, 0xA1, 0xFF, 0x49, 0xFB, 0x83, 0x3E, 0x31, 0xF3, 0x87, 0x60, 0x80, 0x61, 0x1D, 0xF0, - 0x60, 0x40, 0x01, 0x2A, 0x15, 0x00, 0xFE, 0xB4, 0x31, 0xFB, 0x00, 0x64, 0x49, 0xFB, 0x01, 0x64, - 0x47, 0xFB, 0x21, 0x60, 0x98, 0x63, 0xA3, 0xD3, 0xB5, 0x60, 0x58, 0x4D, 0xE3, 0x78, 0xFF, 0xFF, - 0x00, 0x71, 0x64, 0x5F, 0x0D, 0xFA, 0x40, 0x64, 0x3B, 0xDB, 0xBE, 0x60, 0x70, 0x78, 0xFF, 0xFF, - 0x02, 0x2A, 0x1B, 0x00, 0xD1, 0x91, 0x8D, 0xE2, 0x41, 0x64, 0x3B, 0xDB, 0x31, 0xF3, 0x21, 0x60, - 0xA0, 0x63, 0xFD, 0xB4, 0x31, 0xFB, 0xA3, 0xD3, 0xB5, 0x60, 0x58, 0x4D, 0xE3, 0x78, 0xFF, 0xFF, - 0x02, 0x63, 0x60, 0x5C, 0x0D, 0xF2, 0x47, 0xFD, 0xFF, 0xB5, 0x60, 0x47, 0xD0, 0x80, 0xDC, 0x84, - 0x1F, 0x03, 0x60, 0x47, 0xB4, 0x84, 0x0D, 0xFA, 0x1B, 0x00, 0x08, 0x2A, 0x07, 0x00, 0x42, 0x64, - 0x3B, 0xDB, 0x31, 0xF3, 0xFF, 0xFF, 0xF7, 0xB4, 0x31, 0xFB, 0x12, 0x00, 0x10, 0x2A, 0x09, 0x00, - 0x43, 0x64, 0x3B, 0xDB, 0x31, 0xF3, 0xFF, 0xFF, 0xEF, 0xB4, 0x31, 0xFB, 0xBD, 0x60, 0xEB, 0x78, - 0xFF, 0xFF, 0x44, 0x64, 0x3B, 0xDB, 0x31, 0xF3, 0xFF, 0xFF, 0xDF, 0xB4, 0x31, 0xFB, 0x00, 0x00, - 0x2A, 0x64, 0x3B, 0xDB, 0xB5, 0x60, 0xA2, 0x64, 0x40, 0x40, 0xBA, 0x60, 0x4F, 0x78, 0xFF, 0xFF, - 0x12, 0x60, 0xCC, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0x02, 0xB5, 0x04, 0xB5, 0x04, 0x03, 0x03, 0x03, - 0xBE, 0x60, 0xF7, 0x78, 0xFF, 0xFF, 0xEB, 0x60, 0x58, 0x4E, 0x24, 0x78, 0xFF, 0xFF, 0x31, 0x40, - 0x01, 0x2A, 0x29, 0x00, 0x9D, 0xFE, 0x27, 0x04, 0x26, 0x0A, 0x9F, 0xFE, 0x24, 0x05, 0x85, 0xFF, - 0x20, 0x44, 0x84, 0xFF, 0x40, 0x26, 0x1F, 0x00, 0x3F, 0x40, 0x20, 0x2B, 0x1C, 0x00, 0x38, 0x69, - 0xFF, 0xFF, 0x68, 0x44, 0x01, 0x16, 0xFD, 0x01, 0x01, 0x2A, 0x15, 0x00, 0x1F, 0x60, 0x1A, 0x64, - 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xFF, 0xFF, 0x08, 0x28, 0xA2, 0xDB, 0x65, 0xF1, 0x02, 0x60, - 0xEE, 0x64, 0x82, 0xFB, 0xFF, 0xFF, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0x83, 0xFB, 0x04, 0x64, - 0x84, 0xFB, 0xDF, 0xFE, 0x19, 0xFF, 0x10, 0x64, 0x3B, 0xDB, 0x66, 0xF3, 0x73, 0x45, 0xE0, 0x84, - 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x93, 0x75, 0xF1, 0xC9, 0xFE, 0x64, 0x40, 0x01, 0x26, 0x3D, 0x00, - 0x49, 0xF3, 0x3C, 0x46, 0x33, 0x18, 0xCC, 0x84, 0x49, 0xFB, 0x30, 0x02, 0xBF, 0x60, 0xAD, 0x64, - 0x40, 0x42, 0xFC, 0xFC, 0x00, 0x64, 0x5C, 0x5C, 0x32, 0xFB, 0x82, 0xFF, 0x5C, 0x47, 0x84, 0xFF, - 0x62, 0xFF, 0x1F, 0x60, 0x0A, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xFF, 0xFF, 0x08, 0x28, - 0xA2, 0xDB, 0x2A, 0xF2, 0x07, 0xF0, 0x0C, 0xB4, 0x08, 0x3A, 0x07, 0x00, 0x66, 0x41, 0x64, 0x46, - 0x06, 0xF0, 0xFF, 0x60, 0xDF, 0x64, 0xA0, 0x84, 0x06, 0xFA, 0x23, 0xF0, 0x01, 0x64, 0xB0, 0x84, - 0xA2, 0xDA, 0x1B, 0x60, 0xD4, 0x62, 0x1B, 0x60, 0xAC, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0xCE, 0xFE, 0x06, 0x00, 0x66, 0xF3, - 0x73, 0x45, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x93, 0x12, 0x60, 0xC8, 0x63, 0xA3, 0xD3, - 0xAD, 0x49, 0x20, 0xB5, 0x08, 0xB1, 0x23, 0x03, 0xE1, 0x81, 0x10, 0xB5, 0x95, 0x81, 0x60, 0x41, - 0x18, 0x02, 0x12, 0x60, 0xCA, 0x7C, 0xA4, 0xD3, 0xFF, 0xFF, 0xCC, 0x84, 0xA4, 0xDB, 0x17, 0x02, - 0x0A, 0x64, 0xA4, 0xDB, 0x61, 0x44, 0x07, 0xB4, 0xFF, 0xFF, 0x11, 0x02, 0x08, 0xB1, 0xE1, 0x81, - 0x95, 0x81, 0xA3, 0xD3, 0x0C, 0x03, 0x08, 0xAC, 0x01, 0xBC, 0xA3, 0xDB, 0xFF, 0xFF, 0x13, 0xFF, - 0x06, 0x00, 0x10, 0xAC, 0xA3, 0xDB, 0x12, 0x60, 0xCA, 0x63, 0x0A, 0x7C, 0xA3, 0xD9, 0xB5, 0x60, - 0xAF, 0x78, 0xFF, 0xFF, 0x46, 0xF3, 0x45, 0xF1, 0x05, 0x1B, 0x64, 0x44, 0x03, 0x1B, 0x0F, 0x60, - 0x92, 0x62, 0xA2, 0xD3, 0x45, 0xFB, 0x00, 0x63, 0x46, 0xFD, 0x60, 0x41, 0x25, 0x64, 0x3B, 0xDB, - 0x27, 0x44, 0xEF, 0xB4, 0x40, 0x47, 0x00, 0xB9, 0x71, 0x40, 0x80, 0x27, 0x01, 0x12, 0x19, 0x03, - 0xBF, 0x60, 0x4D, 0x62, 0x84, 0xFF, 0x42, 0x42, 0x82, 0xFF, 0xA0, 0x4C, 0x14, 0xBC, 0xFF, 0xB4, - 0xA0, 0x51, 0x1F, 0x0A, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x70, 0x44, 0xAC, 0x80, 0x19, 0x0A, - 0x71, 0x40, 0x80, 0x27, 0xF7, 0x12, 0x45, 0xF3, 0x27, 0x02, 0x03, 0x18, 0xCC, 0x84, 0x45, 0xFB, - 0xF1, 0x02, 0x06, 0x0A, 0xA0, 0x4C, 0xFB, 0xB4, 0xA0, 0x51, 0xA7, 0x60, 0xDF, 0x78, 0xFF, 0xFF, - 0x84, 0xFF, 0xBF, 0x60, 0x2A, 0x64, 0x40, 0x42, 0x82, 0xFF, 0xA0, 0x4C, 0x14, 0xBC, 0xFF, 0xB4, - 0xA0, 0x51, 0xAF, 0x60, 0x19, 0x78, 0xFF, 0xFF, 0x3C, 0x44, 0xAC, 0x80, 0x32, 0xF1, 0x12, 0x03, - 0x64, 0x40, 0x07, 0x22, 0x0F, 0x00, 0xA7, 0x60, 0xC1, 0x78, 0xFF, 0xFF, 0xA0, 0x4C, 0x1C, 0xBC, - 0xDF, 0xB4, 0xA0, 0x51, 0xF1, 0x01, 0x06, 0x00, 0x28, 0x64, 0x3A, 0xDB, 0xA0, 0x4C, 0x30, 0xBC, - 0xF3, 0xB4, 0xA0, 0x51, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x28, 0x64, 0x3B, 0xDB, 0x0F, 0x60, - 0x94, 0x62, 0xA2, 0xD3, 0x32, 0x40, 0x02, 0x27, 0x16, 0x00, 0x46, 0xFB, 0x14, 0x18, 0xBF, 0x60, - 0x9B, 0x64, 0x84, 0xFF, 0x40, 0x42, 0x82, 0xFF, 0xA0, 0x4C, 0x14, 0xBC, 0xF7, 0xB4, 0xA0, 0x51, - 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x70, 0x44, 0xAC, 0x80, 0x46, 0xF3, 0xCA, 0x0A, 0xDC, 0x02, - 0xCC, 0x84, 0x46, 0xFB, 0xF5, 0x02, 0x84, 0xFF, 0xBF, 0x60, 0xAD, 0x64, 0x40, 0x42, 0x82, 0xFF, - 0x27, 0x44, 0x08, 0xBC, 0x40, 0x47, 0xBB, 0xE1, 0x04, 0x00, 0x3A, 0xE1, 0x31, 0x40, 0x01, 0x26, - 0xBB, 0xE1, 0xA7, 0x60, 0xB5, 0x78, 0xFF, 0xFF, 0x24, 0xE2, 0x2D, 0xF3, 0x2C, 0xF3, 0x00, 0xBD, - 0xCC, 0x84, 0x08, 0x03, 0x2C, 0xFB, 0x06, 0x02, 0x65, 0x44, 0x2C, 0xFB, 0x8A, 0xFF, 0x80, 0x60, - 0x00, 0x75, 0x88, 0xFF, 0xD2, 0xF3, 0x31, 0x40, 0x01, 0x2A, 0x44, 0x00, 0x60, 0x43, 0x04, 0xB0, - 0x02, 0xB0, 0x08, 0x24, 0x16, 0x02, 0x29, 0x44, 0xFF, 0xFF, 0x00, 0xA8, 0xCC, 0x81, 0x0E, 0x03, - 0x41, 0x49, 0x37, 0x02, 0x63, 0x40, 0x08, 0x2A, 0x09, 0x00, 0xF7, 0xB3, 0x25, 0x60, 0x1C, 0x7C, - 0xA4, 0xD1, 0xAD, 0x4F, 0xFD, 0xB4, 0xA0, 0x5D, 0x44, 0x49, 0x2B, 0x00, 0x63, 0x40, 0x02, 0x2A, - 0x14, 0x00, 0x25, 0x60, 0x1E, 0x64, 0xA0, 0xD3, 0x25, 0x60, 0x1A, 0x7C, 0xA4, 0xDB, 0x40, 0x49, - 0x25, 0x60, 0x20, 0x64, 0xA0, 0xD3, 0x25, 0x60, 0x1C, 0x7C, 0xA4, 0xDB, 0x0C, 0xBB, 0xFD, 0xB3, - 0xAD, 0x4F, 0x02, 0xBC, 0x00, 0x7F, 0xA0, 0x5D, 0x14, 0x00, 0x25, 0x60, 0x22, 0x64, 0xA0, 0xD3, - 0x25, 0x60, 0x1A, 0x7C, 0x0E, 0x18, 0xA4, 0xDB, 0x40, 0x49, 0x25, 0x60, 0x24, 0x64, 0xA0, 0xD3, - 0x25, 0x60, 0x1C, 0x7C, 0xA4, 0xDB, 0x08, 0xBB, 0xFB, 0xB3, 0xAD, 0x4F, 0x02, 0xBC, 0x00, 0x7F, - 0xA0, 0x5D, 0xD2, 0xFD, 0x01, 0x60, 0x0C, 0x61, 0xA1, 0xD3, 0x61, 0x43, 0x17, 0x18, 0x58, 0xD3, - 0x62, 0x41, 0x03, 0x18, 0xCC, 0x84, 0xA1, 0xDB, 0x11, 0x00, 0x49, 0xD3, 0xA3, 0xDB, 0x06, 0xA1, - 0xA1, 0xD3, 0x59, 0xD1, 0x60, 0x45, 0xA5, 0xD3, 0x59, 0xD1, 0xB0, 0x84, 0xA5, 0xDB, 0x64, 0x44, - 0x06, 0x36, 0xCD, 0xFE, 0x07, 0x36, 0xD6, 0xFE, 0xE5, 0x01, 0x23, 0x46, 0xB5, 0x60, 0xAF, 0x78, - 0xFF, 0xFF, 0x46, 0x43, 0x1C, 0x60, 0x0A, 0x61, 0xA1, 0xD3, 0x59, 0xD1, 0x06, 0x1B, 0x59, 0xD3, - 0x59, 0xD1, 0x03, 0x1B, 0x59, 0xD3, 0x59, 0xD1, 0xF0, 0x18, 0x00, 0x63, 0x49, 0xDD, 0x60, 0x40, - 0x02, 0x36, 0x11, 0x00, 0x03, 0x36, 0x32, 0x00, 0x01, 0x36, 0x08, 0x00, 0x05, 0x3A, 0xEA, 0x01, - 0xA4, 0xD3, 0x5A, 0xD3, 0x9C, 0x85, 0xA4, 0x84, 0xA2, 0xDB, 0xE4, 0x01, 0x01, 0x60, 0x0C, 0x61, - 0x00, 0x64, 0xA1, 0xDB, 0xDF, 0x01, 0xC0, 0x60, 0x4F, 0x64, 0x40, 0x45, 0x22, 0x00, 0x01, 0x60, - 0x0C, 0x66, 0xA6, 0xD3, 0x04, 0xA1, 0x60, 0x43, 0xA1, 0xD3, 0xC9, 0x81, 0x60, 0x45, 0x00, 0xBB, - 0xA1, 0xDB, 0xBE, 0xD3, 0x09, 0x03, 0xD4, 0x84, 0x9C, 0x84, 0xDC, 0x84, 0xFF, 0xFF, 0x04, 0x0E, - 0xA3, 0xD1, 0x63, 0x46, 0x64, 0x43, 0xF2, 0x01, 0x9C, 0x84, 0xDC, 0x85, 0x49, 0xDD, 0x61, 0x44, - 0x00, 0xBB, 0xA6, 0xDB, 0x02, 0x03, 0x65, 0x44, 0xBE, 0xDB, 0xBC, 0x01, 0xC0, 0x60, 0x2A, 0x64, - 0x40, 0x45, 0x01, 0x60, 0x0C, 0x66, 0xA6, 0xD3, 0xFF, 0xFF, 0xD0, 0x80, 0x0F, 0x18, 0x02, 0x03, - 0x60, 0x46, 0xF9, 0x01, 0x58, 0xD3, 0xA4, 0xD3, 0x60, 0x45, 0x00, 0x63, 0xA4, 0xDD, 0x05, 0x18, - 0x58, 0xD3, 0xFF, 0xFF, 0xC4, 0x83, 0xA2, 0xDD, 0xCA, 0x84, 0xA6, 0xDB, 0x25, 0x58, 0x64, 0x41, - 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x06, 0x02, 0x40, 0xFF, 0x42, 0xFF, 0x43, 0xFF, 0x44, 0xFF, - 0x45, 0xFF, 0xA1, 0xFF, 0x88, 0xFF, 0x85, 0xFF, 0x21, 0xE1, 0x5C, 0x40, 0xC0, 0x60, 0x9A, 0x78, - 0xFF, 0xFF, 0x43, 0xFF, 0x39, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x84, 0x3E, 0xFB, 0x01, 0xA0, 0x4C, - 0x3D, 0x46, 0x2A, 0xF2, 0x46, 0x4D, 0x10, 0x25, 0x0E, 0x00, 0x09, 0xE1, 0xA1, 0xFF, 0x66, 0x40, - 0x0F, 0xF2, 0x01, 0x29, 0x02, 0x00, 0x40, 0xFF, 0x0A, 0xBC, 0xA2, 0xDA, 0x08, 0x25, 0xE9, 0x01, - 0xCB, 0xFE, 0x5C, 0x5D, 0xE7, 0x01, 0x44, 0xFF, 0x03, 0x2B, 0x21, 0x00, 0x89, 0xF3, 0x06, 0x61, - 0x60, 0x43, 0x66, 0x45, 0x31, 0xF0, 0x63, 0x46, 0x05, 0xF2, 0x65, 0x46, 0xD0, 0x80, 0x30, 0xF0, - 0x0F, 0x02, 0x63, 0x46, 0x04, 0xF2, 0x65, 0x46, 0xD0, 0x80, 0x2F, 0xF0, 0x09, 0x02, 0x63, 0x46, - 0x03, 0xF2, 0x65, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x03, 0x02, 0xFF, 0xFF, 0x48, 0xFE, 0x06, 0x00, - 0xCD, 0x81, 0x02, 0xA3, 0xE7, 0x02, 0x88, 0xF1, 0x08, 0xFE, 0x64, 0x43, 0x26, 0x03, 0x31, 0xF2, - 0x12, 0x60, 0xCE, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, - 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x31, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, - 0x0C, 0x02, 0x61, 0x46, 0x30, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, - 0x2F, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, - 0xE8, 0x1B, 0x88, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x07, 0xFC, 0x3F, 0xF2, 0x09, 0x60, - 0xB0, 0x65, 0xD4, 0x80, 0x2A, 0xF2, 0xA1, 0x05, 0x08, 0x25, 0x93, 0x01, 0x00, 0x64, 0x0D, 0x60, - 0x2C, 0x61, 0x40, 0x4B, 0xA1, 0xDB, 0x2D, 0x46, 0x3B, 0xF2, 0x88, 0xF1, 0x87, 0xF4, 0x60, 0x40, - 0x20, 0x2B, 0x12, 0x00, 0xD3, 0x80, 0x2C, 0xF0, 0x90, 0x03, 0x07, 0xF4, 0x64, 0x40, 0x01, 0x26, - 0x88, 0xF5, 0xB6, 0xF4, 0x2D, 0x46, 0x04, 0x64, 0x04, 0xB3, 0x22, 0xFA, 0x04, 0x03, 0xC2, 0x60, - 0x11, 0x78, 0xFF, 0xFF, 0x01, 0x00, 0xE0, 0x00, 0x74, 0x62, 0xA2, 0xD0, 0xFF, 0xFF, 0x64, 0x44, - 0xE0, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xE1, 0x7F, 0x5A, 0xD0, 0xA0, 0x5B, 0x64, 0x44, 0xE2, 0x7F, - 0xA0, 0x5B, 0x64, 0x47, 0x7C, 0x5F, 0xE8, 0x84, 0xE8, 0x85, 0x0C, 0x60, 0x3A, 0x64, 0x44, 0xD3, - 0x5A, 0xD1, 0x03, 0x1B, 0xC2, 0x60, 0x04, 0x78, 0xFF, 0xFF, 0x60, 0x45, 0x64, 0x44, 0xE3, 0x7F, - 0xA0, 0x5B, 0x64, 0x47, 0xE4, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, 0xE5, 0x7F, 0xA0, 0x5B, - 0x64, 0x47, 0xE6, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, 0xE7, 0x7F, 0xA0, 0x5B, 0x65, 0x40, - 0x0D, 0x3A, 0x1C, 0x00, 0x64, 0x47, 0xE8, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, 0xE9, 0x7F, - 0xA0, 0x5B, 0x64, 0x47, 0xEA, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, 0xEB, 0x7F, 0xA0, 0x5B, - 0x64, 0x47, 0xEC, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, 0xED, 0x7F, 0xA0, 0x5B, 0x64, 0x47, - 0xEE, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, 0xEF, 0x7F, 0xA0, 0x5B, 0x65, 0x44, 0xD8, 0x84, - 0x08, 0x25, 0x78, 0x00, 0x60, 0x7F, 0xA0, 0x5B, 0x80, 0x60, 0x00, 0xEB, 0xA0, 0x60, 0x00, 0xEB, - 0xD1, 0x60, 0x00, 0xEB, 0x3F, 0xF2, 0x04, 0x65, 0xC4, 0x83, 0x0A, 0xE1, 0xB3, 0xFF, 0x9A, 0xFF, - 0xCB, 0x83, 0x00, 0xF4, 0x10, 0x62, 0x6C, 0x61, 0x0E, 0xA3, 0xAB, 0x84, 0xF2, 0xA3, 0xA1, 0xFF, - 0x08, 0x00, 0x00, 0xF4, 0x81, 0xF2, 0x02, 0x62, 0xC9, 0x81, 0xAB, 0x84, 0xA1, 0xFF, 0x01, 0x00, - 0xA2, 0xDC, 0x7A, 0xD4, 0xFD, 0x1C, 0xA2, 0xDC, 0x08, 0x25, 0x54, 0x00, 0xF2, 0x1D, 0x7C, 0xA8, - 0xD9, 0x81, 0xEF, 0x03, 0xFF, 0xB1, 0x09, 0x1E, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x62, 0x5A, 0xD2, - 0x89, 0xFF, 0x80, 0x4F, 0x6F, 0x44, 0xA2, 0xDA, 0x88, 0xFF, 0x98, 0xFF, 0x09, 0xE1, 0xA1, 0xFF, - 0x3D, 0x46, 0x08, 0x25, 0x3F, 0x00, 0x40, 0xFF, 0x0F, 0xF0, 0x0A, 0x64, 0xB0, 0x84, 0x18, 0x14, - 0xF7, 0xB4, 0xA2, 0xDA, 0x0D, 0x60, 0x2C, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, - 0x0C, 0x00, 0xD1, 0xF5, 0xD0, 0xF4, 0x0D, 0x60, 0x2C, 0x61, 0x59, 0xD1, 0x37, 0xF8, 0x05, 0x64, - 0x59, 0xD1, 0xCC, 0x84, 0xBD, 0xD8, 0xFC, 0x02, 0x2D, 0x46, 0xC0, 0x60, 0xB0, 0x78, 0xFF, 0xFF, - 0xA2, 0xDA, 0x2D, 0x46, 0x3B, 0xF0, 0xFF, 0xFF, 0x64, 0x40, 0x20, 0x2B, 0x18, 0x00, 0xD1, 0xF5, - 0xB7, 0xF0, 0x2A, 0x44, 0xA4, 0x84, 0xFF, 0xFF, 0x2F, 0x26, 0x10, 0x00, 0x2D, 0x46, 0x64, 0x44, - 0x3A, 0xF0, 0xBC, 0xF0, 0x64, 0x5F, 0x3D, 0xF0, 0x07, 0xF4, 0xD0, 0xF4, 0xFF, 0xFF, 0x08, 0xA3, - 0x5B, 0xD8, 0x65, 0x5C, 0x5B, 0xD8, 0x5B, 0xDA, 0x2D, 0x46, 0x01, 0x00, 0x2D, 0x46, 0xC0, 0x60, - 0xB0, 0x78, 0xFF, 0xFF, 0x98, 0xFF, 0x43, 0xFF, 0x40, 0xFF, 0xB0, 0xFF, 0xB1, 0xFF, 0x2D, 0x46, - 0x0D, 0x60, 0x2C, 0x61, 0xA1, 0xD3, 0x2D, 0x46, 0x60, 0x40, 0x01, 0x2A, 0x0A, 0x00, 0xD1, 0xF5, - 0xD0, 0xF4, 0x59, 0xD1, 0x37, 0xF8, 0x05, 0x64, 0x59, 0xD1, 0xCC, 0x84, 0xBD, 0xD8, 0xFC, 0x02, - 0x2D, 0x46, 0xC0, 0x60, 0x9A, 0x78, 0xFF, 0xFF, 0x98, 0xFF, 0x09, 0xE1, 0xA1, 0xFF, 0x3D, 0x46, - 0x08, 0x25, 0xE0, 0x01, 0x0F, 0xF2, 0x40, 0xFF, 0x02, 0xBC, 0xA2, 0xDA, 0xC0, 0x60, 0xB0, 0x78, - 0xFF, 0xFF, 0x00, 0x64, 0x0D, 0x60, 0x2C, 0x62, 0xA2, 0xDB, 0x04, 0x64, 0x22, 0xFA, 0x87, 0xF4, - 0x88, 0xF1, 0xFF, 0xFF, 0xD3, 0x80, 0x3B, 0xF2, 0xE7, 0x03, 0x60, 0x47, 0xC0, 0xB7, 0x02, 0xFE, - 0xF0, 0x84, 0xF0, 0x84, 0xF0, 0x84, 0x00, 0xA8, 0x40, 0x4A, 0x16, 0x03, 0xE0, 0x81, 0x61, 0x43, - 0x42, 0xFE, 0x00, 0x64, 0xF0, 0x84, 0xFE, 0x1F, 0x40, 0x4A, 0xE1, 0x84, 0xE0, 0x84, 0x2D, 0x46, - 0x07, 0xF4, 0xE0, 0x81, 0x37, 0xF0, 0x2A, 0x47, 0x0C, 0x60, 0x7A, 0x63, 0xA0, 0x84, 0x47, 0x9C, - 0x10, 0x03, 0x7C, 0x44, 0xA0, 0x63, 0x11, 0x00, 0x20, 0x64, 0x40, 0x4A, 0x63, 0x46, 0x37, 0xF0, - 0x66, 0x44, 0x64, 0x40, 0x80, 0x2B, 0x05, 0x00, 0x00, 0x60, 0x70, 0x7C, 0x00, 0x60, 0x90, 0x63, - 0x04, 0x00, 0x2D, 0x46, 0xC2, 0x60, 0x04, 0x78, 0xFF, 0xFF, 0x2D, 0x46, 0xCE, 0xFB, 0xCF, 0xF9, - 0xD0, 0xFD, 0x07, 0xF2, 0xD1, 0xFB, 0x60, 0x46, 0x37, 0xF0, 0x2A, 0x44, 0x0D, 0x60, 0x2C, 0x62, - 0x5A, 0xD9, 0x00, 0x65, 0x45, 0x4B, 0xA0, 0x84, 0xFF, 0xFF, 0x3F, 0x22, 0x05, 0x00, 0x90, 0x84, - 0x37, 0xFA, 0x01, 0x64, 0x40, 0x4B, 0x21, 0x00, 0xAD, 0x46, 0x0A, 0xA3, 0x3D, 0xF2, 0xAD, 0x46, - 0xA3, 0xD0, 0xAD, 0x46, 0xD0, 0x80, 0x3C, 0xF2, 0xAD, 0x46, 0x02, 0x03, 0x16, 0x07, 0x14, 0x04, - 0x5B, 0xD0, 0xAD, 0x46, 0xD0, 0x80, 0x3B, 0xF2, 0x03, 0x03, 0xAD, 0x46, 0x0E, 0x07, 0x0C, 0x04, - 0x3A, 0xF0, 0xAD, 0x46, 0x5B, 0xD0, 0x64, 0x5F, 0xD0, 0x80, 0x2B, 0x44, 0x18, 0x07, 0x04, 0x03, - 0xD0, 0x84, 0x10, 0xA4, 0xFF, 0xFF, 0x13, 0x07, 0x7F, 0x01, 0x01, 0x64, 0x0D, 0x60, 0x2C, 0x62, - 0xA2, 0xDB, 0x2D, 0x46, 0x0D, 0x60, 0x3C, 0x62, 0x80, 0xFF, 0x78, 0x44, 0x03, 0xA4, 0xA2, 0xDB, - 0xC2, 0x60, 0xAA, 0x78, 0xFF, 0xFF, 0x85, 0xFF, 0x2D, 0x46, 0x08, 0x25, 0x53, 0x01, 0x2D, 0x46, - 0x0D, 0x60, 0x3C, 0x62, 0x80, 0xFF, 0x78, 0x44, 0x03, 0xA4, 0xA2, 0xDB, 0xC3, 0x60, 0x33, 0x78, - 0xFF, 0xFF, 0x85, 0xFF, 0x2D, 0x46, 0x08, 0x25, 0x45, 0x01, 0x00, 0x60, 0x0F, 0x64, 0xC1, 0x60, - 0x70, 0x78, 0xFF, 0xFF, 0x07, 0xF4, 0x66, 0x41, 0x03, 0xF2, 0x04, 0xF2, 0x40, 0x42, 0x05, 0xF2, - 0x40, 0x43, 0x40, 0x44, 0x61, 0x46, 0x3C, 0xF2, 0x3D, 0xF2, 0x40, 0x40, 0x40, 0x41, 0x0D, 0x60, - 0x70, 0x65, 0x00, 0x61, 0xCF, 0xF1, 0xCE, 0xF5, 0x44, 0x4C, 0x2C, 0x5C, 0xE9, 0x80, 0x00, 0x64, - 0xF0, 0x84, 0xF0, 0x84, 0xC0, 0x83, 0xBD, 0xD2, 0x24, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x20, 0x44, 0x40, 0x80, 0xDB, 0x83, 0xBD, 0xD2, 0x20, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x21, 0x44, 0x40, 0x81, 0xDB, 0x83, 0xBD, 0xD2, 0x21, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x22, 0x44, 0x40, 0x82, 0xDB, 0x83, 0xBD, 0xD2, 0x22, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x23, 0x44, 0x40, 0x83, 0xF2, 0xA3, 0xBD, 0xD2, 0x23, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x24, 0x44, 0xC0, 0x9C, 0x41, 0x84, 0xDD, 0x81, 0x08, 0x2A, 0xA7, 0x01, 0x0D, 0x60, 0x2E, 0x61, - 0x05, 0x64, 0xD0, 0xF4, 0xD1, 0xF5, 0xFE, 0xA3, 0x5B, 0xD0, 0xCC, 0x84, 0x59, 0xD9, 0xFC, 0x02, - 0xD0, 0xF3, 0xD1, 0xF5, 0x60, 0x42, 0x20, 0x44, 0xA2, 0xDA, 0x21, 0x44, 0x5A, 0xDA, 0x22, 0x44, - 0x5A, 0xDA, 0x23, 0x44, 0x5A, 0xDA, 0x24, 0x44, 0x5A, 0xDA, 0x61, 0x46, 0x0D, 0x60, 0x3C, 0x62, - 0xA2, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0x41, 0xD0, 0xF3, 0xD1, 0xF5, 0xA0, 0xD2, 0x5A, 0xD0, - 0x40, 0x40, 0x44, 0x41, 0x5A, 0xD2, 0x5A, 0xD0, 0x40, 0x42, 0x5A, 0xD0, 0x44, 0x43, 0x61, 0x46, - 0xBA, 0xF0, 0x3B, 0xF2, 0x44, 0x44, 0x65, 0x5F, 0x40, 0x85, 0xCF, 0xF4, 0xCE, 0xF5, 0x43, 0x4C, - 0x0D, 0x60, 0x70, 0x65, 0xBD, 0xD2, 0x25, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x20, 0x44, - 0x40, 0x80, 0xBD, 0xD2, 0x20, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x21, 0x44, 0x40, 0x81, - 0xBD, 0xD2, 0x21, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x22, 0x44, 0x40, 0x82, 0xBD, 0xD2, - 0x22, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x23, 0x44, 0x40, 0x83, 0xBD, 0xD2, 0x23, 0x5C, - 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x24, 0x44, 0x40, 0x84, 0xBD, 0xD2, 0x24, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x25, 0x44, 0x40, 0x85, 0x61, 0x46, 0x3A, 0xF0, 0xFF, 0xFF, 0x64, 0x44, - 0xE0, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xE1, 0x7F, 0x5A, 0xD0, 0xA0, 0x5B, 0x64, 0x44, 0xE2, 0x7F, - 0xA0, 0x5B, 0x64, 0x47, 0xCE, 0xF5, 0xBD, 0xD2, 0x25, 0x5C, 0x90, 0x84, 0xE8, 0x80, 0xF8, 0x84, - 0x20, 0x5C, 0x40, 0x80, 0x20, 0x44, 0xE4, 0x7F, 0xA0, 0x5B, 0x20, 0x47, 0xE5, 0x7F, 0xA0, 0x5B, - 0xBD, 0xD2, 0x20, 0x5C, 0x90, 0x84, 0xE8, 0x80, 0xF8, 0x84, 0x21, 0x5C, 0x40, 0x81, 0x21, 0x44, - 0xE6, 0x7F, 0xA0, 0x5B, 0x21, 0x47, 0xE7, 0x7F, 0xA0, 0x5B, 0x21, 0x44, 0xE8, 0x80, 0xF8, 0x84, - 0x22, 0x5C, 0x40, 0x82, 0x22, 0x44, 0xE8, 0x7F, 0xA0, 0x5B, 0x22, 0x47, 0xE9, 0x7F, 0xA0, 0x5B, - 0x22, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x23, 0x5C, 0x40, 0x83, 0x23, 0x44, 0xEA, 0x7F, 0xA0, 0x5B, - 0x23, 0x47, 0xEB, 0x7F, 0xA0, 0x5B, 0x23, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x24, 0x5C, 0x40, 0x84, - 0x24, 0x44, 0xEC, 0x7F, 0xA0, 0x5B, 0x24, 0x47, 0xED, 0x7F, 0xA0, 0x5B, 0x24, 0x44, 0xE8, 0x80, - 0xF8, 0x84, 0x25, 0x5C, 0x40, 0x85, 0x25, 0x44, 0xEE, 0x7F, 0xA0, 0x5B, 0x25, 0x47, 0xEF, 0x7F, - 0xA0, 0x5B, 0x2C, 0x43, 0xA3, 0xD2, 0x25, 0x5C, 0x90, 0x81, 0xE9, 0x84, 0xE3, 0x7F, 0xA0, 0x5B, - 0x0D, 0x60, 0x3C, 0x62, 0xA2, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF3, 0x5A, 0xD3, 0x40, 0x48, - 0x5A, 0xD3, 0x40, 0x49, 0x40, 0x4A, 0x00, 0x60, 0x70, 0x7C, 0x44, 0x4D, 0x45, 0xF2, 0x46, 0xF2, - 0x40, 0x47, 0x40, 0x46, 0x0D, 0x60, 0x70, 0x65, 0x00, 0x61, 0x2D, 0x5C, 0xE9, 0x80, 0x00, 0x64, - 0xF0, 0x84, 0xF0, 0x84, 0xC0, 0x83, 0xBD, 0xD2, 0x2A, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x26, 0x44, 0x40, 0x86, 0xDB, 0x83, 0xBD, 0xD2, 0x26, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x27, 0x44, 0x40, 0x87, 0xDB, 0x83, 0xBD, 0xD2, 0x27, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x28, 0x44, 0x40, 0x88, 0xDB, 0x83, 0xBD, 0xD2, 0x28, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x29, 0x44, 0x40, 0x89, 0xF2, 0xA3, 0xBD, 0xD2, 0x29, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x2A, 0x44, 0xC0, 0x9C, 0x41, 0x8A, 0xDD, 0x81, 0x08, 0x2A, 0xA7, 0x01, 0x26, 0x44, 0x40, 0xFA, - 0x27, 0x44, 0x41, 0xFA, 0x28, 0x44, 0x42, 0xFA, 0x29, 0x44, 0x43, 0xFA, 0x2A, 0x44, 0x44, 0xFA, - 0x0D, 0x60, 0x3E, 0x62, 0xA2, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x80, 0x7C, 0x44, 0x4D, - 0x2D, 0x42, 0xA2, 0xD2, 0x5A, 0xD0, 0x40, 0x46, 0x44, 0x47, 0x5A, 0xD2, 0x5A, 0xD0, 0x40, 0x48, - 0x5A, 0xD0, 0x44, 0x49, 0x47, 0xF2, 0x44, 0x4A, 0x40, 0x8B, 0x60, 0x5C, 0x64, 0x47, 0xE0, 0x7F, - 0xA0, 0x5A, 0xFF, 0xB4, 0x20, 0xBC, 0x7F, 0xB4, 0xE1, 0x7F, 0xA0, 0x5A, 0x64, 0x44, 0xE2, 0x7F, - 0xA0, 0x5A, 0x00, 0x60, 0x70, 0x63, 0x0D, 0x60, 0x70, 0x65, 0xBD, 0xD2, 0x2B, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x26, 0x44, 0x40, 0x86, 0xBD, 0xD2, 0x26, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x27, 0x44, 0x40, 0x87, 0xBD, 0xD2, 0x27, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x28, 0x44, 0x40, 0x88, 0xBD, 0xD2, 0x28, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x29, 0x44, - 0x40, 0x89, 0xBD, 0xD2, 0x29, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x2A, 0x44, 0x40, 0x8A, - 0xBD, 0xD2, 0x2A, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x2B, 0x44, 0x40, 0x8B, 0xBD, 0xD2, - 0x2B, 0x5C, 0x90, 0x84, 0xE8, 0x80, 0xF8, 0x84, 0x26, 0x5C, 0x40, 0x86, 0x26, 0x44, 0xE4, 0x7F, - 0xA0, 0x5A, 0x26, 0x47, 0xE5, 0x7F, 0xA0, 0x5A, 0xBD, 0xD2, 0x26, 0x5C, 0x90, 0x84, 0xE8, 0x80, - 0xF8, 0x84, 0x27, 0x5C, 0x40, 0x87, 0x27, 0x44, 0xE6, 0x7F, 0xA0, 0x5A, 0x27, 0x47, 0xE7, 0x7F, - 0xA0, 0x5A, 0x27, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x28, 0x5C, 0x40, 0x88, 0x28, 0x44, 0xE8, 0x7F, - 0xA0, 0x5A, 0x28, 0x47, 0xE9, 0x7F, 0xA0, 0x5A, 0x28, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x29, 0x5C, - 0x40, 0x89, 0x29, 0x44, 0xEA, 0x7F, 0xA0, 0x5A, 0x29, 0x47, 0xEB, 0x7F, 0xA0, 0x5A, 0x29, 0x44, - 0xE8, 0x80, 0xF8, 0x84, 0x2A, 0x5C, 0x40, 0x8A, 0x2A, 0x44, 0xEC, 0x7F, 0xA0, 0x5A, 0x2A, 0x47, - 0xED, 0x7F, 0xA0, 0x5A, 0x2A, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x2B, 0x5C, 0x40, 0x8B, 0x2B, 0x44, - 0xEE, 0x7F, 0xA0, 0x5A, 0x2B, 0x47, 0xEF, 0x7F, 0xA0, 0x5A, 0x38, 0xF0, 0x2B, 0x44, 0x90, 0x84, - 0xE8, 0x84, 0xE3, 0x7F, 0xA0, 0x5A, 0x0D, 0x60, 0x3E, 0x62, 0xA2, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, - 0x42, 0xFF, 0x40, 0xFF, 0xDD, 0xFE, 0xAD, 0x4F, 0x00, 0x7F, 0x01, 0xBC, 0xA0, 0x5D, 0x00, 0xEE, - 0x19, 0x61, 0xCD, 0x81, 0xFF, 0xFF, 0xFD, 0x02, 0x43, 0x45, 0x20, 0x44, 0x60, 0xBC, 0x40, 0x40, - 0x02, 0x60, 0xEE, 0x63, 0x65, 0xF3, 0x82, 0xFD, 0x40, 0x7F, 0x83, 0xFB, 0x05, 0x64, 0x84, 0xFB, - 0xDF, 0xFE, 0x19, 0xFF, 0xC5, 0x60, 0x6D, 0x64, 0x3F, 0x40, 0x01, 0x2B, 0x02, 0x00, 0xC5, 0x60, - 0x6D, 0x64, 0x85, 0xFB, 0xC0, 0x60, 0x9A, 0x78, 0xFF, 0xFF, 0x04, 0xEE, 0xAD, 0x4F, 0x00, 0x7F, - 0x01, 0xBC, 0xA0, 0x5D, 0x19, 0x61, 0xCD, 0x81, 0xFF, 0xFF, 0xFD, 0x02, 0xAD, 0x4F, 0x00, 0x7F, - 0x01, 0xBC, 0xA0, 0x5D, 0x00, 0xEE, 0x15, 0x60, 0xA2, 0xE7, 0x1C, 0x60, 0x68, 0x63, 0x1C, 0x60, - 0xDC, 0x65, 0xDF, 0xFE, 0x80, 0xE1, 0xBD, 0xD3, 0xFF, 0xFF, 0x60, 0x48, 0x60, 0x47, 0x80, 0xBC, - 0x00, 0x7F, 0x60, 0x4A, 0xD7, 0x80, 0xA1, 0xFF, 0xFF, 0xFF, 0xF5, 0x02, 0x1C, 0x60, 0xDC, 0x63, - 0x1D, 0x60, 0xDE, 0x65, 0xBD, 0xD3, 0xFF, 0xFF, 0x60, 0x48, 0x60, 0x47, 0x80, 0xBC, 0x00, 0x7F, - 0x60, 0x4A, 0xD7, 0x80, 0xA1, 0xFF, 0xFF, 0xFF, 0xF5, 0x02, 0x3F, 0x40, 0x20, 0x2B, 0x00, 0x00, - 0x01, 0x68, 0xFF, 0x6A, 0xBF, 0xFE, 0xC6, 0x60, 0x55, 0x78, 0xFF, 0xFF, 0x3F, 0x40, 0x20, 0x2B, - 0xAD, 0x00, 0x01, 0x16, 0xFE, 0x01, 0x38, 0x69, 0xA1, 0xFF, 0xFF, 0xFF, 0x68, 0x44, 0x01, 0x2A, - 0xA5, 0x00, 0x1F, 0x60, 0x1A, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xFF, 0xFF, 0x08, 0x28, - 0xA2, 0xDB, 0x65, 0xF1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x9C, 0x01, 0x00, 0x65, 0xF1, 0xDD, 0xFE, - 0xAD, 0x4F, 0x00, 0x7F, 0x01, 0xBC, 0xA0, 0x5D, 0x00, 0xEE, 0x43, 0x45, 0x20, 0x44, 0x20, 0xBC, - 0x40, 0x40, 0x02, 0x60, 0xEE, 0x64, 0x82, 0xFB, 0x83, 0xF9, 0x05, 0x64, 0x84, 0xFB, 0xDF, 0xFE, - 0x19, 0xFF, 0x83, 0x00, 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, 0x43, 0x45, 0xA4, 0xD1, 0xDA, 0x83, - 0xC3, 0x85, 0x80, 0xE1, 0xDF, 0xFE, 0xBD, 0xD3, 0xFF, 0xFF, 0x60, 0x48, 0x60, 0x47, 0x80, 0xBC, - 0x00, 0x7F, 0x60, 0x4A, 0xD7, 0x80, 0xA1, 0xFF, 0xF6, 0x02, 0xBF, 0xFE, 0x6E, 0x00, 0x3F, 0x40, - 0x40, 0x26, 0x13, 0x00, 0x0B, 0x60, 0xF8, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x10, 0x64, 0x90, 0x84, - 0xA0, 0x50, 0xF8, 0xA2, 0xA2, 0xD1, 0x0A, 0x60, 0x19, 0x64, 0x90, 0x84, 0xA0, 0x52, 0x06, 0xA2, - 0xA2, 0xD1, 0x46, 0x60, 0x09, 0x64, 0x90, 0x84, 0xA0, 0x50, 0xAD, 0x4F, 0xFE, 0xB4, 0xA0, 0x5D, - 0xAD, 0x4F, 0xFD, 0xB4, 0xA0, 0x5D, 0x02, 0xEE, 0xBD, 0xFE, 0x50, 0x00, 0x80, 0xE1, 0x01, 0x16, - 0xFE, 0x01, 0x64, 0x48, 0x92, 0x6A, 0xA1, 0xFF, 0xFF, 0xFF, 0x68, 0x40, 0x1F, 0x60, 0x08, 0x64, - 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xFF, 0xFF, 0x08, 0x28, 0xA2, 0xDB, 0x3F, 0x00, 0x80, 0xE1, - 0x01, 0x16, 0xFE, 0x01, 0x01, 0x68, 0xA7, 0x6A, 0xA1, 0xFF, 0xFF, 0xFF, 0x68, 0x40, 0x36, 0x00, - 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, 0x80, 0xE1, 0x64, 0x46, 0x01, 0x16, 0xFE, 0x01, 0x21, 0x69, - 0xA1, 0xFF, 0xFF, 0xFF, 0x68, 0x5E, 0x01, 0x16, 0xFE, 0x01, 0x22, 0x69, 0xA1, 0xFF, 0xFF, 0xFF, - 0x68, 0x5F, 0x26, 0xFA, 0x1C, 0xF2, 0x01, 0x16, 0xFE, 0x01, 0x3A, 0x69, 0xA1, 0xFF, 0xFF, 0xFF, - 0x68, 0x5F, 0x27, 0xFA, 0x1B, 0x00, 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, 0x43, 0x45, 0xBE, 0xD5, - 0xA4, 0xD2, 0x5A, 0x86, 0xEF, 0xA0, 0x11, 0x61, 0x01, 0x06, 0x60, 0x41, 0x1C, 0x60, 0x46, 0x63, - 0x80, 0xE1, 0xBD, 0xD3, 0x26, 0x42, 0x01, 0x16, 0xFE, 0x01, 0x60, 0x49, 0xA1, 0xFF, 0xFF, 0xFF, - 0x68, 0x44, 0xCD, 0x81, 0xA2, 0xDA, 0x5A, 0x86, 0xF4, 0x02, 0x25, 0x43, 0x21, 0xE1, 0x00, 0x64, - 0xBF, 0xDB, 0x20, 0x44, 0x20, 0x2A, 0x07, 0x00, 0x07, 0xB4, 0x04, 0x36, 0xC3, 0xFE, 0x06, 0x36, - 0xCC, 0xFE, 0x07, 0x36, 0xD5, 0xFE, 0x20, 0x44, 0xD8, 0xB4, 0x40, 0x40, 0x20, 0x44, 0x40, 0x2A, - 0x07, 0x00, 0x9F, 0xFE, 0x1E, 0x05, 0xBF, 0xB4, 0x40, 0x40, 0x85, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, - 0x1B, 0x60, 0xE6, 0x63, 0xBD, 0xD3, 0x02, 0x61, 0x17, 0x1B, 0x04, 0xA3, 0xBD, 0xD3, 0x02, 0x61, - 0x13, 0x1B, 0x04, 0xA3, 0xBD, 0xD3, 0x02, 0x61, 0x0F, 0x1B, 0x04, 0xA3, 0xBD, 0xD3, 0x04, 0x61, - 0x0B, 0x1B, 0x04, 0xA3, 0xBD, 0xD3, 0x06, 0x61, 0x07, 0x1B, 0x04, 0xA3, 0xBD, 0xD3, 0x07, 0x61, - 0x03, 0x1B, 0xC0, 0x60, 0x9A, 0x78, 0xFF, 0xFF, 0xA3, 0xD1, 0x40, 0x44, 0x20, 0x44, 0x07, 0xB5, - 0xD4, 0x85, 0x35, 0x80, 0x24, 0x45, 0x1C, 0x60, 0x22, 0x64, 0x44, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0xE1, 0x43, 0x45, 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, 0x64, 0x43, 0xBD, 0xD3, 0xBD, 0xD1, - 0x40, 0x44, 0x10, 0x27, 0x10, 0x00, 0xFF, 0x60, 0x7F, 0x65, 0x15, 0x60, 0xA2, 0x64, 0x24, 0x40, - 0x08, 0x2B, 0xA4, 0x84, 0xA0, 0x57, 0xFF, 0xFF, 0x64, 0x49, 0xFF, 0xFF, 0x68, 0x44, 0x01, 0x16, - 0xFD, 0x01, 0x00, 0x7F, 0xA3, 0xDB, 0xA1, 0x01, 0x80, 0xE1, 0x43, 0x45, 0x20, 0x44, 0x20, 0xBC, - 0x40, 0x40, 0x64, 0x43, 0xBD, 0xD3, 0xBD, 0xD1, 0x40, 0x44, 0x10, 0x2B, 0x11, 0x00, 0xA3, 0xD3, - 0xFF, 0xFF, 0x15, 0x60, 0x80, 0xE7, 0x24, 0x40, 0x07, 0x27, 0x02, 0x00, 0x50, 0xEC, 0x00, 0x00, - 0x60, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x24, 0x40, 0x20, 0x2B, 0x40, 0xEC, 0x0F, 0x00, - 0x15, 0x60, 0x22, 0x64, 0x24, 0x40, 0x08, 0x27, 0x80, 0xBC, 0xA3, 0xD3, 0xA0, 0x57, 0x60, 0x48, - 0x64, 0x44, 0x80, 0xBC, 0xFF, 0xB4, 0x60, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x75, 0x01, - 0xA2, 0xFF, 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x01, 0x02, 0xA1, 0xFF, 0x86, 0xFF, 0x88, 0xFF, - 0x5C, 0x46, 0x5C, 0x49, 0x5C, 0x40, 0xDE, 0x60, 0x58, 0x4F, 0xE2, 0x78, 0xFF, 0xFF, 0xCE, 0x60, - 0x58, 0x4F, 0x00, 0x78, 0xFF, 0xFF, 0xE7, 0x60, 0x58, 0x4F, 0xBE, 0x78, 0xFF, 0xFF, 0xDB, 0x60, - 0x58, 0x4F, 0x3B, 0x78, 0xFF, 0xFF, 0x13, 0xE1, 0xA3, 0xFF, 0xC7, 0x60, 0x2E, 0x78, 0xFF, 0xFF, - 0xDC, 0x60, 0x87, 0x78, 0xFF, 0xFF, 0x0F, 0x60, 0xCE, 0x62, 0xA2, 0xD1, 0x80, 0x60, 0x00, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x22, 0x00, 0x75, 0xF3, 0x31, 0x40, 0x01, 0x2A, 0x1E, 0x00, - 0xDC, 0x84, 0x01, 0xB4, 0x75, 0xFB, 0x09, 0x02, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x00, 0x60, - 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x11, 0x00, 0x0F, 0x60, 0xDC, 0x62, 0xA2, 0xD1, - 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x08, 0x00, 0xA9, 0xFE, 0xE4, 0x05, - 0xAB, 0xFE, 0x07, 0x05, 0xA8, 0xFE, 0xD4, 0x05, 0xAA, 0xFE, 0xD5, 0x05, 0xA1, 0xFF, 0xFF, 0xFF, - 0x85, 0x3E, 0x1B, 0x60, 0xC4, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x03, 0x02, - 0xC7, 0x60, 0x2E, 0x78, 0xFF, 0xFF, 0x26, 0x45, 0xD4, 0x80, 0x0F, 0xF0, 0xF9, 0x03, 0x64, 0x44, - 0x70, 0xB0, 0x70, 0x2A, 0x14, 0x00, 0x1F, 0x60, 0x18, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, - 0xFF, 0xFF, 0x08, 0x28, 0xA2, 0xDB, 0xA2, 0xFF, 0x8F, 0xF3, 0xFF, 0xFF, 0xCC, 0x84, 0xFE, 0xA0, - 0x8F, 0xFB, 0x01, 0x07, 0xD4, 0xFE, 0xA3, 0xFF, 0xCB, 0x60, 0xBC, 0x78, 0xFF, 0xFF, 0x64, 0x40, - 0x02, 0x26, 0x09, 0x00, 0x66, 0x45, 0x09, 0xF4, 0x0F, 0xF2, 0x02, 0x18, 0x65, 0x46, 0xE3, 0x1B, - 0x00, 0x64, 0x40, 0x46, 0xCB, 0x01, 0xA2, 0xFF, 0x8F, 0xF3, 0x46, 0x46, 0xCC, 0x84, 0xFE, 0xA0, - 0x8F, 0xFB, 0x01, 0x07, 0xD4, 0xFE, 0xA3, 0xFF, 0x0F, 0xF0, 0xA3, 0xFC, 0x64, 0x44, 0x80, 0x26, - 0x22, 0x00, 0x98, 0xF1, 0x1E, 0x60, 0xF8, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, - 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, - 0x00, 0x75, 0x88, 0xFF, 0x32, 0x44, 0x01, 0x2A, 0x03, 0x00, 0x07, 0x60, 0x01, 0x64, 0x04, 0x00, - 0x02, 0x2A, 0x06, 0x00, 0x00, 0x60, 0x01, 0x64, 0x23, 0xFA, 0xCB, 0x60, 0xC8, 0x78, 0xFF, 0xFF, - 0xCB, 0x60, 0xBC, 0x78, 0xFF, 0xFF, 0x08, 0x26, 0x3F, 0x00, 0x2A, 0xF2, 0x60, 0x63, 0x60, 0x40, - 0x02, 0x2B, 0x66, 0x63, 0xBE, 0xD2, 0x69, 0xF1, 0xA3, 0xD2, 0xD0, 0x80, 0x68, 0xF1, 0x18, 0x02, - 0xBF, 0xD2, 0xD0, 0x80, 0x67, 0xF1, 0x14, 0x02, 0xD0, 0x80, 0xFF, 0xFF, 0x11, 0x02, 0x98, 0xF1, - 0x1F, 0x60, 0x04, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, - 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, - 0x32, 0x44, 0x01, 0x2A, 0x03, 0x00, 0x07, 0x60, 0x02, 0x64, 0x04, 0x00, 0x02, 0x2A, 0x06, 0x00, - 0x00, 0x60, 0x02, 0x64, 0x23, 0xFA, 0xCB, 0x60, 0xC8, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0xFF, 0xFF, - 0x60, 0x40, 0xB0, 0x3A, 0x06, 0x00, 0x00, 0x60, 0x02, 0x64, 0x23, 0xFA, 0xC8, 0x60, 0x6D, 0x78, - 0xFF, 0xFF, 0xCB, 0x60, 0xBC, 0x78, 0xFF, 0xFF, 0x32, 0x44, 0x01, 0x2A, 0x4A, 0x00, 0x20, 0x60, - 0x6C, 0x63, 0xBF, 0xD3, 0x00, 0x65, 0xB4, 0x81, 0xDB, 0x83, 0x3D, 0x03, 0xBF, 0xD3, 0xA3, 0xD3, - 0x40, 0x48, 0xBE, 0xD3, 0x40, 0x4A, 0x2E, 0xF0, 0x40, 0x4C, 0xD0, 0x80, 0x2D, 0xF0, 0x08, 0x02, - 0x2A, 0x44, 0xD0, 0x80, 0x2C, 0xF0, 0x04, 0x02, 0x28, 0x44, 0xD0, 0x80, 0xFF, 0xFF, 0x2B, 0x03, - 0x31, 0xF0, 0x2C, 0x44, 0xD0, 0x80, 0x30, 0xF0, 0x08, 0x02, 0x2A, 0x44, 0xD0, 0x80, 0x2F, 0xF0, - 0x04, 0x02, 0x28, 0x44, 0xD0, 0x80, 0xFF, 0xFF, 0x1E, 0x03, 0x34, 0xF0, 0x2C, 0x44, 0xD0, 0x80, - 0x33, 0xF0, 0x08, 0x02, 0x2A, 0x44, 0xD0, 0x80, 0x32, 0xF0, 0x04, 0x02, 0x28, 0x44, 0xD0, 0x80, - 0xFF, 0xFF, 0x11, 0x03, 0x38, 0xF0, 0x2C, 0x44, 0xD0, 0x80, 0x37, 0xF0, 0x08, 0x02, 0x2A, 0x44, - 0xD0, 0x80, 0x36, 0xF0, 0x04, 0x02, 0x28, 0x44, 0xD0, 0x80, 0xFF, 0xFF, 0x04, 0x03, 0xFA, 0xA1, - 0x06, 0xA3, 0xB7, 0x03, 0xC3, 0x01, 0x07, 0x60, 0x00, 0x64, 0x23, 0xFA, 0xCB, 0x60, 0xC8, 0x78, - 0xFF, 0xFF, 0x2A, 0xF2, 0x0F, 0xF0, 0x60, 0x45, 0xA4, 0x36, 0x08, 0x00, 0x0C, 0xB4, 0x04, 0x36, - 0x02, 0x00, 0x0C, 0x3A, 0x06, 0x00, 0xCB, 0x60, 0xBC, 0x78, 0xFF, 0xFF, 0xC9, 0x60, 0x42, 0x78, - 0xFF, 0xFF, 0x26, 0xF2, 0x50, 0xF1, 0x60, 0x47, 0x00, 0x7E, 0xD0, 0x84, 0x1F, 0xA4, 0x06, 0x0E, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x07, 0x00, 0xC2, 0xA4, 0xE8, 0x84, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x87, 0xF8, 0xBF, 0xC0, 0x84, 0xA2, 0xDB, 0x0F, 0xF0, - 0x65, 0x40, 0x40, 0x2B, 0x22, 0x00, 0x32, 0x40, 0x08, 0x26, 0x1F, 0x00, 0x07, 0xF4, 0x36, 0xF2, - 0xFF, 0xFF, 0x37, 0xB4, 0x26, 0x46, 0x19, 0x02, 0x2C, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x26, - 0x11, 0x00, 0x98, 0xF1, 0x1E, 0x60, 0xFE, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, - 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, - 0x00, 0x75, 0x88, 0xFF, 0xCB, 0x60, 0xBC, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x64, 0x40, 0x60, 0x26, - 0x03, 0x00, 0xC9, 0x60, 0x1A, 0x78, 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x3A, 0xF3, 0x01, 0x98, 0xF1, - 0x1E, 0x60, 0xF2, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, - 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, - 0x27, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x3B, 0x12, 0x00, 0x98, 0xF1, 0x1F, 0x60, 0x00, 0x64, - 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, - 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x13, 0x00, 0x02, 0x3B, - 0x11, 0x00, 0x98, 0xF1, 0x1F, 0x60, 0x02, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, - 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, - 0x00, 0x75, 0x88, 0xFF, 0x2A, 0xF2, 0x28, 0x41, 0x40, 0xA8, 0x01, 0xB1, 0x02, 0x02, 0x5F, 0x02, - 0x89, 0x00, 0x60, 0x40, 0x08, 0x2A, 0x2B, 0x00, 0x98, 0xF1, 0x1E, 0x60, 0xF0, 0x64, 0xA0, 0xD3, - 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, - 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x1B, 0xF2, 0xFF, 0xFF, 0x60, 0x45, - 0x98, 0xF1, 0x1E, 0x60, 0xF6, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xD8, 0x80, 0xC4, 0x84, 0x0B, 0x03, - 0x07, 0x05, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x09, 0x04, 0xC6, 0xFE, 0x07, 0x00, - 0x00, 0x64, 0xB8, 0x84, 0xA2, 0xDB, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x0F, 0xF2, - 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x26, 0x28, 0x00, 0x32, 0x44, 0x02, 0x26, 0x25, 0x00, 0x10, 0x2B, - 0x26, 0x00, 0x20, 0x60, 0x6C, 0x63, 0xBF, 0xD3, 0x2C, 0xF0, 0x00, 0xA8, 0x60, 0x41, 0x0D, 0x03, - 0x50, 0xFE, 0xBD, 0xD3, 0x2D, 0xF0, 0xD0, 0x80, 0xBD, 0xD3, 0x2E, 0xF0, 0xD0, 0x80, 0xBD, 0xD3, - 0x2C, 0xF0, 0xD0, 0x80, 0xFA, 0xA1, 0x10, 0x0C, 0xF3, 0x02, 0x50, 0xFE, 0x60, 0x60, 0x01, 0x64, - 0xD0, 0x80, 0x2D, 0xF0, 0x1D, 0x64, 0xD0, 0x80, 0x2E, 0xF0, 0x01, 0x64, 0xD0, 0x80, 0xFF, 0xFF, - 0x03, 0x0C, 0xCB, 0x60, 0xBC, 0x78, 0xFF, 0xFF, 0x32, 0x40, 0x40, 0x2A, 0x00, 0x00, 0xCB, 0x60, - 0xB6, 0x78, 0xFF, 0xFF, 0x32, 0x40, 0x40, 0x26, 0xFA, 0x01, 0x2A, 0xF0, 0xFF, 0xFF, 0x64, 0x40, - 0x08, 0x2A, 0x20, 0x00, 0x32, 0x40, 0x02, 0x2A, 0x1D, 0x00, 0x03, 0x67, 0xA0, 0x84, 0x00, 0x37, - 0x64, 0x63, 0x60, 0x40, 0x02, 0x37, 0x5E, 0x63, 0x60, 0x40, 0x01, 0x37, 0x58, 0x63, 0x60, 0x40, - 0x03, 0x37, 0x0D, 0x00, 0xBD, 0xD2, 0x67, 0xF1, 0xBD, 0xD2, 0xD0, 0x80, 0x68, 0xF1, 0x07, 0x02, - 0xD0, 0x80, 0xBD, 0xD2, 0x69, 0xF1, 0x03, 0x02, 0xD0, 0x80, 0xFF, 0xFF, 0x03, 0x03, 0xCB, 0x60, - 0xBC, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x87, 0xF4, 0x60, 0x40, 0x03, 0x2B, 0x31, 0x00, 0x89, 0xF3, - 0x06, 0x61, 0x60, 0x43, 0x66, 0x45, 0x31, 0xF0, 0x63, 0x46, 0x05, 0xF2, 0x65, 0x46, 0xD0, 0x80, - 0x30, 0xF0, 0x0F, 0x02, 0x63, 0x46, 0x04, 0xF2, 0x65, 0x46, 0xD0, 0x80, 0x2F, 0xF0, 0x09, 0x02, - 0x63, 0x46, 0x03, 0xF2, 0x65, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x03, 0x02, 0xFF, 0xFF, 0x48, 0xFE, - 0x06, 0x00, 0xCD, 0x81, 0x02, 0xA3, 0xE7, 0x02, 0x88, 0xF1, 0x08, 0xFE, 0x64, 0x43, 0x03, 0x03, - 0xCB, 0x60, 0xBC, 0x78, 0xFF, 0xFF, 0x43, 0x43, 0x23, 0x46, 0x06, 0xF0, 0x26, 0x46, 0x07, 0x67, - 0xA0, 0x84, 0x23, 0xFA, 0x64, 0x40, 0x02, 0x26, 0x2B, 0x00, 0xCB, 0x60, 0xBC, 0x78, 0xFF, 0xFF, - 0x26, 0x1B, 0x31, 0xF2, 0x12, 0x60, 0xCE, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, - 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x31, 0xF0, 0x63, 0x46, - 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x30, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, - 0x06, 0x02, 0x61, 0x46, 0x2F, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, - 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0x88, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x43, 0x43, - 0x07, 0xFC, 0x43, 0x43, 0x02, 0xFE, 0x1D, 0xF0, 0x12, 0x60, 0xC0, 0x62, 0xC0, 0x64, 0xC0, 0x84, - 0xA2, 0xD1, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xC0, 0x84, 0xA2, 0xDB, - 0x63, 0x45, 0x2A, 0xF2, 0x35, 0xF0, 0x60, 0x40, 0xA4, 0x36, 0x0B, 0x00, 0x08, 0x2B, 0x0C, 0x00, - 0x23, 0x46, 0x22, 0xF2, 0x26, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x06, 0x02, 0xCB, 0x60, 0xBC, 0x78, - 0xFF, 0xFF, 0xCB, 0x60, 0xB6, 0x78, 0xFF, 0xFF, 0x23, 0x46, 0x1E, 0xF2, 0x26, 0x46, 0x44, 0x4C, - 0x0F, 0x26, 0x19, 0x00, 0x00, 0xBC, 0x40, 0x45, 0x0B, 0x03, 0x00, 0x64, 0x23, 0x46, 0x1E, 0xFA, - 0x26, 0x46, 0xA2, 0xFF, 0xB4, 0x60, 0x58, 0x4E, 0x48, 0x78, 0xFF, 0xFF, 0xA3, 0xFF, 0x26, 0x46, - 0x2A, 0xF0, 0x2C, 0x44, 0x64, 0x40, 0x04, 0x27, 0x06, 0x00, 0x23, 0x46, 0x22, 0xFA, 0x26, 0x46, - 0xCA, 0x60, 0xB6, 0x78, 0xFF, 0xFF, 0x3F, 0xF2, 0x02, 0xFA, 0xA2, 0xFF, 0x16, 0xF0, 0xFF, 0xFF, - 0x64, 0x44, 0x01, 0x26, 0xDC, 0x9C, 0x93, 0xF3, 0x2A, 0xF2, 0xDC, 0x83, 0x93, 0xFD, 0x06, 0xF4, - 0x01, 0xF8, 0x26, 0x46, 0x60, 0x40, 0x40, 0x2B, 0x18, 0x00, 0x64, 0x44, 0x00, 0x65, 0xFF, 0xB4, - 0xFC, 0xA4, 0x06, 0xF0, 0x03, 0x03, 0x64, 0x46, 0x0C, 0x0D, 0x02, 0x65, 0x26, 0x46, 0x00, 0xF2, - 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x02, 0x03, 0x60, 0x46, 0xF9, 0x01, 0x01, 0xF2, 0xFF, 0xFF, - 0xD4, 0x84, 0x01, 0xFA, 0x66, 0x44, 0x26, 0x46, 0x06, 0xFA, 0x06, 0xF4, 0x00, 0xF2, 0x80, 0xFC, - 0x40, 0x45, 0xB4, 0x60, 0x58, 0x4E, 0x48, 0x78, 0xFF, 0xFF, 0xA3, 0xFF, 0x26, 0x46, 0x2C, 0x44, - 0x0F, 0x26, 0x10, 0x00, 0x23, 0x46, 0x22, 0xFA, 0x26, 0x44, 0x1E, 0xFA, 0x26, 0x46, 0x1B, 0x60, - 0xDA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0x6F, 0x00, 0xA3, 0x46, 0x22, 0xF2, 0x60, 0x45, 0xDC, 0x84, 0xD4, 0x80, 0x22, 0xFA, - 0xA3, 0x46, 0x6C, 0x02, 0x2A, 0xF0, 0xA3, 0x46, 0x1E, 0xF2, 0xA3, 0x46, 0x00, 0xBC, 0x00, 0xF2, - 0x01, 0x02, 0x64, 0x00, 0x44, 0x4C, 0x3F, 0xF0, 0x60, 0x43, 0x23, 0x46, 0x1E, 0xF4, 0x09, 0x60, - 0x00, 0x65, 0x3F, 0xF2, 0x26, 0x46, 0xC0, 0x84, 0xD4, 0x80, 0x60, 0x45, 0x57, 0x07, 0x80, 0xFC, - 0x1B, 0xF2, 0x06, 0xF2, 0x60, 0x41, 0x23, 0x46, 0x1E, 0xF4, 0x1B, 0xF0, 0x06, 0xF0, 0xC1, 0x81, - 0x06, 0xFA, 0x05, 0xFA, 0x9B, 0xFA, 0x65, 0x44, 0x3F, 0xFA, 0x64, 0x46, 0x00, 0xFC, 0x63, 0x46, - 0x01, 0xF2, 0x10, 0x61, 0xF2, 0xA4, 0x01, 0xFA, 0xC8, 0x83, 0x02, 0x64, 0x59, 0xD0, 0x58, 0xD8, - 0xFD, 0x1F, 0x06, 0x45, 0x1B, 0x60, 0xDA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x25, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xA2, 0xFF, 0x00, 0xF4, 0x01, 0xF0, 0x0A, 0x18, - 0x70, 0x67, 0xA0, 0x80, 0xF0, 0x67, 0x06, 0x03, 0xC0, 0x84, 0x01, 0xFA, 0x25, 0x46, 0x25, 0x44, - 0x80, 0xFC, 0x05, 0xFA, 0xB4, 0x60, 0x58, 0x4E, 0x48, 0x78, 0xFF, 0xFF, 0xD4, 0xFE, 0xA3, 0xFF, - 0x2C, 0x44, 0x04, 0x27, 0x16, 0x00, 0x23, 0x46, 0x1E, 0xF2, 0x9E, 0xFC, 0x60, 0x46, 0x46, 0x46, - 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x47, 0x08, 0xFA, 0x26, 0x46, 0x2C, 0x43, 0x2A, 0xFC, 0x06, 0xF4, - 0x00, 0x64, 0x00, 0xFA, 0x01, 0xF0, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0x01, 0xFA, 0x26, 0x46, - 0x1D, 0x00, 0x00, 0x66, 0x46, 0x46, 0xC7, 0x60, 0x31, 0x78, 0xFF, 0xFF, 0xA3, 0x46, 0x1E, 0xF0, - 0x9E, 0xFC, 0x00, 0x63, 0x33, 0x85, 0xA3, 0x46, 0x0D, 0x03, 0xA3, 0x46, 0x22, 0xF2, 0x0F, 0x65, - 0xA4, 0x85, 0xD4, 0x84, 0x22, 0xFA, 0xA3, 0x46, 0xA2, 0xFF, 0xB4, 0x60, 0x58, 0x4E, 0x48, 0x78, - 0xFF, 0xFF, 0xA3, 0xFF, 0x26, 0x46, 0xCB, 0x60, 0xBC, 0x78, 0xFF, 0xFF, 0x07, 0xF0, 0x88, 0xF3, - 0xFF, 0xFF, 0xD0, 0x80, 0x64, 0x46, 0x6F, 0xF2, 0x26, 0x46, 0x50, 0x03, 0x60, 0x40, 0x00, 0x36, - 0x4D, 0x00, 0x64, 0x46, 0x0E, 0xF2, 0x26, 0x46, 0x60, 0x47, 0xFF, 0xB5, 0x27, 0xF2, 0xFF, 0xFF, - 0xFF, 0xB4, 0xD4, 0x80, 0xFF, 0xFF, 0x42, 0x06, 0x64, 0x46, 0x6F, 0xF2, 0x26, 0x46, 0x60, 0x47, - 0xFF, 0xB5, 0x65, 0x41, 0x0F, 0x60, 0xA2, 0x65, 0x00, 0x64, 0xE9, 0x81, 0xD8, 0x84, 0xFD, 0x02, - 0xC8, 0x84, 0x60, 0x43, 0x44, 0xD1, 0xFF, 0xFF, 0x64, 0x47, 0xFF, 0xB5, 0x27, 0xF2, 0xFF, 0xFF, - 0xFF, 0xB4, 0xD4, 0x80, 0x64, 0x44, 0x06, 0x06, 0x07, 0xF0, 0xFF, 0xFF, 0x64, 0x46, 0x0E, 0xFA, - 0x26, 0x46, 0x19, 0x00, 0x00, 0x61, 0x27, 0xF0, 0x0F, 0x60, 0xA2, 0x65, 0x61, 0x43, 0x45, 0xD3, - 0x64, 0x41, 0xFF, 0xB1, 0x61, 0x45, 0x60, 0x47, 0xFF, 0xB4, 0xDB, 0x83, 0xD4, 0x80, 0x63, 0x41, - 0xF3, 0x02, 0xCB, 0x83, 0x63, 0x41, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x07, 0xF0, 0xFF, 0xFF, - 0x64, 0x46, 0x0E, 0xFA, 0x26, 0x46, 0xAF, 0x84, 0xE8, 0x81, 0x05, 0x03, 0x00, 0x60, 0x01, 0x64, - 0xCD, 0x81, 0xE0, 0x84, 0xFD, 0x02, 0x64, 0x46, 0x70, 0xFA, 0x26, 0x46, 0x2A, 0xF2, 0x32, 0xF0, - 0x60, 0x40, 0x08, 0x2A, 0x5C, 0x00, 0x01, 0x2B, 0x2F, 0x00, 0x64, 0x40, 0x01, 0x2A, 0x2C, 0x00, - 0x98, 0xF1, 0x1E, 0x60, 0xF0, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, - 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, - 0x88, 0xFF, 0x1B, 0xF2, 0xFF, 0xFF, 0x60, 0x45, 0x98, 0xF1, 0x1E, 0x60, 0xF6, 0x64, 0xA0, 0xD3, - 0xFF, 0xFF, 0xD8, 0x80, 0xC4, 0x84, 0x0B, 0x03, 0x07, 0x05, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, - 0xA2, 0xDB, 0x09, 0x04, 0xC6, 0xFE, 0x07, 0x00, 0x00, 0x64, 0xB8, 0x84, 0xA2, 0xDB, 0x8A, 0xFF, - 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x2B, 0x00, 0x98, 0xF1, 0x1E, 0x60, 0xEE, 0x64, 0xA0, 0xD3, - 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, - 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x1B, 0xF2, 0xFF, 0xFF, 0x60, 0x45, - 0x98, 0xF1, 0x1E, 0x60, 0xF4, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xD8, 0x80, 0xC4, 0x84, 0x0B, 0x03, - 0x07, 0x05, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x09, 0x04, 0xC6, 0xFE, 0x07, 0x00, - 0x00, 0x64, 0xB8, 0x84, 0xA2, 0xDB, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x07, 0xF4, - 0xFF, 0xFF, 0x22, 0xF2, 0x26, 0x46, 0x0F, 0xB4, 0xDC, 0x85, 0x98, 0xF1, 0x1E, 0x60, 0xF2, 0x64, - 0xA0, 0xD3, 0xFF, 0xFF, 0xD8, 0x80, 0xC4, 0x84, 0x0B, 0x03, 0x07, 0x05, 0xDC, 0x80, 0xD0, 0x80, - 0x04, 0x03, 0xA2, 0xDB, 0x09, 0x04, 0xC6, 0xFE, 0x07, 0x00, 0x00, 0x64, 0xB8, 0x84, 0xA2, 0xDB, - 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x27, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x3B, - 0x12, 0x00, 0x98, 0xF1, 0x1F, 0x60, 0x00, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, - 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, - 0x00, 0x75, 0x88, 0xFF, 0x13, 0x00, 0x02, 0x3B, 0x11, 0x00, 0x98, 0xF1, 0x1F, 0x60, 0x02, 0x64, - 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, - 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0xCC, 0x60, 0x06, 0x78, - 0xFF, 0xFF, 0xC7, 0x60, 0x31, 0x78, 0xFF, 0xFF, 0x1B, 0x60, 0xDA, 0x64, 0x40, 0x4B, 0xF0, 0x60, - 0x58, 0x4D, 0x75, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xC7, 0x60, 0x31, 0x78, 0xFF, 0xFF, - 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0xBE, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF8, 0xFE, 0x00, 0x66, 0x46, 0x46, 0xC7, 0x60, 0x31, 0x78, - 0xFF, 0xFF, 0x2A, 0xF2, 0x58, 0x63, 0x60, 0x47, 0x01, 0x27, 0x64, 0x63, 0x25, 0x60, 0x26, 0x62, - 0x61, 0x5C, 0xA2, 0xD9, 0xBD, 0xD0, 0xBD, 0xD0, 0x64, 0x45, 0x64, 0x41, 0xBD, 0xD0, 0x00, 0xF4, - 0x04, 0xF8, 0x83, 0xFA, 0x82, 0xF8, 0xA6, 0x46, 0x02, 0xB0, 0x5E, 0x63, 0x04, 0x03, 0x64, 0x63, - 0x03, 0xB0, 0x02, 0x3A, 0x6C, 0x63, 0x3F, 0xF2, 0xBD, 0xD0, 0xBD, 0xD0, 0x64, 0x45, 0x64, 0x41, - 0xBD, 0xD0, 0xA6, 0x46, 0x07, 0xF8, 0x86, 0xFA, 0x85, 0xF8, 0x60, 0x47, 0x08, 0xFA, 0x25, 0x60, - 0x26, 0x62, 0xA2, 0xD1, 0x26, 0x46, 0x64, 0x41, 0x2F, 0x58, 0xFF, 0xFF, 0x2A, 0xF2, 0x2C, 0xF0, - 0x31, 0x40, 0x20, 0x26, 0x09, 0x00, 0x60, 0x40, 0xA4, 0x36, 0x21, 0x00, 0x08, 0x26, 0x07, 0x00, - 0x7E, 0xF1, 0xCC, 0x60, 0xCF, 0x78, 0xFF, 0xFF, 0xCC, 0x60, 0xFF, 0x78, 0xFF, 0xFF, 0x64, 0x40, - 0x01, 0x26, 0x12, 0x00, 0x3F, 0xF0, 0x32, 0x40, 0x10, 0x2A, 0x0A, 0x00, 0x64, 0x41, 0x60, 0x40, - 0x40, 0x27, 0x06, 0x00, 0xCD, 0x81, 0xDD, 0x81, 0x03, 0x03, 0x02, 0x03, 0x01, 0x61, 0x01, 0x00, - 0x00, 0x61, 0x60, 0x40, 0x18, 0x3A, 0x03, 0x00, 0xCD, 0x60, 0x3B, 0x78, 0xFF, 0xFF, 0x07, 0xF2, - 0x88, 0xF1, 0x66, 0x45, 0xD0, 0x80, 0x60, 0x46, 0x06, 0xF2, 0x65, 0x46, 0x03, 0x03, 0xFF, 0xFF, - 0x02, 0x26, 0x07, 0x00, 0xDA, 0x60, 0x58, 0x4F, 0xDB, 0x78, 0xFF, 0xFF, 0xCD, 0x60, 0x37, 0x78, - 0xFF, 0xFF, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0xA4, 0x3A, 0x07, 0x00, 0xDD, 0x60, 0x58, 0x4F, - 0x45, 0x78, 0xFF, 0xFF, 0xCD, 0x60, 0x37, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0xCB, 0x60, 0x58, 0x4F, - 0xD9, 0x78, 0xFF, 0xFF, 0x3F, 0xF2, 0x06, 0x65, 0xD4, 0x80, 0x60, 0x43, 0x52, 0x04, 0x00, 0xF4, - 0xAA, 0x60, 0xAA, 0x65, 0x09, 0xF2, 0x0A, 0xF0, 0xD4, 0x80, 0x03, 0x64, 0x4A, 0x02, 0xD0, 0x80, - 0x00, 0x64, 0x0B, 0xF0, 0x46, 0x02, 0x64, 0x45, 0xD4, 0x80, 0xF8, 0x7F, 0x08, 0x02, 0x0C, 0xF0, - 0x26, 0x46, 0x64, 0x45, 0x23, 0xF0, 0x20, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0x0B, 0x00, 0xD4, 0x80, - 0x1D, 0x60, 0x60, 0x64, 0x11, 0x02, 0x0C, 0xF0, 0x26, 0x46, 0x64, 0x45, 0x23, 0xF0, 0x40, 0x67, - 0xB0, 0x84, 0xA2, 0xDA, 0x65, 0x44, 0x88, 0x3A, 0x2C, 0x00, 0x77, 0x37, 0x03, 0x00, 0x78, 0x37, - 0x01, 0x00, 0x8E, 0x37, 0x00, 0x61, 0x25, 0x00, 0xD4, 0x80, 0x08, 0x65, 0x22, 0x02, 0xD7, 0x80, - 0x01, 0x60, 0x00, 0x64, 0x0C, 0xF0, 0x1D, 0x04, 0xD0, 0x80, 0x0D, 0xF0, 0x1A, 0x02, 0x26, 0x46, - 0x14, 0xF2, 0x01, 0x63, 0x02, 0xA8, 0x64, 0x47, 0x14, 0x03, 0x7F, 0xB4, 0xFD, 0xA0, 0x06, 0x03, - 0x10, 0x07, 0x23, 0xF0, 0x60, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0x6A, 0x00, 0xD2, 0xF3, 0xFF, 0xFF, - 0x02, 0xBC, 0xD2, 0xFB, 0xE5, 0x60, 0x58, 0x4F, 0x94, 0x78, 0xFF, 0xFF, 0xCD, 0x60, 0x37, 0x78, - 0xFF, 0xFF, 0x26, 0x46, 0x61, 0x40, 0x01, 0x2A, 0x12, 0x00, 0x98, 0xF1, 0x1F, 0x60, 0x06, 0x64, - 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, - 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x7C, 0x00, 0xDD, 0x60, - 0x58, 0x4F, 0x45, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0xFF, 0xFF, 0xFF, 0xFF, 0x48, 0x36, 0x73, 0x00, - 0xCD, 0x60, 0x58, 0x4F, 0x48, 0x78, 0xFF, 0xFF, 0xCD, 0x60, 0x37, 0x78, 0xFF, 0xFF, 0x60, 0x40, - 0x0C, 0x26, 0x69, 0x00, 0x64, 0x40, 0x01, 0x2A, 0x66, 0x00, 0xB0, 0x3A, 0x05, 0x00, 0xD1, 0x60, - 0x58, 0x4F, 0x80, 0x78, 0xFF, 0xFF, 0x5B, 0x00, 0x00, 0x3A, 0x05, 0x00, 0xD4, 0x60, 0x58, 0x4F, - 0xF3, 0x78, 0xFF, 0xFF, 0x54, 0x00, 0x20, 0x3A, 0x05, 0x00, 0xD4, 0x60, 0x58, 0x4F, 0xF3, 0x78, - 0xFF, 0xFF, 0x4D, 0x00, 0xC0, 0x3A, 0x05, 0x00, 0xDA, 0x60, 0x58, 0x4F, 0x48, 0x78, 0xFF, 0xFF, - 0x46, 0x00, 0xA0, 0x3A, 0x05, 0x00, 0xDA, 0x60, 0x58, 0x4F, 0xA6, 0x78, 0xFF, 0xFF, 0x3F, 0x00, - 0x40, 0x3A, 0x0D, 0x00, 0xE1, 0x60, 0x58, 0x4F, 0x10, 0x78, 0xFF, 0xFF, 0x38, 0x00, 0x60, 0x40, - 0x50, 0x3A, 0x05, 0x00, 0xEA, 0x60, 0x58, 0x4F, 0xF5, 0x78, 0xFF, 0xFF, 0x30, 0x00, 0x33, 0x00, - 0xD2, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0xD2, 0xFB, 0x2A, 0xF2, 0x3B, 0xF0, 0x60, 0x40, 0x40, 0x2B, - 0x19, 0x00, 0x22, 0xF2, 0xFF, 0xFF, 0x04, 0xB4, 0xFF, 0xFF, 0x14, 0x03, 0xC0, 0x60, 0x00, 0x64, - 0x64, 0x40, 0x20, 0x2B, 0x0F, 0x00, 0xA0, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x23, 0xF2, - 0x10, 0xBD, 0xB4, 0x9C, 0x3F, 0xF2, 0x23, 0xF8, 0xF8, 0xA4, 0x3F, 0xFA, 0x00, 0xF4, 0x60, 0x47, - 0x08, 0xFA, 0x26, 0x46, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0xBE, 0x64, 0xA2, 0xDB, 0x26, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF8, 0xFE, 0x0C, 0x00, 0x66, 0x44, - 0x00, 0xA8, 0xFF, 0xFF, 0x0A, 0x03, 0x26, 0x46, 0x1B, 0x60, 0xDA, 0x64, 0x40, 0x4B, 0xF0, 0x60, - 0x58, 0x4D, 0x75, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xCB, 0x60, 0xB9, 0x78, 0xFF, 0xFF, - 0x14, 0xF2, 0x00, 0x7C, 0x3E, 0xF8, 0xCC, 0x84, 0xCC, 0x84, 0x19, 0x03, 0x60, 0x02, 0x11, 0xF2, - 0x07, 0xFA, 0xAC, 0xF3, 0x19, 0xFA, 0xCD, 0x60, 0x58, 0x4E, 0xE4, 0x78, 0xFF, 0xFF, 0x1B, 0x60, - 0xDA, 0x62, 0x1B, 0x60, 0x9A, 0x64, 0xA2, 0xDB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xC8, 0xFE, 0xF2, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x79, 0x00, 0xA2, 0xFF, - 0x46, 0x45, 0xB4, 0x60, 0x58, 0x4E, 0x91, 0x78, 0xFF, 0xFF, 0xA3, 0xFF, 0x11, 0x03, 0x7E, 0x63, - 0x46, 0x4B, 0x25, 0x46, 0xA3, 0xD0, 0x2B, 0x46, 0xA3, 0xD8, 0xFB, 0x1F, 0x89, 0xFC, 0x8A, 0xFC, - 0x88, 0xFC, 0x05, 0x18, 0x64, 0x46, 0x01, 0xF0, 0x10, 0x67, 0xC0, 0x84, 0x01, 0xFA, 0x08, 0xFE, - 0x2B, 0x46, 0x46, 0x46, 0x25, 0x46, 0xCD, 0x60, 0x58, 0x4E, 0xE4, 0x78, 0xFF, 0xFF, 0x1F, 0x60, - 0x8E, 0x62, 0xA2, 0xD3, 0x88, 0xF3, 0x00, 0xA8, 0x07, 0xFA, 0x0F, 0x03, 0x1B, 0x60, 0xDA, 0x62, - 0x1B, 0x60, 0x94, 0x64, 0xA2, 0xDB, 0x25, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xF3, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x0E, 0x00, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, - 0x88, 0x64, 0xA2, 0xDB, 0x25, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xF4, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x26, 0x44, 0x00, 0xA8, 0xC1, 0xFE, 0x31, 0x03, 0xD2, 0xF3, - 0xFF, 0xFF, 0x02, 0xBC, 0xD2, 0xFB, 0x26, 0x46, 0x2A, 0xF2, 0x3B, 0xF0, 0x60, 0x40, 0x40, 0x2B, - 0x18, 0x00, 0x64, 0x40, 0x20, 0x2B, 0x15, 0x00, 0x22, 0xF2, 0xFF, 0xFF, 0x04, 0xB4, 0xFF, 0xFF, - 0x10, 0x03, 0xC0, 0x67, 0xA0, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x23, 0xF2, 0x10, 0xBD, - 0xB4, 0x9C, 0x3F, 0xF2, 0x23, 0xF8, 0xF8, 0xA4, 0x3F, 0xFA, 0x00, 0xF4, 0x60, 0x47, 0x08, 0xFA, - 0x26, 0x46, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0xBE, 0x64, 0xA2, 0xDB, 0x26, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF8, 0xFE, 0xF1, 0x64, 0x3B, 0x42, 0x4A, 0xDB, - 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x2A, 0xF2, 0x82, 0x60, 0xFF, 0x65, 0xA4, 0x87, - 0x02, 0xBF, 0x2A, 0xFA, 0x1C, 0xF2, 0x13, 0xFA, 0x32, 0xF2, 0x2C, 0xFA, 0x33, 0xF2, 0x2D, 0xFA, - 0x34, 0xF2, 0x2E, 0xFA, 0x2F, 0xF2, 0x32, 0xFA, 0x30, 0xF2, 0x33, 0xFA, 0x31, 0xF2, 0x34, 0xFA, - 0x67, 0xF3, 0x2F, 0xFA, 0x68, 0xF3, 0x30, 0xFA, 0x69, 0xF3, 0x31, 0xFA, 0x2E, 0x58, 0xFF, 0xFF, - 0x0F, 0x60, 0xF8, 0x62, 0xD0, 0x60, 0x7B, 0x64, 0xA2, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x1F, 0x60, - 0x62, 0x63, 0x20, 0x60, 0x02, 0x62, 0xA2, 0xD3, 0xA3, 0xDB, 0x1E, 0x63, 0x1F, 0x60, 0x6C, 0x61, - 0x20, 0x60, 0x0C, 0x64, 0x58, 0xD1, 0x59, 0xD9, 0xFD, 0x1F, 0x1F, 0x60, 0x8E, 0x63, 0x20, 0x60, - 0x2E, 0x62, 0xA2, 0xD3, 0xA3, 0xDB, 0x1F, 0x60, 0x90, 0x63, 0x20, 0x60, 0x30, 0x62, 0xA2, 0xD3, - 0xA3, 0xDB, 0x1F, 0x60, 0x9A, 0x63, 0x20, 0x60, 0x3A, 0x62, 0xA2, 0xD3, 0xA3, 0xDB, 0x1F, 0x60, - 0x9C, 0x63, 0x20, 0x60, 0x3C, 0x62, 0xA2, 0xD3, 0xA3, 0xDB, 0x1F, 0x60, 0x9E, 0x63, 0x20, 0x60, - 0x3E, 0x62, 0xA2, 0xD3, 0xA3, 0xDB, 0x1F, 0x60, 0xA0, 0x63, 0x20, 0x60, 0x40, 0x62, 0xA2, 0xD3, - 0xA3, 0xDB, 0x1F, 0x60, 0x92, 0x63, 0x20, 0x60, 0x32, 0x62, 0xA2, 0xD3, 0xA3, 0xDB, 0x1F, 0x60, - 0x94, 0x63, 0x20, 0x60, 0x34, 0x62, 0xA2, 0xD3, 0xA3, 0xDB, 0x1F, 0x60, 0x96, 0x63, 0x20, 0x60, - 0x36, 0x62, 0xA2, 0xD3, 0xA3, 0xDB, 0x1F, 0x60, 0xB6, 0x63, 0xBD, 0xD1, 0xCB, 0xF9, 0x67, 0xF9, - 0xBD, 0xD1, 0xCC, 0xF9, 0x68, 0xF9, 0xA3, 0xD1, 0xCD, 0xF9, 0x69, 0xF9, 0x01, 0x64, 0x6B, 0xFB, - 0x1F, 0x60, 0xA8, 0x62, 0xA2, 0xD3, 0xC4, 0xFB, 0x00, 0x63, 0x4A, 0xFD, 0x5A, 0xFD, 0x6C, 0xFD, - 0x6D, 0xFD, 0x21, 0x60, 0x82, 0x64, 0xA0, 0xD3, 0xEA, 0x60, 0x58, 0x4E, 0x78, 0x78, 0xFF, 0xFF, - 0x21, 0x60, 0x80, 0x64, 0xA0, 0xD1, 0x1F, 0x60, 0x92, 0x62, 0xA2, 0xD3, 0xFF, 0x60, 0xE7, 0x65, - 0x32, 0x41, 0xA5, 0x81, 0xFF, 0xA0, 0xFF, 0xFF, 0x01, 0x03, 0x0B, 0x00, 0x08, 0x65, 0xB5, 0x81, - 0x1F, 0x60, 0x96, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x02, 0x00, 0x10, 0x65, - 0xB5, 0x81, 0x41, 0x52, 0x88, 0xF5, 0x32, 0x44, 0x10, 0xB0, 0xFF, 0xFF, 0x0B, 0x03, 0x21, 0x60, - 0x2C, 0x62, 0xA2, 0xD3, 0x06, 0xF0, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0x80, 0xBF, - 0xB0, 0x84, 0x06, 0xFA, 0x1F, 0x60, 0x92, 0x62, 0xA2, 0xD3, 0x22, 0x7C, 0xFF, 0xA0, 0xFD, 0xA0, - 0x05, 0x06, 0x03, 0x03, 0xFE, 0xA0, 0x04, 0x7C, 0x01, 0x02, 0x36, 0xF8, 0x0E, 0xF0, 0x0F, 0x60, - 0xA2, 0x65, 0x20, 0x60, 0x38, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xFE, 0xA0, 0x03, 0xA8, 0x11, 0x06, - 0x5F, 0xF1, 0x06, 0x02, 0x64, 0x44, 0x08, 0x2A, 0x09, 0x00, 0x06, 0x64, 0x44, 0xD3, 0x0D, 0x00, - 0x64, 0x44, 0x20, 0x2A, 0x03, 0x00, 0x0A, 0x64, 0x44, 0xD3, 0x07, 0x00, 0x01, 0x64, 0x44, 0xD3, - 0x04, 0x00, 0xE8, 0x84, 0xE0, 0x84, 0x44, 0xD3, 0x00, 0x00, 0x0E, 0xFA, 0x1F, 0x60, 0x9E, 0x62, - 0xA2, 0xD1, 0x20, 0x44, 0x20, 0xB5, 0x64, 0x41, 0x00, 0xB9, 0xD4, 0x84, 0x08, 0x28, 0x20, 0xBC, - 0x40, 0x40, 0x11, 0x60, 0xF0, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0x00, 0xB8, 0x10, 0x60, 0x0C, 0x65, - 0x0D, 0x03, 0x11, 0x60, 0xF8, 0x63, 0xC5, 0xF3, 0xA3, 0xD1, 0xE0, 0x84, 0xC4, 0x84, 0xA0, 0xD3, - 0xFF, 0xFF, 0x01, 0xB0, 0xFF, 0xFF, 0x02, 0x02, 0xC5, 0xF9, 0x65, 0xF9, 0xC5, 0xF3, 0x01, 0x61, - 0xCC, 0x84, 0xFF, 0xFF, 0x02, 0x03, 0xE1, 0x81, 0xFB, 0x01, 0x9A, 0xF3, 0x61, 0x45, 0xA4, 0x80, - 0xFF, 0xFF, 0x0B, 0x02, 0x00, 0xB8, 0x01, 0x63, 0x08, 0x03, 0xE8, 0x84, 0xFF, 0xFF, 0x02, 0x24, - 0x02, 0x00, 0xDF, 0x83, 0xFA, 0x01, 0xC5, 0xFD, 0x65, 0xFD, 0x0A, 0x64, 0x25, 0x60, 0x1E, 0x63, - 0xA3, 0xDB, 0x01, 0x64, 0x25, 0x60, 0x20, 0x63, 0xA3, 0xDB, 0xB6, 0xF1, 0x09, 0x60, 0x2A, 0x64, - 0xD0, 0x80, 0x03, 0x64, 0x01, 0x06, 0x06, 0x64, 0xB0, 0xFB, 0x0F, 0x60, 0xD6, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, 0xD8, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, - 0xCF, 0x60, 0x05, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD6, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x65, 0xF1, 0x1C, 0x60, 0x00, 0x62, 0xA2, 0xD9, 0x08, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xCF, 0x60, - 0x2D, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD6, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0xBE, 0xFE, 0x0F, 0x60, 0xCE, 0x62, 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x20, 0x44, 0x01, 0x65, 0x34, 0x80, 0x1F, 0x60, 0xA6, 0x64, 0xA0, 0xD3, - 0xC3, 0xFB, 0x60, 0x40, 0x05, 0x3A, 0x03, 0x00, 0xEB, 0x60, 0x1A, 0x61, 0x11, 0x00, 0x04, 0x3A, - 0x03, 0x00, 0xEB, 0x60, 0x0E, 0x61, 0x0C, 0x00, 0x03, 0x3A, 0x03, 0x00, 0xEB, 0x60, 0x02, 0x61, - 0x07, 0x00, 0x02, 0x3A, 0x03, 0x00, 0xEA, 0x60, 0xF6, 0x61, 0x02, 0x00, 0xEA, 0x60, 0xEA, 0x61, - 0x3E, 0x60, 0x00, 0x66, 0x01, 0x60, 0x78, 0x64, 0x0A, 0x63, 0x59, 0xD0, 0x58, 0xD9, 0xFD, 0x1F, - 0x00, 0x66, 0xC4, 0xF3, 0x60, 0x41, 0x00, 0xA8, 0xFA, 0xA1, 0x01, 0x03, 0xA1, 0xDB, 0x01, 0x60, - 0x7A, 0x63, 0x16, 0x60, 0xC4, 0x61, 0xBD, 0xD3, 0xFF, 0xFF, 0x20, 0x7F, 0xA1, 0xDB, 0xBD, 0xD3, - 0xFF, 0xFF, 0x21, 0x7F, 0x59, 0xDB, 0xA3, 0xD3, 0xFF, 0xFF, 0x22, 0x7F, 0x59, 0xDB, 0x0F, 0x60, - 0xD6, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, 0xD8, 0x62, 0x40, 0x60, - 0x00, 0x64, 0xA2, 0xDB, 0xCF, 0x60, 0x77, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x1C, 0x60, 0x00, 0x62, 0x16, 0x60, 0xC2, 0x64, 0xA2, 0xDB, 0x20, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x2D, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xCF, 0x60, 0x9C, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD6, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x65, 0xF1, 0x1C, 0x60, 0x00, 0x62, 0xA2, 0xD9, 0x08, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, - 0x0F, 0x60, 0xD8, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xCF, 0x60, 0xB3, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD6, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xBE, 0xFE, - 0x0F, 0x60, 0xCE, 0x62, 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x20, 0x40, 0x20, 0x2A, 0x04, 0x00, 0xEB, 0x60, 0x58, 0x4E, 0x16, 0x78, 0xFF, 0xFF, 0x0F, 0x60, - 0xD6, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x4E, 0xF3, 0xFF, 0xFF, 0x13, 0x1B, 0x1F, 0x60, 0xAE, 0x64, - 0xA0, 0xD3, 0xC7, 0xFB, 0x1F, 0x60, 0x1E, 0x65, 0x1F, 0x60, 0xBC, 0x61, 0x1F, 0x60, 0x1C, 0x64, - 0x20, 0x63, 0x59, 0xD1, 0x58, 0xD9, 0xA5, 0xD9, 0xDA, 0x85, 0xFB, 0x1F, 0xD0, 0x60, 0x62, 0x78, - 0xFF, 0xFF, 0x20, 0x60, 0x40, 0x63, 0xE0, 0x84, 0xE0, 0x85, 0xC4, 0x85, 0xC7, 0x83, 0xFE, 0xA5, - 0x89, 0xF3, 0xFF, 0xFF, 0xC4, 0x84, 0x66, 0x45, 0x60, 0x46, 0x60, 0x41, 0xBD, 0xD1, 0x03, 0xF8, - 0xBD, 0xD1, 0x04, 0xF8, 0xA3, 0xD1, 0x05, 0xF8, 0x06, 0xF2, 0xFF, 0xFF, 0x02, 0x7E, 0x06, 0xFA, - 0x5F, 0xF3, 0x60, 0xFB, 0x73, 0xF0, 0x63, 0xF9, 0x66, 0x43, 0x21, 0x60, 0x2C, 0x62, 0x32, 0x40, - 0x08, 0x2A, 0x09, 0x00, 0xA2, 0xD3, 0x06, 0xF0, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, - 0x80, 0xBF, 0xB0, 0x84, 0x06, 0xFA, 0x63, 0x44, 0x63, 0xF3, 0x60, 0x45, 0x66, 0x41, 0x65, 0x46, - 0x8C, 0xFA, 0x60, 0x40, 0x01, 0x36, 0x06, 0x00, 0x02, 0x36, 0x04, 0x00, 0x04, 0x36, 0x02, 0x00, - 0x05, 0x3A, 0x02, 0x00, 0x00, 0x64, 0x01, 0x00, 0x01, 0x64, 0x6F, 0xFA, 0x5F, 0xF3, 0x60, 0xF1, - 0xFF, 0xFF, 0xA0, 0x84, 0x65, 0x43, 0x02, 0x02, 0x5F, 0xF3, 0xFF, 0xFF, 0x60, 0x41, 0x0F, 0x60, - 0xAE, 0x65, 0x63, 0xF3, 0xFF, 0xFF, 0xE0, 0x84, 0x44, 0xD3, 0x61, 0x45, 0xA4, 0x80, 0xFF, 0xFF, - 0x04, 0x02, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0xFC, 0x03, 0xA4, 0x84, 0x61, 0xFB, 0x6F, 0xF0, - 0x60, 0x47, 0x90, 0x84, 0x6F, 0xFA, 0x60, 0x47, 0x60, 0x45, 0x80, 0x64, 0xE8, 0x84, 0xA4, 0x80, - 0xFF, 0xFF, 0xFC, 0x03, 0xA4, 0x84, 0x70, 0xF0, 0x70, 0xFA, 0x00, 0x61, 0xE8, 0x84, 0xFF, 0xFF, - 0x02, 0x05, 0xDD, 0x81, 0xFB, 0x01, 0xE1, 0x81, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, - 0x66, 0x43, 0x0C, 0xF4, 0xC5, 0xFE, 0x0F, 0x60, 0xD6, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, - 0xD8, 0x62, 0x00, 0x60, 0x30, 0x64, 0xA2, 0xDB, 0xCF, 0x60, 0xC7, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x4E, 0xDF, 0x60, 0x58, 0x4F, 0x13, 0x78, 0xFF, 0xFF, 0x0E, 0x4F, - 0x0F, 0x4E, 0xDC, 0x60, 0x58, 0x4F, 0x6B, 0x78, 0xFF, 0xFF, 0x0E, 0x4F, 0x0F, 0x4E, 0xDB, 0x60, - 0x58, 0x4F, 0xE8, 0x78, 0xFF, 0xFF, 0x0E, 0x4F, 0x0F, 0x4E, 0xDB, 0x60, 0x58, 0x4F, 0x42, 0x78, - 0xFF, 0xFF, 0x0E, 0x4F, 0xD7, 0x01, 0x4E, 0xF3, 0x7E, 0xF5, 0x60, 0x40, 0xFF, 0x22, 0x0A, 0x00, - 0x89, 0xF1, 0xCC, 0x84, 0xE0, 0x84, 0xC0, 0x86, 0x06, 0xF2, 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, - 0x7E, 0xF5, 0x08, 0x00, 0x0F, 0x60, 0xF4, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x11, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x4E, 0xF3, 0x66, 0x40, 0xFF, 0x22, 0x05, 0x00, 0xFF, 0x22, 0x37, 0x00, - 0xD1, 0x60, 0x30, 0x78, 0xFF, 0xFF, 0x02, 0x64, 0x6A, 0xFB, 0xFF, 0xFF, 0xC1, 0xFE, 0x6A, 0xF3, - 0x00, 0x65, 0xD4, 0x80, 0x4E, 0xF3, 0x0F, 0x03, 0x0F, 0x60, 0xD6, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x0F, 0x60, 0xD8, 0x62, 0x80, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xD0, 0x60, 0x9F, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD6, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, - 0x0B, 0x04, 0x0F, 0x60, 0xD8, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xD0, 0x60, 0xB3, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x1C, 0x60, 0x00, 0x62, 0x06, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x2D, 0xFF, 0x20, 0x44, 0x01, 0xB5, 0x54, 0x80, 0xDA, 0xFE, 0xBE, 0xFE, 0x88, 0xF1, - 0x02, 0x64, 0x87, 0xF3, 0xC0, 0x83, 0x40, 0x48, 0x76, 0xFD, 0xE4, 0x60, 0x58, 0x4E, 0x9D, 0x78, - 0xFF, 0xFF, 0x28, 0x44, 0x4C, 0x88, 0x76, 0xF3, 0x02, 0x65, 0xC4, 0x83, 0xF5, 0x02, 0xA2, 0x60, - 0x58, 0x4E, 0x00, 0x78, 0xFF, 0xFF, 0x14, 0x60, 0xD0, 0x62, 0x14, 0x60, 0xD2, 0x64, 0xA2, 0xDB, - 0x00, 0x64, 0x4A, 0xDB, 0x01, 0x60, 0xFE, 0x63, 0x12, 0x60, 0xCC, 0x61, 0x00, 0x64, 0x59, 0xDB, - 0xFE, 0x1F, 0x7E, 0xF1, 0x1B, 0x60, 0x9A, 0x61, 0x64, 0x40, 0xFF, 0x26, 0x39, 0x00, 0xD1, 0x60, - 0x58, 0x4E, 0x33, 0x78, 0xFF, 0xFF, 0x1B, 0x60, 0x88, 0x61, 0xD1, 0x60, 0x58, 0x4E, 0x33, 0x78, - 0xFF, 0xFF, 0x1B, 0x60, 0x8E, 0x61, 0xD1, 0x60, 0x58, 0x4E, 0x33, 0x78, 0xFF, 0xFF, 0x1B, 0x60, - 0xA0, 0x61, 0xD1, 0x60, 0x58, 0x4E, 0x33, 0x78, 0xFF, 0xFF, 0x1B, 0x60, 0xA6, 0x61, 0xD1, 0x60, - 0x58, 0x4E, 0x33, 0x78, 0xFF, 0xFF, 0x1B, 0x60, 0xB2, 0x61, 0xD1, 0x60, 0x58, 0x4E, 0x33, 0x78, - 0xFF, 0xFF, 0x1B, 0x60, 0xBE, 0x61, 0xD1, 0x60, 0x58, 0x4E, 0x33, 0x78, 0xFF, 0xFF, 0x1B, 0x60, - 0xAC, 0x61, 0xD1, 0x60, 0x58, 0x4E, 0x33, 0x78, 0xFF, 0xFF, 0x1B, 0x60, 0x94, 0x61, 0xD1, 0x60, - 0x58, 0x4E, 0x5F, 0x78, 0xFF, 0xFF, 0x0F, 0x60, 0xD6, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, - 0xC5, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xA1, 0xD3, 0x0E, 0x57, 0x24, 0x00, 0x0E, 0xF2, 0x44, 0x4C, - 0x80, 0xB0, 0x10, 0xB0, 0x0B, 0x03, 0x1B, 0x60, 0xDA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x13, 0x00, 0x12, 0x02, 0xF0, 0x37, - 0x09, 0x00, 0x02, 0xF0, 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, 0xA2, 0xFF, 0x90, 0xF3, 0x02, 0x02, - 0xCC, 0x84, 0x90, 0xFB, 0x1B, 0x60, 0xDA, 0x64, 0x40, 0x4B, 0xF0, 0x60, 0x58, 0x4D, 0x75, 0x78, - 0xFF, 0xFF, 0x2C, 0x44, 0xAC, 0x86, 0x09, 0xF0, 0xD9, 0x02, 0x37, 0x58, 0xFF, 0xFF, 0xA1, 0xD3, - 0x0E, 0x57, 0x19, 0x00, 0x0E, 0xF2, 0x44, 0x4C, 0x80, 0xB0, 0x10, 0xB0, 0x0B, 0x03, 0x1B, 0x60, - 0xDA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0x08, 0x00, 0x07, 0x02, 0x1B, 0x60, 0xDA, 0x64, 0x40, 0x4B, 0xF0, 0x60, 0x58, 0x4D, - 0x75, 0x78, 0xFF, 0xFF, 0x2C, 0x44, 0xAC, 0x86, 0x09, 0xF0, 0xE4, 0x02, 0x37, 0x58, 0xFF, 0xFF, - 0x00, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0xB0, 0x64, 0x2A, 0xFA, 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, - 0x2D, 0xFA, 0x31, 0xF2, 0x2E, 0xFA, 0xCB, 0xF3, 0x2F, 0xFA, 0xCC, 0xF3, 0x30, 0xFA, 0xCD, 0xF3, - 0x31, 0xFA, 0x67, 0xF3, 0x32, 0xFA, 0x68, 0xF3, 0x33, 0xFA, 0x69, 0xF3, 0x34, 0xFA, 0xAC, 0xF1, - 0x19, 0xF8, 0x06, 0x63, 0x3F, 0xFC, 0x1C, 0xF2, 0x13, 0xFA, 0x00, 0x64, 0x3E, 0xFA, 0x07, 0xF2, - 0x88, 0xF1, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x0C, 0x03, 0x60, 0x46, 0x06, 0xF2, 0x26, 0x46, - 0x01, 0xB0, 0xFF, 0xFF, 0x03, 0x02, 0xD3, 0x60, 0x64, 0x78, 0xFF, 0xFF, 0xD4, 0x60, 0xBA, 0x78, - 0xFF, 0xFF, 0x00, 0xF4, 0x0A, 0xF2, 0x09, 0xF2, 0xFF, 0xA0, 0x00, 0xA0, 0x13, 0x02, 0xFF, 0xA0, - 0x04, 0x03, 0x08, 0x03, 0xD1, 0x60, 0xD5, 0x78, 0xFF, 0xFF, 0x02, 0x64, 0x55, 0xFB, 0xD1, 0x60, - 0xE0, 0x78, 0xFF, 0xFF, 0x01, 0x63, 0x32, 0x40, 0x08, 0x2A, 0x0F, 0x00, 0x55, 0xFD, 0xD1, 0x60, - 0xE0, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x00, 0xF4, 0x0A, 0xF2, 0x0E, 0x63, 0x01, 0xA4, 0x0A, 0xFA, - 0x0B, 0xFC, 0x43, 0x59, 0xD4, 0x60, 0x93, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x00, 0xF4, 0x0A, 0xF2, - 0x0D, 0x63, 0x01, 0xA4, 0x0A, 0xFA, 0x0B, 0xFC, 0x43, 0x59, 0xD4, 0x60, 0x93, 0x78, 0xFF, 0xFF, - 0x88, 0xF5, 0x00, 0xF2, 0x26, 0x46, 0x00, 0xA0, 0x2E, 0xF0, 0x37, 0x03, 0x66, 0x41, 0x12, 0x60, - 0xCE, 0x65, 0x64, 0x47, 0x00, 0x7F, 0x88, 0xF1, 0xE0, 0x84, 0x44, 0xD3, 0x64, 0x43, 0x11, 0x18, - 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xFC, 0x1B, 0x66, 0x44, 0x64, 0x46, 0x80, 0xF0, 0x60, 0x46, - 0x80, 0xF8, 0x65, 0x46, 0x65, 0x43, 0x80, 0xF0, 0x01, 0xFA, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, - 0x0B, 0x00, 0x64, 0x46, 0x62, 0x43, 0x00, 0xF2, 0xA3, 0xDB, 0x60, 0x46, 0x80, 0xF0, 0x81, 0xFC, - 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x60, 0x43, 0x61, 0x46, 0x87, 0xF1, 0x14, 0x60, 0xCE, 0x61, - 0xA1, 0xD3, 0xDA, 0x81, 0xD0, 0x80, 0xDC, 0x9C, 0x05, 0x05, 0xA1, 0xD3, 0x4A, 0xD9, 0xA0, 0xDD, - 0xDA, 0x9C, 0xA1, 0xD9, 0xD3, 0x60, 0x2D, 0x78, 0xFF, 0xFF, 0x14, 0x60, 0xCE, 0x64, 0xA0, 0xD3, - 0xFF, 0xFF, 0x62, 0x18, 0x14, 0x60, 0xCE, 0x64, 0x04, 0xA5, 0xA0, 0xD1, 0x72, 0x44, 0xFF, 0xB4, - 0x64, 0x40, 0xE0, 0x22, 0x1F, 0xB4, 0x64, 0x40, 0xF8, 0x22, 0x07, 0xB4, 0x02, 0x00, 0x03, 0x04, - 0xD0, 0x84, 0xD0, 0x80, 0xFC, 0x01, 0xE0, 0x84, 0x44, 0xD3, 0xFF, 0xFF, 0x60, 0x43, 0x66, 0x41, - 0x63, 0x46, 0x05, 0xF2, 0x00, 0xF0, 0x81, 0xF0, 0x02, 0x18, 0x64, 0x46, 0x81, 0xF8, 0x07, 0x1B, - 0x12, 0x60, 0xCE, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD9, 0x02, 0x00, 0x65, 0x46, - 0x00, 0xF8, 0x88, 0xF3, 0x63, 0x45, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x18, - 0xFA, 0x04, 0x80, 0xF8, 0x65, 0x46, 0x00, 0xFA, 0x06, 0xF2, 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, - 0x61, 0x46, 0x2E, 0xF0, 0x66, 0x41, 0x12, 0x60, 0xCE, 0x65, 0x64, 0x47, 0x00, 0x7F, 0x88, 0xF1, - 0xE0, 0x84, 0x44, 0xD3, 0x64, 0x43, 0x11, 0x18, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xFC, 0x1B, - 0x66, 0x44, 0x64, 0x46, 0x80, 0xF0, 0x60, 0x46, 0x80, 0xF8, 0x65, 0x46, 0x65, 0x43, 0x80, 0xF0, - 0x01, 0xFA, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x0B, 0x00, 0x64, 0x46, 0x62, 0x43, 0x00, 0xF2, - 0xA3, 0xDB, 0x60, 0x46, 0x80, 0xF0, 0x81, 0xFC, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x60, 0x43, - 0x61, 0x46, 0xD3, 0x60, 0x2D, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x02, 0x61, 0xB3, 0x60, 0x58, 0x4D, - 0x77, 0x78, 0xFF, 0xFF, 0x87, 0xF1, 0x72, 0x44, 0xFF, 0xB4, 0xD0, 0x80, 0xFF, 0xFF, 0x02, 0x04, - 0xD0, 0x84, 0xFB, 0x01, 0xE0, 0x83, 0x88, 0xF3, 0x02, 0xA3, 0x43, 0x93, 0x66, 0x44, 0x00, 0xA8, - 0x56, 0xFD, 0x37, 0x03, 0x00, 0x64, 0x2B, 0xFA, 0x00, 0x60, 0xC0, 0x64, 0x2A, 0xFA, 0x66, 0x45, - 0x63, 0x46, 0x03, 0xF2, 0x04, 0xF0, 0x85, 0xF2, 0x65, 0x46, 0x2C, 0xFA, 0x2D, 0xF8, 0xAE, 0xFA, - 0xCB, 0xF3, 0x2F, 0xFA, 0x32, 0xFA, 0xCC, 0xF3, 0x30, 0xFA, 0x33, 0xFA, 0xCD, 0xF3, 0x31, 0xFA, - 0x34, 0xFA, 0xAC, 0xF1, 0x19, 0xF8, 0xFF, 0x67, 0x0E, 0xFA, 0x66, 0x45, 0x63, 0x46, 0x0E, 0xF2, - 0x65, 0x46, 0x02, 0x63, 0x00, 0x7E, 0x13, 0xFA, 0x3F, 0xFC, 0x00, 0x64, 0x3E, 0xFA, 0x88, 0xF3, - 0x07, 0xFA, 0x66, 0x41, 0x00, 0xF4, 0x05, 0x64, 0x09, 0xFA, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, - 0x8E, 0x64, 0xA2, 0xDB, 0x61, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xC1, 0xFE, 0x56, 0xF3, 0xA3, 0xFF, 0x60, 0x43, 0xE4, 0x60, 0x58, 0x4E, 0x9D, 0x78, 0xFF, 0xFF, - 0x56, 0xF3, 0xFF, 0xFF, 0x40, 0x58, 0x03, 0x65, 0xE2, 0x60, 0x58, 0x4E, 0x86, 0x78, 0xFF, 0xFF, - 0x56, 0xF3, 0x26, 0x46, 0x60, 0x43, 0x66, 0x41, 0x63, 0x46, 0x05, 0xF2, 0x00, 0xF0, 0x81, 0xF0, - 0x02, 0x18, 0x64, 0x46, 0x81, 0xF8, 0x07, 0x1B, 0x12, 0x60, 0xCE, 0x65, 0x60, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD9, 0x02, 0x00, 0x65, 0x46, 0x00, 0xF8, 0x88, 0xF3, 0x63, 0x45, 0x60, 0x46, - 0x00, 0xF2, 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x18, 0xFA, 0x04, 0x80, 0xF8, 0x65, 0x46, 0x00, 0xFA, - 0x06, 0xF2, 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, 0x61, 0x46, 0x2E, 0xF0, 0x66, 0x41, 0x12, 0x60, - 0xCE, 0x65, 0x64, 0x47, 0x00, 0x7F, 0x88, 0xF1, 0xE0, 0x84, 0x44, 0xD3, 0x64, 0x43, 0x11, 0x18, - 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xFC, 0x1B, 0x66, 0x44, 0x64, 0x46, 0x80, 0xF0, 0x60, 0x46, - 0x80, 0xF8, 0x65, 0x46, 0x65, 0x43, 0x80, 0xF0, 0x01, 0xFA, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, - 0x0B, 0x00, 0x64, 0x46, 0x62, 0x43, 0x00, 0xF2, 0xA3, 0xDB, 0x60, 0x46, 0x80, 0xF0, 0x81, 0xFC, - 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x60, 0x43, 0x61, 0x46, 0x2C, 0xF2, 0x2D, 0xF0, 0xAE, 0xF2, - 0x66, 0x45, 0x63, 0x46, 0x03, 0xFA, 0x04, 0xF8, 0x55, 0xF3, 0x85, 0xFA, 0xFF, 0xA0, 0x65, 0x46, - 0x03, 0x03, 0xD4, 0x60, 0xD6, 0x78, 0xFF, 0xFF, 0x95, 0xF3, 0x66, 0x45, 0x63, 0x46, 0x1B, 0xFA, - 0x65, 0x46, 0xBA, 0x65, 0x60, 0x44, 0xC4, 0x85, 0x01, 0x60, 0xFE, 0x61, 0x00, 0x64, 0x80, 0x63, - 0xC7, 0x85, 0x94, 0x84, 0x59, 0xDB, 0xFC, 0x1F, 0x00, 0x60, 0x88, 0x64, 0x3F, 0xFA, 0x00, 0xF4, - 0x02, 0x64, 0x0A, 0xFA, 0x00, 0x64, 0x0B, 0xFA, 0x80, 0x7F, 0x10, 0x7E, 0x0C, 0xFA, 0x1A, 0x65, - 0x80, 0x61, 0x02, 0x60, 0x00, 0x63, 0x0F, 0x4E, 0xF2, 0x60, 0x58, 0x4F, 0x4A, 0x78, 0xFF, 0xFF, - 0x0E, 0x4F, 0xD4, 0x60, 0xA7, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x23, 0xF0, 0x00, 0x60, 0x02, 0x64, - 0xA0, 0x80, 0x00, 0xF4, 0x03, 0x03, 0xD4, 0x60, 0x50, 0x78, 0xFF, 0xFF, 0x09, 0xF2, 0xFF, 0xFF, - 0xFF, 0xA0, 0x00, 0xA0, 0x0C, 0x03, 0x03, 0x03, 0xD3, 0x60, 0xCC, 0x78, 0xFF, 0xFF, 0x0A, 0xF2, - 0x26, 0x46, 0xFF, 0xA0, 0x87, 0xF4, 0x10, 0x02, 0xD4, 0x60, 0xD6, 0x78, 0xFF, 0xFF, 0x0A, 0xF2, - 0xFF, 0xFF, 0xFF, 0xA0, 0xFD, 0xA0, 0x02, 0x03, 0x04, 0x03, 0x06, 0x00, 0xD4, 0x60, 0x0C, 0x78, - 0xFF, 0xFF, 0xD4, 0x60, 0x17, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x87, 0xF4, 0x66, 0x41, 0x63, 0x46, - 0x05, 0xF2, 0x00, 0xF0, 0x81, 0xF0, 0x02, 0x18, 0x64, 0x46, 0x81, 0xF8, 0x07, 0x1B, 0x12, 0x60, - 0xCE, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD9, 0x02, 0x00, 0x65, 0x46, 0x00, 0xF8, - 0x88, 0xF3, 0x63, 0x45, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x18, 0xFA, 0x04, - 0x80, 0xF8, 0x65, 0x46, 0x00, 0xFA, 0x06, 0xF2, 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, 0x61, 0x46, - 0x14, 0x60, 0xD0, 0x62, 0xA2, 0xD3, 0xDA, 0x81, 0x60, 0x45, 0xD5, 0x80, 0xA1, 0xD1, 0x11, 0x03, - 0xD3, 0x80, 0xD9, 0x81, 0xFA, 0x02, 0xC9, 0x81, 0xC8, 0x85, 0xD5, 0x80, 0xA5, 0xD3, 0x08, 0x28, - 0xA1, 0xDB, 0x14, 0x60, 0xD0, 0x62, 0x65, 0x44, 0xA2, 0xDB, 0x4A, 0xD3, 0xFF, 0xFF, 0xCC, 0x84, - 0xA2, 0xDB, 0xD1, 0x60, 0xCA, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x87, 0xF4, 0x66, 0x41, 0x63, 0x46, - 0x05, 0xF2, 0x00, 0xF0, 0x81, 0xF0, 0x02, 0x18, 0x64, 0x46, 0x81, 0xF8, 0x07, 0x1B, 0x12, 0x60, - 0xCE, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD9, 0x02, 0x00, 0x65, 0x46, 0x00, 0xF8, - 0x88, 0xF3, 0x63, 0x45, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x18, 0xFA, 0x04, - 0x80, 0xF8, 0x65, 0x46, 0x00, 0xFA, 0x06, 0xF2, 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, 0x61, 0x46, - 0x14, 0x60, 0xD0, 0x62, 0xA2, 0xD3, 0xDA, 0x81, 0x60, 0x45, 0xD5, 0x80, 0xA1, 0xD1, 0x11, 0x03, - 0xD3, 0x80, 0xD9, 0x81, 0xFA, 0x02, 0xC9, 0x81, 0xC8, 0x85, 0xD5, 0x80, 0xA5, 0xD3, 0x08, 0x28, - 0xA1, 0xDB, 0x14, 0x60, 0xD0, 0x62, 0x65, 0x44, 0xA2, 0xDB, 0x4A, 0xD3, 0xFF, 0xFF, 0xCC, 0x84, - 0xA2, 0xDB, 0xD1, 0x60, 0xD5, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x32, 0x44, 0x08, 0xB0, 0x87, 0xF4, - 0x03, 0x02, 0xD1, 0x60, 0xD5, 0x78, 0xFF, 0xFF, 0xD3, 0x60, 0x3C, 0x78, 0xFF, 0xFF, 0x32, 0x44, - 0x26, 0x46, 0x08, 0xB0, 0x07, 0xF2, 0x03, 0x02, 0xD1, 0x60, 0xD5, 0x78, 0xFF, 0xFF, 0x60, 0x46, - 0x1B, 0xF2, 0x26, 0x46, 0xBA, 0x65, 0x60, 0x44, 0xC4, 0x85, 0x01, 0x60, 0xFE, 0x61, 0x00, 0x64, - 0x80, 0x63, 0xC7, 0x85, 0x94, 0x84, 0x59, 0xDB, 0xFC, 0x1F, 0x00, 0xF4, 0x01, 0x60, 0xFE, 0x61, - 0x7E, 0x65, 0x18, 0x63, 0x5B, 0xD2, 0x59, 0xD1, 0xFF, 0xFF, 0xD0, 0x80, 0xD7, 0x80, 0x18, 0x02, - 0xF9, 0x02, 0x00, 0xF4, 0x02, 0x63, 0x0E, 0x65, 0x5B, 0xD2, 0x59, 0xD1, 0xFF, 0xFF, 0xD0, 0x80, - 0xD7, 0x80, 0x0E, 0x02, 0xF9, 0x02, 0x26, 0x46, 0x07, 0xF4, 0x06, 0xF2, 0xFF, 0xFF, 0x01, 0x7E, - 0x06, 0xFA, 0x26, 0x46, 0x00, 0xF4, 0x04, 0x64, 0x0A, 0xFA, 0x00, 0x64, 0x0B, 0xFA, 0x57, 0x00, - 0x26, 0x46, 0x87, 0xF4, 0x66, 0x41, 0x63, 0x46, 0x05, 0xF2, 0x00, 0xF0, 0x81, 0xF0, 0x02, 0x18, - 0x64, 0x46, 0x81, 0xF8, 0x07, 0x1B, 0x12, 0x60, 0xCE, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD9, 0x02, 0x00, 0x65, 0x46, 0x00, 0xF8, 0x88, 0xF3, 0x63, 0x45, 0x60, 0x46, 0x00, 0xF2, - 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x18, 0xFA, 0x04, 0x80, 0xF8, 0x65, 0x46, 0x00, 0xFA, 0x06, 0xF2, - 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, 0x61, 0x46, 0x14, 0x60, 0xD0, 0x62, 0xA2, 0xD3, 0xDA, 0x81, - 0x60, 0x45, 0xD5, 0x80, 0xA1, 0xD1, 0x11, 0x03, 0xD3, 0x80, 0xD9, 0x81, 0xFA, 0x02, 0xC9, 0x81, - 0xC8, 0x85, 0xD5, 0x80, 0xA5, 0xD3, 0x08, 0x28, 0xA1, 0xDB, 0x14, 0x60, 0xD0, 0x62, 0x65, 0x44, - 0xA2, 0xDB, 0x4A, 0xD3, 0xFF, 0xFF, 0xCC, 0x84, 0xA2, 0xDB, 0x00, 0xF4, 0x04, 0x64, 0x0A, 0xFA, - 0x0F, 0x64, 0x0B, 0xFA, 0x40, 0x59, 0x02, 0x60, 0x00, 0x61, 0x41, 0x58, 0x26, 0x46, 0x2C, 0xF2, - 0xA1, 0xDB, 0x2D, 0xF2, 0x59, 0xDB, 0x2E, 0xF2, 0x59, 0xDB, 0x03, 0x65, 0xE2, 0x60, 0x58, 0x4E, - 0x5B, 0x78, 0xFF, 0xFF, 0x03, 0x65, 0xE2, 0x60, 0x58, 0x4E, 0x86, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0x88, 0xF3, 0x07, 0xFA, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0x8E, 0x64, 0xA2, 0xDB, 0x26, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x66, 0x46, 0x46, - 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0xF4, 0x0A, 0xF2, 0x09, 0xF2, 0xFF, 0xA0, 0x00, 0xA0, 0x06, 0x02, - 0xFF, 0xA0, 0x07, 0x03, 0x09, 0x03, 0xD3, 0x60, 0xCC, 0x78, 0xFF, 0xFF, 0xD3, 0x60, 0x8C, 0x78, - 0xFF, 0xFF, 0xD4, 0x60, 0xDB, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x07, 0xF4, 0x06, 0xF2, 0x66, 0x43, - 0x00, 0x7E, 0x06, 0xFA, 0x26, 0x46, 0xD3, 0x60, 0x3C, 0x78, 0xFF, 0xFF, 0x63, 0x46, 0x06, 0xF2, - 0xFF, 0xFF, 0x01, 0x7E, 0x06, 0xFA, 0x26, 0x46, 0x88, 0xF3, 0x07, 0xFA, 0x00, 0xF4, 0x02, 0x64, - 0x0A, 0xFA, 0x00, 0x64, 0x0B, 0xFA, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0x8E, 0x64, 0xA2, 0xDB, - 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x66, - 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x16, 0x60, 0xAC, 0x7C, 0x2A, 0xF2, 0xA4, 0xDB, 0x22, 0x60, - 0x2A, 0x63, 0xFF, 0xB4, 0x01, 0x61, 0x00, 0x60, 0x10, 0x7C, 0xA3, 0xDB, 0x60, 0x40, 0x00, 0x36, - 0x03, 0x00, 0x02, 0x61, 0x00, 0x60, 0x30, 0x7C, 0x41, 0x47, 0x2A, 0xF8, 0x2F, 0xF2, 0x2C, 0xFA, - 0x30, 0xF2, 0x2D, 0xFA, 0x31, 0xF2, 0x2E, 0xFA, 0xCB, 0xF3, 0x2F, 0xFA, 0xCC, 0xF3, 0x30, 0xFA, - 0xCD, 0xF3, 0x31, 0xFA, 0x67, 0xF3, 0x32, 0xFA, 0x68, 0xF3, 0x33, 0xFA, 0x69, 0xF3, 0x34, 0xFA, - 0xAC, 0xF1, 0x19, 0xF8, 0x00, 0x7C, 0x3E, 0xF8, 0x1C, 0xF0, 0x13, 0xF8, 0x07, 0xF2, 0x88, 0xF1, - 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x03, 0x02, 0xD9, 0x60, 0xA3, 0x78, 0xFF, 0xFF, 0x40, 0x4B, - 0xAB, 0x46, 0x06, 0xF2, 0xAB, 0x46, 0x00, 0xF4, 0x01, 0xB0, 0xFF, 0xFF, 0x03, 0x02, 0xD9, 0x60, - 0xA3, 0x78, 0xFF, 0xFF, 0x22, 0x60, 0x2C, 0x63, 0x09, 0xF2, 0xBD, 0xDB, 0x43, 0x44, 0x10, 0xB0, - 0x80, 0x60, 0x00, 0x63, 0x0D, 0x03, 0x1F, 0x60, 0x92, 0x62, 0xA2, 0xD1, 0xFF, 0xFF, 0x64, 0x44, - 0xFE, 0x26, 0x08, 0x00, 0x32, 0x40, 0x08, 0x26, 0x06, 0x00, 0xDA, 0x60, 0x02, 0x78, 0xFF, 0xFF, - 0x32, 0x40, 0x10, 0x2A, 0x00, 0x63, 0xAB, 0x46, 0x06, 0xF0, 0x7F, 0x60, 0xFF, 0x64, 0xA0, 0x84, - 0x63, 0x45, 0xB4, 0x84, 0x06, 0xFA, 0xAB, 0x46, 0x0A, 0xF0, 0x56, 0xF9, 0x24, 0x43, 0xBD, 0xD9, - 0x43, 0x44, 0x01, 0x63, 0x32, 0x40, 0x10, 0x26, 0x10, 0xBB, 0x1F, 0x60, 0x92, 0x62, 0xA2, 0xD3, - 0xFF, 0xFF, 0x60, 0x40, 0xFE, 0x26, 0x10, 0xBB, 0x09, 0xFC, 0x27, 0x44, 0xFE, 0xA0, 0xFF, 0xFF, - 0x03, 0x03, 0xD5, 0x60, 0xFE, 0x78, 0xFF, 0xFF, 0x16, 0x60, 0xA2, 0x64, 0x24, 0x43, 0x0B, 0xF0, - 0xA0, 0xD9, 0xBD, 0xD9, 0x0C, 0xF0, 0x58, 0xD9, 0xBD, 0xD9, 0x0D, 0xF0, 0x58, 0xD9, 0xBD, 0xD9, - 0x43, 0x44, 0x1C, 0x65, 0x2D, 0x61, 0x02, 0x60, 0x00, 0x63, 0xA5, 0xD0, 0xDA, 0x85, 0x64, 0x44, - 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, 0x05, 0x03, 0x64, 0x47, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, - 0xF4, 0x02, 0x02, 0x60, 0x02, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0xE0, 0x84, 0x04, 0xA5, 0xC5, 0x81, - 0xA1, 0xD3, 0x00, 0x65, 0x60, 0x43, 0x59, 0xD3, 0xFF, 0xFF, 0x7F, 0xB4, 0x02, 0x3A, 0x02, 0x00, - 0x01, 0x64, 0x15, 0x00, 0x04, 0x3A, 0x02, 0x00, 0x02, 0x64, 0x11, 0x00, 0x0A, 0x3A, 0x02, 0x00, - 0x04, 0x64, 0x0D, 0x00, 0x0B, 0x3A, 0x02, 0x00, 0x08, 0x64, 0x09, 0x00, 0x10, 0x3A, 0x02, 0x00, - 0x10, 0x64, 0x05, 0x00, 0x16, 0x3A, 0x02, 0x00, 0x20, 0x64, 0x01, 0x00, 0x00, 0x64, 0xCF, 0x83, - 0xB4, 0x85, 0xE1, 0x02, 0x65, 0x44, 0x60, 0xFB, 0xB8, 0xF3, 0x2B, 0x45, 0x66, 0x41, 0x65, 0x46, - 0x8C, 0xFA, 0x60, 0x40, 0x01, 0x36, 0x06, 0x00, 0x02, 0x36, 0x04, 0x00, 0x04, 0x36, 0x02, 0x00, - 0x05, 0x3A, 0x02, 0x00, 0x00, 0x64, 0x01, 0x00, 0x01, 0x64, 0x6F, 0xFA, 0x5F, 0xF3, 0x60, 0xF1, - 0xFF, 0xFF, 0xA0, 0x84, 0x65, 0x43, 0x02, 0x02, 0x5F, 0xF3, 0xFF, 0xFF, 0x60, 0x41, 0x0F, 0x60, - 0xAE, 0x65, 0xB8, 0xF3, 0xFF, 0xFF, 0xE0, 0x84, 0x44, 0xD3, 0x61, 0x45, 0xA4, 0x80, 0xFF, 0xFF, - 0x04, 0x02, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0xFC, 0x03, 0xA4, 0x84, 0x61, 0xFB, 0x6F, 0xF0, - 0x60, 0x47, 0x90, 0x84, 0x6F, 0xFA, 0x60, 0x47, 0x60, 0x45, 0x80, 0x64, 0xE8, 0x84, 0xA4, 0x80, - 0xFF, 0xFF, 0xFC, 0x03, 0xA4, 0x84, 0x70, 0xF0, 0x70, 0xFA, 0x00, 0x61, 0xE8, 0x84, 0xFF, 0xFF, - 0x02, 0x05, 0xDD, 0x81, 0xFB, 0x01, 0xE1, 0x81, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, - 0x66, 0x43, 0x0C, 0xF4, 0xFF, 0xFF, 0xD6, 0x60, 0x80, 0x78, 0xFF, 0xFF, 0x16, 0x65, 0x2D, 0x61, - 0x02, 0x60, 0x00, 0x63, 0xA5, 0xD0, 0xDA, 0x85, 0x64, 0x44, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, - 0x05, 0x03, 0x64, 0x47, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, 0xF4, 0x02, 0x02, 0x60, 0x02, 0x61, - 0xA1, 0xD3, 0xFF, 0xFF, 0xE0, 0x84, 0x04, 0xA5, 0xC5, 0x81, 0xA1, 0xD3, 0x00, 0x65, 0x60, 0x43, - 0x59, 0xD3, 0xFF, 0xFF, 0x7F, 0xB4, 0x02, 0x3A, 0x02, 0x00, 0x01, 0x64, 0x15, 0x00, 0x04, 0x3A, - 0x02, 0x00, 0x02, 0x64, 0x11, 0x00, 0x0A, 0x3A, 0x02, 0x00, 0x04, 0x64, 0x0D, 0x00, 0x0B, 0x3A, - 0x02, 0x00, 0x08, 0x64, 0x09, 0x00, 0x10, 0x3A, 0x02, 0x00, 0x10, 0x64, 0x05, 0x00, 0x16, 0x3A, - 0x02, 0x00, 0x20, 0x64, 0x01, 0x00, 0x00, 0x64, 0xCF, 0x83, 0xB4, 0x85, 0xE1, 0x02, 0x65, 0x44, - 0x60, 0xFB, 0xB8, 0xF3, 0x2B, 0x45, 0x66, 0x41, 0x65, 0x46, 0x8C, 0xFA, 0x60, 0x40, 0x01, 0x36, - 0x06, 0x00, 0x02, 0x36, 0x04, 0x00, 0x04, 0x36, 0x02, 0x00, 0x05, 0x3A, 0x02, 0x00, 0x00, 0x64, - 0x01, 0x00, 0x01, 0x64, 0x6F, 0xFA, 0x5F, 0xF3, 0x60, 0xF1, 0xFF, 0xFF, 0xA0, 0x84, 0x65, 0x43, - 0x02, 0x02, 0x5F, 0xF3, 0xFF, 0xFF, 0x60, 0x41, 0x0F, 0x60, 0xAE, 0x65, 0xB8, 0xF3, 0xFF, 0xFF, - 0xE0, 0x84, 0x44, 0xD3, 0x61, 0x45, 0xA4, 0x80, 0xFF, 0xFF, 0x04, 0x02, 0xE8, 0x84, 0xA4, 0x80, - 0xFF, 0xFF, 0xFC, 0x03, 0xA4, 0x84, 0x61, 0xFB, 0x6F, 0xF0, 0x60, 0x47, 0x90, 0x84, 0x6F, 0xFA, - 0x60, 0x47, 0x60, 0x45, 0x80, 0x64, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0xFC, 0x03, 0xA4, 0x84, - 0x70, 0xF0, 0x70, 0xFA, 0x00, 0x61, 0xE8, 0x84, 0xFF, 0xFF, 0x02, 0x05, 0xDD, 0x81, 0xFB, 0x01, - 0xE1, 0x81, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, 0x66, 0x43, 0x0C, 0xF4, 0xFF, 0xFF, - 0x26, 0x46, 0x3F, 0xF2, 0x00, 0xF4, 0x16, 0x65, 0x27, 0x40, 0x02, 0x3A, 0x03, 0x00, 0x1C, 0x65, - 0xF6, 0xA4, 0x01, 0x00, 0xFC, 0xA4, 0x24, 0x43, 0x22, 0x60, 0x82, 0x61, 0x5D, 0x91, 0x51, 0x90, - 0xFF, 0xFF, 0x04, 0x28, 0x60, 0x41, 0xCD, 0x84, 0x4C, 0x91, 0x60, 0x43, 0x60, 0xFE, 0xA5, 0xD2, - 0xDE, 0x85, 0x7F, 0x26, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x5D, 0x93, 0xA3, 0xDB, 0x5D, 0x93, - 0xA5, 0xD2, 0xF6, 0x1F, 0x5D, 0x93, 0x20, 0xFE, 0xDF, 0x83, 0x22, 0x60, 0x28, 0x7C, 0x03, 0x1E, - 0x60, 0xFE, 0xBD, 0xDF, 0x20, 0xFE, 0x22, 0x60, 0x2C, 0x64, 0x53, 0x93, 0xA4, 0xDD, 0x26, 0x46, - 0x00, 0xF4, 0x1F, 0x60, 0x90, 0x64, 0xA0, 0xD3, 0x00, 0x63, 0x00, 0xB8, 0x0A, 0xFC, 0x03, 0x02, - 0xD7, 0x60, 0x14, 0x78, 0xFF, 0xFF, 0x0B, 0xF2, 0x27, 0x40, 0x02, 0x3A, 0x02, 0x00, 0x0E, 0xF2, - 0xFF, 0xFF, 0x60, 0x47, 0x00, 0x3A, 0x26, 0x00, 0x60, 0x41, 0x00, 0x36, 0x23, 0x00, 0xE0, 0xA0, - 0xDA, 0x85, 0x20, 0x07, 0x1F, 0x60, 0x1E, 0x63, 0xA3, 0xD1, 0x65, 0x42, 0xD1, 0x80, 0x1F, 0x60, - 0x20, 0x63, 0x18, 0x02, 0x50, 0xFE, 0x61, 0x40, 0xFE, 0x22, 0x08, 0x00, 0x62, 0x45, 0xBD, 0xD3, - 0xA5, 0xD0, 0xDA, 0x82, 0xD0, 0x80, 0xC9, 0x81, 0xF6, 0x0C, 0x0C, 0x00, 0x61, 0x40, 0x00, 0x36, - 0x33, 0x00, 0x62, 0x45, 0xA3, 0xD3, 0xA5, 0xD0, 0xFF, 0xFF, 0x90, 0x80, 0xFF, 0x26, 0x02, 0x00, - 0xDE, 0x82, 0x2A, 0x00, 0x0C, 0x63, 0x0A, 0xFC, 0x00, 0x64, 0x09, 0xFA, 0x0B, 0xFA, 0x01, 0x7E, - 0x0C, 0xFA, 0x26, 0x46, 0x08, 0x64, 0x3F, 0xFA, 0x07, 0xF2, 0x88, 0xF1, 0x40, 0x58, 0x07, 0xF8, - 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0x8E, 0x64, 0xA2, 0xDB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0xDA, 0x60, 0x1E, 0x78, 0xFF, 0xFF, 0x20, 0xFE, - 0x21, 0x60, 0xE2, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0x22, 0xB0, 0xFF, 0xFF, 0x03, 0x03, 0xD8, 0x60, - 0x9F, 0x78, 0xFF, 0xFF, 0x01, 0x63, 0xD7, 0x01, 0x1F, 0x60, 0x92, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, - 0xFF, 0xA4, 0xFF, 0xFF, 0x0C, 0x20, 0x0D, 0x00, 0xD8, 0x60, 0x9F, 0x78, 0xFF, 0xFF, 0x20, 0xFE, - 0x28, 0x46, 0x2A, 0x41, 0xFF, 0xB1, 0x60, 0xFE, 0x82, 0x64, 0xA1, 0xDA, 0xFF, 0xFF, 0x20, 0xFE, - 0x15, 0x00, 0x21, 0x60, 0xEE, 0x61, 0xA1, 0xDF, 0xD9, 0x81, 0xA1, 0xDF, 0xD9, 0x81, 0xA1, 0xDF, - 0x04, 0xA1, 0xA1, 0xDF, 0xD9, 0x81, 0xA1, 0xDF, 0xD9, 0x81, 0xA1, 0xDF, 0xD9, 0x81, 0xA1, 0xDF, - 0x2B, 0x46, 0x37, 0xF2, 0x7F, 0x60, 0xCF, 0x65, 0xA4, 0x84, 0xA2, 0xDA, 0x26, 0x46, 0x3F, 0xF2, - 0x00, 0xF4, 0x27, 0x40, 0x02, 0x3A, 0x40, 0x00, 0x60, 0x43, 0xF6, 0xA3, 0x00, 0x60, 0x1B, 0x61, - 0x00, 0x60, 0xDD, 0x65, 0x60, 0xFE, 0x81, 0xA1, 0x7F, 0xA1, 0x02, 0x06, 0x00, 0xF4, 0x03, 0x61, - 0xDD, 0x81, 0xA1, 0xD2, 0xCF, 0x83, 0xD4, 0x80, 0x2D, 0x03, 0x17, 0x03, 0xCF, 0x83, 0x61, 0x44, - 0x80, 0xA0, 0x28, 0x03, 0x02, 0x02, 0x00, 0xF4, 0x03, 0x61, 0xDD, 0x81, 0xA1, 0xD2, 0xCF, 0x83, - 0x81, 0xA1, 0x20, 0x03, 0x05, 0x07, 0x7F, 0xA1, 0xCC, 0x84, 0xDD, 0x81, 0xE4, 0x03, 0xF7, 0x01, - 0x00, 0xF4, 0x00, 0xB8, 0x04, 0x61, 0xE4, 0x03, 0xF2, 0x01, 0x01, 0x60, 0xFF, 0x63, 0x46, 0x48, - 0x41, 0x4A, 0xDD, 0x81, 0xA1, 0xD0, 0xDF, 0x83, 0xA3, 0xD9, 0x64, 0x44, 0xDD, 0x81, 0xA1, 0xD0, - 0xDF, 0x83, 0xA3, 0xD9, 0xCC, 0x84, 0x81, 0xA1, 0x05, 0x03, 0x7F, 0xA1, 0xF7, 0x04, 0x00, 0xF4, - 0x03, 0x61, 0xF4, 0x01, 0x20, 0xFE, 0x3F, 0x00, 0x60, 0x43, 0xFC, 0xA3, 0x00, 0x60, 0x15, 0x61, - 0x00, 0x60, 0xDD, 0x65, 0x60, 0xFE, 0x81, 0xA1, 0x7F, 0xA1, 0x02, 0x06, 0x00, 0xF4, 0x03, 0x61, - 0xDD, 0x81, 0xA1, 0xD2, 0xCF, 0x83, 0xD4, 0x80, 0x2D, 0x03, 0x17, 0x03, 0xCF, 0x83, 0x61, 0x44, - 0x80, 0xA0, 0x28, 0x03, 0x02, 0x02, 0x00, 0xF4, 0x03, 0x61, 0xDD, 0x81, 0xA1, 0xD2, 0xCF, 0x83, - 0x81, 0xA1, 0x20, 0x03, 0x05, 0x07, 0x7F, 0xA1, 0xCC, 0x84, 0xDD, 0x81, 0xE4, 0x03, 0xF7, 0x01, - 0x00, 0xF4, 0x00, 0xB8, 0x04, 0x61, 0xE4, 0x03, 0xF2, 0x01, 0x01, 0x60, 0xFF, 0x63, 0x46, 0x48, - 0x41, 0x4A, 0xDD, 0x81, 0xA1, 0xD0, 0xDF, 0x83, 0xA3, 0xD9, 0x64, 0x44, 0xDD, 0x81, 0xA1, 0xD0, - 0xDF, 0x83, 0xA3, 0xD9, 0xCC, 0x84, 0x81, 0xA1, 0x05, 0x03, 0x7F, 0xA1, 0xF7, 0x04, 0x00, 0xF4, - 0x03, 0x61, 0xF4, 0x01, 0x20, 0xFE, 0x00, 0xBB, 0x02, 0x60, 0x00, 0x61, 0x08, 0x24, 0xD7, 0x00, - 0x60, 0xFE, 0xA1, 0xD3, 0xFF, 0xFF, 0xFA, 0xA4, 0xFF, 0xFF, 0x01, 0x05, 0x50, 0x01, 0xDD, 0x81, - 0xA1, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x00, 0x3A, 0x4A, 0x01, 0xDD, 0x81, 0xA1, 0xD1, 0xFF, 0xFF, - 0x64, 0x40, 0x50, 0x3A, 0x44, 0x01, 0xDD, 0x81, 0xA1, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0xF2, 0x3A, - 0x3E, 0x01, 0xDD, 0x81, 0xA1, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x3A, 0x20, 0x01, 0xDD, 0x81, - 0xA1, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x3A, 0x1A, 0x01, 0xDD, 0x81, 0xA1, 0xD1, 0xFF, 0xFF, - 0x64, 0x40, 0x00, 0x3A, 0x14, 0x01, 0x60, 0x5C, 0x00, 0x36, 0x30, 0x00, 0x00, 0x64, 0xD8, 0x60, - 0x58, 0x4E, 0xC4, 0x78, 0xFF, 0xFF, 0x21, 0x60, 0xF6, 0x62, 0xA2, 0xDB, 0x64, 0x40, 0x00, 0x36, - 0x2B, 0x00, 0xDD, 0x81, 0xA1, 0xD3, 0xDD, 0x81, 0xD8, 0x60, 0x58, 0x4E, 0xC4, 0x78, 0xFF, 0xFF, - 0x21, 0x60, 0xF8, 0x62, 0xA2, 0xDB, 0x64, 0x40, 0x00, 0x36, 0x24, 0x00, 0xDD, 0x81, 0xA1, 0xD3, - 0xDD, 0x81, 0xD8, 0x60, 0x58, 0x4E, 0xC4, 0x78, 0xFF, 0xFF, 0x21, 0x60, 0xFA, 0x62, 0xA2, 0xDB, - 0x64, 0x40, 0x00, 0x36, 0x1D, 0x00, 0xDD, 0x81, 0xA1, 0xD1, 0x21, 0x60, 0xFC, 0x62, 0xA2, 0xD9, - 0xDD, 0x81, 0xA1, 0xD1, 0x21, 0x60, 0xFD, 0x62, 0xA2, 0xD9, 0x19, 0x00, 0x20, 0xFE, 0x21, 0x60, - 0xF6, 0x62, 0x00, 0x60, 0x04, 0x64, 0xA2, 0xDB, 0x20, 0xFE, 0x21, 0x60, 0xF8, 0x62, 0x00, 0x60, - 0x04, 0x64, 0xA2, 0xDB, 0x20, 0xFE, 0x21, 0x60, 0xFA, 0x62, 0x00, 0x60, 0x02, 0x64, 0xA2, 0xDB, - 0x20, 0xFE, 0x21, 0x60, 0xFC, 0x62, 0x00, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x00, 0x20, 0xFE, - 0x21, 0x60, 0xE2, 0x62, 0xA2, 0xD1, 0x21, 0x60, 0xF6, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xA0, 0x84, - 0xFF, 0xFF, 0x10, 0x26, 0x09, 0x00, 0x04, 0x26, 0x09, 0x00, 0x20, 0x26, 0x09, 0x00, 0x02, 0x26, - 0x09, 0x00, 0xD7, 0x60, 0x07, 0x78, 0xFF, 0xFF, 0x10, 0x7C, 0x05, 0x00, 0x04, 0x7C, 0x03, 0x00, - 0x20, 0x7C, 0x01, 0x00, 0x02, 0x7C, 0x21, 0x60, 0xEE, 0x61, 0xA1, 0xD9, 0x21, 0x60, 0xE4, 0x61, - 0xA1, 0xD1, 0x21, 0x60, 0xF8, 0x61, 0xA1, 0xD3, 0x21, 0x60, 0xEE, 0x61, 0xA0, 0x84, 0xA1, 0xD1, - 0xFF, 0xFF, 0x10, 0x26, 0x07, 0x00, 0x04, 0x26, 0x07, 0x00, 0x01, 0x26, 0x0D, 0x00, 0xD7, 0x60, - 0x07, 0x78, 0xFF, 0xFF, 0x10, 0x7C, 0x09, 0x00, 0x64, 0x40, 0x10, 0x22, 0x03, 0x00, 0xD7, 0x60, - 0x07, 0x78, 0xFF, 0xFF, 0x04, 0x7C, 0x01, 0x00, 0x01, 0x7C, 0x21, 0x60, 0xF0, 0x61, 0xA1, 0xD9, - 0x21, 0x60, 0xE6, 0x61, 0xA1, 0xD1, 0x21, 0x60, 0xFA, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0xA0, 0x84, - 0x02, 0x26, 0x07, 0x00, 0x04, 0x26, 0x07, 0x00, 0x01, 0x26, 0x07, 0x00, 0xD7, 0x60, 0x07, 0x78, - 0xFF, 0xFF, 0x02, 0x7C, 0x03, 0x00, 0x04, 0x7C, 0x01, 0x00, 0x20, 0x7C, 0x21, 0x60, 0xF2, 0x61, - 0xA1, 0xD9, 0x21, 0x60, 0xFC, 0x61, 0xA1, 0xD1, 0x21, 0x60, 0xF4, 0x61, 0xA1, 0xD9, 0x21, 0x60, - 0xF2, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0x60, 0x47, 0x21, 0x60, 0xF0, 0x61, 0xA1, 0xD1, 0xFF, 0xFF, - 0xB0, 0x84, 0x1F, 0x60, 0x92, 0x62, 0xA2, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x36, 0x22, 0xBC, - 0xAB, 0x46, 0x36, 0xFA, 0xAB, 0x46, 0x21, 0x60, 0xEE, 0x61, 0xA1, 0xD3, 0x1F, 0x60, 0x92, 0x62, - 0xA2, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x36, 0x22, 0xBC, 0x88, 0xF1, 0x66, 0x41, 0x64, 0x46, - 0x36, 0xFA, 0xFF, 0xFF, 0x61, 0x46, 0x50, 0x00, 0x21, 0x60, 0xFE, 0x62, 0xA2, 0xDB, 0xE0, 0x84, - 0xE0, 0x84, 0x03, 0x02, 0x01, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x02, 0xA5, 0x64, 0x44, 0xD4, 0x9C, - 0x22, 0x60, 0x00, 0x62, 0xA2, 0xD9, 0x22, 0x60, 0x02, 0x62, 0xA2, 0xDF, 0xDD, 0x81, 0xA1, 0xD1, - 0x00, 0x65, 0x64, 0x40, 0x00, 0x3A, 0x01, 0x65, 0xDD, 0x81, 0xA1, 0xD1, 0xFF, 0xFF, 0x64, 0x40, - 0x50, 0x3A, 0x01, 0x65, 0xDD, 0x81, 0xA1, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0xF2, 0x3A, 0x01, 0x65, - 0xDD, 0x81, 0xA1, 0xD1, 0x65, 0x40, 0x00, 0x3A, 0x18, 0x00, 0x00, 0x60, 0x00, 0x65, 0x64, 0x40, - 0x00, 0x36, 0x01, 0x65, 0x64, 0x40, 0x01, 0x36, 0x02, 0x65, 0x64, 0x40, 0x02, 0x36, 0x04, 0x65, - 0x64, 0x40, 0x04, 0x36, 0x10, 0x65, 0x64, 0x40, 0x05, 0x36, 0x20, 0x65, 0x65, 0x5C, 0x22, 0x60, - 0x02, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xB0, 0x84, 0xA2, 0xDB, 0x21, 0x60, 0xFE, 0x62, 0xA2, 0xD3, - 0xFF, 0xFF, 0xFF, 0xA4, 0xA2, 0xDB, 0xCA, 0x02, 0x22, 0x60, 0x02, 0x62, 0xA2, 0xD3, 0x22, 0x60, - 0x00, 0x62, 0xA2, 0xD1, 0x2E, 0x58, 0xFF, 0xFF, 0xAB, 0x46, 0x82, 0xF0, 0xC0, 0x67, 0xB4, 0x84, - 0xAB, 0x46, 0x0B, 0xFA, 0x1F, 0x60, 0xA0, 0x64, 0xA0, 0xD1, 0x22, 0x60, 0xD4, 0x7C, 0x04, 0x1B, - 0xFF, 0x60, 0xFF, 0x63, 0xA4, 0xDD, 0x29, 0x00, 0x23, 0x60, 0x3C, 0x63, 0xA4, 0xDD, 0xDB, 0x83, - 0x60, 0xFE, 0x00, 0x64, 0xBD, 0xDB, 0x60, 0x64, 0xBD, 0xDB, 0x1D, 0x64, 0xBD, 0xDB, 0xC3, 0xF3, - 0xBD, 0xDB, 0xFF, 0xFF, 0x20, 0xFE, 0x01, 0x60, 0x78, 0x64, 0x06, 0x61, 0x58, 0xD1, 0xFF, 0xFF, - 0x60, 0xFE, 0xBD, 0xD9, 0x20, 0xFE, 0xCD, 0x81, 0x61, 0x40, 0x08, 0x28, 0xF7, 0x01, 0xB7, 0xF1, - 0xFF, 0xFF, 0x64, 0x47, 0x60, 0xFE, 0xBD, 0xD9, 0xBD, 0xDB, 0x20, 0xFE, 0x1F, 0x60, 0x9C, 0x64, - 0xA0, 0xD1, 0x60, 0xFE, 0xBD, 0xD9, 0xFF, 0xFF, 0x20, 0xFE, 0x22, 0x60, 0xD2, 0x64, 0x40, 0x48, - 0x18, 0x61, 0x26, 0x46, 0x00, 0xF4, 0xFF, 0x60, 0xF2, 0x64, 0xE1, 0x60, 0x58, 0x4D, 0xE5, 0x78, - 0xFF, 0xFF, 0x26, 0x46, 0x3F, 0xFC, 0x2B, 0x46, 0x56, 0xF1, 0x16, 0x60, 0xAC, 0x61, 0x1B, 0xF8, - 0xA1, 0xD1, 0x10, 0x60, 0x00, 0x64, 0xA0, 0x80, 0x06, 0xF2, 0x0C, 0x03, 0x10, 0xBC, 0x06, 0xFA, - 0x87, 0xF3, 0x00, 0x60, 0xE2, 0x62, 0xA2, 0xD3, 0x60, 0x45, 0xD4, 0x80, 0xDC, 0x84, 0x07, 0x07, - 0xA2, 0xDB, 0x05, 0x00, 0x10, 0xB5, 0xFF, 0xFF, 0x02, 0x03, 0xD4, 0x84, 0x06, 0xFA, 0x07, 0xF2, - 0x66, 0x45, 0x60, 0x46, 0x06, 0xF2, 0x65, 0x46, 0x02, 0xB0, 0xFF, 0xFF, 0x12, 0x03, 0x26, 0x46, - 0x88, 0xF3, 0x07, 0xFA, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0x8E, 0x64, 0xA2, 0xDB, 0x26, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x66, 0x46, 0x46, - 0x4C, 0x00, 0x26, 0x46, 0x88, 0xF3, 0x07, 0xFA, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0x8E, 0x64, - 0xA2, 0xDB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, - 0x00, 0x66, 0x46, 0x46, 0x1A, 0x00, 0x00, 0x60, 0xC0, 0x64, 0x2A, 0xFA, 0x02, 0x64, 0x3F, 0xFA, - 0x88, 0xF3, 0x07, 0xFA, 0x00, 0xF4, 0x09, 0x64, 0x09, 0xFA, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, - 0x8E, 0x64, 0xA2, 0xDB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xC1, 0xFE, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x2B, 0x43, 0x14, 0x60, 0xD0, 0x62, - 0xA2, 0xD3, 0xDA, 0x81, 0x60, 0x45, 0xD5, 0x80, 0xA1, 0xD1, 0x11, 0x03, 0xD3, 0x80, 0xD9, 0x81, - 0xFA, 0x02, 0xC9, 0x81, 0xC8, 0x85, 0xD5, 0x80, 0xA5, 0xD3, 0x08, 0x28, 0xA1, 0xDB, 0x14, 0x60, - 0xD0, 0x62, 0x65, 0x44, 0xA2, 0xDB, 0x4A, 0xD3, 0xFF, 0xFF, 0xCC, 0x84, 0xA2, 0xDB, 0xAB, 0x46, - 0x06, 0xF2, 0xFF, 0xFF, 0x02, 0xBC, 0x06, 0xFA, 0xAB, 0x46, 0xAB, 0x46, 0x0F, 0x60, 0xFF, 0x64, - 0x02, 0xF0, 0x72, 0xF1, 0xA0, 0x84, 0xD0, 0x80, 0x02, 0xFA, 0xAB, 0x46, 0x01, 0x06, 0x72, 0xFB, - 0x27, 0x41, 0x01, 0xB1, 0xFF, 0xFF, 0x08, 0x03, 0x2B, 0x46, 0x0B, 0x58, 0x01, 0x65, 0xE2, 0x60, - 0x58, 0x4E, 0x86, 0x78, 0xFF, 0xFF, 0x0A, 0x00, 0x2B, 0x46, 0x0B, 0x58, 0x16, 0x60, 0xA2, 0x64, - 0x40, 0x59, 0x02, 0x65, 0xE2, 0x60, 0x58, 0x4E, 0x86, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, - 0x2F, 0x58, 0xFF, 0xFF, 0x26, 0x46, 0x00, 0xF4, 0x00, 0x64, 0x09, 0xFA, 0x0B, 0xFA, 0x01, 0x7E, - 0x0C, 0xFA, 0x0A, 0x64, 0x0A, 0xFA, 0x26, 0x46, 0x08, 0x64, 0x3F, 0xFA, 0x07, 0xF2, 0x88, 0xF1, - 0x40, 0x58, 0x07, 0xF8, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0x8E, 0x64, 0xA2, 0xDB, 0x26, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0xFF, 0x60, 0xFD, 0x65, - 0x38, 0x46, 0x06, 0xF2, 0xFF, 0xFF, 0xA4, 0x83, 0x06, 0xFC, 0x02, 0xB0, 0x26, 0x46, 0x1C, 0x03, - 0x38, 0x43, 0x87, 0xF1, 0x14, 0x60, 0xCE, 0x61, 0xA1, 0xD3, 0xDA, 0x81, 0xD0, 0x80, 0xDC, 0x9C, - 0x05, 0x05, 0xA1, 0xD3, 0x4A, 0xD9, 0xA0, 0xDD, 0xDA, 0x9C, 0xA1, 0xD9, 0x02, 0x60, 0x00, 0x61, - 0x2C, 0xF2, 0xA1, 0xDB, 0x2D, 0xF2, 0x41, 0x58, 0x59, 0xDB, 0x2E, 0xF2, 0x59, 0xDB, 0x03, 0x65, - 0xE2, 0x60, 0x58, 0x4E, 0x86, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, - 0x07, 0xF2, 0x88, 0xF1, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0x2F, 0x58, 0xFF, 0xFF, - 0x40, 0x47, 0x07, 0xF2, 0x66, 0x45, 0x60, 0x46, 0x06, 0xF2, 0x65, 0x46, 0x02, 0xB0, 0xFF, 0xFF, - 0x1B, 0x02, 0x27, 0x43, 0x14, 0x60, 0xD0, 0x62, 0xA2, 0xD3, 0xDA, 0x81, 0x60, 0x45, 0xD5, 0x80, - 0xA1, 0xD1, 0x11, 0x03, 0xD3, 0x80, 0xD9, 0x81, 0xFA, 0x02, 0xC9, 0x81, 0xC8, 0x85, 0xD5, 0x80, - 0xA5, 0xD3, 0x08, 0x28, 0xA1, 0xDB, 0x14, 0x60, 0xD0, 0x62, 0x65, 0x44, 0xA2, 0xDB, 0x4A, 0xD3, - 0xFF, 0xFF, 0xCC, 0x84, 0xA2, 0xDB, 0x0C, 0x00, 0x27, 0x44, 0x40, 0x58, 0x03, 0x65, 0xE2, 0x60, - 0x58, 0x4E, 0x86, 0x78, 0xFF, 0xFF, 0x27, 0x43, 0xE4, 0x60, 0x58, 0x4E, 0x9D, 0x78, 0xFF, 0xFF, - 0x26, 0x46, 0x87, 0xF4, 0x66, 0x41, 0x63, 0x46, 0x05, 0xF2, 0x00, 0xF0, 0x81, 0xF0, 0x02, 0x18, - 0x64, 0x46, 0x81, 0xF8, 0x07, 0x1B, 0x12, 0x60, 0xCE, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD9, 0x02, 0x00, 0x65, 0x46, 0x00, 0xF8, 0x88, 0xF3, 0x63, 0x45, 0x60, 0x46, 0x00, 0xF2, - 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x18, 0xFA, 0x04, 0x80, 0xF8, 0x65, 0x46, 0x00, 0xFA, 0x06, 0xF2, - 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, 0x61, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x07, 0xF2, 0x88, 0xF1, - 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0x2F, 0x58, 0xFF, 0xFF, 0x40, 0x47, 0x07, 0xF2, - 0x66, 0x45, 0x60, 0x46, 0x06, 0xF2, 0x65, 0x46, 0x02, 0xB0, 0xFF, 0xFF, 0x02, 0x02, 0x2F, 0x58, - 0xFF, 0xFF, 0x27, 0x46, 0x06, 0xF0, 0xFF, 0x60, 0xED, 0x64, 0xA0, 0x84, 0x06, 0xFA, 0x27, 0x43, - 0x87, 0xF1, 0x14, 0x60, 0xCE, 0x61, 0xA1, 0xD3, 0xDA, 0x81, 0xD0, 0x80, 0xDC, 0x9C, 0x05, 0x05, - 0xA1, 0xD3, 0x4A, 0xD9, 0xA0, 0xDD, 0xDA, 0x9C, 0xA1, 0xD9, 0x07, 0x58, 0x03, 0x65, 0xE2, 0x60, - 0x58, 0x4E, 0x86, 0x78, 0xFF, 0xFF, 0x27, 0x43, 0xE4, 0x60, 0x58, 0x4E, 0x9D, 0x78, 0xFF, 0xFF, - 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x26, 0x46, 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, - 0x31, 0xF2, 0x2E, 0xFA, 0xCB, 0xF3, 0x2F, 0xFA, 0xCC, 0xF3, 0x30, 0xFA, 0xCD, 0xF3, 0x31, 0xFA, - 0x67, 0xF3, 0x32, 0xFA, 0x68, 0xF3, 0x33, 0xFA, 0x69, 0xF3, 0x34, 0xFA, 0xAC, 0xF1, 0x19, 0xF8, - 0x1C, 0xF2, 0x13, 0xFA, 0x02, 0x63, 0x3F, 0xFC, 0x00, 0x64, 0x3E, 0xFA, 0x02, 0x60, 0x00, 0x61, - 0x2C, 0xF2, 0xA1, 0xDB, 0x2D, 0xF2, 0x41, 0x58, 0x59, 0xDB, 0x2E, 0xF2, 0x59, 0xDB, 0x06, 0x63, - 0x07, 0xF2, 0x88, 0xF1, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x0D, 0x02, 0x43, 0x59, 0x02, 0x65, - 0xE2, 0x60, 0x58, 0x4E, 0x5B, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0xC0, 0x64, 0x2A, 0xFA, 0x00, 0xF4, - 0x06, 0x64, 0x09, 0xFA, 0x15, 0x00, 0x07, 0xF2, 0x66, 0x45, 0x60, 0x46, 0x06, 0xF2, 0x65, 0x46, - 0x02, 0xB0, 0xFF, 0xFF, 0x1E, 0x02, 0x07, 0x63, 0x43, 0x59, 0x01, 0x65, 0xE2, 0x60, 0x58, 0x4E, - 0x5B, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0xA0, 0x64, 0x2A, 0xFA, 0x00, 0xF4, 0x07, 0x64, 0x09, 0xFA, - 0x26, 0x46, 0x88, 0xF3, 0x07, 0xFA, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0x8E, 0x64, 0xA2, 0xDB, - 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x66, - 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xFE, 0x62, 0xDB, 0x60, 0xB0, 0x64, 0xA2, 0xDB, - 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x60, 0x03, 0x64, 0xA2, 0xDB, 0xDB, 0x60, - 0x4D, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xE8, 0x62, 0xA2, 0xD1, - 0x00, 0x60, 0x02, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x5A, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x72, 0xF3, - 0x88, 0xF5, 0xDC, 0x81, 0x66, 0x43, 0x02, 0xA3, 0x63, 0x46, 0xCD, 0x81, 0x06, 0xF2, 0xED, 0x03, - 0x60, 0x40, 0x08, 0x2A, 0xF7, 0x01, 0x0C, 0xAC, 0x06, 0xFA, 0x46, 0x49, 0x00, 0x60, 0x02, 0x61, - 0xB3, 0x60, 0x58, 0x4D, 0x77, 0x78, 0xFF, 0xFF, 0xE0, 0x03, 0x25, 0x60, 0x2C, 0x61, 0xA1, 0xD3, - 0xFF, 0xFF, 0x03, 0x1B, 0x00, 0x60, 0xA0, 0x64, 0x02, 0x00, 0x00, 0x60, 0xC0, 0x64, 0x2A, 0xFA, - 0xAB, 0xFC, 0x66, 0x45, 0x29, 0x44, 0x07, 0xFA, 0x29, 0x46, 0x03, 0xF2, 0x04, 0xF0, 0x85, 0xF2, - 0x65, 0x46, 0x2C, 0xFA, 0x2D, 0xF8, 0xAE, 0xFA, 0xCB, 0xF3, 0x2F, 0xFA, 0x32, 0xFA, 0xCC, 0xF3, - 0x30, 0xFA, 0x33, 0xFA, 0xCD, 0xF3, 0x31, 0xFA, 0x34, 0xFA, 0xAC, 0xF1, 0x19, 0xF8, 0x18, 0x67, - 0x0E, 0xFA, 0x66, 0x45, 0x63, 0x46, 0x0E, 0xF2, 0x65, 0x46, 0x00, 0x7E, 0x13, 0xFA, 0x02, 0x63, - 0x3F, 0xFC, 0x00, 0x64, 0x3E, 0xFA, 0x66, 0x41, 0x00, 0xF4, 0x25, 0x60, 0x28, 0x62, 0xA2, 0xD3, - 0xFF, 0xFF, 0x09, 0xFA, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0x9A, 0x64, 0xA2, 0xDB, 0x61, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC8, 0xFE, 0x9E, 0x01, 0x92, 0x01, - 0x0F, 0x60, 0xE8, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x07, 0xF0, - 0xFF, 0xFF, 0x64, 0x43, 0x14, 0x60, 0xD0, 0x62, 0xA2, 0xD3, 0xDA, 0x81, 0x60, 0x45, 0xD5, 0x80, - 0xA1, 0xD1, 0x04, 0x03, 0xD3, 0x80, 0xD9, 0x81, 0xFA, 0x02, 0x09, 0x00, 0xA1, 0xDD, 0x14, 0x60, - 0xD0, 0x62, 0xD9, 0x84, 0xA2, 0xDB, 0x4A, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xA2, 0xDB, 0x66, 0x45, - 0x63, 0x46, 0x06, 0xF2, 0xFF, 0x60, 0x01, 0x7C, 0xA0, 0x9C, 0x06, 0xF8, 0x65, 0x46, 0x71, 0xF3, - 0x60, 0x40, 0x10, 0x2A, 0x03, 0x00, 0xCC, 0x84, 0x80, 0x2B, 0x71, 0xFB, 0x0F, 0x60, 0xE8, 0x62, - 0xA2, 0xD1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x0F, 0x60, 0xDC, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xDE, 0x62, 0x00, 0x60, 0x02, 0x64, - 0xA2, 0xDB, 0xDB, 0x60, 0xF7, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x71, 0xF3, - 0x72, 0xF3, 0x00, 0xA8, 0x60, 0x88, 0x50, 0x03, 0xE0, 0x83, 0x6C, 0x03, 0xCB, 0x83, 0x88, 0xF3, - 0x73, 0xF1, 0x02, 0xA4, 0x40, 0x47, 0x64, 0x45, 0x27, 0x46, 0x72, 0xF4, 0x12, 0xF2, 0x40, 0x18, - 0xD4, 0x80, 0x02, 0x64, 0x3D, 0x07, 0x23, 0xFA, 0x2A, 0xF2, 0x0E, 0xF2, 0x0C, 0xB0, 0x02, 0xF0, - 0x0D, 0x02, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0x8E, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0xE6, 0x01, 0x60, 0x40, 0xF0, 0x37, - 0x08, 0x00, 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, 0xA2, 0xFF, 0x90, 0xF3, 0x02, 0x02, 0xDC, 0x84, - 0x90, 0xFB, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0xAC, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xA3, 0xFF, 0xCE, 0xFE, 0x98, 0xF1, 0x1E, 0x60, - 0xEC, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, - 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0xBC, 0x01, - 0x27, 0x44, 0x02, 0xA4, 0x40, 0x47, 0xB8, 0x1F, 0x28, 0x43, 0xCB, 0x83, 0x88, 0xF3, 0x1A, 0x0E, - 0x02, 0xA4, 0x40, 0x4C, 0x43, 0x48, 0x2C, 0x46, 0x1E, 0xF2, 0x73, 0xF1, 0xAC, 0x86, 0x12, 0xF2, - 0x0C, 0x03, 0xD0, 0x80, 0xFF, 0xFF, 0x09, 0x07, 0x1B, 0x60, 0xDA, 0x64, 0x40, 0x4B, 0xF0, 0x60, - 0x58, 0x4D, 0x75, 0x78, 0xFF, 0xFF, 0x2C, 0x46, 0x9E, 0xFC, 0x2C, 0x44, 0x02, 0xA4, 0x28, 0x43, - 0x40, 0x4C, 0xE8, 0x1F, 0x7D, 0x01, 0x01, 0x63, 0x66, 0xF3, 0xAC, 0xF3, 0x00, 0xBD, 0xAC, 0x81, - 0x06, 0x03, 0x05, 0x03, 0xB5, 0x60, 0x58, 0x4D, 0xC1, 0x78, 0xFF, 0xFF, 0x60, 0x43, 0x5B, 0xFD, - 0x3E, 0x63, 0x16, 0x60, 0x60, 0x61, 0x00, 0x64, 0x59, 0xDB, 0xFE, 0x1F, 0x71, 0xFB, 0x72, 0xFB, - 0x16, 0x60, 0xA8, 0x65, 0x00, 0x64, 0xA5, 0xDB, 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x1B, 0x60, - 0x9A, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x03, 0x02, 0xC7, 0x60, 0x2E, 0x78, - 0xFF, 0xFF, 0x07, 0xF0, 0x66, 0x45, 0x64, 0x46, 0x1B, 0xF2, 0x65, 0x46, 0x64, 0x45, 0x5B, 0xF1, - 0xE0, 0x84, 0x73, 0xF1, 0xC0, 0x84, 0xC0, 0x84, 0x12, 0xFA, 0x2C, 0xF2, 0x71, 0xF3, 0x60, 0x40, - 0x01, 0x2A, 0x36, 0x00, 0x00, 0xA8, 0x1F, 0x60, 0x8E, 0x62, 0xA2, 0xD3, 0x37, 0x03, 0x00, 0xA8, - 0xFF, 0xFF, 0x34, 0x03, 0xDE, 0x60, 0x58, 0x4D, 0x6B, 0x78, 0xFF, 0xFF, 0x25, 0x46, 0x09, 0x60, - 0x08, 0x61, 0xA2, 0xFF, 0x0E, 0xF2, 0x02, 0xF0, 0x60, 0x40, 0xF0, 0x37, 0x0D, 0x00, 0x92, 0xF3, - 0x90, 0xF3, 0xDC, 0x83, 0xD1, 0x80, 0x92, 0xFD, 0x0C, 0x03, 0x8C, 0xF3, 0xCC, 0x83, 0xD8, 0xA0, - 0x90, 0xFD, 0x07, 0x04, 0xD4, 0xFE, 0x05, 0x00, 0xD1, 0x80, 0x93, 0xF3, 0x02, 0x03, 0xDC, 0x84, - 0x93, 0xFB, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0x94, 0x64, 0xA2, 0xDB, 0x25, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xA3, 0xFF, 0xDC, 0x60, 0x87, 0x78, 0xFF, 0xFF, - 0x66, 0x41, 0x65, 0x46, 0x06, 0xF2, 0x61, 0x46, 0x60, 0x40, 0x10, 0x2A, 0x4C, 0x00, 0x80, 0x67, - 0xB4, 0x81, 0x1B, 0x60, 0xDA, 0x62, 0x61, 0x44, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xDE, 0x60, 0x58, 0x4D, 0x6B, 0x78, 0xFF, 0xFF, 0x25, 0x46, - 0x2A, 0xF2, 0x09, 0x60, 0x08, 0x61, 0x0C, 0xB0, 0xA2, 0xFF, 0x17, 0x03, 0x0E, 0xF2, 0x02, 0xF0, - 0x60, 0x40, 0xF0, 0x37, 0x0D, 0x00, 0x90, 0xF3, 0x92, 0xF3, 0xCC, 0x83, 0xD1, 0x80, 0x90, 0xFD, - 0x0C, 0x03, 0x8C, 0xF3, 0xDC, 0x83, 0xD8, 0xA0, 0x92, 0xFD, 0x07, 0x04, 0xD4, 0xFE, 0x05, 0x00, - 0xD1, 0x80, 0x93, 0xF3, 0x02, 0x03, 0xDC, 0x84, 0x93, 0xFB, 0x07, 0xF0, 0x0A, 0xF2, 0xA3, 0xFF, - 0x64, 0x45, 0x30, 0x1B, 0x66, 0x41, 0x65, 0x46, 0x02, 0xF0, 0x61, 0x46, 0x0F, 0x60, 0xFF, 0x61, - 0xA1, 0x84, 0x60, 0x41, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0xE1, 0x82, 0x07, 0xB4, 0x01, 0x61, - 0x03, 0x03, 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x02, 0x16, 0x60, 0x62, 0x65, 0x46, 0xD1, 0x61, 0x44, - 0xB0, 0x84, 0xA2, 0xDB, 0x17, 0x00, 0x1B, 0x60, 0x8E, 0x61, 0x2A, 0xF2, 0x3E, 0xF2, 0x0C, 0xB0, - 0x01, 0xB0, 0x05, 0x03, 0x1B, 0x60, 0xA0, 0x61, 0x02, 0x02, 0x1B, 0x60, 0x88, 0x61, 0x1B, 0x60, - 0xDA, 0x62, 0x61, 0x44, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xC1, 0xFE, 0xDC, 0x60, 0x87, 0x78, 0xFF, 0xFF, 0x07, 0xF0, 0x2B, 0xF2, 0x2A, 0xF2, - 0x60, 0x41, 0x44, 0x49, 0x60, 0x45, 0xA4, 0x3A, 0x0D, 0x00, 0x61, 0x40, 0xC0, 0x3B, 0x7B, 0x00, - 0xA9, 0x46, 0x06, 0xF2, 0xA9, 0x46, 0x60, 0x40, 0x20, 0x26, 0x75, 0x00, 0x20, 0xBC, 0xA9, 0x46, - 0x06, 0xFA, 0xA9, 0x46, 0xA9, 0x46, 0x06, 0xF0, 0xA9, 0x46, 0x65, 0x40, 0x10, 0x2B, 0x6E, 0x00, - 0x64, 0x40, 0x10, 0x2A, 0x36, 0x00, 0x65, 0x40, 0xA4, 0x3A, 0x65, 0x00, 0x29, 0x45, 0x65, 0x46, - 0x72, 0xF2, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x04, 0x02, 0x78, 0x00, 0xDE, 0x60, 0x51, 0x78, - 0xFF, 0xFF, 0x09, 0xF2, 0x2A, 0xF0, 0x00, 0xA8, 0x20, 0x67, 0x02, 0x03, 0xB0, 0x84, 0x2A, 0xFA, - 0x0E, 0xF2, 0x02, 0xF0, 0x60, 0x40, 0xF0, 0x37, 0x08, 0x00, 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, - 0xA2, 0xFF, 0x90, 0xF3, 0x02, 0x02, 0xDC, 0x84, 0x90, 0xFB, 0x3E, 0xF2, 0xA3, 0xFF, 0x01, 0xB0, - 0x1B, 0x60, 0xA0, 0x61, 0x02, 0x02, 0x1B, 0x60, 0x8E, 0x61, 0x1B, 0x60, 0xDA, 0x62, 0x61, 0x44, - 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, - 0x17, 0x00, 0x10, 0x64, 0xB0, 0x84, 0xDF, 0x65, 0xA4, 0x9E, 0xA9, 0x46, 0x06, 0xFA, 0xA9, 0x46, - 0xA2, 0xFF, 0x16, 0x60, 0xA8, 0x62, 0x04, 0x64, 0xA2, 0xDB, 0x29, 0x44, 0x5A, 0xDB, 0x71, 0xF3, - 0xC1, 0xFE, 0xD4, 0xFE, 0x87, 0xF1, 0xA3, 0xFF, 0xD0, 0x80, 0xDC, 0x84, 0x01, 0x07, 0x71, 0xFB, - 0xA9, 0x46, 0x72, 0xF2, 0xA9, 0x46, 0x65, 0x18, 0xA9, 0x46, 0x02, 0xF0, 0xA9, 0x46, 0x0F, 0x60, - 0xFF, 0x61, 0xA1, 0x84, 0x60, 0x41, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0xE1, 0x82, 0x07, 0xB4, - 0x01, 0x61, 0x03, 0x03, 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x02, 0x16, 0x60, 0x62, 0x65, 0x46, 0xD1, - 0xFF, 0xFF, 0xB1, 0x84, 0xA2, 0xDB, 0xDE, 0x60, 0x68, 0x78, 0xFF, 0xFF, 0x64, 0x40, 0x10, 0x2A, - 0xFA, 0x01, 0xFF, 0x60, 0xEF, 0x64, 0xA0, 0x84, 0xA9, 0x46, 0x06, 0xFA, 0xA9, 0x46, 0x65, 0x41, - 0x71, 0xF3, 0x29, 0x45, 0xCC, 0x84, 0x80, 0x2B, 0x71, 0xFB, 0x65, 0x46, 0x72, 0xF2, 0xFF, 0xFF, - 0x00, 0xA8, 0x60, 0x46, 0x37, 0x02, 0x61, 0x40, 0xA4, 0x3A, 0xE5, 0x01, 0x00, 0x60, 0x3A, 0x61, - 0xB3, 0x60, 0x58, 0x4D, 0x77, 0x78, 0xFF, 0xFF, 0x81, 0x03, 0x02, 0x60, 0x48, 0x64, 0x2A, 0xFA, - 0xCB, 0xF1, 0x2F, 0xF8, 0xCC, 0xF1, 0x30, 0xF8, 0xCD, 0xF1, 0x31, 0xF8, 0x67, 0xF1, 0x32, 0xF8, - 0x68, 0xF1, 0x33, 0xF8, 0x69, 0xF1, 0x34, 0xF8, 0xA9, 0x46, 0x03, 0xF2, 0x04, 0xF0, 0x85, 0xF0, - 0xA9, 0x46, 0x2C, 0xFA, 0x2D, 0xF8, 0xAE, 0xF8, 0xAC, 0xF1, 0x19, 0xF8, 0xFF, 0x67, 0x0E, 0xFA, - 0x00, 0x64, 0x3E, 0xFA, 0x3F, 0xFA, 0x29, 0x44, 0x07, 0xFA, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, - 0x8E, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xC1, 0xFE, 0x37, 0x00, 0x80, 0x67, 0xB4, 0x83, 0x2A, 0xF2, 0x09, 0x60, 0x08, 0x65, 0x0C, 0xB0, - 0x09, 0xF0, 0x0D, 0x02, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0x8E, 0x64, 0xA2, 0xDB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x9D, 0x18, 0x64, 0x46, 0x3E, 0xF2, - 0xA2, 0xFF, 0x01, 0xB0, 0x1B, 0x60, 0xA0, 0x61, 0x02, 0x02, 0x1B, 0x60, 0x88, 0x61, 0x02, 0xF2, - 0x0E, 0xF0, 0xD4, 0x80, 0x09, 0xF4, 0x06, 0x02, 0x90, 0xF3, 0x64, 0x40, 0xF0, 0x37, 0x02, 0x00, - 0xDC, 0x84, 0x90, 0xFB, 0x66, 0x44, 0x00, 0xA8, 0xFF, 0xFF, 0xF1, 0x02, 0x1B, 0x60, 0xDA, 0x62, - 0x61, 0x44, 0xA2, 0xDB, 0x5A, 0xDD, 0x08, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, - 0xA3, 0xFF, 0xA9, 0x46, 0x02, 0xF0, 0xA9, 0x46, 0x0F, 0x60, 0xFF, 0x61, 0xA1, 0x84, 0x60, 0x41, - 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0xE1, 0x82, 0x07, 0xB4, 0x01, 0x61, 0x03, 0x03, 0xCC, 0x84, - 0xE1, 0x81, 0xFD, 0x02, 0x16, 0x60, 0x62, 0x65, 0x46, 0xD3, 0x9D, 0x85, 0xA4, 0x84, 0xA2, 0xDB, - 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x46, 0x45, 0x3F, 0xF2, 0x05, 0x48, 0x00, 0xA8, 0x60, 0x41, - 0x66, 0x44, 0x0B, 0x03, 0x0E, 0xA1, 0x00, 0xF2, 0x42, 0xFE, 0xAC, 0x86, 0x01, 0xF2, 0x1F, 0x03, - 0x7F, 0xB5, 0xD5, 0x81, 0x66, 0x44, 0xF7, 0x07, 0x25, 0x46, 0x05, 0xF0, 0x06, 0xFA, 0x05, 0xFA, - 0xD0, 0x80, 0x64, 0x43, 0x13, 0x03, 0x60, 0x46, 0x01, 0xF0, 0x80, 0x67, 0xB0, 0x84, 0x01, 0xFA, - 0x00, 0xF0, 0x00, 0x64, 0x00, 0xFA, 0x44, 0x45, 0xA2, 0xFF, 0xB4, 0x60, 0x58, 0x4E, 0x48, 0x78, - 0xFF, 0xFF, 0xA3, 0xFF, 0x08, 0x45, 0x25, 0x46, 0x01, 0x64, 0x02, 0xFA, 0x02, 0xFE, 0x2D, 0x58, - 0xFF, 0xFF, 0x23, 0xF2, 0x07, 0xF0, 0x10, 0xB0, 0x10, 0xAC, 0x3B, 0x03, 0x23, 0xFA, 0x80, 0x67, - 0xB0, 0x81, 0x1B, 0x60, 0xDA, 0x62, 0x61, 0x44, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x04, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x46, 0x45, 0x64, 0x46, 0x02, 0xF0, 0x0F, 0x60, 0xFF, 0x61, - 0xA1, 0x84, 0x60, 0x41, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0xE1, 0x82, 0x07, 0xB4, 0x01, 0x61, - 0x03, 0x03, 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x02, 0x16, 0x60, 0x62, 0x65, 0x46, 0xD1, 0xFF, 0xFF, - 0xB1, 0x84, 0xA2, 0xDB, 0x9B, 0xF2, 0x25, 0x46, 0xE1, 0x81, 0x5B, 0xF1, 0x73, 0xF1, 0xC1, 0x81, - 0xC1, 0x81, 0x92, 0xFA, 0xA2, 0xFF, 0x02, 0xF0, 0x09, 0x60, 0x08, 0x61, 0xD1, 0x80, 0x0E, 0xF2, - 0x05, 0x02, 0x90, 0xF3, 0x20, 0xB0, 0xCC, 0x84, 0x01, 0x02, 0x90, 0xFB, 0xA3, 0xFF, 0x48, 0xFE, - 0x07, 0x00, 0x0E, 0xF2, 0x08, 0xFE, 0xF0, 0x7F, 0x60, 0x40, 0x20, 0x2A, 0x00, 0x7F, 0x0E, 0xFA, - 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x60, 0xA0, 0x61, 0xB3, 0x60, 0x58, 0x4D, 0x77, 0x78, 0xFF, 0xFF, - 0x66, 0x44, 0x57, 0xFB, 0x04, 0x64, 0x03, 0xFA, 0x80, 0x64, 0x2A, 0xFA, 0xAC, 0xF1, 0x19, 0xF8, - 0x00, 0x64, 0x3E, 0xFA, 0x00, 0x60, 0x80, 0x64, 0x0E, 0xFA, 0x88, 0xF1, 0x07, 0xF8, 0x67, 0x44, - 0x2C, 0xFA, 0x2D, 0xFA, 0x2E, 0xFA, 0x0F, 0x60, 0xF6, 0x62, 0xE1, 0x60, 0x9E, 0x64, 0xA2, 0xDB, - 0x10, 0x60, 0x02, 0x62, 0xE0, 0x60, 0x0D, 0x64, 0xA2, 0xDB, 0x16, 0x60, 0xB2, 0x63, 0x65, 0x44, - 0xBD, 0xDB, 0x10, 0x60, 0x04, 0x64, 0xBD, 0xDB, 0x02, 0x64, 0xBD, 0xDB, 0x06, 0x64, 0xA3, 0xDB, - 0xE6, 0x60, 0x5A, 0x78, 0xFF, 0xFF, 0xE6, 0x60, 0x58, 0x4D, 0x66, 0x78, 0xFF, 0xFF, 0x57, 0xF5, - 0xCB, 0xF1, 0x2F, 0xF8, 0xCC, 0xF1, 0x30, 0xF8, 0xCD, 0xF1, 0x31, 0xF8, 0x67, 0xF1, 0x32, 0xF8, - 0x68, 0xF1, 0x33, 0xF8, 0x69, 0xF1, 0x34, 0xF8, 0x1F, 0x60, 0x92, 0x62, 0xA2, 0xD1, 0x01, 0x64, - 0x64, 0x40, 0xFE, 0x26, 0x10, 0xBC, 0x32, 0x40, 0x10, 0x26, 0x10, 0xBC, 0x23, 0x60, 0x4C, 0x62, - 0xA2, 0xDB, 0x1F, 0x60, 0x90, 0x62, 0xA2, 0xD1, 0x1F, 0x60, 0x1E, 0x64, 0x02, 0x18, 0x1F, 0x60, - 0x40, 0x64, 0x22, 0x60, 0xA2, 0x62, 0xA2, 0xDB, 0x22, 0x60, 0xBE, 0x62, 0xA2, 0xDB, 0x21, 0x60, - 0xC6, 0x61, 0x20, 0x60, 0x32, 0x62, 0xA2, 0xD3, 0x22, 0x60, 0x82, 0x65, 0xFE, 0xA4, 0xE0, 0x84, - 0x02, 0x05, 0x67, 0x44, 0x99, 0x00, 0xE0, 0x84, 0xC4, 0x85, 0x21, 0x60, 0xEC, 0x62, 0xA2, 0xD3, - 0xA5, 0xD1, 0xDA, 0x85, 0x21, 0x60, 0xE4, 0x62, 0xA0, 0x83, 0xA2, 0xDD, 0xA5, 0xD1, 0x21, 0x60, - 0xE2, 0x62, 0xA0, 0x83, 0xA2, 0xDD, 0x21, 0x60, 0xC0, 0x61, 0xDD, 0x60, 0x06, 0x64, 0xA1, 0xDB, - 0x06, 0xA1, 0x21, 0x60, 0xEA, 0x62, 0xA2, 0xD3, 0x21, 0x60, 0xE2, 0x62, 0x60, 0x40, 0xFD, 0xA0, - 0xA2, 0xD3, 0x74, 0x03, 0x50, 0x60, 0x00, 0x7C, 0x60, 0x40, 0x02, 0x2A, 0x03, 0x00, 0x01, 0x60, - 0xF2, 0x63, 0x0E, 0x00, 0x04, 0x2A, 0x03, 0x00, 0x02, 0x60, 0xF2, 0x63, 0x09, 0x00, 0x10, 0x2A, - 0x03, 0x00, 0x04, 0x60, 0xF2, 0x63, 0x04, 0x00, 0x20, 0x2A, 0x04, 0x00, 0x05, 0x60, 0xF2, 0x63, - 0x59, 0xD9, 0x59, 0xDD, 0x21, 0x60, 0xEA, 0x62, 0xA2, 0xD3, 0x21, 0x60, 0xE4, 0x62, 0xFE, 0xA0, - 0xA2, 0xD3, 0x54, 0x03, 0x00, 0x60, 0x00, 0x63, 0x59, 0xDD, 0x61, 0x45, 0x60, 0x40, 0x01, 0x2A, - 0x04, 0x00, 0x00, 0x60, 0xF2, 0x63, 0x59, 0xD9, 0x59, 0xDD, 0x60, 0x40, 0x02, 0x2A, 0x04, 0x00, - 0x01, 0x60, 0xF2, 0x63, 0x59, 0xD9, 0x59, 0xDD, 0x60, 0x40, 0x04, 0x2A, 0x04, 0x00, 0x02, 0x60, - 0xF2, 0x63, 0x59, 0xD9, 0x59, 0xDD, 0x60, 0x40, 0x10, 0x2A, 0x04, 0x00, 0x04, 0x60, 0xF2, 0x63, - 0x59, 0xD9, 0x59, 0xDD, 0x60, 0x40, 0x20, 0x2A, 0x04, 0x00, 0x05, 0x60, 0xF2, 0x63, 0x59, 0xD9, - 0x59, 0xDD, 0xD5, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0xA5, 0xDD, 0x21, 0x60, 0xEA, 0x62, 0xA2, 0xD3, - 0x21, 0x60, 0xE6, 0x62, 0xFF, 0xA0, 0xA2, 0xD3, 0x21, 0x03, 0x00, 0x60, 0x00, 0x63, 0x59, 0xDD, - 0x61, 0x45, 0x60, 0x40, 0x01, 0x2A, 0x04, 0x00, 0x00, 0x60, 0xF2, 0x63, 0x59, 0xD9, 0x59, 0xDD, - 0x60, 0x40, 0x02, 0x2A, 0x04, 0x00, 0x01, 0x60, 0xF2, 0x63, 0x59, 0xD9, 0x59, 0xDD, 0x60, 0x40, - 0x04, 0x2A, 0x04, 0x00, 0x02, 0x60, 0xF2, 0x63, 0x59, 0xD9, 0x59, 0xDD, 0xD5, 0x83, 0xEB, 0x83, - 0xEB, 0x83, 0xA5, 0xDD, 0x21, 0x60, 0xE8, 0x62, 0xA2, 0xD1, 0x59, 0xD9, 0x21, 0x60, 0xC0, 0x65, - 0xD5, 0x84, 0xDD, 0x7F, 0xA5, 0xDB, 0x65, 0x44, 0x22, 0x60, 0xAC, 0x62, 0xA2, 0xDB, 0x22, 0x60, - 0xC8, 0x62, 0xA2, 0xDB, 0x57, 0xF5, 0xCB, 0xF3, 0xCC, 0xF1, 0x00, 0x63, 0xC0, 0x87, 0xCD, 0xF1, - 0x5A, 0xFD, 0xC0, 0x85, 0x65, 0x47, 0xC4, 0x84, 0x07, 0xB5, 0x1C, 0x60, 0x10, 0x62, 0x16, 0x60, - 0xAE, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x0F, 0x60, 0xD0, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xD2, 0x62, 0x00, 0x60, 0x02, 0x64, 0xA2, 0xDB, 0xE0, 0x60, - 0x17, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, - 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, - 0xD0, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x57, 0xF5, 0x00, 0x64, 0x95, 0xFB, 0x96, 0xFB, 0x97, 0xFB, - 0x75, 0xFB, 0x66, 0xF3, 0x00, 0x75, 0x00, 0x72, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x93, 0xC7, 0xF3, - 0xED, 0xE2, 0xCC, 0x84, 0x5A, 0xFB, 0x0F, 0x60, 0xD2, 0x62, 0x00, 0x60, 0x04, 0x64, 0xA2, 0xDB, - 0xE0, 0x60, 0x36, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD0, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x65, 0xF1, 0x23, 0x60, 0x02, 0x62, 0xA2, 0xD9, 0x22, 0x60, 0xAA, 0x65, - 0xE2, 0x60, 0x58, 0x4D, 0x2F, 0x78, 0xFF, 0xFF, 0xE1, 0x60, 0x58, 0x4D, 0xA8, 0x78, 0xFF, 0xFF, - 0xE2, 0x60, 0x58, 0x4D, 0x49, 0x78, 0xFF, 0xFF, 0x57, 0xF5, 0x00, 0xF4, 0x66, 0xF1, 0x06, 0xF8, - 0x23, 0x60, 0x4C, 0x62, 0xA2, 0xD3, 0x07, 0xFA, 0x22, 0x60, 0xA2, 0x64, 0x40, 0x48, 0x10, 0x61, - 0x00, 0x60, 0x00, 0x64, 0xE1, 0x60, 0x58, 0x4D, 0xE5, 0x78, 0xFF, 0xFF, 0x57, 0xF5, 0x3F, 0xFC, - 0x5A, 0xF3, 0xC7, 0xF1, 0xAC, 0x83, 0x01, 0x64, 0x02, 0x02, 0x6C, 0xFB, 0x64, 0x43, 0x1B, 0x60, - 0xDA, 0x62, 0x1B, 0x60, 0x8E, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x04, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0xCF, 0x83, 0x73, 0xF3, 0x5A, 0xFD, 0xDC, 0x84, 0x73, 0xFB, - 0x5C, 0xF3, 0xFF, 0xFF, 0xCC, 0x84, 0x5C, 0xFB, 0x03, 0x03, 0xE1, 0x60, 0x0A, 0x78, 0xFF, 0xFF, - 0x0A, 0x64, 0x5C, 0xFB, 0xA2, 0x4C, 0x20, 0x27, 0xF8, 0x01, 0x46, 0x60, 0x50, 0x65, 0x72, 0x44, - 0xD4, 0x80, 0xFF, 0xFF, 0xF2, 0x04, 0x5D, 0xFB, 0x40, 0x48, 0x95, 0xF3, 0x5E, 0xFB, 0x40, 0x4A, - 0x96, 0xF3, 0x97, 0xF3, 0x40, 0x4C, 0x60, 0x41, 0x66, 0xF1, 0x40, 0x63, 0xAD, 0x80, 0xF0, 0xA3, - 0x09, 0x02, 0x3C, 0x03, 0x2C, 0x41, 0x2A, 0x44, 0x40, 0x4C, 0x28, 0x44, 0x40, 0x4A, 0x00, 0x64, - 0x40, 0x48, 0xF4, 0x01, 0xD1, 0x80, 0x01, 0x02, 0x31, 0x04, 0x10, 0xA3, 0x80, 0x60, 0x00, 0x65, - 0xA5, 0x80, 0xCF, 0x83, 0x08, 0x02, 0x28, 0x44, 0x60, 0x88, 0x2A, 0x44, 0x70, 0x8A, 0x2C, 0x44, - 0x70, 0x8C, 0xF1, 0x81, 0xF5, 0x01, 0xE7, 0xA3, 0x64, 0x44, 0x00, 0xA0, 0x00, 0x62, 0x02, 0x02, - 0x00, 0x61, 0x1C, 0x00, 0xE0, 0x84, 0xDE, 0x82, 0xFD, 0x04, 0x42, 0xFE, 0xF8, 0x84, 0x62, 0x45, - 0xC7, 0x83, 0x60, 0x45, 0x02, 0xFE, 0xD5, 0x84, 0x02, 0x05, 0x01, 0x05, 0x61, 0x44, 0xCF, 0x83, - 0x60, 0x41, 0x08, 0x03, 0x28, 0x44, 0x60, 0x88, 0x2A, 0x44, 0x70, 0x8A, 0x2C, 0x44, 0x70, 0x8C, - 0xF1, 0x81, 0xF1, 0x01, 0xCE, 0x82, 0xE9, 0x81, 0xFD, 0x02, 0xF1, 0x81, 0x61, 0x44, 0x00, 0xA8, - 0xFF, 0xFF, 0x30, 0x03, 0x73, 0x40, 0x5D, 0xF3, 0xFF, 0xFF, 0x60, 0x47, 0xE8, 0x84, 0xE8, 0x84, - 0x5E, 0xF3, 0x3F, 0xB5, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, - 0xB4, 0x84, 0x61, 0x45, 0xD4, 0x84, 0xC0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x81, - 0x64, 0x44, 0x73, 0x45, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x85, 0x61, 0x44, 0xD4, 0x80, - 0xFF, 0xFF, 0x10, 0x03, 0x60, 0x53, 0xD4, 0x84, 0xFF, 0xFF, 0x75, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, - 0x01, 0xB4, 0x75, 0xFB, 0x1F, 0x60, 0x14, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xFF, 0xFF, - 0x08, 0x28, 0xA2, 0xDB, 0xE6, 0x60, 0xA3, 0x78, 0xFF, 0xFF, 0xC1, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x04, 0x64, 0x03, 0xFA, 0x00, 0xF4, 0x09, 0xF2, 0xFF, 0xFF, 0x60, 0x47, 0x00, 0x3A, 0x1C, 0x00, - 0x60, 0x43, 0x00, 0x36, 0x1C, 0x00, 0xE0, 0xA0, 0xDA, 0x85, 0x16, 0x07, 0x1F, 0x60, 0x1E, 0x61, - 0xA1, 0xD1, 0xFF, 0xFF, 0xD3, 0x80, 0xCB, 0x83, 0x0F, 0x02, 0x07, 0x0E, 0x59, 0xD3, 0xA5, 0xD0, - 0xDA, 0x85, 0xD0, 0x80, 0xFF, 0xFF, 0x08, 0x02, 0xF9, 0x1F, 0x13, 0x1E, 0xA5, 0xD0, 0x59, 0xD3, - 0xFF, 0xFF, 0x90, 0x80, 0xFF, 0x22, 0x0D, 0x00, 0xE1, 0x60, 0x9C, 0x78, 0xFF, 0xFF, 0x1F, 0x60, - 0x90, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x03, 0x00, 0x1F, 0x60, 0x40, 0x64, - 0x02, 0x00, 0x1F, 0x60, 0x1E, 0x64, 0x22, 0x60, 0xBE, 0x62, 0xA2, 0xDB, 0x26, 0x46, 0x2F, 0xF2, - 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, 0x31, 0xF2, 0x2E, 0xFA, 0xCB, 0xF1, 0x2F, 0xF8, 0xCC, 0xF1, - 0x30, 0xF8, 0xCD, 0xF1, 0x31, 0xF8, 0x67, 0xF1, 0x32, 0xF8, 0x68, 0xF1, 0x33, 0xF8, 0x69, 0xF1, - 0x34, 0xF8, 0x50, 0x63, 0x2A, 0xFC, 0xAC, 0xF3, 0x19, 0xFA, 0x00, 0x64, 0x3E, 0xFA, 0x88, 0xF3, - 0x07, 0xFA, 0x00, 0xF4, 0x66, 0xF1, 0x06, 0xF8, 0x23, 0x60, 0x4C, 0x62, 0xA2, 0xD3, 0x07, 0xFA, - 0x22, 0x60, 0xC6, 0x65, 0xE2, 0x60, 0x58, 0x4D, 0x2F, 0x78, 0xFF, 0xFF, 0x22, 0x60, 0xBE, 0x64, - 0x40, 0x48, 0x10, 0x61, 0x00, 0x60, 0x00, 0x64, 0xE1, 0x60, 0x58, 0x4D, 0xE5, 0x78, 0xFF, 0xFF, - 0x26, 0x46, 0x3F, 0xFC, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0x8E, 0x64, 0xA2, 0xDB, 0x26, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x20, 0x44, 0x80, 0x26, - 0x11, 0x00, 0x80, 0xBC, 0x40, 0x40, 0x00, 0x64, 0x95, 0xFB, 0x96, 0xFB, 0x97, 0xFB, 0x75, 0xFB, - 0x66, 0xF3, 0x00, 0x75, 0x00, 0x72, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x93, 0xC7, 0xF3, 0xED, 0xE2, - 0xCC, 0x84, 0x5A, 0xFB, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD0, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, 0x00, 0x64, 0x73, 0xFB, 0x75, 0xFB, 0x2F, 0x58, 0xFF, 0xFF, - 0x3E, 0x63, 0x16, 0x60, 0x60, 0x61, 0x59, 0xD1, 0x61, 0x46, 0x08, 0x1B, 0xFC, 0x1F, 0x22, 0x60, - 0xDE, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x01, 0x65, 0x00, 0x61, 0x17, 0x00, 0x16, 0x60, 0xA2, 0x61, - 0x49, 0xD1, 0xCB, 0x83, 0xFD, 0x18, 0x63, 0x41, 0x04, 0xA1, 0x61, 0x45, 0x66, 0x43, 0x22, 0x60, - 0xDE, 0x64, 0xDC, 0x84, 0x60, 0xFE, 0xA3, 0xD1, 0xDF, 0x83, 0xA0, 0xD9, 0xCD, 0x81, 0x20, 0xFE, - 0xF8, 0x02, 0x66, 0x44, 0x16, 0x60, 0x62, 0x7C, 0xD0, 0x81, 0x5A, 0xF3, 0xC7, 0xF1, 0x22, 0x60, - 0xDC, 0x63, 0x00, 0xA0, 0x64, 0x5F, 0xBD, 0xDB, 0x1B, 0x60, 0x94, 0x66, 0xA6, 0xD1, 0x02, 0x02, - 0x01, 0x18, 0x01, 0xB9, 0x61, 0x44, 0x60, 0xFE, 0xA3, 0xDB, 0xFC, 0xA3, 0x65, 0x44, 0x03, 0xA4, - 0xA3, 0xDB, 0xFF, 0xFF, 0x20, 0xFE, 0x2D, 0x58, 0xFF, 0xFF, 0x23, 0x60, 0x4E, 0x62, 0xA2, 0xDB, - 0xCD, 0x81, 0x28, 0xD3, 0x5A, 0x88, 0xDC, 0x83, 0x39, 0x18, 0xFB, 0x03, 0x61, 0x40, 0x7F, 0x3A, - 0x07, 0x00, 0x23, 0x60, 0x4E, 0x62, 0xA2, 0xD3, 0x03, 0x61, 0x7C, 0xA4, 0xA2, 0xDB, 0x00, 0xF4, - 0x60, 0xFE, 0xA3, 0xD1, 0xDD, 0x81, 0xA1, 0xD8, 0x61, 0x40, 0x7F, 0x3A, 0x09, 0x00, 0x20, 0xFE, - 0x23, 0x60, 0x4E, 0x62, 0xA2, 0xD3, 0x03, 0x61, 0x7C, 0xA4, 0xA2, 0xDB, 0x00, 0xF4, 0x60, 0xFE, - 0xCF, 0x83, 0xA3, 0xD3, 0xDD, 0x81, 0xA1, 0xDA, 0xFF, 0xB4, 0x00, 0x7F, 0x15, 0x03, 0xDB, 0x83, - 0x61, 0x40, 0x7F, 0x3A, 0x0B, 0x00, 0x20, 0xFE, 0x60, 0x45, 0x23, 0x60, 0x4E, 0x62, 0xA2, 0xD3, - 0x03, 0x61, 0x7C, 0xA4, 0xA2, 0xDB, 0x65, 0x44, 0x00, 0xF4, 0x60, 0xFE, 0xA3, 0xD1, 0xDF, 0x83, - 0xDD, 0x81, 0xCC, 0x84, 0xA1, 0xD8, 0xEC, 0x02, 0x20, 0xFE, 0xC3, 0x01, 0x23, 0x60, 0x4E, 0x62, - 0xA2, 0xD1, 0xFD, 0xA1, 0xFF, 0xB1, 0xC1, 0x83, 0xA2, 0xDD, 0x2D, 0x58, 0xFF, 0xFF, 0x67, 0x5C, - 0x11, 0x60, 0xF0, 0x61, 0xA1, 0xD3, 0xA5, 0xD9, 0x12, 0x18, 0x60, 0x43, 0x23, 0x60, 0x04, 0x64, - 0xA5, 0xDB, 0x60, 0xFE, 0xA0, 0xDD, 0xFF, 0xFF, 0x20, 0xFE, 0xDC, 0x84, 0xCF, 0x83, 0xE3, 0x83, - 0x59, 0xD1, 0xDC, 0x84, 0x60, 0xFE, 0xA0, 0xD9, 0xFF, 0xFF, 0x20, 0xFE, 0xF9, 0x1F, 0x2D, 0x58, - 0xFF, 0xFF, 0x20, 0x40, 0x20, 0x2A, 0x0D, 0x00, 0x12, 0x60, 0xB8, 0x62, 0xA2, 0xD1, 0x50, 0xF3, - 0x23, 0x60, 0x39, 0x63, 0x60, 0xFE, 0xA3, 0xD9, 0xDF, 0x83, 0x60, 0x47, 0xA3, 0xDB, 0xFF, 0xFF, - 0x20, 0xFE, 0x2D, 0x58, 0xFF, 0xFF, 0x0E, 0x57, 0x32, 0x40, 0x40, 0x26, 0x25, 0x00, 0x45, 0x48, - 0x00, 0x60, 0x10, 0x61, 0xB3, 0x60, 0x58, 0x4D, 0x77, 0x78, 0xFF, 0xFF, 0x1D, 0x03, 0xF2, 0x60, - 0x02, 0x64, 0x24, 0xFA, 0x00, 0x60, 0x48, 0x61, 0x28, 0x44, 0x59, 0xDA, 0x03, 0x64, 0x38, 0x43, - 0xBD, 0xD1, 0xCC, 0x84, 0x59, 0xD8, 0xFC, 0x02, 0x39, 0x44, 0x59, 0xDA, 0x06, 0x64, 0x23, 0xFA, - 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0xCA, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0x37, 0x58, 0xFF, 0xFF, 0x0E, 0x57, 0x32, 0x40, - 0x40, 0x26, 0x51, 0x00, 0x45, 0x48, 0x00, 0x60, 0x68, 0x61, 0xB3, 0x60, 0x58, 0x4D, 0x77, 0x78, - 0xFF, 0xFF, 0x49, 0x03, 0xF2, 0x60, 0x01, 0x64, 0x24, 0xFA, 0x02, 0x60, 0x00, 0x61, 0x46, 0x4A, - 0x38, 0x44, 0x54, 0x94, 0x03, 0x64, 0x01, 0x02, 0x09, 0x00, 0x06, 0x63, 0x4A, 0x61, 0x38, 0x46, - 0xBD, 0xD0, 0xCC, 0x84, 0x2A, 0x46, 0x59, 0xD8, 0xFA, 0x02, 0x06, 0x00, 0xDA, 0x81, 0x38, 0x43, - 0xBD, 0xD1, 0xCC, 0x84, 0x59, 0xD8, 0xFC, 0x02, 0x05, 0x63, 0x28, 0x44, 0x02, 0xA8, 0x25, 0xFA, - 0x07, 0x02, 0x03, 0x64, 0x39, 0x43, 0xBD, 0xD1, 0xCC, 0x84, 0x59, 0xD8, 0xFC, 0x02, 0x08, 0x63, - 0x22, 0x60, 0x28, 0x7C, 0x28, 0x44, 0x03, 0xA8, 0xA4, 0xD3, 0x0F, 0x03, 0xE8, 0x85, 0xC7, 0x85, - 0x60, 0x43, 0xFE, 0xA3, 0x22, 0x60, 0x2A, 0x64, 0x58, 0xD1, 0xD9, 0x81, 0xA1, 0xD8, 0x7E, 0x2A, - 0x02, 0x00, 0x00, 0xF4, 0x02, 0x61, 0xF8, 0x1F, 0x65, 0x43, 0x2A, 0x46, 0x23, 0xFC, 0x1B, 0x60, - 0xDA, 0x62, 0x1B, 0x60, 0xCA, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0x37, 0x58, 0xFF, 0xFF, 0x0E, 0x57, 0x32, 0x40, 0x40, 0x26, - 0x1C, 0x00, 0x45, 0x48, 0x00, 0x60, 0x06, 0x61, 0xB3, 0x60, 0x58, 0x4D, 0x77, 0x78, 0xFF, 0xFF, - 0x14, 0x03, 0x02, 0x64, 0x23, 0xFA, 0xF2, 0x60, 0x00, 0x64, 0x5A, 0xDA, 0x28, 0x44, 0x5A, 0xDA, - 0xFF, 0xFF, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0xCA, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0x37, 0x58, 0xFF, 0xFF, 0xA2, 0xFF, - 0x32, 0x40, 0x40, 0x26, 0x3E, 0x00, 0x7C, 0xF3, 0x67, 0x43, 0xDC, 0x84, 0xCC, 0x84, 0x39, 0x03, - 0x60, 0x46, 0x0A, 0x02, 0x7C, 0xFD, 0x00, 0x60, 0x46, 0x61, 0xB3, 0x60, 0x58, 0x4D, 0x77, 0x78, - 0xFF, 0xFF, 0x66, 0x44, 0x7C, 0xFB, 0x2E, 0x03, 0x46, 0x4B, 0x1E, 0x60, 0xD8, 0x61, 0x18, 0x64, - 0x23, 0xFA, 0xF1, 0x60, 0x00, 0x64, 0x24, 0xFA, 0x4A, 0x65, 0xA2, 0xFF, 0x2C, 0x63, 0x00, 0x64, - 0x59, 0xD1, 0xA2, 0xDB, 0xA5, 0xD8, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, - 0xF7, 0x1F, 0x12, 0x63, 0x59, 0xD1, 0xA5, 0xD8, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, - 0x04, 0x65, 0xF8, 0x1F, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0xCA, 0x64, 0xA2, 0xDB, 0x2B, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0xA6, 0xFE, 0x00, 0x64, - 0x7C, 0xFB, 0xA3, 0xFF, 0xC7, 0x60, 0x2E, 0x78, 0xFF, 0xFF, 0xA6, 0xFE, 0xB8, 0x05, 0xA7, 0xFE, - 0x0A, 0x05, 0xA5, 0xFE, 0x03, 0x04, 0xE3, 0x60, 0xD3, 0x78, 0xFF, 0xFF, 0xA4, 0xFE, 0xF2, 0x04, - 0xE4, 0x60, 0x69, 0x78, 0xFF, 0xFF, 0x36, 0x45, 0x17, 0x60, 0x52, 0x64, 0x44, 0xD7, 0xFF, 0xFF, - 0xFF, 0xFF, 0x28, 0xF3, 0x7E, 0xF1, 0x60, 0x47, 0x07, 0xB4, 0x4E, 0xFB, 0x01, 0x61, 0x03, 0x03, - 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x02, 0x9D, 0x84, 0xA1, 0x80, 0xA0, 0x83, 0x1A, 0x03, 0x7E, 0xFD, - 0x0F, 0x60, 0xF4, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x7E, 0xF1, 0x31, 0x44, 0x64, 0x40, 0xFF, 0x26, 0x09, 0x00, 0xFE, 0xB4, 0x40, 0x51, 0x01, 0x7C, - 0xBC, 0xF9, 0x49, 0xF3, 0x01, 0x63, 0x60, 0x40, 0xFF, 0x26, 0x49, 0xFD, 0xC7, 0x60, 0x2E, 0x78, - 0xFF, 0xFF, 0xE3, 0x60, 0xD3, 0x78, 0xFF, 0xFF, 0x1F, 0x60, 0xB6, 0x63, 0xBD, 0xD3, 0xBD, 0xD1, - 0xBD, 0xD1, 0xB0, 0x84, 0xB0, 0x84, 0xFF, 0xFF, 0x07, 0x02, 0x6B, 0xFB, 0x31, 0x44, 0xFE, 0xB4, - 0x40, 0x51, 0x0D, 0x64, 0x05, 0xFB, 0x3F, 0x00, 0x28, 0xF3, 0x7E, 0xF1, 0x60, 0x47, 0x64, 0x41, - 0x07, 0xB1, 0x07, 0xB4, 0x08, 0x24, 0x67, 0x4C, 0x4E, 0xFB, 0x01, 0x61, 0x03, 0x03, 0xCC, 0x84, - 0xE1, 0x81, 0xFD, 0x02, 0xA1, 0x80, 0xB1, 0x83, 0x2E, 0x02, 0x7E, 0xFD, 0x1F, 0x60, 0xAA, 0x62, - 0xA2, 0xD3, 0xC5, 0xFB, 0x65, 0xFB, 0x7E, 0xF3, 0xFF, 0xFF, 0xCC, 0x85, 0xA4, 0x80, 0x7E, 0xFB, - 0x17, 0x02, 0x1B, 0x60, 0xC4, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x46, 0x5E, - 0x31, 0x44, 0x01, 0xBC, 0x40, 0x51, 0xED, 0xE2, 0x0F, 0x4E, 0xCE, 0x60, 0x58, 0x4F, 0x07, 0x78, - 0xFF, 0xFF, 0x0E, 0x4F, 0x01, 0x65, 0xE2, 0x60, 0x58, 0x4E, 0xDD, 0x78, 0xFF, 0xFF, 0x08, 0x00, - 0x0F, 0x60, 0xD6, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x10, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0xE5, 0x60, 0x16, 0x78, 0xFF, 0xFF, 0xD7, 0xFE, 0xC7, 0x60, 0x2E, 0x78, 0xFF, 0xFF, 0x2E, 0xF5, - 0x27, 0xF2, 0x12, 0x60, 0xCE, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, - 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, - 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x26, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, - 0x61, 0x46, 0x25, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, - 0x63, 0x46, 0xE8, 0x1B, 0x88, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x28, 0x02, 0x14, 0x60, - 0xD0, 0x62, 0xA2, 0xD3, 0xDA, 0x81, 0x60, 0x45, 0xD5, 0x80, 0xA1, 0xD1, 0x04, 0x03, 0xD3, 0x80, - 0xD9, 0x81, 0xFA, 0x02, 0x09, 0x00, 0xA1, 0xDD, 0x14, 0x60, 0xD0, 0x62, 0xD9, 0x84, 0xA2, 0xDB, - 0x4A, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xA2, 0xDB, 0x66, 0x45, 0x63, 0x46, 0x06, 0xF2, 0xFF, 0x60, - 0x01, 0x7C, 0xA0, 0x9C, 0x06, 0xF8, 0x65, 0x46, 0x71, 0xF3, 0x60, 0x40, 0x10, 0x2A, 0x03, 0x00, - 0xCC, 0x84, 0x80, 0x2B, 0x71, 0xFB, 0xE4, 0x60, 0x58, 0x4E, 0x9D, 0x78, 0xFF, 0xFF, 0xAB, 0x01, - 0x2E, 0xF5, 0x25, 0x60, 0x28, 0x61, 0x28, 0xF0, 0xFF, 0xFF, 0xA1, 0xD9, 0x27, 0xF2, 0x12, 0x60, - 0xCE, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, - 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, - 0x61, 0x46, 0x26, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x25, 0xF0, - 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, - 0x88, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x13, 0x02, 0x63, 0x46, 0x06, 0xF2, 0xFF, 0xFF, - 0x02, 0xB0, 0x08, 0xBC, 0x0D, 0x03, 0x06, 0xFA, 0xE4, 0x60, 0x58, 0x4E, 0x9D, 0x78, 0xFF, 0xFF, - 0x0F, 0x60, 0xE8, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x6A, 0x01, 0x7E, 0xF1, 0xFF, 0xFF, 0x64, 0x41, 0x07, 0xB1, 0xFF, 0xFF, 0x08, 0x24, 0x67, 0x4C, - 0x1B, 0x60, 0xC4, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x46, 0x5E, 0x1F, 0x60, - 0xAA, 0x62, 0xA2, 0xD3, 0xC5, 0xFB, 0x65, 0xFB, 0x1F, 0x60, 0xB6, 0x63, 0xBD, 0xD1, 0xCB, 0xF9, - 0x67, 0xF9, 0xBD, 0xD1, 0xCC, 0xF9, 0x68, 0xF9, 0xA3, 0xD1, 0xCD, 0xF9, 0x69, 0xF9, 0x01, 0x64, - 0x6B, 0xFB, 0x31, 0x44, 0x21, 0xBC, 0x40, 0x51, 0x20, 0x44, 0x01, 0x65, 0x34, 0x80, 0x01, 0x64, - 0x51, 0xFB, 0x21, 0x60, 0x50, 0x64, 0x52, 0xFB, 0x0F, 0x4E, 0xE8, 0x60, 0x58, 0x4F, 0x02, 0x78, - 0xFF, 0xFF, 0x0E, 0x4F, 0xC7, 0x60, 0x2E, 0x78, 0xFF, 0xFF, 0x0E, 0x57, 0x63, 0x46, 0x43, 0x47, - 0x1E, 0xF2, 0x72, 0xF2, 0x02, 0x1B, 0x01, 0x1B, 0x0C, 0x00, 0x60, 0x46, 0x1B, 0x60, 0xDA, 0x64, - 0x40, 0x4B, 0xF0, 0x60, 0x58, 0x4D, 0x75, 0x78, 0xFF, 0xFF, 0x27, 0x46, 0x72, 0xF2, 0xFF, 0xFF, - 0xF4, 0x1B, 0x37, 0x58, 0xFF, 0xFF, 0x1B, 0x60, 0xAC, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, - 0x60, 0x46, 0x0E, 0xF2, 0x5B, 0x03, 0x60, 0x40, 0xF0, 0x37, 0x48, 0x00, 0xFF, 0x37, 0x3D, 0x00, - 0xFD, 0x37, 0x35, 0x00, 0x18, 0x37, 0x29, 0x00, 0xFE, 0x37, 0x2C, 0x00, 0xF8, 0x37, 0x0A, 0x00, - 0x60, 0x47, 0xFF, 0xB5, 0x0F, 0x60, 0xD0, 0x62, 0x46, 0xD1, 0x00, 0x60, 0x01, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x1B, 0x60, 0xDA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xD6, 0x01, 0x06, 0xB4, 0xFD, 0x7F, 0x0E, 0xFA, - 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0xB2, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF9, 0xFE, 0xC6, 0x01, 0xDB, 0x60, 0x58, 0x4F, 0xB7, 0x78, - 0xFF, 0xFF, 0x14, 0x00, 0xDE, 0x60, 0x58, 0x4F, 0x99, 0x78, 0xFF, 0xFF, 0xBC, 0x03, 0x23, 0xF0, - 0x60, 0x40, 0x04, 0x26, 0xE2, 0x1B, 0x02, 0x26, 0xE0, 0x18, 0xA2, 0xFF, 0x02, 0xF0, 0x09, 0x60, - 0x08, 0x64, 0xD0, 0x80, 0x90, 0xF3, 0x02, 0x02, 0xCC, 0x84, 0x90, 0xFB, 0x1B, 0x60, 0xDA, 0x64, - 0x40, 0x4B, 0xF0, 0x60, 0x58, 0x4D, 0x75, 0x78, 0xFF, 0xFF, 0xA5, 0x01, 0xAC, 0xFE, 0x09, 0x05, - 0xAD, 0xFE, 0x10, 0x05, 0xAE, 0xFE, 0x9F, 0x05, 0xAF, 0xFE, 0x3A, 0x05, 0xC7, 0x60, 0x2E, 0x78, - 0xFF, 0xFF, 0x0F, 0x60, 0xCE, 0x62, 0xA2, 0xD1, 0x20, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0xF4, 0x01, 0x10, 0x60, 0x02, 0x65, 0x03, 0x61, 0x07, 0x00, 0xA2, 0xDD, 0x58, 0x4F, - 0x64, 0x58, 0xFF, 0xFF, 0x00, 0xB9, 0xFF, 0xFF, 0x08, 0x03, 0x00, 0x63, 0xA5, 0xD1, 0x5A, 0xD3, - 0xDA, 0x85, 0x00, 0xA8, 0xCD, 0x81, 0xF2, 0x02, 0xF8, 0x02, 0xE0, 0x01, 0x0F, 0x60, 0xCC, 0x62, - 0x0F, 0x60, 0xF2, 0x65, 0xE5, 0x60, 0x4E, 0x63, 0x00, 0x64, 0x5A, 0xDB, 0xD6, 0x80, 0xFF, 0xFF, - 0x04, 0x03, 0x5A, 0xDB, 0x5A, 0xDB, 0x5A, 0xDD, 0xF9, 0x01, 0x10, 0x60, 0x00, 0x65, 0x00, 0x64, - 0x5A, 0xDB, 0xD6, 0x80, 0xFF, 0xFF, 0x02, 0x03, 0x5A, 0xDD, 0xFB, 0x01, 0x2F, 0x58, 0xFF, 0xFF, - 0x0F, 0x60, 0xD0, 0x64, 0x40, 0x41, 0x0F, 0x60, 0xCE, 0x63, 0xA3, 0xD1, 0x00, 0x64, 0xD0, 0x80, - 0x06, 0x61, 0x08, 0x03, 0xBD, 0xDB, 0xA3, 0xD3, 0xFF, 0xFF, 0xB0, 0x84, 0xCD, 0x81, 0xA3, 0xDB, - 0x06, 0xA3, 0xF9, 0x02, 0x0F, 0x60, 0xF4, 0x63, 0xA3, 0xD1, 0x00, 0x64, 0xD0, 0x80, 0x07, 0x61, - 0x19, 0x03, 0xBD, 0xDB, 0x64, 0x44, 0xFE, 0xA3, 0x02, 0xA3, 0xCD, 0x81, 0xE8, 0x84, 0xE3, 0x03, - 0x02, 0x05, 0xE1, 0x03, 0xF9, 0x01, 0x78, 0xFB, 0x7A, 0xFD, 0x61, 0x5C, 0xA3, 0xD3, 0x79, 0xF9, - 0x03, 0x18, 0x58, 0x4F, 0x60, 0x58, 0xFF, 0xFF, 0x7A, 0xF3, 0x79, 0xF1, 0x60, 0x43, 0x78, 0xF3, - 0x64, 0x41, 0xEA, 0x01, 0x21, 0x43, 0x0F, 0x60, 0xF4, 0x65, 0xD7, 0x80, 0xBD, 0xD1, 0xBD, 0xD3, - 0x03, 0x02, 0xC7, 0x60, 0x2E, 0x78, 0xFF, 0xFF, 0xA0, 0x84, 0xBD, 0xD1, 0x43, 0x41, 0xF5, 0x03, - 0xE5, 0x60, 0x53, 0x64, 0x64, 0x58, 0x40, 0x4F, 0x2A, 0xF0, 0x83, 0x60, 0xFF, 0x65, 0x64, 0x47, - 0x03, 0x2B, 0x01, 0x00, 0x17, 0x00, 0x03, 0x26, 0x03, 0xAC, 0x60, 0x47, 0xA4, 0x84, 0x2A, 0xFA, - 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, 0x31, 0xF2, 0x2E, 0xFA, 0x64, 0x41, 0xCB, 0xF3, - 0x2F, 0xFA, 0x60, 0x43, 0xCC, 0xF3, 0x30, 0xFA, 0xCD, 0xF1, 0x31, 0xF8, 0x32, 0xFC, 0x33, 0xFA, - 0x34, 0xF8, 0x19, 0x00, 0x60, 0x47, 0xA4, 0x84, 0x2A, 0xFA, 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, - 0x2D, 0xFA, 0x31, 0xF2, 0x2E, 0xFA, 0x36, 0xF2, 0x32, 0xFA, 0x37, 0xF2, 0x33, 0xFA, 0x38, 0xF2, - 0x34, 0xFA, 0xCB, 0xF3, 0x2F, 0xFA, 0x36, 0xFA, 0xCC, 0xF3, 0x30, 0xFA, 0x37, 0xFA, 0xCD, 0xF3, - 0x31, 0xFA, 0x38, 0xFA, 0x64, 0x41, 0x1C, 0xF2, 0x13, 0xFA, 0x00, 0xF4, 0x0D, 0xF2, 0xFF, 0xFF, - 0x60, 0x40, 0x80, 0x2B, 0x29, 0x00, 0x26, 0x46, 0x04, 0x63, 0x03, 0xFC, 0x00, 0xF4, 0x0D, 0xF2, - 0x06, 0xFA, 0xE6, 0x60, 0x58, 0x4E, 0xF4, 0x78, 0xFF, 0xFF, 0xFF, 0xA0, 0x59, 0xF5, 0x1A, 0x02, - 0x39, 0xF2, 0x26, 0x46, 0x3F, 0xFA, 0x00, 0xF4, 0x00, 0x60, 0x81, 0x67, 0x0D, 0xFA, 0x7C, 0x64, - 0x01, 0xFA, 0x26, 0x46, 0x00, 0x64, 0x3E, 0xFA, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0x9A, 0x64, - 0xA2, 0xDB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC8, 0xFE, - 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x26, 0x46, 0x3F, 0xF0, 0x42, 0x64, 0xD0, 0x80, - 0xFF, 0xFF, 0x01, 0x04, 0x3F, 0xFA, 0x1C, 0xF2, 0x13, 0xFA, 0x26, 0xF2, 0x27, 0xF0, 0x60, 0x47, - 0x00, 0xF4, 0x1F, 0xFA, 0x64, 0x47, 0x20, 0xFA, 0x61, 0x44, 0x21, 0xFA, 0x01, 0x67, 0x0D, 0xFA, - 0x10, 0x61, 0x1F, 0x60, 0x6C, 0x64, 0x1E, 0x63, 0x58, 0xD1, 0xCD, 0x81, 0xBD, 0xD8, 0xFC, 0x02, - 0x9B, 0xF1, 0xB8, 0xF1, 0x64, 0x5E, 0x64, 0x5F, 0x44, 0x63, 0xBD, 0xDA, 0x1F, 0x60, 0x66, 0x62, - 0xA2, 0xD3, 0xFF, 0xFF, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0x09, 0xBC, 0x4A, 0xD3, 0x60, 0x45, - 0x60, 0x40, 0x01, 0x36, 0x03, 0x64, 0x02, 0x36, 0x01, 0x64, 0xB4, 0x84, 0x06, 0xA2, 0xA2, 0xD1, - 0xBD, 0xDA, 0x64, 0x47, 0xBD, 0xDA, 0xB5, 0xF3, 0xB6, 0xF1, 0x60, 0x47, 0xBD, 0xDA, 0x64, 0x47, - 0xC3, 0xF1, 0xBD, 0xDA, 0x64, 0x44, 0xBD, 0xDA, 0x26, 0x46, 0x00, 0x64, 0x23, 0xF0, 0x3B, 0xF0, - 0x64, 0x40, 0x10, 0x2A, 0x06, 0x00, 0xC0, 0x67, 0xA0, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, - 0x10, 0xBC, 0x3E, 0xFA, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0x9A, 0x64, 0xA2, 0xDB, 0x26, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC8, 0xFE, 0x00, 0x66, 0x46, 0x46, - 0x2F, 0x58, 0xFF, 0xFF, 0x04, 0x60, 0x5C, 0x61, 0xB3, 0x60, 0x58, 0x4D, 0x77, 0x78, 0xFF, 0xFF, - 0x66, 0x44, 0x59, 0xFB, 0x04, 0x64, 0x03, 0xFA, 0x2F, 0x58, 0xFF, 0xFF, 0x59, 0xF5, 0xAC, 0xF1, - 0x19, 0xF8, 0x00, 0x64, 0x3E, 0xFA, 0x08, 0x64, 0x2A, 0xFA, 0x80, 0x7E, 0xF8, 0x7F, 0x0E, 0xFA, - 0x88, 0xF1, 0x07, 0xF8, 0x01, 0x60, 0x60, 0x67, 0x2C, 0xFA, 0x1D, 0x60, 0x00, 0x67, 0x2D, 0xFA, - 0x01, 0x60, 0x00, 0x67, 0x2E, 0xFA, 0xCB, 0xF1, 0x2F, 0xF8, 0x32, 0xF8, 0xCC, 0xF1, 0x30, 0xF8, - 0x33, 0xF8, 0xCD, 0xF1, 0x31, 0xF8, 0x34, 0xF8, 0x00, 0x63, 0x3B, 0xFC, 0x3D, 0xFC, 0x01, 0x64, - 0x3A, 0xFA, 0x66, 0x64, 0x39, 0xFA, 0x3C, 0xFC, 0xAA, 0x60, 0xAA, 0x64, 0x00, 0xF4, 0x02, 0xFA, - 0x00, 0x60, 0x03, 0x64, 0x5A, 0xDA, 0x1D, 0x60, 0x60, 0x64, 0x5A, 0xDA, 0x01, 0x60, 0x00, 0x64, - 0x5A, 0xDA, 0x82, 0x7F, 0x24, 0x7E, 0x08, 0xFA, 0x01, 0x60, 0x01, 0x64, 0x0A, 0xFA, 0x00, 0x64, - 0x0E, 0xFA, 0x2D, 0x58, 0xFF, 0xFF, 0x59, 0xF5, 0x3D, 0xF2, 0x3C, 0xF2, 0xCC, 0x83, 0x00, 0xA8, - 0x03, 0x03, 0x08, 0x28, 0x3D, 0xFC, 0x45, 0x00, 0x3D, 0xFA, 0x3A, 0xF2, 0x3B, 0xF0, 0x00, 0x63, - 0x00, 0xF4, 0x07, 0xFC, 0x01, 0xB0, 0x0B, 0xFA, 0x1A, 0x03, 0x1F, 0xF8, 0xFF, 0xFF, 0x1B, 0x60, - 0xDA, 0x62, 0x18, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x0A, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0x1F, 0xF2, 0x1E, 0xF0, 0x59, 0xF5, 0x00, 0xA8, 0x3B, 0xF8, 0xD0, 0x80, 0x06, 0x03, - 0x05, 0x03, 0x04, 0x60, 0x5C, 0x63, 0x0F, 0x64, 0x3A, 0xFA, 0x39, 0xFC, 0x00, 0xF4, 0x00, 0x64, - 0x06, 0xFA, 0xE6, 0x60, 0x58, 0x4E, 0xF4, 0x78, 0xFF, 0xFF, 0x59, 0xF5, 0x00, 0xF4, 0x81, 0x60, - 0x00, 0x64, 0x06, 0xFA, 0x32, 0x47, 0x04, 0xBC, 0x07, 0xFA, 0xB8, 0xF1, 0x00, 0x7F, 0x64, 0x5E, - 0x09, 0xFA, 0x59, 0xF5, 0x00, 0x64, 0x15, 0xFA, 0x39, 0xF2, 0x3F, 0xFA, 0x1B, 0x60, 0xDA, 0x62, - 0x1B, 0x60, 0x88, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xE1, 0x60, 0x0D, 0x78, 0xFF, 0xFF, 0x66, 0x45, 0x0E, 0xF2, 0x0F, 0xF0, 0x10, 0xF0, - 0x64, 0x41, 0x01, 0xA8, 0x59, 0xF5, 0x09, 0x02, 0xAD, 0x83, 0x64, 0x44, 0xAC, 0x84, 0x08, 0x24, - 0x0A, 0x63, 0x3C, 0xFC, 0x3D, 0xFC, 0x1A, 0x02, 0x2D, 0x00, 0x03, 0x3A, 0x03, 0x00, 0x00, 0x64, - 0x3C, 0xFA, 0x29, 0x00, 0x04, 0x3A, 0x09, 0x00, 0x0A, 0x64, 0x3C, 0xFA, 0x01, 0x64, 0x3A, 0xFA, - 0x00, 0xF4, 0x00, 0x64, 0x1F, 0xFA, 0x1E, 0xFA, 0x1E, 0x00, 0x02, 0x3A, 0x1E, 0x00, 0x64, 0x44, - 0xAD, 0x83, 0xAC, 0x84, 0x02, 0x03, 0x3C, 0xFC, 0x3D, 0xFC, 0x15, 0x03, 0x3A, 0xFA, 0xF8, 0x65, - 0x52, 0x63, 0x64, 0x44, 0x01, 0x36, 0x0D, 0x00, 0x12, 0xA3, 0x64, 0x40, 0x02, 0x2A, 0x02, 0x00, - 0xC7, 0x83, 0xC7, 0x83, 0x64, 0x40, 0x08, 0x2A, 0x01, 0x00, 0xC7, 0x83, 0x64, 0x40, 0x04, 0x26, - 0xC7, 0x83, 0x39, 0xFC, 0x00, 0x64, 0x2E, 0x58, 0xFF, 0xFF, 0x3B, 0xF0, 0x3A, 0xF2, 0x65, 0x46, - 0x06, 0xF2, 0x40, 0x47, 0x1D, 0x18, 0x32, 0x47, 0x07, 0xFA, 0x24, 0x7E, 0x82, 0x7F, 0x08, 0xFA, - 0x01, 0x60, 0x01, 0x63, 0xB8, 0xF3, 0x0A, 0xFC, 0x00, 0x7F, 0x09, 0xFA, 0x27, 0x40, 0x01, 0x2A, - 0x0F, 0x00, 0x1F, 0xF8, 0x1B, 0x60, 0xDA, 0x62, 0x18, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, - 0x0A, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x1E, 0xF0, 0x59, 0xF5, 0x3B, 0xF8, 0x65, 0x46, - 0x27, 0x40, 0x02, 0x26, 0x02, 0x00, 0x00, 0xF4, 0x13, 0x00, 0x6E, 0x61, 0xFF, 0x60, 0xFE, 0x64, - 0x00, 0x60, 0x0E, 0x63, 0x58, 0xD1, 0x59, 0xD8, 0xFD, 0x1F, 0x01, 0x60, 0xEE, 0x63, 0x00, 0xF4, - 0x02, 0x61, 0x58, 0xD1, 0x59, 0xD8, 0x7E, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x02, 0x61, 0xF9, 0x1F, - 0x27, 0x40, 0x04, 0x26, 0x1B, 0x00, 0x46, 0x4B, 0x1B, 0x60, 0x88, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, - 0x00, 0xA8, 0x60, 0x46, 0x0E, 0x03, 0x89, 0xF0, 0xE7, 0x60, 0x58, 0x4D, 0xAE, 0x78, 0xFF, 0xFF, - 0x65, 0x44, 0xAC, 0x86, 0xFF, 0xFF, 0x08, 0x03, 0xE7, 0x60, 0x58, 0x4D, 0xAE, 0x78, 0xFF, 0xFF, - 0x04, 0x00, 0x2B, 0x46, 0x82, 0xFC, 0x00, 0xF4, 0x82, 0xFC, 0x00, 0xF4, 0x27, 0x40, 0x08, 0x26, - 0x1A, 0x00, 0x46, 0x4B, 0x1B, 0x60, 0xC4, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, - 0x0E, 0x03, 0x89, 0xF0, 0xE7, 0x60, 0x58, 0x4D, 0xAE, 0x78, 0xFF, 0xFF, 0x65, 0x44, 0xAC, 0x86, - 0xFF, 0xFF, 0x08, 0x03, 0xE7, 0x60, 0x58, 0x4D, 0xAE, 0x78, 0xFF, 0xFF, 0x04, 0x00, 0x65, 0x46, - 0x02, 0xFA, 0x00, 0xF4, 0x82, 0xFC, 0x01, 0x64, 0x2E, 0x58, 0xFF, 0xFF, 0x01, 0x61, 0x02, 0x64, - 0x7A, 0x63, 0x58, 0xD0, 0xAB, 0x46, 0xA0, 0xD8, 0xAB, 0x46, 0xFB, 0x1F, 0xAB, 0x46, 0x00, 0xF4, - 0xCD, 0x81, 0xAB, 0x46, 0x00, 0xF4, 0xF3, 0x02, 0x2D, 0x58, 0xFF, 0xFF, 0x00, 0x60, 0x2A, 0x61, - 0xB3, 0x60, 0x58, 0x4D, 0x77, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x58, 0xFB, 0x04, 0x64, 0x03, 0xFA, - 0x67, 0x44, 0x2C, 0xFA, 0x2D, 0xFA, 0x2E, 0xFA, 0x32, 0xFA, 0x33, 0xFA, 0x34, 0xFA, 0x12, 0x60, - 0x80, 0x64, 0x88, 0xF1, 0x0E, 0xFA, 0x07, 0xF8, 0x00, 0x64, 0x3E, 0xFA, 0x11, 0x60, 0xD8, 0x63, - 0xA3, 0xDB, 0x06, 0xA3, 0x10, 0x60, 0x08, 0x64, 0xBD, 0xDB, 0x04, 0x64, 0xBD, 0xDB, 0x06, 0x64, - 0xA3, 0xDB, 0x10, 0x60, 0x06, 0x62, 0xEA, 0x60, 0x08, 0x64, 0xA2, 0xDB, 0x11, 0x60, 0xE4, 0x63, - 0x00, 0x64, 0xA3, 0xDB, 0x06, 0xA3, 0x10, 0x60, 0x0C, 0x64, 0xBD, 0xDB, 0x08, 0x64, 0xBD, 0xDB, - 0x06, 0x64, 0xA3, 0xDB, 0x10, 0x60, 0x0A, 0x62, 0xEA, 0x60, 0x12, 0x64, 0xA2, 0xDB, 0x0F, 0x60, - 0xFC, 0x62, 0xE9, 0x60, 0xF2, 0x64, 0xA2, 0xDB, 0x00, 0x64, 0x25, 0x60, 0x2A, 0x62, 0xA2, 0xDB, - 0x2F, 0x58, 0xFF, 0xFF, 0x58, 0xF5, 0xCB, 0xF1, 0x2F, 0xF8, 0xCC, 0xF1, 0x30, 0xF8, 0xCD, 0xF1, - 0x31, 0xF8, 0xAC, 0xF1, 0x19, 0xF8, 0xEA, 0x60, 0x58, 0x4E, 0x1C, 0x78, 0xFF, 0xFF, 0x30, 0x64, - 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, 0xE2, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x16, 0x60, 0xCC, 0x61, - 0xA1, 0xD3, 0xFF, 0xFF, 0x59, 0x18, 0x58, 0xF5, 0x40, 0x64, 0x2A, 0xFA, 0x52, 0xF3, 0x00, 0xF4, - 0x60, 0x43, 0xBD, 0xD1, 0x04, 0x65, 0x64, 0x47, 0xA5, 0xDA, 0x64, 0x41, 0xDD, 0x81, 0xE9, 0x81, - 0x62, 0x44, 0x04, 0x03, 0xBD, 0xD1, 0xCD, 0x81, 0x58, 0xD8, 0xFC, 0x02, 0x58, 0x8B, 0x21, 0x60, - 0x8E, 0x63, 0xA3, 0xD1, 0x2B, 0x44, 0xC8, 0x84, 0x64, 0x41, 0xFF, 0xB1, 0x61, 0x45, 0x03, 0xA1, - 0xE9, 0x81, 0x41, 0x4C, 0xBD, 0xD1, 0xCD, 0x81, 0x58, 0xD8, 0xFC, 0x02, 0x2B, 0xD2, 0x2B, 0x43, - 0x60, 0x47, 0x01, 0x7E, 0x52, 0xF1, 0xA3, 0xDA, 0xA4, 0xD3, 0xCB, 0x83, 0x44, 0x8B, 0xF8, 0x84, - 0x2C, 0x41, 0x0C, 0x04, 0xBE, 0xD2, 0xFF, 0xFF, 0x60, 0x47, 0xBE, 0xDA, 0x00, 0x7E, 0xA3, 0xD2, - 0x60, 0x45, 0x00, 0x7F, 0xB4, 0x84, 0xCD, 0x81, 0xBD, 0xDA, 0xF4, 0x02, 0x58, 0xF5, 0x2B, 0x44, - 0x04, 0xA4, 0x3F, 0xFA, 0x65, 0xF3, 0x64, 0xFB, 0x16, 0x60, 0xCE, 0x61, 0x01, 0x64, 0x52, 0xF1, - 0xA1, 0xDB, 0x65, 0xFB, 0xA4, 0xD3, 0x04, 0x65, 0x51, 0xF3, 0x01, 0x18, 0x0C, 0x65, 0xF3, 0xB4, - 0xB4, 0x84, 0x51, 0xFB, 0x02, 0xB0, 0xFF, 0xFF, 0x16, 0x03, 0x65, 0xF3, 0xFF, 0xFF, 0x60, 0x47, - 0x0F, 0xB4, 0x65, 0xFB, 0x01, 0x03, 0x0F, 0x00, 0xE9, 0x60, 0x74, 0x78, 0xFF, 0xFF, 0x51, 0xF1, - 0x65, 0xF3, 0x64, 0x40, 0x02, 0x26, 0xF8, 0x01, 0xF3, 0xA0, 0x04, 0xA4, 0x01, 0x04, 0xF1, 0xA4, - 0x10, 0x36, 0xF2, 0x01, 0x65, 0xFB, 0x65, 0xF3, 0x16, 0x60, 0xCC, 0x61, 0xA1, 0xD1, 0xCC, 0x84, - 0x01, 0x61, 0x08, 0x24, 0x03, 0x00, 0xE1, 0x81, 0xCC, 0x84, 0xFB, 0x01, 0xA1, 0x84, 0x51, 0xF1, - 0xE7, 0x03, 0x16, 0x60, 0xCE, 0x61, 0xA1, 0xDB, 0x00, 0x00, 0x65, 0xF3, 0x01, 0x61, 0xCC, 0x84, - 0xFF, 0xFF, 0x02, 0x03, 0xE1, 0x81, 0xFB, 0x01, 0x9A, 0xF3, 0x61, 0x45, 0xA4, 0x80, 0xFF, 0xFF, - 0xD7, 0x03, 0x31, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, 0xE2, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, 0xE4, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xE8, 0x60, - 0x95, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x65, 0xF1, 0x1C, 0x60, 0x00, 0x62, - 0xA2, 0xD9, 0x1E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xE4, 0x62, 0x20, 0x60, - 0x00, 0x64, 0xA2, 0xDB, 0xE8, 0x60, 0xC8, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0xBE, 0xFE, 0x0F, 0x60, 0xCE, 0x62, 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x0F, 0x60, 0xE2, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x58, 0xF5, 0x1B, 0x60, 0xDA, 0x62, - 0x1B, 0x60, 0x8E, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0x00, 0x64, 0x4F, 0xFB, 0x0F, 0x60, 0xE4, 0x62, 0x00, 0x60, 0x01, 0x64, 0xA2, 0xDB, - 0xE8, 0x60, 0xF2, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0xC1, 0xFE, 0x33, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x2F, 0x58, 0xFF, 0xFF, 0x34, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, 0xE2, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0xA6, 0xF1, 0x11, 0x60, 0xDC, 0x62, 0xA2, 0xD9, 0x1C, 0x60, 0x10, 0x62, 0x11, 0x60, - 0xD8, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0xA7, 0xF1, 0x11, 0x60, - 0xE8, 0x62, 0xA2, 0xD9, 0x1C, 0x60, 0x0E, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xFD, 0x1B, 0x1C, 0x60, - 0x10, 0x62, 0x11, 0x60, 0xE4, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0x0F, 0x60, 0xE4, 0x62, 0x00, 0x60, 0x08, 0x64, 0xA2, 0xDB, 0xE9, 0x60, 0x23, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x4F, 0xF1, 0x0F, 0x60, 0xE2, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x64, 0x40, 0xFF, 0x26, 0x03, 0x00, 0xE8, 0x60, 0x77, 0x78, 0xFF, 0xFF, 0x02, 0x0A, 0x00, 0x64, - 0x4F, 0xFB, 0xA8, 0xF1, 0x11, 0x60, 0xE8, 0x62, 0xA2, 0xD9, 0x0F, 0x60, 0xE4, 0x62, 0x00, 0x60, - 0x0C, 0x64, 0xA2, 0xDB, 0xE9, 0x60, 0x49, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x1C, 0x60, 0x10, 0x62, - 0x11, 0x60, 0xE4, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x2F, 0x58, - 0xFF, 0xFF, 0x0F, 0x60, 0xE2, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x0C, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1C, 0x60, 0x10, 0x62, 0x11, 0x60, 0xE4, 0x64, 0xA2, 0xDB, - 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x14, 0x00, 0xFF, 0x60, 0xF7, 0x64, 0xA0, 0x84, - 0xA2, 0xDB, 0x4F, 0xF3, 0xDB, 0x0A, 0x00, 0xA0, 0x00, 0x64, 0x02, 0x03, 0x4F, 0xFB, 0xD6, 0x01, - 0x1C, 0x60, 0x10, 0x62, 0x11, 0x60, 0xD8, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0xE8, 0x60, 0x77, 0x78, 0xFF, 0xFF, 0x35, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x1C, 0x60, - 0x10, 0x62, 0x11, 0x60, 0xD8, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0x51, 0xF3, 0xFF, 0xFF, 0xE3, 0xB4, 0x51, 0xFB, 0x16, 0x60, 0xCA, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, - 0xFE, 0xB4, 0xA2, 0xDB, 0x00, 0x64, 0x25, 0x60, 0x2A, 0x62, 0xA2, 0xDB, 0x0F, 0x60, 0xE2, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0E, 0x04, 0x32, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, - 0xE4, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xE9, 0x60, 0x8E, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x64, 0xF1, 0x65, 0xF9, 0x1C, 0x60, 0x00, 0x62, 0xA2, 0xD9, 0x1E, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xE4, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, - 0xE9, 0x60, 0xB6, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xBE, 0xFE, 0x0F, 0x60, - 0xCE, 0x62, 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, - 0xCE, 0x62, 0xA2, 0xD1, 0x10, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x00, 0x60, - 0x04, 0x61, 0xB3, 0x60, 0x58, 0x4D, 0x77, 0x78, 0xFF, 0xFF, 0x01, 0x64, 0x23, 0xFA, 0xF1, 0x60, - 0x02, 0x64, 0x24, 0xFA, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0xCA, 0x64, 0xA2, 0xDB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0xEA, 0x60, 0x58, 0x4E, - 0x2E, 0x78, 0xFF, 0xFF, 0x20, 0x44, 0x01, 0xB5, 0x54, 0x80, 0x31, 0x44, 0xDE, 0xB4, 0x40, 0x51, - 0x0F, 0x60, 0xE2, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, 0x3E, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x2F, 0x58, 0xFF, 0xFF, 0x3F, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x1C, 0x60, 0x10, 0x62, 0x11, 0x60, - 0xD8, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x64, 0x51, 0xFB, - 0x0F, 0x60, 0xE2, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, 0xBE, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x0F, 0x60, 0xE2, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xE2, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x08, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x66, 0x01, 0x60, 0x7A, 0x61, 0x16, 0x60, - 0xC4, 0x63, 0xA1, 0xD3, 0xFF, 0xFF, 0x20, 0x7F, 0xBD, 0xDB, 0x21, 0x60, 0x32, 0x64, 0xBD, 0xDB, - 0x04, 0xA1, 0xA1, 0xD3, 0xFF, 0xFF, 0x22, 0x7F, 0xA3, 0xDB, 0x10, 0x00, 0x01, 0x60, 0x7A, 0x61, - 0x16, 0x60, 0xC4, 0x63, 0xA1, 0xD3, 0x00, 0x66, 0x20, 0x7F, 0xBD, 0xDB, 0x59, 0xD3, 0xFF, 0xFF, - 0x21, 0x7F, 0xBD, 0xDB, 0x59, 0xD3, 0xFF, 0xFF, 0x22, 0x7F, 0xA3, 0xDB, 0x0F, 0x60, 0xE2, 0x62, - 0xA2, 0xD1, 0x9F, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, - 0xE4, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xEA, 0x60, 0x3E, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x1C, 0x60, 0x00, 0x62, 0x16, 0x60, 0xC2, 0x64, 0xA2, 0xDB, 0x20, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xE4, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, - 0xEA, 0x60, 0x66, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xE2, 0x62, - 0xA2, 0xD1, 0x9F, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0xBE, 0xFE, 0x0F, 0x60, 0xCE, 0x62, - 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2E, 0x58, 0xFF, 0xFF, - 0x5F, 0xFB, 0xAC, 0x85, 0x60, 0x41, 0x20, 0x03, 0x01, 0x60, 0x00, 0x63, 0x08, 0x64, 0xE9, 0x81, - 0xCC, 0x84, 0x02, 0x24, 0xDF, 0x83, 0xFB, 0x02, 0x21, 0x60, 0x8E, 0x64, 0xA0, 0xDD, 0x65, 0x41, - 0x21, 0x60, 0x90, 0x63, 0x0F, 0x60, 0xC0, 0x64, 0xE9, 0x81, 0x58, 0xD1, 0xFD, 0x04, 0xA3, 0xD9, - 0x0B, 0x03, 0x58, 0xD1, 0xE9, 0x81, 0x60, 0x45, 0xFC, 0x04, 0xA3, 0xD1, 0x64, 0x47, 0xB0, 0x84, - 0xBD, 0xDB, 0x00, 0xB9, 0x65, 0x44, 0xF0, 0x02, 0x20, 0x60, 0x38, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, - 0x01, 0xA8, 0x01, 0x60, 0x70, 0x62, 0x06, 0x02, 0xA2, 0xD3, 0xFF, 0xFF, 0x01, 0xA8, 0xFF, 0xFF, - 0x01, 0x03, 0x02, 0x64, 0x60, 0x41, 0x21, 0x60, 0x8E, 0x63, 0xBD, 0xD3, 0xA3, 0xD3, 0xFF, 0xB5, - 0x80, 0xBF, 0xCD, 0x81, 0x65, 0x5C, 0x0F, 0x03, 0x80, 0xBF, 0xBD, 0xDB, 0x65, 0x44, 0xC8, 0x84, - 0xFF, 0xFF, 0x0C, 0x03, 0x60, 0x45, 0xCD, 0x81, 0xA3, 0xD3, 0x08, 0x03, 0x80, 0xBF, 0xCD, 0x81, - 0xFF, 0xFF, 0x01, 0x03, 0x80, 0xBC, 0x60, 0x47, 0xBD, 0xDB, 0x00, 0x65, 0x64, 0x41, 0x21, 0x60, - 0x90, 0x63, 0xBD, 0xD3, 0xFF, 0xFF, 0x80, 0xB0, 0xFF, 0xFF, 0x01, 0x03, 0x60, 0x45, 0x60, 0x47, - 0x80, 0xB0, 0xFF, 0xFF, 0x01, 0x03, 0x60, 0x45, 0xCD, 0x81, 0xFF, 0xFF, 0xF2, 0x02, 0x65, 0x44, - 0x7F, 0xB4, 0x02, 0x3A, 0x02, 0x00, 0x0A, 0x64, 0x15, 0x00, 0x04, 0x3A, 0x02, 0x00, 0x14, 0x64, - 0x11, 0x00, 0x0A, 0x3A, 0x02, 0x00, 0x32, 0x64, 0x0D, 0x00, 0x0B, 0x3A, 0x02, 0x00, 0x37, 0x64, - 0x09, 0x00, 0x10, 0x3A, 0x02, 0x00, 0x50, 0x64, 0x05, 0x00, 0x16, 0x3A, 0x02, 0x00, 0x6E, 0x64, - 0x01, 0x00, 0x14, 0x64, 0x62, 0xFB, 0x2E, 0x58, 0xFF, 0xFF, 0x3C, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x31, 0x40, 0x20, 0x2A, 0x18, 0x00, 0x3F, 0xF2, 0x47, 0x65, 0xC4, 0x84, 0xE8, 0x84, 0x23, 0xFA, - 0xF1, 0x60, 0x02, 0x64, 0x24, 0xFA, 0x1B, 0x60, 0xDA, 0x62, 0x1B, 0x60, 0xCA, 0x64, 0xA2, 0xDB, - 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0x00, 0x66, - 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x0C, 0x63, 0x12, 0x60, - 0xB6, 0x62, 0x00, 0x64, 0x5A, 0xDB, 0xFE, 0x1F, 0x53, 0xFB, 0x54, 0xFB, 0x12, 0x60, 0xBA, 0x63, - 0x02, 0x64, 0xA3, 0xDB, 0x2E, 0x58, 0xFF, 0xFF, 0x12, 0x60, 0xBE, 0x62, 0xA2, 0xD3, 0x00, 0x63, - 0xF0, 0xA0, 0x01, 0xA4, 0x03, 0x03, 0xA2, 0xDB, 0x2E, 0x58, 0xFF, 0xFF, 0xA2, 0xDD, 0x12, 0x60, - 0xC0, 0x62, 0xA2, 0xD1, 0xA2, 0xDD, 0x5A, 0xD3, 0xA2, 0xDD, 0xC0, 0x81, 0x61, 0x44, 0x02, 0x24, - 0xFF, 0xFF, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0x5A, 0xD3, 0xE9, 0x81, 0xE8, 0x83, - 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x85, 0xD4, 0x85, 0xC5, 0x83, 0xA2, 0xDD, 0x12, 0x60, - 0xB8, 0x62, 0x63, 0x47, 0x00, 0x7F, 0xA2, 0xDB, 0x2E, 0x58, 0xFF, 0xFF, 0x03, 0xE1, 0xA3, 0xFF, - 0x1B, 0x60, 0x5A, 0x63, 0x17, 0xFD, 0xAE, 0xFF, 0xEB, 0x60, 0x84, 0x78, 0xFF, 0xFF, 0x7F, 0x67, - 0x01, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0xB1, 0xFE, 0x05, 0x05, 0xB0, 0xFE, 0x06, 0x05, 0xB2, 0xFE, - 0xB3, 0xFE, 0x22, 0x00, 0xF0, 0x60, 0xFA, 0x78, 0xFF, 0xFF, 0x28, 0xF3, 0x29, 0xF1, 0x40, 0x44, - 0x44, 0x45, 0x2A, 0xF1, 0x2B, 0xF1, 0x44, 0x46, 0x44, 0x47, 0x3F, 0xB4, 0xE0, 0x85, 0x16, 0x60, - 0xD2, 0x64, 0x44, 0xD7, 0x58, 0x43, 0xFF, 0xFF, 0x60, 0x45, 0x12, 0x60, 0xC8, 0x7C, 0xA4, 0xD3, - 0x61, 0x43, 0x04, 0xB4, 0x24, 0x44, 0x02, 0x03, 0x13, 0xFF, 0x06, 0x00, 0x3F, 0xB4, 0xB4, 0x84, - 0xFF, 0x27, 0x05, 0xFD, 0x04, 0xFB, 0x10, 0x75, 0xA1, 0xFF, 0xFF, 0xFF, 0x86, 0x3E, 0xB4, 0xFE, - 0x09, 0x05, 0xB5, 0xFE, 0x02, 0x24, 0x80, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0xFE, 0x05, 0x05, - 0xB6, 0xFE, 0xF2, 0x01, 0xF1, 0x60, 0x35, 0x78, 0xFF, 0xFF, 0x36, 0x44, 0x00, 0x7F, 0xF4, 0xA0, - 0x60, 0x45, 0x05, 0x05, 0x17, 0x60, 0x5E, 0x64, 0x44, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x01, - 0xE3, 0x01, 0x7F, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x10, 0x02, - 0x10, 0x64, 0x40, 0x40, 0x02, 0x64, 0x40, 0x50, 0x61, 0xFF, 0x3F, 0x40, 0x40, 0x26, 0x04, 0x00, - 0x10, 0xE0, 0x46, 0x60, 0x09, 0xE0, 0x00, 0x00, 0x27, 0xF1, 0x00, 0x66, 0x20, 0x78, 0x42, 0xFE, - 0x23, 0x58, 0xFF, 0xFF, 0x78, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, - 0x1C, 0x02, 0x12, 0x60, 0xC8, 0x63, 0xA3, 0xD3, 0x07, 0x7C, 0x20, 0xB5, 0x0C, 0xB5, 0x04, 0x03, - 0x03, 0x02, 0xBC, 0xF9, 0x00, 0x67, 0x11, 0x00, 0x00, 0x61, 0x41, 0x56, 0xC7, 0xFE, 0xB4, 0x01, - 0x36, 0x47, 0xFF, 0x23, 0x04, 0x00, 0x00, 0x7F, 0x60, 0x41, 0x7F, 0x67, 0x06, 0x00, 0x04, 0x7C, - 0xBC, 0xF9, 0x20, 0x44, 0x80, 0xBC, 0x40, 0x40, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x78, 0x60, - 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x31, 0x02, 0x12, 0x60, 0xC8, 0x63, - 0xA3, 0xD3, 0x01, 0x7C, 0x20, 0xB5, 0x0C, 0xB5, 0x03, 0x03, 0x02, 0x02, 0xBC, 0xF9, 0xFF, 0xFF, - 0x02, 0x61, 0x41, 0x56, 0xC7, 0xFE, 0xEB, 0x60, 0x84, 0x78, 0xFF, 0xFF, 0x7E, 0xF1, 0x20, 0x44, - 0x64, 0x40, 0xFF, 0x26, 0x1B, 0x00, 0x7F, 0xB4, 0x40, 0x40, 0x5C, 0x5E, 0x82, 0xFF, 0x26, 0x44, - 0xFD, 0xB4, 0x40, 0x46, 0x5C, 0x41, 0x87, 0xFF, 0x62, 0xFF, 0x00, 0x63, 0x1B, 0x60, 0xC4, 0x62, - 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x04, 0x03, 0x09, 0xF2, 0x0F, 0xFC, 0xAC, 0x86, - 0xFB, 0x01, 0x1C, 0x60, 0x04, 0x62, 0x06, 0x64, 0xA2, 0xDB, 0x2D, 0xFF, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x25, 0x46, 0x01, 0xF2, 0x08, 0xF0, 0x60, 0x47, 0x03, 0xB4, 0x03, 0xAC, 0x7F, 0x67, - 0x03, 0x61, 0x08, 0x02, 0x1B, 0x60, 0xE0, 0x64, 0x40, 0x4B, 0xF0, 0x60, 0x58, 0x4D, 0x75, 0x78, - 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x24, 0x40, 0x01, 0x2B, 0x49, 0x00, 0x25, 0x44, - 0x1F, 0xB4, 0xE0, 0x85, 0xEC, 0x60, 0x36, 0x64, 0xC4, 0x98, 0xFF, 0xFF, 0xC0, 0xFE, 0x3D, 0x00, - 0xC1, 0xFE, 0x3B, 0x00, 0xC2, 0xFE, 0x39, 0x00, 0xC3, 0xFE, 0x37, 0x00, 0xC4, 0xFE, 0x35, 0x00, - 0xC5, 0xFE, 0x33, 0x00, 0xC6, 0xFE, 0x31, 0x00, 0xC7, 0xFE, 0x2F, 0x00, 0xC8, 0xFE, 0x2D, 0x00, - 0xC9, 0xFE, 0x2B, 0x00, 0xCA, 0xFE, 0x29, 0x00, 0xCB, 0xFE, 0x27, 0x00, 0xCC, 0xFE, 0x25, 0x00, - 0xCD, 0xFE, 0x23, 0x00, 0xCE, 0xFE, 0x21, 0x00, 0xCF, 0xFE, 0x1F, 0x00, 0xD0, 0xFE, 0x1D, 0x00, - 0xD1, 0xFE, 0x1B, 0x00, 0xD2, 0xFE, 0x19, 0x00, 0xD3, 0xFE, 0x17, 0x00, 0xD4, 0xFE, 0x15, 0x00, - 0xD5, 0xFE, 0x13, 0x00, 0xD6, 0xFE, 0x11, 0x00, 0xD7, 0xFE, 0x0F, 0x00, 0xD8, 0xFE, 0x0D, 0x00, - 0xD9, 0xFE, 0x0B, 0x00, 0xDA, 0xFE, 0x09, 0x00, 0xDB, 0xFE, 0x07, 0x00, 0xDC, 0xFE, 0x05, 0x00, - 0xDD, 0xFE, 0x03, 0x00, 0xDE, 0xFE, 0x01, 0x00, 0xDF, 0xFE, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x00, 0x64, 0x9F, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x9E, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x9D, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x9C, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x9B, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x9A, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x99, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x98, 0xFE, 0xF0, 0x84, - 0xFF, 0xFF, 0x97, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x96, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x95, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x94, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x93, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x92, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x91, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x90, 0xFE, 0xF0, 0x84, - 0x06, 0xFB, 0x8F, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x8E, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x8D, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x8C, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x8B, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x8A, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x89, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x88, 0xFE, 0xF0, 0x84, - 0xFF, 0xFF, 0x87, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x86, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x85, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x84, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x83, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x82, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x81, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x80, 0xFE, 0xF0, 0x84, - 0x05, 0xFB, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x5C, 0x5C, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x24, 0x40, 0x01, 0x27, 0x55, 0x00, 0x05, 0x60, 0x00, 0x63, 0x05, 0xFD, 0x30, 0x44, 0xBD, 0xDB, - 0x31, 0x44, 0xBD, 0xDB, 0x32, 0x44, 0xBD, 0xDB, 0x33, 0x44, 0xBD, 0xDB, 0x34, 0x44, 0xBD, 0xDB, - 0x35, 0x44, 0xBD, 0xDB, 0x36, 0x44, 0xBD, 0xDB, 0x37, 0x44, 0xBD, 0xDB, 0x38, 0x44, 0xBD, 0xDB, - 0x39, 0x44, 0xBD, 0xDB, 0x3A, 0x44, 0xBD, 0xDB, 0x3B, 0x44, 0xBD, 0xDB, 0x3C, 0x44, 0xBD, 0xDB, - 0x3D, 0x44, 0xBD, 0xDB, 0x3E, 0x44, 0xBD, 0xDB, 0x3F, 0x44, 0xBD, 0xDB, 0x02, 0x61, 0x61, 0x44, - 0x02, 0x36, 0x82, 0xFF, 0x03, 0x36, 0x83, 0xFF, 0x04, 0x36, 0x84, 0xFF, 0x05, 0x36, 0x85, 0xFF, - 0x06, 0x36, 0x86, 0xFF, 0x07, 0x36, 0x87, 0xFF, 0x20, 0x44, 0xBD, 0xDB, 0x21, 0x44, 0xBD, 0xDB, - 0x22, 0x44, 0xBD, 0xDB, 0x23, 0x44, 0xBD, 0xDB, 0x24, 0x44, 0xBD, 0xDB, 0x25, 0x44, 0xBD, 0xDB, - 0x26, 0x44, 0xBD, 0xDB, 0x27, 0x44, 0xBD, 0xDB, 0x28, 0x44, 0xBD, 0xDB, 0x29, 0x44, 0xBD, 0xDB, - 0x2A, 0x44, 0xBD, 0xDB, 0x2B, 0x44, 0xBD, 0xDB, 0x2C, 0x44, 0xBD, 0xDB, 0x2D, 0x44, 0xBD, 0xDB, - 0x2E, 0x44, 0xBD, 0xDB, 0x2F, 0x44, 0xBD, 0xDB, 0xDD, 0x81, 0x08, 0x3A, 0xD0, 0x01, 0x54, 0x00, - 0x27, 0x40, 0x10, 0x26, 0x30, 0x00, 0x26, 0x44, 0x01, 0x36, 0x2D, 0x00, 0x02, 0x36, 0x82, 0xFF, - 0x03, 0x36, 0x83, 0xFF, 0x04, 0x36, 0x84, 0xFF, 0x05, 0x36, 0x85, 0xFF, 0x06, 0x36, 0x86, 0xFF, - 0x25, 0x44, 0x00, 0x36, 0x44, 0x40, 0x01, 0x36, 0x44, 0x41, 0x02, 0x36, 0x44, 0x42, 0x03, 0x36, - 0x44, 0x43, 0x04, 0x36, 0x44, 0x44, 0x05, 0x36, 0x44, 0x45, 0x06, 0x36, 0x44, 0x46, 0x07, 0x36, - 0x44, 0x47, 0x08, 0x36, 0x44, 0x48, 0x09, 0x36, 0x44, 0x49, 0x0A, 0x36, 0x44, 0x4A, 0x0B, 0x36, - 0x44, 0x4B, 0x0C, 0x36, 0x44, 0x4C, 0x0D, 0x36, 0x44, 0x4D, 0x0E, 0x36, 0x44, 0x4E, 0x0F, 0x36, - 0x44, 0x4F, 0x87, 0xFF, 0x21, 0x00, 0x25, 0x44, 0x10, 0x36, 0x44, 0x50, 0x11, 0x36, 0x44, 0x51, - 0x12, 0x36, 0x44, 0x52, 0x13, 0x36, 0x44, 0x53, 0x14, 0x36, 0x44, 0x54, 0x15, 0x36, 0x44, 0x55, - 0x16, 0x36, 0x44, 0x56, 0x17, 0x36, 0x44, 0x57, 0x18, 0x36, 0x44, 0x58, 0x19, 0x36, 0x44, 0x59, - 0x1A, 0x36, 0x44, 0x5A, 0x1B, 0x36, 0x44, 0x5B, 0x1C, 0x36, 0x44, 0x5C, 0x1D, 0x36, 0x44, 0x5D, - 0x1E, 0x36, 0x44, 0x5E, 0x1F, 0x36, 0x44, 0x5F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0x46, - 0xB3, 0x60, 0x58, 0x4F, 0x22, 0x78, 0xFF, 0xFF, 0x03, 0x61, 0x7F, 0x67, 0x0B, 0x02, 0x00, 0xF0, - 0x1B, 0x60, 0xE0, 0x62, 0x04, 0x64, 0xA2, 0xDB, 0x5A, 0xD9, 0x0A, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x40, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, - 0x7F, 0x67, 0x02, 0x61, 0x11, 0x02, 0x1C, 0x60, 0x04, 0x62, 0x1A, 0x64, 0xA2, 0xDB, 0x00, 0x60, - 0x50, 0x63, 0x5A, 0xDD, 0xED, 0x60, 0xB9, 0x64, 0x80, 0xFB, 0x2D, 0xFF, 0xEB, 0x60, 0x84, 0x78, - 0xFF, 0xFF, 0x2A, 0xF3, 0x05, 0xFB, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x40, 0x60, 0xC0, 0x64, - 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x0F, 0x02, 0x1C, 0x60, 0x04, 0x62, 0x1C, 0x64, - 0xA2, 0xDB, 0x00, 0x60, 0x50, 0x63, 0x5A, 0xDD, 0xED, 0x60, 0xD3, 0x64, 0x80, 0xFB, 0x2D, 0xFF, - 0xEB, 0x60, 0x84, 0x78, 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x7F, 0x60, 0xC0, 0x64, - 0x24, 0x45, 0xA4, 0x80, 0x02, 0x61, 0x34, 0x02, 0x25, 0x45, 0x20, 0x44, 0x80, 0x2A, 0x35, 0x00, - 0xF1, 0x60, 0x00, 0x64, 0xD4, 0x80, 0xFF, 0xFF, 0x01, 0x03, 0x29, 0x00, 0x21, 0x60, 0x74, 0x62, - 0xA2, 0xD1, 0x9A, 0xF3, 0x16, 0x60, 0xCC, 0x61, 0xA0, 0x84, 0xA1, 0xDB, 0x25, 0x45, 0x1B, 0x60, - 0x52, 0x63, 0x01, 0x61, 0xBD, 0xD3, 0xBD, 0xD1, 0xD4, 0x80, 0xBD, 0xD3, 0xBD, 0xD5, 0xCD, 0x81, - 0x02, 0x03, 0x15, 0x03, 0xF7, 0x01, 0xA2, 0xFF, 0xA6, 0xD3, 0x40, 0x4C, 0x00, 0xA8, 0x67, 0x43, - 0x0C, 0x02, 0xA2, 0xDD, 0x42, 0x48, 0x64, 0x41, 0xB3, 0x60, 0x58, 0x4D, 0x77, 0x78, 0xFF, 0xFF, - 0x66, 0x44, 0x28, 0xDB, 0x02, 0x03, 0x2C, 0x58, 0xA3, 0xFF, 0x0C, 0x61, 0x03, 0x00, 0x04, 0x61, - 0x7F, 0x67, 0x01, 0x00, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xF1, 0x60, 0x02, 0x64, 0xD4, 0x80, - 0x7F, 0x67, 0x06, 0x63, 0xF8, 0x02, 0x31, 0x40, 0x20, 0x26, 0xF5, 0x01, 0x21, 0x60, 0x74, 0x62, - 0xA2, 0xD1, 0x9A, 0xF3, 0x16, 0x60, 0xCC, 0x61, 0xA0, 0x84, 0xA1, 0xDB, 0x16, 0x60, 0xD0, 0x61, - 0x01, 0x64, 0xA1, 0xDB, 0xFF, 0xFF, 0xC4, 0xFE, 0xE5, 0x01, 0xC6, 0xFE, 0xE3, 0x01, 0x7E, 0x60, - 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x02, 0x61, 0x3F, 0x02, 0x25, 0x45, 0xF8, 0x2B, 0x3B, 0x00, - 0x2E, 0xF5, 0x67, 0x44, 0xD4, 0x80, 0x17, 0x60, 0x6A, 0x63, 0x39, 0x03, 0x64, 0x61, 0x24, 0x44, - 0x01, 0x27, 0x29, 0x00, 0xA3, 0xFC, 0xA4, 0xF8, 0xBD, 0xD3, 0xA3, 0xD1, 0xD4, 0x80, 0xCD, 0x81, - 0x08, 0x24, 0x64, 0x58, 0x08, 0xA3, 0xF8, 0x02, 0x08, 0x60, 0x00, 0x63, 0xBD, 0xD3, 0xA3, 0xD1, - 0xFE, 0xA0, 0xFA, 0x60, 0x00, 0x64, 0xD0, 0x80, 0x14, 0x02, 0x13, 0x02, 0x04, 0xA3, 0xBE, 0xD3, - 0xBD, 0xD1, 0x0F, 0x18, 0xD4, 0x80, 0x0D, 0x18, 0x03, 0x03, 0xC3, 0x83, 0xC3, 0x83, 0xF7, 0x01, - 0x64, 0x41, 0xDD, 0x81, 0xE1, 0x81, 0xCB, 0x83, 0x46, 0x65, 0xF2, 0x60, 0x58, 0x4F, 0x4A, 0x78, - 0xFF, 0xFF, 0x00, 0x67, 0x0A, 0x00, 0xBD, 0xD3, 0xBE, 0xD1, 0xD4, 0x80, 0xCD, 0x81, 0x08, 0x24, - 0x64, 0x58, 0x08, 0xA3, 0xF8, 0x02, 0x04, 0x61, 0x7F, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x0F, 0x64, - 0x23, 0xFA, 0x67, 0x44, 0x24, 0xFA, 0x62, 0x41, 0x3E, 0x60, 0x00, 0x65, 0x1A, 0x63, 0xEA, 0x60, - 0x88, 0x64, 0x65, 0x46, 0x58, 0xD0, 0x2E, 0xF5, 0x59, 0xD8, 0xFB, 0x1F, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x4B, 0xD3, 0xFF, 0xFF, 0x60, 0x41, 0xE8, 0x84, 0xDC, 0x84, 0x23, 0xFA, 0xBF, 0xD1, - 0x4A, 0x65, 0x64, 0x43, 0xF2, 0x60, 0x58, 0x4F, 0x4A, 0x78, 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x25, 0xF2, 0xFF, 0xFF, 0xE0, 0xA0, 0x20, 0x64, 0x01, 0x06, 0x25, 0xFA, 0x23, 0xF2, - 0xDF, 0xD1, 0xCC, 0x84, 0xE0, 0x85, 0x0B, 0x06, 0xBF, 0xD1, 0x64, 0x41, 0xD5, 0x80, 0x64, 0x43, - 0x01, 0x06, 0x65, 0x41, 0x4A, 0x65, 0xEF, 0x60, 0x58, 0x4F, 0x87, 0x78, 0xFF, 0xFF, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0xBC, 0xF3, 0x02, 0x63, 0x23, 0xFC, 0x07, 0xB4, 0x25, 0xFA, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x4B, 0xD3, 0xBF, 0xD3, 0x60, 0x41, 0xC9, 0x83, 0xE9, 0x81, 0xDD, 0x81, - 0xA3, 0xFA, 0xE0, 0x81, 0x3C, 0x60, 0x00, 0x67, 0x02, 0x24, 0x02, 0xA4, 0x60, 0x47, 0x40, 0x4B, - 0xC9, 0x81, 0x4A, 0x65, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0xA5, 0xD8, 0xDA, 0x85, 0x80, 0x3A, - 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF6, 0x1F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xFC, 0xA3, - 0xA3, 0xD1, 0x4C, 0x65, 0xA4, 0xD3, 0xDA, 0x83, 0x60, 0x47, 0x25, 0xFA, 0x00, 0x7E, 0x60, 0x47, - 0x01, 0x26, 0xDC, 0x84, 0x60, 0x41, 0xE8, 0x84, 0xD8, 0x84, 0x23, 0xFA, 0xAB, 0x01, 0xFC, 0xA3, - 0xA3, 0xD1, 0x4C, 0x65, 0xA4, 0xD3, 0xDA, 0x83, 0x00, 0x7F, 0x25, 0xFA, 0x60, 0x41, 0x01, 0x26, - 0xDD, 0x81, 0xE9, 0x84, 0xD8, 0x84, 0x23, 0xFA, 0x9D, 0x01, 0x23, 0xF2, 0x12, 0x60, 0xB8, 0x65, - 0x60, 0x41, 0x12, 0x60, 0x54, 0x63, 0xA3, 0xDB, 0xFF, 0xA1, 0x48, 0x64, 0x58, 0xD0, 0x7E, 0xA8, - 0x5B, 0xD9, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x64, 0xFF, 0xA1, 0xD7, 0x80, 0x02, 0x03, 0x01, 0x03, - 0xF5, 0x01, 0x2E, 0xF5, 0x00, 0x60, 0x2F, 0x65, 0x25, 0xF2, 0x00, 0x63, 0xCC, 0x84, 0x03, 0xA3, - 0xFD, 0x05, 0x4A, 0x64, 0xD7, 0x80, 0x11, 0x60, 0xF0, 0x61, 0x2F, 0x05, 0xA1, 0xDD, 0xE3, 0x83, - 0xFE, 0xA3, 0x58, 0xD0, 0x7E, 0xA8, 0x59, 0xD9, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x64, 0xF9, 0x1F, - 0x00, 0x63, 0x59, 0xDD, 0x2E, 0xF5, 0x11, 0x60, 0xF0, 0x64, 0x25, 0xF0, 0xA0, 0xD3, 0xD3, 0x80, - 0x01, 0xB0, 0x04, 0x03, 0x01, 0xA4, 0x03, 0x03, 0xA2, 0xDB, 0x01, 0x00, 0xA2, 0xDD, 0x11, 0x60, - 0xF8, 0x63, 0x10, 0x60, 0x0A, 0x65, 0xBD, 0xD3, 0xBD, 0xD1, 0xE0, 0x84, 0xC4, 0x82, 0x10, 0x60, - 0x2A, 0x65, 0x07, 0x64, 0x64, 0x41, 0x5A, 0xDB, 0xD6, 0x80, 0xCD, 0x81, 0x06, 0x03, 0xFB, 0x02, - 0x25, 0xF2, 0x02, 0xA3, 0xCC, 0x84, 0xA2, 0xDA, 0xEC, 0x02, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x12, 0x60, 0x54, 0x61, 0xA1, 0xD3, 0x23, 0xFA, 0xE0, 0x83, 0x4A, 0x65, 0x04, 0x02, 0x02, 0x63, - 0x23, 0xFC, 0xA5, 0xFC, 0x09, 0x00, 0xDB, 0x83, 0x59, 0xD1, 0xA5, 0xD8, 0xDA, 0x85, 0x80, 0x3A, - 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF8, 0x1F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x11, 0x60, - 0xF0, 0x62, 0xA2, 0xD3, 0x00, 0x61, 0x02, 0xA4, 0xFE, 0xA0, 0x23, 0xFA, 0x1B, 0x03, 0xFA, 0xA4, - 0xFD, 0xA4, 0x01, 0xA1, 0xFD, 0x07, 0x61, 0x43, 0x23, 0xF2, 0x25, 0xFC, 0xE0, 0x83, 0x02, 0xA3, - 0x11, 0x60, 0xF0, 0x61, 0x00, 0x60, 0x4A, 0x64, 0x59, 0xD1, 0x58, 0xD8, 0x7E, 0x3A, 0x02, 0x00, - 0x00, 0xF4, 0x02, 0x64, 0xF9, 0x1F, 0x25, 0xF2, 0x23, 0xF2, 0x01, 0xB0, 0xCC, 0x84, 0x04, 0x02, - 0x23, 0xFA, 0x02, 0x00, 0x00, 0x64, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x41, 0x4B, - 0x65, 0x42, 0x80, 0x64, 0xD4, 0x85, 0x2B, 0x41, 0x00, 0xA1, 0x55, 0x8B, 0x0D, 0x03, 0x02, 0x04, - 0x65, 0x41, 0x02, 0x00, 0x00, 0x64, 0x40, 0x4B, 0xCA, 0x84, 0x58, 0xD0, 0xC9, 0x81, 0xBD, 0xD9, - 0xFC, 0x02, 0x00, 0xF4, 0x04, 0x65, 0xEC, 0x01, 0x2F, 0x58, 0xFF, 0xFF, 0xFC, 0xA3, 0xA3, 0xD3, - 0x02, 0x7C, 0xA0, 0xD3, 0x23, 0xF8, 0xDC, 0x84, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x02, 0x64, 0x23, 0xFA, 0x01, 0x64, 0x9D, 0xFE, 0x02, 0x28, 0x02, 0x64, 0x25, 0xFA, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x21, 0x60, 0x80, 0x62, 0xA2, 0xD3, 0x02, 0x7C, 0x23, 0xF8, 0x01, 0xB4, - 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xFC, 0xA3, 0xA3, 0xD1, 0x02, 0x64, 0x23, 0xFA, - 0x64, 0x44, 0x7C, 0x5F, 0x60, 0x45, 0x64, 0x47, 0x7C, 0x5F, 0x89, 0xF1, 0x66, 0x41, 0xC0, 0x86, - 0xA5, 0xD2, 0x61, 0x46, 0x00, 0x63, 0x60, 0x40, 0x0A, 0x37, 0x01, 0x63, 0x14, 0x37, 0x02, 0x63, - 0x37, 0x37, 0x06, 0x63, 0x6E, 0x37, 0x0B, 0x63, 0x25, 0xFC, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x02, 0x64, 0x23, 0xFA, 0x88, 0xFF, 0x75, 0x44, 0x8D, 0xFF, 0xE8, 0x87, 0xE8, 0x84, 0xE8, 0x84, - 0x03, 0xB4, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0xF0, 0x21, 0x60, 0x7C, 0x65, - 0x23, 0xF2, 0xA5, 0xD9, 0x02, 0xA8, 0x64, 0x44, 0x07, 0x02, 0x00, 0xBC, 0xF2, 0xA4, 0x04, 0x03, - 0x03, 0x07, 0x1F, 0x60, 0xAA, 0x62, 0xA2, 0xD9, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x20, 0x63, - 0x20, 0x60, 0x0A, 0x61, 0x48, 0x64, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x25, 0xF0, 0x20, 0x64, - 0xD0, 0x81, 0xFF, 0xFF, 0x02, 0x07, 0x25, 0xFA, 0x0F, 0x00, 0x20, 0x60, 0x0E, 0x63, 0xC3, 0x83, - 0x01, 0x2A, 0x06, 0x00, 0xCF, 0x83, 0xA3, 0xD3, 0xCD, 0x81, 0x00, 0x7F, 0xBD, 0xDB, 0x04, 0x03, - 0x00, 0x64, 0xC9, 0x81, 0xBD, 0xDB, 0xFD, 0x02, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, - 0x25, 0xF0, 0x01, 0x60, 0x70, 0x63, 0xA3, 0xD9, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xFC, 0xA3, - 0xA5, 0xF0, 0xA3, 0xD1, 0xFF, 0xFF, 0x64, 0x5E, 0x00, 0x7F, 0x60, 0x41, 0x64, 0x47, 0x7C, 0x5F, - 0x89, 0xF1, 0x66, 0x43, 0xC0, 0x86, 0x65, 0x44, 0xA1, 0xDA, 0x63, 0x46, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0xFC, 0xA3, 0xA3, 0xD1, 0xFF, 0xFF, 0x64, 0x5E, 0x00, 0x7F, 0x60, 0x45, 0x64, 0x47, - 0x7C, 0x5F, 0x89, 0xF1, 0x66, 0x41, 0xC0, 0x86, 0x65, 0x44, 0xA0, 0xD2, 0x61, 0x46, 0x25, 0xFA, - 0x02, 0x64, 0x23, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF0, 0x02, 0xA8, - 0x00, 0x67, 0x02, 0x02, 0x2D, 0xF9, 0x2C, 0xF9, 0x23, 0x58, 0xFF, 0xFF, 0x1F, 0x60, 0xA8, 0x61, - 0x23, 0xF2, 0x25, 0xF2, 0x02, 0xA8, 0x00, 0xA8, 0x09, 0x02, 0x07, 0x03, 0xD0, 0xA0, 0x30, 0x65, - 0x03, 0x04, 0xA7, 0xA0, 0x59, 0x65, 0x01, 0x06, 0x65, 0x44, 0xA1, 0xDB, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x04, 0x61, 0x0A, 0x00, 0x25, 0x60, 0x2C, 0x61, 0x01, 0x64, 0xA1, 0xDB, 0x04, 0x00, - 0x25, 0x60, 0x2C, 0x61, 0x00, 0x64, 0xA1, 0xDB, 0x06, 0x61, 0x41, 0x56, 0xC7, 0xFE, 0xEB, 0x60, - 0x84, 0x78, 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xA2, 0xFF, 0x46, 0x45, 0x02, 0xF0, - 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, 0x00, 0xF4, 0x01, 0xF2, 0x66, 0x5C, 0x25, 0x46, 0x56, 0x02, - 0x70, 0x27, 0x54, 0x00, 0x12, 0x64, 0x03, 0xFA, 0x04, 0xF8, 0x0E, 0xF2, 0x87, 0xFC, 0x8D, 0xFC, - 0x8E, 0xFC, 0xDA, 0x82, 0x16, 0x61, 0x00, 0x63, 0xC9, 0x81, 0x5A, 0xDC, 0xFD, 0x02, 0x60, 0x40, - 0xF0, 0x3B, 0x16, 0x00, 0x32, 0x44, 0x8F, 0xF3, 0x01, 0xB0, 0xF6, 0xA0, 0x08, 0x24, 0x2C, 0x05, - 0xDC, 0x83, 0xF0, 0x67, 0x0E, 0xFA, 0x1B, 0x60, 0xC4, 0x64, 0x2B, 0xDB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0x8F, 0xFD, 0x2B, 0xFF, 0xFE, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x4F, 0x00, - 0x90, 0xF3, 0x0A, 0x65, 0xD4, 0x80, 0xDC, 0x83, 0x17, 0x05, 0x90, 0xFD, 0x98, 0xFE, 0x04, 0x04, - 0x00, 0x7F, 0x08, 0x7E, 0x0E, 0xFA, 0x3B, 0xFF, 0x1B, 0x60, 0xB8, 0x64, 0x2B, 0xDB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0x0E, 0xF2, 0x2B, 0xFF, 0x60, 0x40, 0x08, 0x26, 0xF7, 0xFE, - 0xFD, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x32, 0x00, 0x8C, 0xF3, 0xFF, 0xFF, 0xD8, 0xA0, 0xFF, 0xFF, - 0x0D, 0x04, 0x1B, 0x60, 0xD0, 0x64, 0x2B, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xFC, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x21, 0x00, 0x46, 0x45, 0x00, 0x64, - 0x2B, 0xDB, 0x25, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xA2, 0xFF, - 0x00, 0xF4, 0x01, 0xF0, 0x0A, 0x18, 0x70, 0x67, 0xA0, 0x80, 0xF0, 0x67, 0x06, 0x03, 0xC0, 0x84, - 0x01, 0xFA, 0x25, 0x46, 0x25, 0x44, 0x80, 0xFC, 0x05, 0xFA, 0xB4, 0x60, 0x58, 0x4E, 0x48, 0x78, - 0xFF, 0xFF, 0xD4, 0xFE, 0xA3, 0xFF, 0xFF, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0xD4, 0xFE, 0xA3, 0xFF, - 0x2D, 0x58, 0xFF, 0xFF, 0x1B, 0x60, 0xBE, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x0D, 0x00, 0x1B, 0x60, - 0xB2, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x18, 0x00, 0x1B, 0x60, 0xCA, 0x64, 0x40, 0x47, 0x58, 0x4F, - 0x03, 0x00, 0xEB, 0x60, 0x84, 0x78, 0xFF, 0xFF, 0x27, 0xD5, 0x0E, 0xF2, 0x0B, 0x18, 0x60, 0x40, - 0x01, 0x2A, 0x08, 0x00, 0x1B, 0x60, 0xE0, 0x64, 0x40, 0x4B, 0xF0, 0x60, 0x58, 0x4D, 0x75, 0x78, - 0xFF, 0xFF, 0xF2, 0x01, 0x2F, 0x58, 0xFF, 0xFF, 0x27, 0xD5, 0x0E, 0xF2, 0x14, 0x18, 0x60, 0x40, - 0x01, 0x2A, 0x11, 0x00, 0x02, 0xF0, 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, 0xA2, 0xFF, 0x90, 0xF3, - 0x02, 0x02, 0xCC, 0x84, 0x90, 0xFB, 0x1B, 0x60, 0xE0, 0x64, 0x40, 0x4B, 0xF0, 0x60, 0x58, 0x4D, - 0x75, 0x78, 0xFF, 0xFF, 0xE9, 0x01, 0x2F, 0x58, 0xFF, 0xFF, 0xFB, 0x64, 0x3A, 0x42, 0x4A, 0xDB, - 0xA2, 0xFF, 0x93, 0xF3, 0x8F, 0xF3, 0xCC, 0x80, 0xFA, 0xA0, 0x01, 0x14, 0x1E, 0x05, 0xB3, 0x60, - 0x58, 0x4D, 0x4E, 0x78, 0xFF, 0xFF, 0xA2, 0xFF, 0x18, 0x03, 0xF0, 0x67, 0x0E, 0xFA, 0x1B, 0x60, - 0xE0, 0x62, 0x1B, 0x60, 0xC4, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xF6, 0x64, 0x3A, 0x42, 0x4A, 0xDB, 0x93, 0xF3, 0x8F, 0xF3, 0xCC, 0x83, - 0xDC, 0x84, 0x01, 0x15, 0x93, 0xFD, 0x8F, 0xFB, 0xD4, 0xFE, 0x92, 0xF3, 0x90, 0xF3, 0x00, 0xA8, - 0x91, 0xF1, 0x03, 0x02, 0xD0, 0x80, 0xFF, 0xFF, 0x27, 0x05, 0xB3, 0x60, 0x58, 0x4D, 0x4E, 0x78, - 0xFF, 0xFF, 0xA2, 0xFF, 0x21, 0x03, 0x00, 0x63, 0x92, 0xF3, 0x0E, 0xFC, 0xCC, 0x84, 0xFF, 0x3A, - 0x92, 0xFB, 0x98, 0xFE, 0x03, 0x04, 0x08, 0xBB, 0x0E, 0xFC, 0x3B, 0xFF, 0x1B, 0x60, 0xE0, 0x62, - 0x1B, 0x60, 0xB8, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xF7, 0x64, 0x3A, 0x42, 0x4A, 0xDB, 0x90, 0xF3, 0x0E, 0xF2, 0xDC, 0x83, 0x08, 0xB0, - 0x90, 0xFD, 0x08, 0x28, 0xF7, 0xFE, 0xD4, 0xFE, 0xA3, 0xFF, 0xEB, 0x60, 0x84, 0x78, 0xFF, 0xFF, - 0xB9, 0xFE, 0x13, 0xFF, 0x24, 0x40, 0x80, 0x2B, 0x0B, 0x00, 0xA2, 0xFF, 0x25, 0x46, 0x09, 0xF4, - 0x0E, 0xF2, 0x05, 0x18, 0x08, 0xBC, 0x0E, 0xFA, 0xFF, 0xFF, 0xF7, 0xFE, 0x01, 0x00, 0xD8, 0xFE, - 0xA3, 0xFF, 0x25, 0x46, 0x3E, 0xF2, 0x00, 0xF4, 0x08, 0xF0, 0x25, 0x46, 0x06, 0xB4, 0xFF, 0x7F, - 0x10, 0xBC, 0x06, 0x26, 0xFD, 0x7F, 0x0E, 0xFA, 0x3E, 0xF2, 0x3F, 0xF2, 0x60, 0x41, 0x08, 0x2A, - 0x64, 0x47, 0x3F, 0xFA, 0x60, 0x45, 0x1F, 0x60, 0x62, 0x62, 0xA2, 0xD3, 0xA3, 0xFC, 0xAB, 0xFC, - 0x91, 0xFC, 0xD4, 0x80, 0xE0, 0x60, 0xC1, 0x65, 0xA5, 0x80, 0x01, 0x04, 0x07, 0x03, 0x23, 0xF0, - 0x08, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0xF2, 0x60, 0x25, 0x78, 0xFF, 0xFF, 0xF4, 0x60, 0x58, 0x4F, - 0x2D, 0x78, 0xFF, 0xFF, 0x14, 0x04, 0x23, 0xF0, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0x98, 0xF1, - 0x1E, 0x60, 0xFC, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, - 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x02, 0x00, 0x20, 0x60, 0x00, 0x75, 0x46, 0x00, 0x3E, 0xF0, - 0x89, 0xF1, 0x64, 0x47, 0x07, 0xB4, 0x07, 0x36, 0x3B, 0x00, 0x04, 0x03, 0xCC, 0x84, 0xE0, 0x84, - 0xC0, 0x83, 0x2D, 0x00, 0x2C, 0xF2, 0x88, 0xF1, 0x01, 0xB0, 0x64, 0x43, 0x35, 0x02, 0x2E, 0xF2, - 0x12, 0x60, 0xCE, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, - 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x2E, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, - 0x0C, 0x02, 0x61, 0x46, 0x2D, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, - 0x2C, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, - 0xE8, 0x1B, 0x88, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x01, 0x03, 0x09, 0x00, 0x66, 0x45, - 0x63, 0x46, 0x06, 0xF0, 0x65, 0x46, 0x64, 0x44, 0x0C, 0x26, 0x02, 0x00, 0x02, 0x26, 0x04, 0x00, - 0x23, 0xF0, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0x07, 0xFC, 0x23, 0xF2, 0xFF, 0xFF, 0x10, 0x1B, - 0x1B, 0x60, 0xE0, 0x62, 0x1B, 0x60, 0x9A, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x0E, 0xF2, 0xC8, 0xFE, 0x10, 0xAC, 0x0E, 0xFA, 0x0F, 0x00, - 0x1B, 0x60, 0xE0, 0x62, 0x1B, 0x60, 0xAC, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x0E, 0xF2, 0xCE, 0xFE, 0x10, 0xAC, 0x0E, 0xFA, 0xEB, 0x60, - 0x84, 0x78, 0xFF, 0xFF, 0xCB, 0x84, 0xC9, 0x83, 0xFF, 0xFF, 0x08, 0x04, 0x58, 0xD1, 0xA5, 0xD8, - 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF8, 0x1F, 0x2F, 0x58, 0xFF, 0xFF, - 0x25, 0xF0, 0x21, 0x60, 0x2C, 0x62, 0xA2, 0xD9, 0x19, 0x00, 0x21, 0x60, 0x80, 0x64, 0xA0, 0xD1, - 0x7F, 0xF9, 0x0C, 0x60, 0x38, 0x62, 0x40, 0x63, 0x00, 0x64, 0x5A, 0xDB, 0xFE, 0x1F, 0x64, 0x40, - 0x01, 0x2A, 0x0C, 0x00, 0x04, 0x65, 0x0C, 0x60, 0x38, 0x61, 0x48, 0x64, 0x3E, 0x63, 0x7C, 0xA8, - 0x58, 0xD0, 0x59, 0xD9, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x64, 0xF9, 0x1F, 0x21, 0x60, 0x2C, 0x62, - 0xA2, 0xD1, 0x0D, 0x60, 0x1C, 0x65, 0x02, 0xFE, 0x64, 0x44, 0xF8, 0x84, 0xF8, 0x84, 0xF8, 0x87, - 0x60, 0x41, 0x64, 0x44, 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x84, 0x3E, 0xFB, 0x60, 0x42, 0x61, 0x44, - 0x03, 0xA2, 0x60, 0xFE, 0xA2, 0xDB, 0xFF, 0xFF, 0x20, 0xFE, 0x64, 0x44, 0x0C, 0x60, 0x3A, 0x65, - 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x84, 0x40, 0xFB, 0xFF, 0xFF, 0x00, 0x67, - 0x00, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x21, 0x60, 0x80, 0x64, 0xA0, 0xD1, 0x7F, 0xF9, 0x00, 0x64, - 0x40, 0x41, 0x64, 0x40, 0x01, 0x2A, 0xA6, 0x00, 0x4A, 0x64, 0xA0, 0xD2, 0xFF, 0xFF, 0x40, 0x42, - 0x80, 0x2B, 0x04, 0x00, 0xFF, 0xB4, 0x40, 0x42, 0x01, 0x64, 0x40, 0x41, 0x88, 0xF3, 0x46, 0x4B, - 0x87, 0xF3, 0x60, 0x46, 0xE0, 0x83, 0xAB, 0x46, 0x26, 0xF0, 0xAB, 0x46, 0x55, 0xF8, 0xAB, 0x46, - 0x27, 0xF0, 0xAB, 0x46, 0x56, 0xF8, 0xAB, 0x46, 0x28, 0xF0, 0xAB, 0x46, 0x57, 0xF8, 0x66, 0x44, - 0x02, 0xA6, 0xF1, 0x1F, 0x88, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0xAB, 0x46, 0x0C, 0x60, 0x7A, 0x65, - 0x22, 0x44, 0xFF, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x81, 0xC9, 0x81, - 0x52, 0x64, 0x0E, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x21, 0x44, 0x01, 0x2A, 0x08, 0x00, - 0xAB, 0x46, 0xF0, 0xA1, 0x6E, 0x64, 0x0E, 0x63, 0x59, 0xD1, 0x58, 0xD8, 0xFD, 0x1F, 0xAB, 0x46, - 0x22, 0x44, 0xFF, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0x0C, 0x60, 0xDC, 0x65, 0xC4, 0x81, - 0x60, 0x45, 0xC9, 0x81, 0x62, 0x64, 0x06, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x21, 0x44, - 0x01, 0x2A, 0x08, 0x00, 0xAB, 0x46, 0xF8, 0xA1, 0xAE, 0x64, 0x06, 0x63, 0x59, 0xD1, 0x58, 0xD8, - 0xFD, 0x1F, 0xAB, 0x46, 0x65, 0x44, 0x0C, 0x60, 0xFC, 0x65, 0xC4, 0x81, 0xC9, 0x81, 0x6A, 0x64, - 0x06, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x22, 0x44, 0xFF, 0xB4, 0xE0, 0x84, 0xE0, 0x85, - 0xC4, 0x84, 0x0C, 0x60, 0xC2, 0x65, 0xC4, 0x81, 0x72, 0x64, 0x04, 0x63, 0x58, 0xD0, 0x59, 0xD9, - 0xFD, 0x1F, 0xAB, 0x46, 0x21, 0x44, 0x01, 0x2A, 0x06, 0x00, 0xFA, 0xA1, 0x88, 0x64, 0x04, 0x63, - 0x59, 0xD1, 0x58, 0xD8, 0xFD, 0x1F, 0x37, 0xF0, 0x21, 0x44, 0x01, 0x2A, 0x13, 0x00, 0x22, 0x44, - 0x3D, 0xFB, 0x60, 0x41, 0x02, 0xFE, 0xF8, 0x84, 0xF8, 0x84, 0xF8, 0x84, 0x3C, 0xFB, 0x0C, 0x60, - 0xBE, 0x63, 0x88, 0xFF, 0xCD, 0x81, 0x06, 0xA3, 0xFD, 0x0D, 0x8D, 0xFF, 0x3B, 0xFD, 0x64, 0x47, - 0x80, 0xBF, 0x60, 0x5C, 0x22, 0x43, 0x80, 0x61, 0x88, 0xFF, 0xCF, 0x83, 0xE1, 0x81, 0xFD, 0x0D, - 0x8D, 0xFF, 0x61, 0x47, 0x31, 0x91, 0xB1, 0x84, 0x37, 0xFA, 0x87, 0xF3, 0xFF, 0xFF, 0xCC, 0x83, - 0xE3, 0x83, 0x66, 0x44, 0x02, 0xA6, 0x37, 0xF0, 0x66, 0x44, 0xB1, 0x9C, 0x37, 0xF8, 0x02, 0xA6, - 0xFA, 0x1F, 0xAB, 0x46, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF0, - 0x02, 0xA8, 0x00, 0x67, 0x24, 0x02, 0x3D, 0xF1, 0x64, 0x44, 0x03, 0xB4, 0x40, 0x42, 0xD0, 0x80, - 0x88, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0xB7, 0xF4, 0x80, 0x61, 0x02, 0x02, 0xE3, 0x83, 0xEB, 0x83, - 0x22, 0x44, 0x88, 0xFF, 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x0D, 0x8D, 0xFF, 0x61, 0x47, 0x31, 0x91, - 0x9D, 0x85, 0xA7, 0x83, 0x37, 0xFC, 0x87, 0xF3, 0xFF, 0xFF, 0xCC, 0x83, 0xE3, 0x83, 0x66, 0x44, - 0x02, 0xA6, 0xB7, 0xF2, 0x66, 0x44, 0xA5, 0x81, 0xB7, 0xFA, 0x02, 0xA6, 0xFA, 0x1F, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x11, 0x64, 0x23, 0xFA, 0x25, 0x44, 0x24, 0xFA, 0x04, 0x64, 0x40, 0x4B, - 0x62, 0x41, 0x0C, 0x60, 0xC2, 0x64, 0x04, 0x63, 0x58, 0xD1, 0x59, 0xD8, 0xFD, 0x1F, 0x2B, 0x43, - 0x00, 0x7C, 0x59, 0xD8, 0x4F, 0x8B, 0x06, 0xA4, 0xF6, 0x02, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x21, 0x60, 0x80, 0x64, 0xA0, 0xD1, 0x7F, 0xF9, 0x64, 0x40, 0x01, 0x2A, 0x4E, 0x00, 0x27, 0xF2, - 0x12, 0x60, 0xCE, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, - 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, - 0x0C, 0x02, 0x61, 0x46, 0x26, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, - 0x25, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, - 0xE8, 0x1B, 0x88, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x01, 0x03, 0x2A, 0x00, 0x43, 0x4B, - 0xAB, 0x46, 0x37, 0xF2, 0x80, 0x60, 0x30, 0x7C, 0xB0, 0x84, 0xA2, 0xDA, 0x4E, 0x61, 0x6E, 0x64, - 0x0E, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, 0x88, 0x64, 0x04, 0x63, - 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, 0xD9, 0x81, 0x98, 0x64, 0x04, 0x63, - 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, 0xD9, 0x81, 0xAE, 0x64, 0x0E, 0x63, - 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, - 0xFF, 0xFF, 0x01, 0x67, 0x20, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x21, 0x60, 0x80, 0x64, 0xA0, 0xD1, - 0x7F, 0xF9, 0x64, 0x40, 0x01, 0x2A, 0x31, 0x00, 0x27, 0xF2, 0x12, 0x60, 0xCE, 0x65, 0x60, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, - 0x61, 0x46, 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x26, 0xF0, - 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x25, 0xF0, 0x63, 0x46, 0xD0, 0x80, - 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0x88, 0xF3, 0x08, 0xFE, - 0x60, 0x43, 0x61, 0x46, 0x01, 0x03, 0x0D, 0x00, 0x43, 0x4B, 0xAB, 0x46, 0x37, 0xF2, 0x80, 0x60, - 0x30, 0x61, 0x9D, 0x85, 0xA4, 0x84, 0xA2, 0xDA, 0xAB, 0x46, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, - 0xFF, 0xFF, 0x01, 0x67, 0x20, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x3E, 0xF2, 0xAC, 0xF1, 0x08, 0xB0, - 0x19, 0xF8, 0x4A, 0x02, 0x07, 0x23, 0x2B, 0x00, 0x60, 0x47, 0x07, 0xB4, 0x89, 0xF1, 0xCC, 0x84, - 0xE0, 0x84, 0x40, 0x8A, 0xAA, 0x46, 0x03, 0xF2, 0x04, 0xF0, 0x05, 0xF2, 0x60, 0x43, 0xAA, 0x46, - 0x2C, 0xFC, 0x2D, 0xF8, 0x2E, 0xFA, 0xCB, 0xF1, 0x2F, 0xF8, 0xCC, 0xF1, 0x30, 0xF8, 0xCD, 0xF1, - 0x31, 0xF8, 0x46, 0x4A, 0x00, 0xF4, 0x02, 0xF2, 0x03, 0xF0, 0x04, 0xF2, 0x60, 0x43, 0xAA, 0x46, - 0x32, 0xFC, 0x33, 0xF8, 0x34, 0xFA, 0xAA, 0x46, 0x05, 0xF2, 0x06, 0xF0, 0x07, 0xF2, 0x60, 0x43, - 0xAA, 0x46, 0x36, 0xFC, 0x37, 0xF8, 0x38, 0xFA, 0x03, 0x60, 0x08, 0x64, 0x1C, 0x00, 0x67, 0xF1, - 0x2F, 0xF8, 0x68, 0xF1, 0x30, 0xF8, 0x69, 0xF1, 0x31, 0xF8, 0x46, 0x4A, 0x00, 0xF4, 0x02, 0xF2, - 0x03, 0xF0, 0x04, 0xF2, 0x60, 0x43, 0xAA, 0x46, 0x2C, 0xFC, 0x2D, 0xF8, 0x2E, 0xFA, 0xAA, 0x46, - 0x05, 0xF2, 0x06, 0xF0, 0x07, 0xF2, 0x60, 0x43, 0xAA, 0x46, 0x32, 0xFC, 0x33, 0xF8, 0x34, 0xFA, - 0x02, 0x60, 0x08, 0x64, 0x00, 0x00, 0x2A, 0xFA, 0x02, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x28, 0xF3, - 0xFF, 0xFF, 0x60, 0x47, 0x0F, 0xB4, 0x59, 0x00, 0xFF, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x1C, 0x60, - 0x04, 0x65, 0x04, 0x64, 0xA5, 0xDB, 0x12, 0x00, 0x1C, 0x60, 0x04, 0x65, 0x0C, 0x64, 0xA5, 0xDB, - 0x0D, 0x00, 0x1C, 0x60, 0x04, 0x65, 0x06, 0x64, 0xA5, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x1C, 0x60, 0x04, 0x65, 0x08, 0x64, 0xA5, 0xDB, 0xF4, 0x60, 0xD9, 0x64, - 0x80, 0xFB, 0xFF, 0xFF, 0x2D, 0xFF, 0xEB, 0x60, 0x84, 0x78, 0xFF, 0xFF, 0x29, 0xF3, 0x65, 0xFB, - 0x83, 0xFB, 0x02, 0x60, 0xEE, 0x64, 0x82, 0xFB, 0x07, 0x64, 0x84, 0xFB, 0xF4, 0x60, 0xD9, 0x64, - 0x80, 0xFB, 0xFF, 0xFF, 0xDF, 0xFE, 0x00, 0x64, 0x19, 0xFF, 0xEB, 0x60, 0x84, 0x78, 0xFF, 0xFF, - 0xAF, 0x60, 0xFD, 0x63, 0x0C, 0x60, 0x16, 0x64, 0xA0, 0xDD, 0x62, 0xFF, 0xF4, 0x60, 0xC6, 0x63, - 0x80, 0xFD, 0xFF, 0xFF, 0x1A, 0xFF, 0xEB, 0x60, 0x84, 0x78, 0xFF, 0xFF, 0xA7, 0x60, 0x9B, 0x63, - 0x0C, 0x60, 0x16, 0x64, 0xA0, 0xDD, 0x62, 0xFF, 0x29, 0xF5, 0x1B, 0x60, 0xE0, 0x63, 0x1B, 0x60, - 0xB2, 0x64, 0xBD, 0xDB, 0x66, 0x44, 0xBD, 0xDB, 0x02, 0x64, 0xA3, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xF9, 0xFE, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xA7, 0x01, 0x00, 0x36, 0xA8, 0x01, 0x01, 0x36, - 0xAB, 0x01, 0x02, 0x36, 0xAE, 0x01, 0x03, 0x36, 0xB5, 0x01, 0x04, 0x36, 0xD1, 0x01, 0x05, 0x36, - 0xCF, 0x01, 0x06, 0x36, 0xF1, 0x01, 0x07, 0x36, 0xCB, 0x01, 0x08, 0x36, 0xB7, 0x01, 0x09, 0x36, - 0x0C, 0x00, 0x0A, 0x36, 0x0D, 0x00, 0x0B, 0x36, 0x0E, 0x00, 0x0C, 0x36, 0x17, 0x00, 0x0D, 0x36, - 0x0D, 0x00, 0x0E, 0x36, 0x1E, 0x00, 0x0F, 0x36, 0x32, 0x00, 0x02, 0x60, 0x00, 0x64, 0x08, 0x00, - 0x04, 0x60, 0x00, 0x64, 0x05, 0x00, 0x00, 0x60, 0x01, 0x64, 0x02, 0x00, 0x20, 0x60, 0x00, 0x64, - 0x32, 0x45, 0xB4, 0x85, 0x45, 0x52, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xB0, 0x60, 0xC1, 0x63, - 0x0C, 0x60, 0x16, 0x64, 0xA0, 0xDD, 0x62, 0xFF, 0xFF, 0xFF, 0x1A, 0xFF, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x3F, 0x40, 0x02, 0x2B, 0x05, 0x00, 0x90, 0x60, 0x00, 0xE8, 0xAF, 0x60, 0xFD, 0x63, - 0x04, 0x00, 0x91, 0x60, 0x00, 0xE8, 0xB0, 0x60, 0xAB, 0x63, 0x28, 0xE8, 0x0C, 0x60, 0x16, 0x64, - 0xA0, 0xDD, 0x62, 0xFF, 0xFF, 0xFF, 0x1A, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x91, 0x60, - 0x00, 0xE8, 0x28, 0xE8, 0xD9, 0x60, 0xFE, 0x64, 0x32, 0x45, 0xA4, 0x85, 0x45, 0x52, 0x99, 0xFF, - 0xA5, 0x4F, 0xFF, 0xB4, 0x07, 0xFB, 0x98, 0xFF, 0xA7, 0x60, 0x9B, 0x63, 0x0C, 0x60, 0x16, 0x64, - 0xA0, 0xDD, 0x62, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x42, 0x6F, 0x6F, 0x74, 0x63, 0x6F, - 0x64, 0x65, 0x20, 0x21, 0x21, 0x20, 0x20, 0x00, 0x53, 0x54, 0x41, 0x2F, 0x41, 0x50, 0x20, 0x46, - 0x75, 0x6E, 0x63, 0x27, 0x73, 0x00, 0x20, 0x00, 0x02, 0x00, 0x02, 0x00, 0x24, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x06, 0x00, - 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x01, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x40, 0x00, 0x32, 0x00, 0x32, 0x00, 0x0A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x40, 0x00, 0x32, 0x00, - 0x36, 0x00, 0x0A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x40, 0x00, 0x3B, 0x00, 0x40, 0x00, 0x17, 0x00, - 0x07, 0x00, 0x07, 0x00, 0x4A, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x1E, 0x00, 0x0C, 0x00, 0x08, 0x00, - 0x57, 0x00, 0x4D, 0x00, 0x57, 0x00, 0x2B, 0x00, 0x19, 0x00, 0x08, 0x00, 0x5D, 0x00, 0x53, 0x00, - 0x5D, 0x00, 0x31, 0x00, 0x1F, 0x00, 0x08, 0x00, - -}; /* fw_image_4_data */ - -static const CFG_IDENTITY_STRCT fw_image_infoidentity[] = { - { - sizeof(CFG_IDENTITY_STRCT) / sizeof(hcf_16) - 1, - CFG_FW_IDENTITY, - COMP_ID_FW_AP, - 2, /* Variant / - 2, /* Major */ - 36 /* Minor */ - }, - { 0000, 0000, 0000, 0000, 0000, 0000 } /* endsentinel */ -}; - -static const CFG_PROG_STRCT fw_image_code[] = { - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, /* mode */ - 0x0146, /* sizeof(fw_image_1_data), */ - 0x00000060, /* Target address in NIC Memory */ - 0x0000, /* CRC: yes/no TYPE: primary/station/tertiary */ - (hcf_8 *)fw_image_1_data - }, - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, /* mode */ - 0x1918, /* sizeof(fw_image_2_data), */ - 0x00000C16, /* Target address in NIC Memory */ - 0x0000, /* CRC: yes/no TYPE: primary/station/tertiary */ - (hcf_8 *)fw_image_2_data - }, - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, /* mode */ - 0x01bc, /* sizeof(fw_image_3_data), */ - 0x001E252E, /* Target address in NIC Memory */ - 0x0000, /* CRC: yes/no TYPE: primary/station/tertiary */ - (hcf_8 *)fw_image_3_data - }, - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, /* mode */ - 0xab28, /* sizeof(fw_image_4_data), */ - 0x001F4000, /* Target address in NIC Memory */ - 0x0000, /* CRC: yes/no TYPE: primary/station/tertiary */ - (hcf_8 *)fw_image_4_data - }, - { - 5, - CFG_PROG, - CFG_PROG_STOP, /* mode*/ - 0000, - 0x000F1297, /* Start execution address */ - }, - { 0000, 0000, 0000, 0000, 00000000, 0000, 00000000} -}; - -static const CFG_RANGE20_STRCT fw_image_infocompat[] = { - { 3 + ((20 * sizeof(CFG_RANGE_SPEC_STRCT)) / sizeof(hcf_16)), - CFG_FW_SUP_RANGE, - COMP_ROLE_SUPL, - COMP_ID_APF, - { - { 2, 2, 4 } /* variant, bottom, top */ - } - }, - { 3 + ((20 * sizeof(CFG_RANGE_SPEC_STRCT)) / sizeof(hcf_16)), - CFG_MFI_ACT_RANGES_STA, - COMP_ROLE_ACT, - COMP_ID_MFI, - { - { 4, 6, 7 }, /* variant, bottom, top */ - { 5, 6, 7 }, /* variant, bottom, top */ - { 6, 6, 7 } /* variant, bottom, top */ - } - }, - { 3 + ((20 * sizeof(CFG_RANGE_SPEC_STRCT)) / sizeof(hcf_16)), - CFG_CFI_ACT_RANGES_STA, - COMP_ROLE_ACT, - COMP_ID_CFI, - { - { 2, 1, 2 } /* variant, bottom, top */ - } - }, - { 0000, 0000, 0000, 0000, { { 0000, 0000, 0000 } } } /* endsentinel */ -}; - -memimage fw_image = { - "FUPU7D37dhfwci\001C", /* signature, , C/Bin type */ - (CFG_PROG_STRCT *) fw_image_code, - 0x000F1297, - 00000000, /* (dummy) pdaplug */ - 00000000, /* (dummy) priplug */ - (CFG_RANGE20_STRCT *) fw_image_infocompat, - (CFG_IDENTITY_STRCT *) fw_image_infoidentity, -}; - diff --git a/drivers/staging/wlags49_h2/ap_h25.c b/drivers/staging/wlags49_h2/ap_h25.c deleted file mode 100644 index d3a0faa3ab97..000000000000 --- a/drivers/staging/wlags49_h2/ap_h25.c +++ /dev/null @@ -1,4094 +0,0 @@ -/* - * File: ap_h54.124 - * - * Abstract: This file contains memory image 'fw_image'. - * - * Contents: Total size of the memory image: 63146 bytes. - * Total number of blocks: 4 blocks. - * Block 1 : load address 00000060, 328 bytes. - * Block 2 : load address 00000C16, 9266 bytes. - * Block 3 : load address 001E3048, 6476 bytes. - * Block 4 : load address 001F4000, 47076 bytes. - * - * Identity: component id: 32 (variant 3) version 1.24 - * - * Compatibility: - * supplying interface 8 (variant 4) : 1 - 1 - * acting on interface 1 (variant 7) : 3 - 3 - * acting on interface 1 (variant 8) : 1 - 1 - * acting on interface 2 (variant 4) : 1 - 2 - * - * Generated: by g:\fw\fupu3.exe version 4.26 - * - * Commandline: g:\fw\fupu3.exe /f=4 /n=fw_image /i=t3012400.hex - */ - - -#include "hcfcfg.h" /* to get hcf_16 etc defined as well as */ - /* possible settings which inluence mdd.h or dhf.h */ -#include "mdd.h" /* to get COMP_ID_STA etc defined */ -#include "dhf.h" /* used to be fhfmem.h, to get memblock,plugrecord, */ - -static const hcf_8 fw_image_1_data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x0C, 0x00, 0x00, - 0x02, 0x0D, 0x00, 0x00, 0x02, 0x0D, 0xD6, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x02, 0x00, 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, 0xC8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x09, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, - 0x00, 0x00, 0xFF, 0x07, 0x02, 0x00, 0x64, 0x00, 0x64, 0x00, 0x10, 0x27, 0x10, 0x27, 0x14, 0x00, - 0xD0, 0x07, 0xD0, 0x07, 0x10, 0x27, 0x2F, 0x00, 0x32, 0x00, 0x32, 0x00, 0x05, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x10, 0x27, 0x05, 0x00, 0x00, 0x02, 0x00, 0x02, 0x13, 0x00, 0x07, 0x00, 0x03, 0x00, - 0x32, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x09, 0x2B, 0x09, 0x2B, 0x09, 0xFF, 0x0F, - 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x01, 0x00, 0x40, 0x00, 0x32, 0x00, 0x32, 0x00, - 0x0A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - -}; /* fw_image_1_data */ - -static const hcf_8 fw_image_2_data[] = { - 0x7C, 0xA4, 0x00, 0x16, 0x08, 0x40, 0x0F, 0xD2, 0xE1, 0x28, 0xA5, 0x7C, 0x50, 0x30, 0xF1, 0x84, - 0x44, 0x08, 0xAB, 0xAE, 0xA5, 0xB8, 0xFC, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0xC6, 0x84, 0xF8, - 0x99, 0xEE, 0x8D, 0xF6, 0x0D, 0xFF, 0xBD, 0xD6, 0xB1, 0xDE, 0x54, 0x91, 0x50, 0x60, 0x03, 0x02, - 0xA9, 0xCE, 0x7D, 0x56, 0x19, 0xE7, 0x62, 0xB5, 0xE6, 0x4D, 0x9A, 0xEC, 0x45, 0x8F, 0x9D, 0x1F, - 0x40, 0x89, 0x87, 0xFA, 0x15, 0xEF, 0xEB, 0xB2, 0xC9, 0x8E, 0x0B, 0xFB, 0xEC, 0x41, 0x67, 0xB3, - 0xFD, 0x5F, 0xEA, 0x45, 0xBF, 0x23, 0xF7, 0x53, 0x96, 0xE4, 0x5B, 0x9B, 0xC2, 0x75, 0x1C, 0xE1, - 0xAE, 0x3D, 0x6A, 0x4C, 0x5A, 0x6C, 0x41, 0x7E, 0x02, 0xF5, 0x4F, 0x83, 0x5C, 0x68, 0xF4, 0x51, - 0x34, 0xD1, 0x08, 0xF9, 0x93, 0xE2, 0x73, 0xAB, 0x53, 0x62, 0x3F, 0x2A, 0x0C, 0x08, 0x52, 0x95, - 0x65, 0x46, 0x5E, 0x9D, 0x28, 0x30, 0xA1, 0x37, 0x0F, 0x0A, 0xB5, 0x2F, 0x09, 0x0E, 0x36, 0x24, - 0x9B, 0x1B, 0x3D, 0xDF, 0x26, 0xCD, 0x69, 0x4E, 0xCD, 0x7F, 0x9F, 0xEA, 0x1B, 0x12, 0x9E, 0x1D, - 0x74, 0x58, 0x2E, 0x34, 0x2D, 0x36, 0xB2, 0xDC, 0xEE, 0xB4, 0xFB, 0x5B, 0xF6, 0xA4, 0x4D, 0x76, - 0x61, 0xB7, 0xCE, 0x7D, 0x7B, 0x52, 0x3E, 0xDD, 0x71, 0x5E, 0x97, 0x13, 0xF5, 0xA6, 0x68, 0xB9, - 0x00, 0x00, 0x2C, 0xC1, 0x60, 0x40, 0x1F, 0xE3, 0xC8, 0x79, 0xED, 0xB6, 0xBE, 0xD4, 0x46, 0x8D, - 0xD9, 0x67, 0x4B, 0x72, 0xDE, 0x94, 0xD4, 0x98, 0xE8, 0xB0, 0x4A, 0x85, 0x6B, 0xBB, 0x2A, 0xC5, - 0xE5, 0x4F, 0x16, 0xED, 0xC5, 0x86, 0xD7, 0x9A, 0x55, 0x66, 0x94, 0x11, 0xCF, 0x8A, 0x10, 0xE9, - 0x06, 0x04, 0x81, 0xFE, 0xF0, 0xA0, 0x44, 0x78, 0xBA, 0x25, 0xE3, 0x4B, 0xF3, 0xA2, 0xFE, 0x5D, - 0xC0, 0x80, 0x8A, 0x05, 0xAD, 0x3F, 0xBC, 0x21, 0x48, 0x70, 0x04, 0xF1, 0xDF, 0x63, 0xC1, 0x77, - 0x75, 0xAF, 0x63, 0x42, 0x30, 0x20, 0x1A, 0xE5, 0x0E, 0xFD, 0x6D, 0xBF, 0x4C, 0x81, 0x14, 0x18, - 0x35, 0x26, 0x2F, 0xC3, 0xE1, 0xBE, 0xA2, 0x35, 0xCC, 0x88, 0x39, 0x2E, 0x57, 0x93, 0xF2, 0x55, - 0x82, 0xFC, 0x47, 0x7A, 0xAC, 0xC8, 0xE7, 0xBA, 0x2B, 0x32, 0x95, 0xE6, 0xA0, 0xC0, 0x98, 0x19, - 0xD1, 0x9E, 0x7F, 0xA3, 0x66, 0x44, 0x7E, 0x54, 0xAB, 0x3B, 0x83, 0x0B, 0xCA, 0x8C, 0x29, 0xC7, - 0xD3, 0x6B, 0x3C, 0x28, 0x79, 0xA7, 0xE2, 0xBC, 0x1D, 0x16, 0x76, 0xAD, 0x3B, 0xDB, 0x56, 0x64, - 0x4E, 0x74, 0x1E, 0x14, 0xDB, 0x92, 0x0A, 0x0C, 0x6C, 0x48, 0xE4, 0xB8, 0x5D, 0x9F, 0x6E, 0xBD, - 0xEF, 0x43, 0xA6, 0xC4, 0xA8, 0x39, 0xA4, 0x31, 0x37, 0xD3, 0x8B, 0xF2, 0x32, 0xD5, 0x43, 0x8B, - 0x59, 0x6E, 0xB7, 0xDA, 0x8C, 0x01, 0x64, 0xB1, 0xD2, 0x9C, 0xE0, 0x49, 0xB4, 0xD8, 0xFA, 0xAC, - 0x07, 0xF3, 0x25, 0xCF, 0xAF, 0xCA, 0x8E, 0xF4, 0xE9, 0x47, 0x18, 0x10, 0xD5, 0x6F, 0x88, 0xF0, - 0x6F, 0x4A, 0x72, 0x5C, 0x24, 0x38, 0xF1, 0x57, 0xC7, 0x73, 0x51, 0x97, 0x23, 0xCB, 0x7C, 0xA1, - 0x9C, 0xE8, 0x21, 0x3E, 0xDD, 0x96, 0xDC, 0x61, 0x86, 0x0D, 0x85, 0x0F, 0x90, 0xE0, 0x42, 0x7C, - 0xC4, 0x71, 0xAA, 0xCC, 0xD8, 0x90, 0x05, 0x06, 0x01, 0xF7, 0x12, 0x1C, 0xA3, 0xC2, 0x5F, 0x6A, - 0xF9, 0xAE, 0xD0, 0x69, 0x91, 0x17, 0x58, 0x99, 0x27, 0x3A, 0xB9, 0x27, 0x38, 0xD9, 0x13, 0xEB, - 0xB3, 0x2B, 0x33, 0x22, 0xBB, 0xD2, 0x70, 0xA9, 0x89, 0x07, 0xA7, 0x33, 0xB6, 0x2D, 0x22, 0x3C, - 0x92, 0x15, 0x20, 0xC9, 0x49, 0x87, 0xFF, 0xAA, 0x78, 0x50, 0x7A, 0xA5, 0x8F, 0x03, 0xF8, 0x59, - 0x80, 0x09, 0x17, 0x1A, 0xDA, 0x65, 0x31, 0xD7, 0xC6, 0x84, 0xB8, 0xD0, 0xC3, 0x82, 0xB0, 0x29, - 0x77, 0x5A, 0x11, 0x1E, 0xCB, 0x7B, 0xFC, 0xA8, 0xD6, 0x6D, 0x3A, 0x2C, 0x00, 0x30, 0x00, 0x31, - 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3A, - 0x00, 0x3B, 0x00, 0x3C, 0x00, 0x3D, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x3F, 0x59, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0x21, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x20, 0x03, 0xE0, 0x01, 0x40, 0x01, 0x20, 0x03, 0xE0, 0x01, - 0x40, 0x01, 0x18, 0x08, 0xF0, 0x3F, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x02, 0x14, 0x05, 0x32, 0x0B, 0x37, - 0x08, 0x50, 0x0B, 0x6E, 0x02, 0x00, 0x04, 0x00, 0x0B, 0x00, 0x16, 0x00, 0x0C, 0x00, 0x12, 0x00, - 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x39, 0x00, 0x20, 0x00, 0x39, 0x00, - 0x39, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xA4, 0x10, 0xF2, 0x10, 0xAA, 0x10, 0xEC, 0x10, 0xB0, 0x10, 0xE6, 0x10, 0xB6, 0x10, - 0xE0, 0x10, 0xBC, 0x10, 0xDA, 0x10, 0xC2, 0x10, 0xD4, 0x10, 0xC8, 0x10, 0xCE, 0x10, 0x07, 0x01, - 0x00, 0x00, 0x16, 0x22, 0x00, 0x04, 0x08, 0x01, 0x00, 0x00, 0x16, 0x26, 0x00, 0x04, 0x09, 0x01, - 0x00, 0x00, 0x16, 0x2A, 0x00, 0x04, 0x0A, 0x01, 0x00, 0x00, 0x16, 0x2E, 0x00, 0x04, 0x0B, 0x01, - 0x00, 0x00, 0x10, 0x24, 0x04, 0x04, 0x0C, 0x01, 0x00, 0x00, 0x10, 0x28, 0x04, 0x04, 0x0D, 0x01, - 0x00, 0x00, 0x10, 0x2C, 0x04, 0x04, 0x0E, 0x01, 0x00, 0x00, 0x10, 0x30, 0x04, 0x04, 0x0F, 0x01, - 0x00, 0x00, 0x14, 0x34, 0x08, 0x84, 0x10, 0x01, 0x00, 0x00, 0x14, 0x38, 0x08, 0x84, 0x11, 0x01, - 0x00, 0x00, 0x14, 0x3C, 0x08, 0x84, 0x12, 0x01, 0x00, 0x00, 0x14, 0x40, 0x08, 0x84, 0x13, 0x01, - 0x00, 0x00, 0x17, 0x64, 0x0C, 0x8B, 0x14, 0x01, 0x00, 0x00, 0x17, 0x68, 0x0C, 0x8B, 0x15, 0x01, - 0x00, 0x00, 0x17, 0x6C, 0x0C, 0x8B, 0x16, 0x01, 0x00, 0x00, 0x17, 0x70, 0x0C, 0x8B, 0x17, 0x01, - 0x00, 0x00, 0x17, 0x74, 0x0C, 0x8B, 0x18, 0x01, 0x00, 0x00, 0x17, 0x78, 0x0C, 0x8B, 0x19, 0x01, - 0x00, 0x00, 0x17, 0x7C, 0x0C, 0x8B, 0x1A, 0x01, 0x00, 0x00, 0x17, 0x80, 0x0C, 0x8B, 0x1B, 0x01, - 0x00, 0x00, 0x17, 0x84, 0x0C, 0x8B, 0x1C, 0x01, 0x00, 0x00, 0x17, 0x88, 0x0C, 0x8B, 0x1D, 0x01, - 0x00, 0x00, 0x17, 0x8C, 0x0C, 0x8B, 0x1E, 0x01, 0x00, 0x00, 0x0E, 0x95, 0x17, 0x04, 0x1F, 0x01, - 0x00, 0x00, 0x0E, 0x99, 0x17, 0x04, 0x20, 0x01, 0x00, 0x00, 0x0E, 0x9D, 0x17, 0x04, 0x21, 0x01, - 0x00, 0x00, 0x0E, 0xA1, 0x17, 0x04, 0x22, 0x01, 0x00, 0x00, 0x0E, 0xA5, 0x00, 0x00, 0x14, 0x11, - 0x34, 0x11, 0x54, 0x11, 0x74, 0x11, 0xCC, 0x11, 0x1C, 0x11, 0x3C, 0x11, 0x5C, 0x11, 0x7C, 0x11, - 0xD4, 0x11, 0x24, 0x11, 0x44, 0x11, 0x64, 0x11, 0x84, 0x11, 0xDC, 0x11, 0x2C, 0x11, 0x4C, 0x11, - 0x6C, 0x11, 0x8C, 0x11, 0xE4, 0x11, 0x94, 0x11, 0x9C, 0x11, 0xA4, 0x11, 0xAC, 0x11, 0xB4, 0x11, - 0xBC, 0x11, 0xC4, 0x11, 0xEC, 0x11, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, - 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, - 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x0A, 0x0A, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, - 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x0A, 0x0A, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x10, 0x10, 0x10, 0x10, - 0x17, 0x17, 0x17, 0x17, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x14, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, - 0x14, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x11, 0x11, 0x11, 0x11, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x14, 0x14, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x16, 0x16, 0x16, 0x16, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x0A, 0x0A, 0x0A, - 0x0A, 0x7F, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x10, 0x10, 0x10, 0x10, 0x7F, 0x14, 0x14, 0x14, 0x14, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x0A, 0x0A, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, - 0x14, 0x14, 0x14, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x9D, 0x9D, 0xA1, 0xAA, 0x10, 0x10, - 0x9D, 0x9D, 0x08, 0x02, 0x06, 0x00, 0xA5, 0xA5, 0xAA, 0xAA, 0x17, 0x17, 0xA2, 0xA2, 0x15, 0x05, - 0x07, 0x00, 0xAA, 0xAA, 0xB4, 0xB4, 0x1C, 0x1C, 0xA7, 0xA7, 0x1C, 0x0A, 0x08, 0x00, 0xB7, 0xB7, - 0xC1, 0xC1, 0x09, 0x09, 0xB4, 0xB4, 0x29, 0x17, 0x08, 0x00, 0xBD, 0xBD, 0xC7, 0xC7, 0x0F, 0x0F, - 0xBA, 0xBA, 0x2F, 0x1D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x17, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xE4, 0xF0, 0xFD, 0xF0, 0x1F, 0xF1, 0x60, 0xF6, 0x9B, 0xF0, 0x79, 0xF6, 0x9B, 0xF0, 0x9B, 0xF0, - 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0xCC, 0xF7, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, - 0x9B, 0xF0, 0x15, 0xF3, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, - 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, - 0x9B, 0xF0, 0x66, 0xF3, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, - 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, - 0xE3, 0xF2, 0xFE, 0xF2, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, 0x9B, 0xF0, - 0xB4, 0x1C, 0x59, 0xF1, 0x6C, 0xF1, 0x1C, 0xF2, 0x20, 0xF2, 0x9B, 0xF0, 0x9B, 0xF0, 0xCF, 0xF2, - 0x64, 0xE6, 0x3E, 0xE6, 0x92, 0xE6, 0xE1, 0xE6, 0xA9, 0xE7, 0xCF, 0xE7, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x12, 0xF1, 0x35, 0xF1, 0x5D, 0xF6, 0x5D, 0xF6, 0x6D, 0xF6, 0x86, 0xF6, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xC0, 0xF3, 0xF2, 0xF5, 0x5A, 0x00, 0x02, 0x00, 0xF9, 0xFF, - 0xC0, 0xF3, 0xD6, 0xF3, 0xCA, 0x00, 0x02, 0x00, 0xF7, 0xFF, 0xC0, 0xF3, 0xD6, 0xF3, 0xB0, 0x26, - 0x06, 0x00, 0xF0, 0xFF, 0xC0, 0xF3, 0xAA, 0xF3, 0x00, 0x00, 0x00, 0x02, 0xF6, 0xFF, 0xC0, 0xF3, - 0xD6, 0xF3, 0x6C, 0x00, 0x02, 0x00, 0xF4, 0xFF, 0xC0, 0xF3, 0xD6, 0xF3, 0x68, 0x01, 0x02, 0x00, - 0xF5, 0xFF, 0xC0, 0xF3, 0xFB, 0xF5, 0xA2, 0x26, 0x02, 0x00, 0xED, 0xFF, 0xC0, 0xF3, 0x0D, 0xF6, - 0x9E, 0x2B, 0x02, 0x00, 0xEC, 0xFF, 0xC0, 0xF3, 0x3B, 0xF6, 0xA0, 0x2B, 0x02, 0x00, 0xEB, 0xFF, - 0xC0, 0xF3, 0x41, 0xF6, 0xA2, 0x2B, 0x02, 0x00, 0xEE, 0xFF, 0xC0, 0xF3, 0x47, 0xF6, 0xD6, 0x2B, - 0x02, 0x00, 0xDA, 0xFF, 0xC0, 0xF3, 0xD6, 0xF3, 0xD0, 0x13, 0x0C, 0x00, 0xEA, 0xFF, 0xC0, 0xF3, - 0xAA, 0xF3, 0xEC, 0x2B, 0x06, 0x00, 0xE9, 0xFF, 0xC0, 0xF3, 0xD6, 0xF3, 0xF2, 0x2B, 0x02, 0x00, - 0xE8, 0xFF, 0xC0, 0xF3, 0xD6, 0xF3, 0xF4, 0x2B, 0x02, 0x00, 0xE7, 0xFF, 0xC0, 0xF3, 0xD6, 0xF3, - 0xF6, 0x2B, 0x02, 0x00, 0xE6, 0xFF, 0xC0, 0xF3, 0xD6, 0xF3, 0xF8, 0x2B, 0x02, 0x00, 0xE5, 0xFF, - 0xC0, 0xF3, 0xD6, 0xF3, 0xFA, 0x2B, 0x10, 0x00, 0xE4, 0xFF, 0xC0, 0xF3, 0xD6, 0xF3, 0x0A, 0x2C, - 0x18, 0x00, 0xDB, 0xFF, 0xC0, 0xF3, 0xD6, 0xF3, 0x22, 0x2C, 0x02, 0x00, 0xDC, 0xFF, 0xC0, 0xF3, - 0xD6, 0xF3, 0x24, 0x2C, 0x02, 0x00, 0xE1, 0xFF, 0xC0, 0xF3, 0xD6, 0xF3, 0xC6, 0x2C, 0x02, 0x00, - 0xE0, 0xFF, 0xC0, 0xF3, 0xD6, 0xF3, 0xC4, 0x2C, 0x02, 0x00, 0xE3, 0xFF, 0xC0, 0xF3, 0xD6, 0xF3, - 0xA8, 0x2C, 0x02, 0x00, 0xE2, 0xFF, 0x0E, 0xF4, 0xAA, 0xF3, 0x7E, 0x2C, 0x24, 0x00, 0x03, 0xFC, - 0xC0, 0xF3, 0x3A, 0xF5, 0x92, 0x2B, 0x02, 0x00, 0x04, 0xFC, 0xC0, 0xF3, 0xD0, 0xF3, 0xBA, 0x26, - 0x22, 0x00, 0x06, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0xA0, 0x26, 0x02, 0x00, 0x07, 0xFC, 0xC0, 0xF3, - 0xD6, 0xF3, 0xFE, 0x26, 0x02, 0x00, 0x0E, 0xFC, 0xC0, 0xF3, 0x63, 0xF5, 0x08, 0x27, 0x22, 0x00, - 0xB1, 0xFC, 0xC0, 0xF3, 0x88, 0xF8, 0x2A, 0x28, 0x02, 0x00, 0x20, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, - 0x2E, 0x27, 0x02, 0x00, 0x25, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x3A, 0x27, 0x02, 0x00, 0x26, 0xFC, - 0xC0, 0xF3, 0xD6, 0xF3, 0x3C, 0x27, 0x02, 0x00, 0x27, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x3E, 0x27, - 0x02, 0x00, 0xB2, 0xFC, 0xC0, 0xF3, 0xD0, 0xF3, 0x4E, 0x28, 0x22, 0x00, 0xC1, 0xFC, 0xC0, 0xF3, - 0xD6, 0xF3, 0x56, 0x2C, 0x20, 0x00, 0xB0, 0xFC, 0xA0, 0xF3, 0x8C, 0xF8, 0x00, 0x00, 0x00, 0x00, - 0xC4, 0xFC, 0xA0, 0xF3, 0x54, 0xF6, 0x00, 0x00, 0x08, 0x00, 0xC8, 0xFC, 0xA0, 0xF3, 0x52, 0xF6, - 0x00, 0x00, 0x08, 0x00, 0xB4, 0xFC, 0xA0, 0xF3, 0xC0, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xFC, - 0xA0, 0xF3, 0x6A, 0xF9, 0x00, 0x00, 0x00, 0x00, 0xB7, 0xFC, 0xA0, 0xF3, 0xAC, 0xF9, 0x00, 0x00, - 0x00, 0x00, 0xB8, 0xFC, 0xA0, 0xF3, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0xBC, 0xFC, 0xA0, 0xF3, - 0x3B, 0xFA, 0x00, 0x00, 0x00, 0x00, 0xBD, 0xFC, 0xA0, 0xF3, 0xC3, 0xFA, 0x00, 0x00, 0x00, 0x00, - 0xBE, 0xFC, 0xA0, 0xF3, 0xEF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFC, 0xA0, 0xF3, 0x3C, 0xFB, - 0x00, 0x00, 0x00, 0x00, 0xB3, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0xA2, 0x0F, 0x10, 0x00, 0xB5, 0xFC, - 0xC0, 0xF3, 0xD6, 0xF3, 0xA4, 0x2C, 0x02, 0x00, 0xB9, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0xA6, 0x2C, - 0x02, 0x00, 0x90, 0xFD, 0xC0, 0xF3, 0xAA, 0xF3, 0xAA, 0x2C, 0x02, 0x00, 0x88, 0xFC, 0xC0, 0xF3, - 0xD6, 0xF3, 0x78, 0x2B, 0x04, 0x00, 0x89, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x7C, 0x2B, 0x04, 0x00, - 0xC5, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x80, 0x2B, 0x04, 0x00, 0x23, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, - 0x34, 0x27, 0x04, 0x00, 0x2A, 0xFC, 0xC0, 0xF3, 0x2C, 0xF4, 0xB6, 0x26, 0x02, 0x00, 0xC7, 0xFD, - 0xC0, 0xF3, 0xAA, 0xF3, 0xA6, 0x2B, 0x0A, 0x00, 0x29, 0xFC, 0x7F, 0xF4, 0x43, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0xC2, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x86, 0x2B, 0x08, 0x00, 0x32, 0xFC, 0xC0, 0xF3, - 0xD6, 0xF3, 0x5C, 0x01, 0x02, 0x00, 0x33, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x5E, 0x01, 0x02, 0x00, - 0x35, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x8E, 0x2B, 0x02, 0x00, 0xC7, 0xFC, 0xC0, 0xF3, 0xEB, 0xF5, - 0x90, 0x2B, 0x02, 0x00, 0x10, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0xA8, 0x26, 0x02, 0x00, 0x11, 0xFC, - 0xC0, 0xF3, 0xD6, 0xF3, 0x44, 0x27, 0x06, 0x00, 0x12, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x4A, 0x27, - 0x06, 0x00, 0x13, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x50, 0x27, 0x06, 0x00, 0x14, 0xFC, 0xC0, 0xF3, - 0xD6, 0xF3, 0x56, 0x27, 0x06, 0x00, 0x15, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x5C, 0x27, 0x06, 0x00, - 0x16, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x62, 0x27, 0x06, 0x00, 0x17, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, - 0x2A, 0x27, 0x02, 0x00, 0x83, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x6C, 0x01, 0x02, 0x00, 0x97, 0xFC, - 0xC0, 0xF3, 0xD6, 0xF3, 0x6A, 0x01, 0x02, 0x00, 0x98, 0xFC, 0xD7, 0xF5, 0xC5, 0xF5, 0xEC, 0x00, - 0x02, 0x00, 0x99, 0xFC, 0xD7, 0xF5, 0xC5, 0xF5, 0xEC, 0x02, 0x02, 0x00, 0x9A, 0xFC, 0xD7, 0xF5, - 0xC5, 0xF5, 0xEC, 0x04, 0x02, 0x00, 0x9B, 0xFC, 0xD7, 0xF5, 0xC5, 0xF5, 0xEC, 0x06, 0x02, 0x00, - 0x9C, 0xFC, 0xD7, 0xF5, 0xC5, 0xF5, 0xEC, 0x08, 0x02, 0x00, 0x9D, 0xFC, 0xD7, 0xF5, 0xC5, 0xF5, - 0xEC, 0x0A, 0x02, 0x00, 0x18, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x2C, 0x27, 0x02, 0x00, 0x22, 0xFC, - 0xC0, 0xF3, 0xD6, 0xF3, 0x32, 0x27, 0x02, 0x00, 0x24, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x38, 0x27, - 0x02, 0x00, 0xC0, 0xFC, 0xA0, 0xF3, 0x50, 0xF6, 0x00, 0x00, 0x06, 0x00, 0x9E, 0xFC, 0xC0, 0xF3, - 0x83, 0xF5, 0x6E, 0x01, 0x04, 0x00, 0x9F, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x3E, 0x2C, 0x04, 0x00, - 0xA0, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x42, 0x2C, 0x04, 0x00, 0xA1, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, - 0x46, 0x2C, 0x04, 0x00, 0xA2, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x4A, 0x2C, 0x04, 0x00, 0xA3, 0xFC, - 0xC0, 0xF3, 0xD6, 0xF3, 0x4E, 0x2C, 0x04, 0x00, 0xA4, 0xFC, 0xC0, 0xF3, 0xD6, 0xF3, 0x52, 0x2C, - 0x04, 0x00, 0x20, 0xFD, 0xF1, 0xF3, 0xAA, 0xF3, 0xD5, 0xFB, 0x08, 0x00, 0x21, 0xFD, 0xF1, 0xF3, - 0xAA, 0xF3, 0xD9, 0xFB, 0x0A, 0x00, 0x22, 0xFD, 0xF1, 0xF3, 0xAA, 0xF3, 0xDE, 0xFB, 0x16, 0x00, - 0x23, 0xFD, 0xF1, 0xF3, 0xAA, 0xF3, 0xE9, 0xFB, 0x0A, 0x00, 0x45, 0xFD, 0xC0, 0xF3, 0xAA, 0xF3, - 0xCA, 0x00, 0x02, 0x00, 0x47, 0xFD, 0xC0, 0xF3, 0xAA, 0xF3, 0x36, 0x01, 0x02, 0x00, 0x48, 0xFD, - 0xD4, 0xF4, 0xAA, 0xF3, 0x5C, 0x01, 0x02, 0x00, 0x49, 0xFD, 0xD4, 0xF4, 0xAA, 0xF3, 0x5E, 0x01, - 0x02, 0x00, 0x4A, 0xFD, 0xC0, 0xF3, 0xAA, 0xF3, 0x56, 0x01, 0x02, 0x00, 0x4B, 0xFD, 0xC0, 0xF3, - 0xAA, 0xF3, 0x58, 0x01, 0x02, 0x00, 0x4D, 0xFD, 0xF1, 0xF3, 0xAA, 0xF3, 0xEE, 0xFB, 0x08, 0x00, - 0x4F, 0xFD, 0xE8, 0xF4, 0xAA, 0xF3, 0x96, 0x2B, 0x02, 0x00, 0xC2, 0xFD, 0xDE, 0xF4, 0xAA, 0xF3, - 0x00, 0x00, 0x02, 0x00, 0x40, 0xFD, 0xE9, 0xF3, 0xAA, 0xF3, 0x78, 0x01, 0x02, 0x00, 0x24, 0xFD, - 0x01, 0xF5, 0xAA, 0xF3, 0x00, 0x00, 0x02, 0x00, 0x91, 0xFD, 0xC0, 0xF3, 0xAA, 0xF3, 0xCC, 0x1E, - 0x02, 0x00, 0x93, 0xFD, 0xC0, 0xF3, 0xAA, 0xF3, 0xD2, 0x1E, 0x02, 0x00, 0x8F, 0xFD, 0x0E, 0xF5, - 0xAA, 0xF3, 0x00, 0x00, 0x08, 0x00, 0xC1, 0xFD, 0x92, 0xF6, 0xAA, 0xF3, 0xC8, 0x00, 0x02, 0x00, - 0xC6, 0xFD, 0xC0, 0xF3, 0xAA, 0xF3, 0x20, 0x30, 0x04, 0x00, 0x25, 0xFD, 0xC0, 0xF3, 0xAA, 0xF3, - 0x62, 0x01, 0x02, 0x00, 0x89, 0xFD, 0x96, 0xF4, 0xAA, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x8A, 0xFD, - 0x0E, 0xF4, 0xAA, 0xF3, 0x7E, 0x2C, 0x24, 0x00, 0x46, 0xFD, 0xC0, 0xF3, 0xAA, 0xF3, 0x7A, 0x01, - 0x06, 0x00, 0x86, 0xFD, 0xC0, 0xF3, 0xAA, 0xF3, 0xB0, 0x26, 0x06, 0x00, 0x87, 0xFD, 0xC0, 0xF3, - 0xAA, 0xF3, 0x76, 0x2C, 0x06, 0x00, 0x8B, 0xFD, 0x96, 0xF9, 0xAA, 0xF3, 0x00, 0x00, 0x12, 0x00, - 0x8B, 0xFD, 0x96, 0xF9, 0xAA, 0xF3, 0x00, 0x00, 0x12, 0x00, 0x8E, 0xFD, 0xC0, 0xF3, 0xAA, 0xF3, - 0xEE, 0x14, 0x02, 0x00, 0x80, 0xFD, 0xEF, 0xF4, 0xAA, 0xF3, 0x22, 0x00, 0x02, 0x00, 0x81, 0xFD, - 0xEF, 0xF4, 0xAA, 0xF3, 0x22, 0x02, 0x02, 0x00, 0x82, 0xFD, 0xEF, 0xF4, 0xAA, 0xF3, 0x22, 0x04, - 0x02, 0x00, 0x83, 0xFD, 0xEF, 0xF4, 0xAA, 0xF3, 0x22, 0x06, 0x02, 0x00, 0x84, 0xFD, 0xEF, 0xF4, - 0xAA, 0xF3, 0x22, 0x08, 0x02, 0x00, 0x85, 0xFD, 0xEF, 0xF4, 0xAA, 0xF3, 0x22, 0x0A, 0x02, 0x00, - 0x00, 0xF1, 0x46, 0x00, 0x64, 0xF3, 0xF6, 0x00, 0x00, 0x03, 0x8E, 0xF7, 0x1F, 0x00, 0x34, 0x01, - 0xC8, 0x00, 0x96, 0x01, 0xCC, 0x00, 0xFA, 0x00, 0x78, 0x01, 0xD2, 0x25, 0x18, 0x01, 0xCC, 0x1E, - 0xC8, 0x00, 0x00, 0x00, 0x02, 0x15, 0x00, 0x00, 0x06, 0x17, 0x12, 0x01, 0x03, 0x00, 0xAE, 0x00, - 0xEC, 0x00, 0x44, 0x00, 0xDC, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x09, 0x08, 0x24, 0x28, 0x06, - 0x0C, 0x18, 0x08, 0x30, 0x14, 0x0C, 0x08, 0x36, 0x10, 0x12, 0xA1, 0xB6, 0x14, 0xB6, 0x50, 0xB7, - 0x59, 0xB7, 0x25, 0xB6, 0xCE, 0xB6, 0x93, 0xB6, 0x15, 0x1C, 0xD0, 0x1A, 0x15, 0x1C, 0x8B, 0x1B, - 0xEE, 0x1A, 0xCB, 0x1A, 0xD2, 0x1B, 0xF1, 0x1B, 0x06, 0x1C, 0x48, 0x1C, 0x74, 0x1C, 0x74, 0x1B, - 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, - 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x23, 0x46, 0x23, 0x46, 0x23, 0x46, 0x1C, 0x47, 0x1C, 0x47, - 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, - 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1D, 0x47, 0x9A, 0x48, 0xDA, 0x48, 0x1A, 0x48, 0x5A, 0x48, - 0x9A, 0x48, 0xDA, 0x48, 0x1A, 0x48, 0x5A, 0x48, 0x9A, 0x48, 0xDA, 0x48, 0x1A, 0x48, 0x5A, 0x48, - 0x9A, 0x48, 0x33, 0x48, 0x78, 0x49, 0x78, 0x49, 0x79, 0x49, 0x79, 0x49, 0x79, 0x49, 0x79, 0x49, - 0x7A, 0x49, 0x7A, 0x49, 0x7A, 0x49, 0x7A, 0x49, 0x7B, 0x49, 0x7B, 0x49, 0x7B, 0x49, 0x7C, 0x49, - 0xD8, 0x03, 0xDC, 0x03, 0xE0, 0x03, 0xE4, 0x03, 0xF0, 0x03, 0xF4, 0x03, 0xF8, 0x03, 0x0A, 0x04, - 0x0E, 0x04, 0x12, 0x04, 0x16, 0x04, 0x0C, 0x04, 0x10, 0x04, 0x14, 0x04, 0x18, 0x04, 0x1C, 0x04, - 0x20, 0x04, 0x24, 0x04, 0x28, 0x04, 0x4C, 0x04, 0x50, 0x04, 0x54, 0x04, 0x58, 0x04, 0x5C, 0x04, - 0x60, 0x04, 0x64, 0x04, 0x68, 0x04, 0x6C, 0x04, 0x70, 0x04, 0x74, 0x04, 0x7D, 0x04, 0x81, 0x04, - 0x85, 0x04, 0x89, 0x04, 0x8D, 0x04, 0x10, 0x00, 0x8E, 0x19, 0xAC, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x3C, 0x0C, 0x00, 0x00, 0xFF, 0x3F, 0x44, 0x04, 0x00, 0x00, 0xD3, 0x22, 0x44, 0x04, - 0x9C, 0x02, 0xCB, 0x54, 0x44, 0x04, 0x00, 0x00, 0x01, 0x00, 0x44, 0x04, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x0C, 0x71, 0x00, 0x30, 0x50, 0x20, 0x00, 0x80, 0xBF, 0x1F, 0xA6, 0x28, 0x00, 0x0B, 0x02, - 0x60, 0x84, 0x4C, 0x00, 0x02, 0x00, 0x4B, 0x1C, 0x98, 0x00, 0x00, 0x00, 0x20, 0x0B, 0x34, 0x04, - 0xFD, 0x34, 0x34, 0x00, 0x38, 0x04, 0xFD, 0x34, 0x34, 0x00, 0x3C, 0x04, 0x01, 0x00, 0x10, 0x00, - 0x00, 0x08, 0x00, 0x52, 0x14, 0x00, 0x04, 0x08, 0x0E, 0x32, 0x00, 0xA6, 0x10, 0x08, 0xC4, 0x03, - 0x50, 0x60, 0x18, 0x08, 0xF0, 0x3F, 0xFC, 0x01, 0x10, 0x0C, 0x00, 0x00, 0x80, 0x04, 0x14, 0x0C, - 0x00, 0x00, 0x00, 0x41, 0x20, 0x0C, 0xB0, 0x00, 0xB0, 0xB8, 0x24, 0x0C, 0x00, 0x00, 0xAB, 0x05, - 0x2C, 0x0C, 0x80, 0x05, 0x00, 0xFF, 0x30, 0x0C, 0x00, 0x00, 0xB0, 0x04, 0x34, 0x0C, 0x03, 0x00, - 0x00, 0xE8, 0x44, 0x0C, 0x04, 0x00, 0xFF, 0x0F, 0x00, 0x10, 0x2E, 0x00, 0x0C, 0xE3, 0x44, 0x04, - 0x00, 0x00, 0x01, 0x04, 0x44, 0x04, 0x00, 0x00, 0x01, 0x01, 0x44, 0x04, 0x00, 0x00, 0x01, 0x00, - 0x44, 0x04, 0x00, 0x00, 0x01, 0x04, 0x44, 0x04, 0x00, 0x00, 0x80, 0x03, 0x48, 0x0C, 0x00, 0x00, - 0x7F, 0x00, 0x04, 0x04, 0x08, 0x48, 0x00, 0x00, 0x04, 0x04, 0x08, 0x40, 0x00, 0x00, 0x00, 0x0C, - 0x71, 0x00, 0x30, 0x30, 0x00, 0x00, 0x5E, 0x40, 0x01, 0x00, 0x18, 0x00, 0x36, 0xC0, 0xE8, 0x0E, - 0x1C, 0x00, 0x78, 0xC8, 0xA5, 0x40, 0x24, 0x00, 0x9E, 0xB0, 0xB9, 0x95, 0x08, 0x08, 0x00, 0xEA, - 0x40, 0x01, 0x0C, 0x08, 0x00, 0xEA, 0x00, 0x00, 0x1C, 0x08, 0x00, 0x00, 0x42, 0x07, 0x20, 0x08, - 0x7B, 0x00, 0xD4, 0x09, 0x2C, 0x04, 0x14, 0x00, 0x50, 0x14, 0x30, 0x04, 0x28, 0x0F, 0x28, 0x7F, - 0x18, 0x08, 0x20, 0x00, 0xFC, 0x01, 0x04, 0x10, 0x69, 0x00, 0xFD, 0xC3, 0x08, 0x10, 0x69, 0x00, - 0xFD, 0xC3, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x48, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x48, 0x0C, - 0x00, 0x00, 0x7F, 0x00, 0x04, 0x04, 0x08, 0x48, 0x02, 0x00, 0x00, 0x00, 0x5E, 0x48, 0x00, 0x00, - 0x04, 0x04, 0x08, 0x40, 0x02, 0x00, 0x00, 0x0C, 0x71, 0x00, 0x30, 0x50, 0x00, 0x00, 0x5E, 0x48, - 0x01, 0x00, 0x18, 0x00, 0x3A, 0xC0, 0xE8, 0x04, 0x1C, 0x00, 0x78, 0xD0, 0xA5, 0x40, 0x24, 0x00, - 0x9E, 0xB0, 0xB9, 0x85, 0x2C, 0x04, 0x14, 0x00, 0x50, 0x14, 0x30, 0x04, 0x28, 0x0F, 0x28, 0x7F, - 0x08, 0x08, 0x00, 0xEA, 0x40, 0x01, 0x0C, 0x08, 0x00, 0xEA, 0x00, 0x00, 0x1C, 0x08, 0x00, 0x00, - 0x42, 0x07, 0x20, 0x08, 0x7B, 0x00, 0xD4, 0x09, 0x18, 0x08, 0xF0, 0x3F, 0xFC, 0x01, 0x04, 0x10, - 0x69, 0x00, 0xDD, 0xCD, 0x08, 0x10, 0x69, 0x00, 0xDD, 0xCD, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x40, 0x01, 0x41, 0x01, 0x0C, 0x04, 0x40, 0x04, - 0x41, 0x04, 0x10, 0x04, 0xD6, 0x08, 0x56, 0x0A, 0x14, 0x04, 0x42, 0x02, 0x56, 0x0A, 0x18, 0x04, - 0x56, 0x0A, 0x40, 0x02, 0x1C, 0x04, 0x42, 0x0A, 0x42, 0x2A, 0x20, 0x04, 0xC2, 0x00, 0xD6, 0x08, - 0x24, 0x04, 0xD6, 0x08, 0xC0, 0x00, 0x28, 0x04, 0xC2, 0x08, 0xC2, 0x28, 0x08, 0x04, 0x40, 0x01, - 0x41, 0x01, 0x0C, 0x04, 0x00, 0x01, 0x01, 0x01, 0x10, 0x04, 0x56, 0x0A, 0x56, 0x0A, 0x14, 0x04, - 0x42, 0x02, 0x56, 0x0A, 0x18, 0x04, 0x56, 0x0A, 0x40, 0x02, 0x1C, 0x04, 0x42, 0x0A, 0x42, 0x2A, - 0x20, 0x04, 0x42, 0x02, 0x56, 0x0A, 0x24, 0x04, 0x56, 0x0A, 0x40, 0x02, 0x28, 0x04, 0x42, 0x0A, - 0x42, 0x2A, 0x08, 0x04, 0x40, 0x01, 0x41, 0x01, 0x0C, 0x04, 0x40, 0x04, 0x41, 0x04, 0x10, 0x04, - 0xCE, 0x08, 0x4E, 0x0A, 0x14, 0x04, 0x42, 0x02, 0x4E, 0x0A, 0x18, 0x04, 0x4E, 0x0A, 0x40, 0x02, - 0x1C, 0x04, 0x42, 0x0A, 0x42, 0x2A, 0x20, 0x04, 0xC2, 0x00, 0xCE, 0x08, 0x24, 0x04, 0xCE, 0x08, - 0xC0, 0x00, 0x28, 0x04, 0xC2, 0x08, 0xC2, 0x28, 0x08, 0x04, 0x40, 0x01, 0x41, 0x01, 0x0C, 0x04, - 0x00, 0x01, 0x01, 0x01, 0x10, 0x04, 0x4E, 0x0A, 0x4E, 0x0A, 0x14, 0x04, 0x42, 0x02, 0x4E, 0x0A, - 0x18, 0x04, 0x4E, 0x0A, 0x40, 0x02, 0x1C, 0x04, 0x42, 0x0A, 0x42, 0x2A, 0x20, 0x04, 0x42, 0x02, - 0x4E, 0x0A, 0x24, 0x04, 0x4E, 0x0A, 0x40, 0x02, 0x28, 0x04, 0x42, 0x0A, 0x42, 0x2A, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, - 0x05, 0x00, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, - 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, - 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, - 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x17, 0xA0, 0x17, 0xA0, 0x17, - 0xA0, 0x18, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, - 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, - 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, - 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, - 0xFF, 0x06, 0x00, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x00, 0x5D, 0x00, 0x52, 0x00, - 0x48, 0x00, 0x40, 0x00, 0x38, 0x00, 0x31, 0x00, 0x2C, 0x00, 0x27, 0x00, 0x23, 0x00, 0x1F, 0x00, - 0x00, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x00, 0x5D, 0x00, 0x52, 0x00, 0x48, 0x00, - 0x40, 0x00, 0x38, 0x00, 0x31, 0x00, 0x2C, 0x00, 0x27, 0x00, 0x23, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, - 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x15, 0x00, 0x6E, 0x6F, 0x6E, 0x2D, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, - 0x53, 0x53, 0x49, 0x44, 0x20, 0x21, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x01, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x00, 0x09, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0x64, 0x00, 0x00, 0x00, - 0x48, 0x45, 0x52, 0x4D, 0x45, 0x53, 0x20, 0x32, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x10, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x03, 0x00, 0x15, 0x00, 0x6E, 0x6F, 0x6E, 0x2D, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x20, 0x53, 0x53, 0x49, 0x44, 0x20, 0x21, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x09, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, - 0x64, 0x00, 0x00, 0x00, 0x48, 0x45, 0x52, 0x4D, 0x45, 0x53, 0x20, 0x32, 0x00, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, - 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 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, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x69, 0x72, 0x73, 0x74, 0x20, 0x57, 0x61, - 0x76, 0x65, 0x4C, 0x41, 0x4E, 0x20, 0x49, 0x49, 0x20, 0x53, 0x53, 0x49, 0x44, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0x0F, 0xF0, 0x0F, 0x0F, 0x00, 0x50, 0x01, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x14, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x07, 0x00, 0x30, 0x00, 0xFF, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, - 0x0A, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0A, 0x00, - 0x00, 0x00, 0x02, 0x01, 0x02, 0x04, 0x0B, 0x16, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x82, 0x84, - 0x8B, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x20, 0x00, 0x1B, 0x00, 0x17, 0x00, 0x11, 0x00, 0x10, 0x00, 0x0B, 0x00, - 0x0B, 0x00, 0x09, 0x00, 0x17, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0D, 0x00, 0x0B, 0x00, 0x09, 0x00, - 0x08, 0x00, 0x07, 0x00, 0x0D, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x08, 0x00, 0x05, 0x00, 0x05, 0x00, - 0xD8, 0x0C, 0xC0, 0x08, 0x90, 0x0D, 0x60, 0x09, 0x48, 0x0E, 0x30, 0x0A, 0x24, 0x0F, 0x18, 0x0B, - 0x0B, 0x6E, 0x0B, 0x37, 0x02, 0x14, 0x01, 0x0A, 0xFF, 0x0F, 0xF0, 0x0F, 0xFF, 0x0F, 0xF0, 0x0F, - 0xFF, 0x0F, 0xF0, 0x0F, 0xFF, 0x0F, 0xF0, 0x0F, 0xFF, 0x0F, 0xF0, 0x0F, 0xFF, 0x0F, 0xF0, 0x0F, - 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xDD, 0x00, 0x50, 0xF2, 0x01, 0x01, 0x00, - 0x00, 0x50, 0xF2, 0x05, 0x02, 0x00, 0x00, 0x50, 0xF2, 0x02, 0x00, 0x50, 0xF2, 0x04, 0x02, 0x00, - 0x00, 0x50, 0xF2, 0x00, 0x00, 0x50, 0xF2, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00, 0x15, 0x00, 0x02, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, - 0x15, 0x00, 0x20, 0x00, 0x11, 0x00, 0x20, 0x00, 0x16, 0x26, 0xE2, 0x2B, 0xEA, 0x2D, 0xC4, 0x2D, - 0xEE, 0x2D, 0x7E, 0x2C, 0x1E, 0x2E, 0x22, 0x2E, 0xFF, 0xFF, 0x2C, 0x2E, 0x00, 0x00, 0x4E, 0x28, - 0xD8, 0x2B, 0x22, 0x2E, 0xFF, 0xFF, 0x00, 0x00, 0x16, 0x26, 0xE2, 0x2B, 0xEA, 0x2D, 0xFF, 0xFF, - 0xEE, 0x2D, 0x7E, 0x2C, 0x1E, 0x2E, 0x22, 0x2E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x2C, 0x2E, 0x00, 0x00, 0xE2, 0x2B, 0x34, 0x2E, 0x22, 0x2E, 0x00, 0x00, 0x00, 0x05, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2A, 0x00, 0x00, 0x08, 0x32, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x60, 0x1D, 0x00, 0x00, 0x00, 0x0D, 0x81, - 0x00, 0x60, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0xDD, 0x00, 0xFF, 0xFF, 0x97, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x10, 0x00, 0x19, 0x0A, 0x09, 0x46, 0x1C, 0x60, 0x18, 0x00, 0x19, 0x1D, 0x09, 0x42, - 0x1C, 0x60, - -}; /* fw_image_2_data */ - -static const hcf_8 fw_image_3_data[] = { - 0x00, 0x60, 0x46, 0x74, 0xCD, 0xE2, 0x04, 0xE1, 0x02, 0x60, 0x00, 0xE1, 0x82, 0xF3, 0x21, 0x60, - 0xCE, 0x61, 0x60, 0x40, 0x01, 0x2B, 0x02, 0x00, 0x21, 0x60, 0x56, 0x61, 0x0F, 0x60, 0xE8, 0x64, - 0x59, 0xD1, 0x58, 0xD9, 0x59, 0xD1, 0x58, 0xD9, 0x3F, 0x44, 0x40, 0x26, 0x05, 0x00, 0x18, 0x60, - 0x22, 0xF3, 0x5A, 0xD1, 0xA0, 0x50, 0xA4, 0x50, 0x3F, 0x40, 0x02, 0x2B, 0x03, 0x00, 0x18, 0x60, - 0x74, 0x78, 0xFF, 0xFF, 0x04, 0x29, 0xFE, 0x01, 0xC4, 0xE2, 0x43, 0x64, 0x3A, 0xDB, 0x82, 0xF3, - 0xFF, 0xFF, 0x60, 0x41, 0x3F, 0x44, 0xFF, 0x01, 0x3F, 0x40, 0x40, 0x26, 0x05, 0x00, 0x18, 0x60, - 0x20, 0xF3, 0x5A, 0xD1, 0xA0, 0x50, 0xA4, 0x52, 0xC4, 0xE2, 0x00, 0x63, 0x81, 0xFD, 0x32, 0x7B, - 0x4D, 0xE2, 0xBF, 0xFE, 0xC4, 0xE2, 0x41, 0xFF, 0xE0, 0xFE, 0xE1, 0xFE, 0xE2, 0xFE, 0x43, 0xFF, - 0x44, 0xFF, 0x46, 0xFF, 0x83, 0xF3, 0x62, 0xFF, 0x60, 0x40, 0x05, 0x36, 0x2D, 0xFF, 0x07, 0x36, - 0xD5, 0xFE, 0x08, 0xE1, 0x88, 0x60, 0x85, 0x71, 0x8D, 0xE2, 0xA3, 0x60, 0x30, 0x78, 0xFF, 0xFF, - 0x00, 0x60, 0x10, 0x62, 0x1A, 0x60, 0x58, 0x4D, 0xB4, 0x78, 0xFF, 0xFF, 0x64, 0x41, 0xA9, 0x9C, - 0x60, 0x45, 0x1A, 0x60, 0x58, 0x4D, 0x88, 0x78, 0xFF, 0xFF, 0x82, 0xF1, 0x09, 0x60, 0xB4, 0x61, - 0x64, 0x44, 0x01, 0x27, 0x24, 0x00, 0x60, 0x40, 0x0E, 0x3A, 0x0D, 0x00, 0x01, 0x7C, 0x10, 0x60, - 0xF2, 0xF9, 0x44, 0x60, 0x08, 0x7C, 0x10, 0x60, 0xC4, 0xF9, 0x12, 0x60, 0xE5, 0xF1, 0x02, 0x60, - 0xB0, 0x61, 0xB1, 0x9C, 0x26, 0x00, 0x00, 0x7C, 0x10, 0x60, 0xF2, 0xF9, 0x40, 0x60, 0x08, 0x7C, - 0x10, 0x60, 0xC4, 0xF9, 0x12, 0x60, 0xE5, 0xF1, 0x02, 0x60, 0x90, 0x61, 0xB1, 0x9C, 0x09, 0x60, - 0x67, 0x65, 0xFF, 0xB4, 0xC4, 0x85, 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x81, 0x12, 0x00, 0xFF, 0xB4, - 0xED, 0xA0, 0x25, 0x60, 0xCC, 0x61, 0x04, 0x04, 0xE2, 0xA0, 0xD9, 0x81, 0x01, 0x04, 0xD9, 0x81, - 0xA1, 0xD1, 0x02, 0x60, 0x50, 0x61, 0x1F, 0x60, 0xF6, 0x65, 0xE0, 0x84, 0x44, 0xD3, 0xB1, 0x9C, - 0xC8, 0x81, 0x61, 0x47, 0x00, 0x7E, 0xE9, 0x81, 0x07, 0x60, 0xF0, 0x65, 0xA5, 0x81, 0x0B, 0xB9, - 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x85, 0xB5, 0x85, 0x04, 0x60, 0x44, 0x62, 0x1A, 0x60, 0x58, 0x4D, - 0x88, 0x78, 0xFF, 0xFF, 0x82, 0xF3, 0xC8, 0x61, 0x61, 0x54, 0xCD, 0xE2, 0x60, 0x40, 0x01, 0x27, - 0x2E, 0x00, 0xCC, 0x84, 0xE0, 0x85, 0x15, 0x60, 0xA2, 0xE7, 0x1F, 0x60, 0x86, 0x64, 0x1A, 0x60, - 0x58, 0x4F, 0x7D, 0x78, 0xFF, 0xFF, 0x1F, 0x60, 0xA2, 0x64, 0x1A, 0x60, 0x58, 0x4F, 0x7D, 0x78, - 0xFF, 0xFF, 0x1F, 0x60, 0xBE, 0x64, 0x1A, 0x60, 0x58, 0x4F, 0x7D, 0x78, 0xFF, 0xFF, 0x1F, 0x60, - 0xDA, 0x64, 0x1A, 0x60, 0x58, 0x4F, 0x7D, 0x78, 0xFF, 0xFF, 0x75, 0x64, 0x06, 0x61, 0x61, 0x48, - 0x60, 0x44, 0x80, 0xBC, 0xFF, 0xB4, 0x60, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x21, 0x60, - 0xEC, 0x7C, 0x07, 0x60, 0xE9, 0xF9, 0x21, 0x60, 0x74, 0x63, 0x14, 0x61, 0x21, 0x00, 0x11, 0x60, - 0x62, 0xF1, 0xFF, 0xB4, 0xED, 0xA0, 0x64, 0x41, 0x04, 0x04, 0xE2, 0xA0, 0xD9, 0x81, 0x01, 0x04, - 0xD9, 0x81, 0xA1, 0xD1, 0x10, 0x60, 0x91, 0xF3, 0x64, 0x41, 0xFF, 0xB1, 0xFF, 0x60, 0x00, 0x65, - 0xA4, 0x84, 0x34, 0x94, 0xA2, 0xDB, 0x5A, 0xD3, 0x64, 0x41, 0xA5, 0x81, 0xFF, 0xB4, 0x34, 0x94, - 0xA2, 0xDB, 0x22, 0x60, 0x58, 0x7C, 0x07, 0x60, 0xE9, 0xF9, 0x21, 0x60, 0x02, 0x63, 0x13, 0x61, - 0x1A, 0x60, 0x58, 0x4D, 0x9C, 0x78, 0xFF, 0xFF, 0x07, 0x60, 0xE9, 0xF3, 0x31, 0x40, 0x80, 0x26, - 0x36, 0xA4, 0x07, 0x60, 0xE9, 0xFB, 0x60, 0x43, 0x09, 0x61, 0x1A, 0x60, 0x58, 0x4D, 0x9C, 0x78, - 0xFF, 0xFF, 0x82, 0xF3, 0x22, 0x60, 0xC4, 0x61, 0x00, 0x7C, 0x7E, 0x63, 0x59, 0xD9, 0xFE, 0x1F, - 0x60, 0x40, 0x01, 0x27, 0x03, 0x00, 0x23, 0x60, 0x46, 0x65, 0x15, 0x00, 0xFF, 0xB4, 0xF9, 0xA0, - 0x23, 0x60, 0x68, 0x65, 0x01, 0x7C, 0x0D, 0x04, 0xED, 0xA0, 0x23, 0x60, 0x8A, 0x65, 0x11, 0x7C, - 0x08, 0x04, 0xE2, 0xA0, 0x23, 0x60, 0xAC, 0x65, 0x21, 0x7C, 0x03, 0x04, 0x23, 0x60, 0xCE, 0x65, - 0x31, 0x7C, 0x64, 0x5F, 0x64, 0xFB, 0xA5, 0xD3, 0xDA, 0x85, 0xF0, 0xA0, 0x22, 0x60, 0xC4, 0x61, - 0x08, 0x06, 0x40, 0x54, 0x58, 0x53, 0x08, 0xFF, 0xA2, 0x60, 0xE7, 0x64, 0x43, 0xFB, 0x08, 0xFF, - 0xFF, 0x01, 0x60, 0x43, 0x60, 0x46, 0xA5, 0xD1, 0xDA, 0x85, 0xA5, 0xD3, 0xDA, 0x85, 0x59, 0xD9, - 0x59, 0xDB, 0x59, 0xD9, 0x59, 0xDB, 0xFB, 0x1F, 0x0C, 0x63, 0xA5, 0xD1, 0xDA, 0x85, 0xA5, 0xD3, - 0xDA, 0x85, 0x59, 0xD9, 0x59, 0xDB, 0x59, 0xD9, 0x59, 0xDB, 0xF7, 0x1F, 0x66, 0x44, 0x0E, 0x63, - 0x53, 0x93, 0x60, 0x40, 0x10, 0x36, 0x07, 0x00, 0x65, 0x44, 0x48, 0xD3, 0x59, 0xD9, 0x59, 0xDB, - 0x59, 0xD9, 0x59, 0xDB, 0xFB, 0x1F, 0x12, 0x60, 0xBC, 0xF1, 0x64, 0xF3, 0x64, 0x43, 0xDB, 0x81, - 0x25, 0x60, 0x5A, 0x65, 0x60, 0x40, 0x01, 0x37, 0x12, 0x00, 0x11, 0x37, 0x17, 0x00, 0x21, 0x37, - 0x1D, 0x00, 0x31, 0x37, 0x22, 0x00, 0xA3, 0xD1, 0x12, 0x60, 0xB7, 0xF5, 0x64, 0x44, 0xFF, 0xB4, - 0x12, 0x60, 0xB6, 0xFB, 0x64, 0x47, 0xFF, 0xB4, 0x12, 0x60, 0xAD, 0xF1, 0x1D, 0x00, 0xA1, 0xD3, - 0x12, 0x60, 0xB8, 0xF5, 0xFF, 0xB4, 0x12, 0x60, 0xAE, 0xF1, 0x16, 0x00, 0xA1, 0xD3, 0x12, 0x60, - 0xB9, 0xF5, 0x60, 0x47, 0xFF, 0xB4, 0x12, 0x60, 0xAF, 0xF1, 0x0E, 0x00, 0x59, 0xD3, 0x12, 0x60, - 0xBA, 0xF5, 0xFF, 0xB4, 0x12, 0x60, 0xB0, 0xF1, 0x07, 0x00, 0x59, 0xD3, 0x12, 0x60, 0xBB, 0xF5, - 0x60, 0x47, 0xFF, 0xB4, 0x12, 0x60, 0xB1, 0xF1, 0x12, 0x60, 0xB5, 0xFB, 0x12, 0x60, 0xB2, 0xF9, - 0x66, 0x42, 0xFC, 0xA2, 0xA2, 0xD3, 0x24, 0x60, 0x48, 0x63, 0xCC, 0x84, 0xE8, 0x84, 0xCC, 0x81, - 0x63, 0x45, 0xA6, 0xD3, 0xDA, 0x82, 0xFF, 0xB4, 0xFF, 0xFF, 0x03, 0x03, 0x60, 0x40, 0x80, 0x2B, - 0x03, 0x00, 0xDA, 0x86, 0xCD, 0x81, 0xF5, 0x01, 0x00, 0xB9, 0xA6, 0xD3, 0x0B, 0x03, 0x5A, 0xD1, - 0xDA, 0x86, 0xFF, 0xB4, 0xE0, 0x84, 0xC4, 0x84, 0x5C, 0x90, 0xBD, 0xD9, 0xFD, 0x02, 0xCD, 0x81, - 0x66, 0x42, 0xF2, 0x02, 0x5A, 0xD3, 0x24, 0x60, 0x86, 0x65, 0xD7, 0x80, 0xBD, 0xDB, 0xFD, 0x02, - 0x64, 0xF3, 0x15, 0x60, 0xDD, 0xF1, 0x60, 0x40, 0x01, 0x27, 0x09, 0x00, 0x64, 0x40, 0x10, 0x26, - 0x06, 0x00, 0x13, 0x64, 0xAD, 0xFB, 0x01, 0x60, 0x67, 0x64, 0x37, 0xFB, 0x09, 0x00, 0x08, 0x64, - 0xAD, 0xFB, 0x82, 0xF3, 0x01, 0x60, 0x67, 0x7C, 0x60, 0x40, 0x01, 0x27, 0x5B, 0x7C, 0x37, 0xF9, - 0x13, 0x60, 0x5B, 0xF1, 0x64, 0xF3, 0x15, 0x60, 0xD2, 0xF9, 0x15, 0x60, 0xD6, 0xF9, 0x60, 0x40, - 0x01, 0x27, 0x0A, 0x00, 0xFF, 0xB5, 0x10, 0x60, 0xA8, 0x63, 0x65, 0x41, 0xCD, 0x81, 0x06, 0xA3, - 0xFD, 0x02, 0xFA, 0xA3, 0xA3, 0xD3, 0x0F, 0x00, 0x01, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0x11, 0x60, - 0x14, 0x61, 0xA1, 0xD1, 0xFF, 0xFF, 0xD0, 0x80, 0x08, 0xA1, 0xFB, 0x02, 0xFC, 0xA1, 0xA1, 0xD3, - 0x15, 0x60, 0xD2, 0xF1, 0xFF, 0xB4, 0xD0, 0x80, 0xFF, 0xFF, 0x04, 0x07, 0x15, 0x60, 0xD2, 0xFB, - 0x15, 0x60, 0xD6, 0xFB, 0x25, 0x60, 0x7A, 0x63, 0x24, 0x60, 0x08, 0x65, 0x12, 0x60, 0xB6, 0xF1, - 0x23, 0x60, 0xF0, 0x61, 0x25, 0x60, 0x68, 0x64, 0x40, 0x4F, 0x04, 0x64, 0xC3, 0x60, 0x58, 0x4D, - 0x25, 0x78, 0xFF, 0xFF, 0x25, 0x60, 0x82, 0x63, 0x12, 0x60, 0xB5, 0xF1, 0x24, 0x60, 0x48, 0x65, - 0x25, 0x60, 0x66, 0x64, 0x40, 0x4F, 0x08, 0x64, 0xC3, 0x60, 0x58, 0x4D, 0x25, 0x78, 0xFF, 0xFF, - 0x64, 0xF3, 0x08, 0x7C, 0x38, 0xF9, 0x24, 0x60, 0xE0, 0x61, 0x60, 0x40, 0x01, 0x2B, 0x0E, 0x00, - 0x01, 0x37, 0x06, 0x00, 0x11, 0x37, 0x03, 0x00, 0x21, 0x3B, 0x1E, 0xA1, 0x1E, 0xA1, 0x1E, 0xA1, - 0x1C, 0x63, 0x24, 0x60, 0xC2, 0x64, 0x59, 0xD1, 0x58, 0xD9, 0xFD, 0x1F, 0x12, 0x60, 0xB2, 0xF3, - 0x00, 0x7C, 0x60, 0x45, 0x70, 0x62, 0x1A, 0x60, 0x58, 0x4D, 0x88, 0x78, 0xFF, 0xFF, 0x04, 0x29, - 0xFE, 0x01, 0x00, 0x60, 0x10, 0x62, 0x1A, 0x60, 0x58, 0x4D, 0xB4, 0x78, 0xFF, 0xFF, 0x01, 0x61, - 0xB1, 0x9C, 0x60, 0x45, 0x1A, 0x60, 0x58, 0x4D, 0x88, 0x78, 0xFF, 0xFF, 0x18, 0x60, 0x50, 0x78, - 0xFF, 0xFF, 0x44, 0xD3, 0x80, 0x7C, 0x60, 0x48, 0x60, 0x47, 0x00, 0x7F, 0xB0, 0x8A, 0xFF, 0xFF, - 0x01, 0x16, 0xFE, 0x01, 0x2F, 0x58, 0xFF, 0xFF, 0xD5, 0x60, 0x84, 0xE7, 0x62, 0x47, 0x80, 0xBF, - 0x60, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x64, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, - 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x95, 0x60, 0x84, 0xE7, 0x2D, 0x58, 0xFF, 0xFF, - 0x00, 0x7C, 0xBD, 0xD3, 0xD5, 0x60, 0x84, 0xE7, 0x60, 0x47, 0x80, 0xBF, 0x60, 0x4A, 0xBD, 0xD3, - 0x01, 0x16, 0xFE, 0x01, 0x90, 0x8A, 0xBD, 0xD3, 0x01, 0x16, 0xFE, 0x01, 0x90, 0x8A, 0xFF, 0xFF, - 0x01, 0x16, 0xFE, 0x01, 0xCD, 0x81, 0x95, 0x60, 0x84, 0xE7, 0xEB, 0x02, 0x2D, 0x58, 0xFF, 0xFF, - 0xD5, 0x60, 0x84, 0xE7, 0x62, 0x4A, 0x02, 0x64, 0x01, 0x16, 0xFE, 0x01, 0xCC, 0x84, 0xFF, 0xFF, - 0xFD, 0x02, 0x7C, 0x49, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x68, 0x5C, 0x7C, 0x49, 0xFF, 0xFF, - 0x01, 0x16, 0xFE, 0x01, 0x68, 0x44, 0x95, 0x60, 0x84, 0xE7, 0x2D, 0x58, 0xFF, 0xFF, 0x42, 0xFF, - 0x40, 0xFF, 0x3F, 0x40, 0x02, 0x27, 0x33, 0x00, 0x43, 0x45, 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, - 0x3F, 0x40, 0x02, 0x27, 0x1B, 0x00, 0x60, 0xBC, 0x40, 0x40, 0xDD, 0xFE, 0x18, 0x60, 0x07, 0xF1, - 0xAD, 0x4F, 0x00, 0x7F, 0xFA, 0xB4, 0x64, 0x41, 0x64, 0xF1, 0x02, 0xB1, 0x04, 0x65, 0x02, 0x02, - 0x64, 0x40, 0x01, 0x2B, 0x01, 0x65, 0xB4, 0x84, 0xA0, 0x5D, 0x00, 0xEE, 0x19, 0x61, 0xCD, 0x81, - 0xFF, 0xFF, 0xFD, 0x02, 0x43, 0x45, 0x3F, 0x40, 0x02, 0x27, 0x11, 0x00, 0xAE, 0x4F, 0xFD, 0xB4, - 0x04, 0xBC, 0xA0, 0x5E, 0x00, 0x60, 0x02, 0x71, 0x8D, 0xE2, 0x40, 0xE1, 0xA1, 0xFF, 0x04, 0xAC, - 0xA0, 0x5E, 0x0F, 0x60, 0xA0, 0x71, 0x8D, 0xE2, 0xA1, 0xFF, 0xDD, 0xFE, 0x1E, 0x00, 0x43, 0x45, - 0x20, 0x44, 0x60, 0xBC, 0x40, 0x40, 0xAE, 0x4F, 0xFD, 0xB4, 0x04, 0xBC, 0xA0, 0x5E, 0xDD, 0xFE, - 0x00, 0x60, 0x02, 0x71, 0x8D, 0xE2, 0x40, 0xE1, 0xA1, 0xFF, 0x04, 0xAC, 0xA0, 0x5E, 0x00, 0x60, - 0xC8, 0x71, 0x8D, 0xE2, 0xA1, 0xFF, 0x0C, 0x60, 0x00, 0x62, 0x00, 0x60, 0x71, 0x7C, 0x10, 0x60, - 0x00, 0x65, 0x1A, 0x60, 0x58, 0x4D, 0x88, 0x78, 0xFF, 0xFF, 0x20, 0x60, 0x3C, 0x63, 0x1E, 0x61, - 0x1A, 0x60, 0x58, 0x4D, 0x9C, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x14, 0x71, 0x8D, 0xE2, 0xA1, 0xFF, - 0x31, 0x44, 0x40, 0x26, 0x02, 0x00, 0x80, 0x26, 0x17, 0x00, 0x21, 0x60, 0xEC, 0x63, 0x07, 0x60, - 0xE9, 0xFD, 0x09, 0x61, 0x1A, 0x60, 0x58, 0x4D, 0x9C, 0x78, 0xFF, 0xFF, 0x31, 0x44, 0x40, 0x2A, - 0x14, 0x00, 0x31, 0x44, 0x7F, 0xB4, 0x40, 0x51, 0xAE, 0x4C, 0x10, 0x26, 0x0E, 0x00, 0x07, 0x60, - 0xEA, 0xFB, 0x31, 0x44, 0x80, 0xBC, 0x40, 0x51, 0x22, 0x60, 0x22, 0x63, 0x07, 0x60, 0xE9, 0xFD, - 0x09, 0x61, 0x1A, 0x60, 0x58, 0x4D, 0x9C, 0x78, 0xFF, 0xFF, 0x20, 0x60, 0xF0, 0x63, 0x03, 0x61, - 0x1A, 0x60, 0x58, 0x4D, 0x9C, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x10, 0x62, 0x19, 0x60, 0x8F, 0x7C, - 0x00, 0x60, 0xAC, 0x65, 0x1A, 0x60, 0x58, 0x4D, 0x88, 0x78, 0xFF, 0xFF, 0x80, 0xE1, 0xBF, 0xFE, - 0xA1, 0x4F, 0x70, 0xB4, 0x50, 0x36, 0xAF, 0x00, 0x20, 0x36, 0x03, 0x00, 0x18, 0x60, 0x24, 0x78, - 0xFF, 0xFF, 0x01, 0x60, 0x1A, 0xE1, 0xDF, 0xFE, 0x19, 0xFF, 0x00, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, - 0x3F, 0x40, 0x20, 0x2B, 0xA1, 0x00, 0x01, 0x16, 0xFE, 0x01, 0x38, 0x69, 0xA1, 0xFF, 0xFF, 0xFF, - 0x68, 0x44, 0x01, 0x2A, 0x99, 0x00, 0x13, 0x60, 0x09, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, 0x00, 0x36, - 0x00, 0x3B, 0xA2, 0xDB, 0x64, 0xF1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x9C, 0x47, 0x00, 0x43, 0x45, - 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, 0x18, 0x60, 0x22, 0xF3, 0x3F, 0x40, 0x40, 0x26, 0x01, 0x00, - 0xA0, 0x50, 0x3F, 0x40, 0x02, 0x2B, 0x29, 0x00, 0xAE, 0x4F, 0xFD, 0xB4, 0xA0, 0x5E, 0xDD, 0xFE, - 0xAC, 0x4F, 0x10, 0xBC, 0xA0, 0x5C, 0xFF, 0xFF, 0x10, 0xAC, 0xA0, 0x5C, 0x00, 0x60, 0xC8, 0x71, - 0x8D, 0xE2, 0x40, 0xE1, 0x40, 0x29, 0xFE, 0x01, 0x0C, 0x60, 0x00, 0x62, 0x00, 0x60, 0x71, 0x7C, - 0x10, 0x60, 0x00, 0x65, 0x1A, 0x60, 0x58, 0x4D, 0x88, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0xC8, 0x71, - 0x8D, 0xE2, 0x40, 0xE1, 0x40, 0x29, 0xFE, 0x01, 0x01, 0x60, 0x08, 0xE1, 0x64, 0xF1, 0x82, 0xF9, - 0x05, 0x7C, 0x83, 0xF9, 0xDF, 0xFE, 0x19, 0xFF, 0xFF, 0xFF, 0x18, 0x60, 0x07, 0xF1, 0xAD, 0x4F, - 0x00, 0x7F, 0xFA, 0xB4, 0x64, 0x41, 0x64, 0xF1, 0x02, 0xB1, 0x04, 0x65, 0x02, 0x02, 0x64, 0x40, - 0x01, 0x2B, 0x01, 0x65, 0xB4, 0x84, 0xA0, 0x5D, 0xBF, 0xFE, 0x45, 0x00, 0x18, 0x60, 0x07, 0xF1, - 0xAD, 0x4F, 0x00, 0x7F, 0xFA, 0xB4, 0x64, 0x41, 0x64, 0xF1, 0x02, 0xB1, 0x04, 0x65, 0x02, 0x02, - 0x64, 0x40, 0x01, 0x2B, 0x01, 0x65, 0xB4, 0x84, 0xA0, 0x5D, 0x43, 0x45, 0x20, 0x44, 0x20, 0xBC, - 0x40, 0x40, 0x02, 0x60, 0xEE, 0x64, 0x3F, 0x40, 0x02, 0x27, 0xC8, 0x64, 0x81, 0xFB, 0x82, 0xF9, - 0x05, 0x64, 0x83, 0xFB, 0xDF, 0xFE, 0x19, 0xFF, 0x26, 0x00, 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, - 0x43, 0x45, 0xA4, 0xD1, 0xDA, 0x83, 0xC3, 0x85, 0x80, 0xE1, 0xDF, 0xFE, 0xBD, 0xD3, 0xFF, 0xFF, - 0x60, 0x48, 0x60, 0x47, 0x80, 0xBC, 0x00, 0x7F, 0x60, 0x4A, 0xD7, 0x80, 0xA1, 0xFF, 0xF6, 0x02, - 0xBF, 0xFE, 0x11, 0x00, 0x43, 0x45, 0xA4, 0xD1, 0xDA, 0x83, 0x0D, 0x18, 0x64, 0x44, 0x00, 0x61, - 0xFA, 0xA4, 0xDD, 0x81, 0xFD, 0x02, 0x1A, 0x60, 0x58, 0x4D, 0x9C, 0x78, 0xFF, 0xFF, 0xBF, 0xFE, - 0x02, 0x00, 0xF1, 0xFE, 0x01, 0x00, 0x25, 0x43, 0x21, 0xE1, 0x00, 0x64, 0xBF, 0xDB, 0x20, 0x44, - 0x20, 0x2A, 0x07, 0x00, 0x07, 0xB4, 0x04, 0x36, 0xC3, 0xFE, 0x06, 0x36, 0xCC, 0xFE, 0x07, 0x36, - 0xD5, 0xFE, 0x20, 0x44, 0xD8, 0xB4, 0x40, 0x40, 0x1F, 0x60, 0x2C, 0x63, 0xBD, 0xD3, 0x03, 0x61, - 0x0F, 0x1B, 0x04, 0xA3, 0xBD, 0xD3, 0x04, 0x61, 0x0B, 0x1B, 0x04, 0xA3, 0xBD, 0xD3, 0x06, 0x61, - 0x07, 0x1B, 0x04, 0xA3, 0xBD, 0xD3, 0x07, 0x61, 0x03, 0x1B, 0xC3, 0x60, 0x53, 0x78, 0xFF, 0xFF, - 0xA3, 0xD1, 0x40, 0x44, 0x20, 0x44, 0x07, 0xB5, 0xD4, 0x85, 0x35, 0x80, 0x24, 0x45, 0x1F, 0x60, - 0x6C, 0x64, 0x44, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x43, 0x45, 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, - 0x64, 0x43, 0xBD, 0xD3, 0xBD, 0xD1, 0x40, 0x44, 0x10, 0x27, 0x19, 0x00, 0x3F, 0x40, 0x02, 0x2B, - 0x06, 0x00, 0x24, 0x47, 0x08, 0x2B, 0x13, 0x00, 0x07, 0xB4, 0x01, 0x36, 0x11, 0x00, 0xFF, 0x60, - 0x7F, 0x65, 0x15, 0x60, 0xA2, 0x64, 0x24, 0x40, 0x08, 0x2B, 0xA4, 0x84, 0xA0, 0x57, 0xFF, 0xFF, - 0x64, 0x49, 0xFF, 0xFF, 0x68, 0x44, 0x01, 0x16, 0xFD, 0x01, 0x00, 0x7F, 0xA3, 0xDB, 0xAB, 0x01, - 0x64, 0x42, 0x1A, 0x60, 0x58, 0x4D, 0xB4, 0x78, 0xFF, 0xFF, 0xBD, 0xD9, 0xA3, 0xDB, 0xA3, 0x01, - 0x43, 0x45, 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, 0x64, 0x43, 0xBD, 0xD3, 0xA3, 0xD1, 0x40, 0x44, - 0x10, 0x2B, 0x16, 0x00, 0xBE, 0xD1, 0xFF, 0xFF, 0x15, 0x60, 0x80, 0xE7, 0x24, 0x40, 0x07, 0x27, - 0x04, 0x00, 0xAC, 0x4F, 0x10, 0xBC, 0x00, 0x7F, 0xA0, 0x5C, 0x64, 0x4A, 0xFF, 0xFF, 0x01, 0x16, - 0xFE, 0x01, 0x24, 0x40, 0x20, 0x27, 0x1D, 0x00, 0xAC, 0x4F, 0xEF, 0xB4, 0xA0, 0x5C, 0x19, 0x00, - 0x3F, 0x40, 0x02, 0x2B, 0x06, 0x00, 0x24, 0x47, 0x08, 0x2B, 0x13, 0x00, 0x07, 0xB4, 0x01, 0x36, - 0x11, 0x00, 0x15, 0x60, 0x22, 0x64, 0x24, 0x40, 0x08, 0x27, 0x80, 0xBC, 0x7C, 0x48, 0xBE, 0xD3, - 0xA0, 0x57, 0x60, 0x48, 0x64, 0x44, 0x80, 0xBC, 0xFF, 0xB4, 0x60, 0x4A, 0xFF, 0xFF, 0x01, 0x16, - 0xFE, 0x01, 0x69, 0x01, 0x01, 0x61, 0x1A, 0x60, 0x58, 0x4D, 0x9C, 0x78, 0xFF, 0xFF, 0x63, 0x01, - 0x28, 0xF3, 0xFF, 0xFF, 0x60, 0x47, 0x0F, 0xB4, 0x9A, 0x00, 0xFF, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x04, 0x64, 0x0F, 0x60, 0x9F, 0xFB, 0x27, 0x00, 0x0C, 0x64, 0x3F, 0x40, 0x02, 0x2B, 0x23, 0x00, - 0x29, 0xF1, 0x0F, 0x60, 0x9F, 0xFB, 0x5A, 0xD9, 0x1C, 0x60, 0xD0, 0x64, 0x7F, 0xFB, 0xFF, 0xFF, - 0x2D, 0xFF, 0xF0, 0x60, 0xC7, 0x78, 0xFF, 0xFF, 0x22, 0x60, 0x22, 0x63, 0x09, 0x61, 0x1A, 0x60, - 0x58, 0x4D, 0x9C, 0x78, 0xFF, 0xFF, 0x77, 0x00, 0xD3, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0xD3, 0xFB, - 0x06, 0x64, 0x0F, 0x60, 0x9F, 0xFB, 0xFF, 0xFF, 0x2D, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x08, 0x64, 0x0F, 0x60, 0x9F, 0xFB, 0x1D, 0x60, 0x4F, 0x64, 0x7F, 0xFB, 0xFF, 0xFF, 0x2D, 0xFF, - 0xF0, 0x60, 0xC7, 0x78, 0xFF, 0xFF, 0x29, 0xF3, 0x11, 0x60, 0xF9, 0x65, 0x60, 0x5C, 0x3F, 0x40, - 0x02, 0x2B, 0x13, 0x00, 0x00, 0x37, 0x11, 0x00, 0x01, 0x3B, 0x55, 0x00, 0x11, 0x60, 0x19, 0x63, - 0xFF, 0xB7, 0x60, 0x5C, 0xA3, 0xD3, 0x08, 0xA3, 0x00, 0x7E, 0xD0, 0x80, 0xD7, 0x80, 0x02, 0x03, - 0xF9, 0x02, 0x49, 0x00, 0xF4, 0xA3, 0xA3, 0xD3, 0x05, 0x00, 0x00, 0xBC, 0xF2, 0xA4, 0x43, 0x03, - 0x42, 0x07, 0x64, 0x44, 0x64, 0xFB, 0x82, 0xFB, 0xC8, 0x64, 0x81, 0xFB, 0x07, 0x64, 0x83, 0xFB, - 0x1D, 0x60, 0x4F, 0x64, 0x7F, 0xFB, 0xFF, 0xFF, 0xDF, 0xFE, 0x00, 0x64, 0x19, 0xFF, 0xF0, 0x60, - 0xC7, 0x78, 0xFF, 0xFF, 0x88, 0xFF, 0xBA, 0x60, 0x98, 0x71, 0x8D, 0xE2, 0x01, 0x11, 0x09, 0x00, - 0x71, 0x40, 0x80, 0x27, 0xFB, 0x01, 0x88, 0xE2, 0xBA, 0x60, 0xD0, 0x64, 0x03, 0xFB, 0x8D, 0xFF, - 0x15, 0x00, 0x8D, 0xFF, 0xB1, 0x60, 0xED, 0x63, 0x06, 0x60, 0x0B, 0xFD, 0xFF, 0xFF, 0x62, 0xFF, - 0x1D, 0x60, 0x3C, 0x63, 0x7F, 0xFD, 0xFF, 0xFF, 0x1A, 0xFF, 0xF0, 0x60, 0xC7, 0x78, 0xFF, 0xFF, - 0xA4, 0x60, 0x7C, 0x63, 0x06, 0x60, 0x0B, 0xFD, 0xFF, 0xFF, 0x62, 0xFF, 0x29, 0xF5, 0x1F, 0x60, - 0x26, 0x63, 0x1E, 0x60, 0xF8, 0x64, 0xBD, 0xDB, 0x66, 0x44, 0xBD, 0xDB, 0x02, 0x64, 0xA3, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xF9, 0xFE, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x66, 0x01, 0x00, 0x36, - 0x67, 0x01, 0x01, 0x36, 0x69, 0x01, 0x02, 0x36, 0x7F, 0x01, 0x03, 0x36, 0x89, 0x01, 0x04, 0x36, - 0xC1, 0x01, 0x05, 0x36, 0xBF, 0x01, 0x06, 0x36, 0xF1, 0x01, 0x07, 0x36, 0xBB, 0x01, 0x08, 0x36, - 0x8A, 0x01, 0x09, 0x36, 0x0C, 0x00, 0x0A, 0x36, 0x0D, 0x00, 0x0B, 0x36, 0x0E, 0x00, 0x0C, 0x36, - 0x17, 0x00, 0x0D, 0x36, 0x0D, 0x00, 0x0E, 0x36, 0x1D, 0x00, 0x0F, 0x36, 0x41, 0x00, 0x02, 0x60, - 0x00, 0x64, 0x08, 0x00, 0x04, 0x60, 0x00, 0x64, 0x05, 0x00, 0x00, 0x60, 0x01, 0x64, 0x02, 0x00, - 0x20, 0x60, 0x00, 0x64, 0x32, 0x45, 0xB4, 0x85, 0x45, 0x52, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0xB2, 0x60, 0xD0, 0x63, 0x06, 0x60, 0x0B, 0xFD, 0x62, 0xFF, 0xFF, 0xFF, 0x1A, 0xFF, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x3F, 0x40, 0x02, 0x2B, 0x15, 0x00, 0x88, 0xFF, 0xBA, 0x60, 0x98, 0x71, - 0x8D, 0xE2, 0x01, 0x11, 0x09, 0x00, 0x71, 0x40, 0x80, 0x27, 0xFB, 0x01, 0x88, 0xE2, 0xBA, 0x60, - 0xD0, 0x64, 0x03, 0xFB, 0x8D, 0xFF, 0x11, 0x00, 0x8D, 0xFF, 0x90, 0x60, 0x00, 0xE8, 0xB1, 0x60, - 0xED, 0x63, 0x04, 0x00, 0x91, 0x60, 0x00, 0xE8, 0xB2, 0x60, 0xB6, 0x63, 0x2A, 0xE8, 0x06, 0x60, - 0x0B, 0xFD, 0xFF, 0xFF, 0x62, 0xFF, 0xFF, 0xFF, 0x1A, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0xD2, 0xF3, 0xFF, 0xFF, 0xEF, 0xB4, 0xD2, 0xFB, 0xAD, 0x4F, 0xFD, 0xB4, 0xA0, 0x5D, 0xD0, 0x60, - 0x00, 0xE8, 0x2A, 0xE8, 0xD9, 0x60, 0xFE, 0x64, 0x32, 0x45, 0xA4, 0x85, 0x45, 0x52, 0x99, 0xFF, - 0xA5, 0x4F, 0xFF, 0xB4, 0x07, 0xFB, 0x98, 0xFF, 0xA4, 0x60, 0x7C, 0x63, 0x06, 0x60, 0x0B, 0xFD, - 0x62, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x07, 0x02, - 0x62, 0xFF, 0x63, 0xFF, 0x64, 0xFF, 0x65, 0xFF, 0x66, 0xFF, 0xBF, 0xFE, 0xA1, 0xFF, 0x82, 0xFF, - 0x88, 0xFF, 0x6C, 0x40, 0x41, 0xFF, 0xC4, 0xE2, 0x43, 0xFF, 0x5C, 0x49, 0x08, 0xE1, 0xA3, 0x60, - 0x30, 0x78, 0xFF, 0xFF, 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x02, 0x02, 0xA1, 0xFF, 0xFF, 0xFF, - 0x82, 0xFF, 0x88, 0xFF, 0xA8, 0xE2, 0x01, 0x70, 0xAD, 0xF1, 0x00, 0x6B, 0x89, 0xFF, 0x64, 0x54, - 0x88, 0xFF, 0x9F, 0xFE, 0x02, 0x05, 0x64, 0x44, 0x60, 0x54, 0xCD, 0xE2, 0xC2, 0x64, 0x3A, 0xDB, - 0xBC, 0xFF, 0xB5, 0xFF, 0x1D, 0xFF, 0x26, 0x44, 0x02, 0xB4, 0x40, 0x46, 0x3C, 0x44, 0x00, 0xBC, - 0xFF, 0xFF, 0x06, 0x03, 0x27, 0x40, 0x26, 0x22, 0x03, 0x00, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, - 0x27, 0x44, 0x20, 0x2A, 0x04, 0x00, 0xA0, 0x60, 0x00, 0xEA, 0xB0, 0x60, 0x00, 0xEA, 0x5C, 0x44, - 0x27, 0x44, 0x18, 0xB4, 0x40, 0x47, 0x00, 0xE1, 0xA4, 0xE2, 0xC4, 0xE2, 0x47, 0xFF, 0xB6, 0xFF, - 0xB7, 0xFF, 0xB4, 0xFF, 0x32, 0xF1, 0x08, 0x29, 0x09, 0x00, 0x64, 0x40, 0x07, 0x22, 0x06, 0x00, - 0x43, 0xFF, 0x27, 0x44, 0x10, 0xBC, 0x40, 0x47, 0x00, 0x64, 0x32, 0xFB, 0x31, 0x41, 0x3C, 0x44, - 0x01, 0xB1, 0x00, 0xBC, 0x0A, 0x02, 0x09, 0x03, 0x32, 0xF3, 0x00, 0x7C, 0x01, 0xB4, 0xFF, 0xFF, - 0x04, 0x03, 0x32, 0xF9, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0xC8, 0x60, 0x09, 0x7D, 0x00, 0x60, - 0x00, 0x6B, 0x00, 0x64, 0x33, 0xFB, 0x0C, 0x60, 0x16, 0x64, 0xA0, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0xE1, 0x30, 0x40, 0x02, 0x36, 0xA1, 0xFF, 0x83, 0xFF, 0x8D, 0xFF, 0x5C, 0x44, 0x5C, 0x43, - 0x5C, 0x42, 0x5C, 0x41, 0x5C, 0x40, 0xAC, 0xFF, 0xAD, 0xFF, 0xE7, 0xE1, 0xB3, 0x60, 0xBE, 0x78, - 0xFF, 0xFF, 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x03, 0x02, 0x28, 0xE2, 0x40, 0xFF, 0xA1, 0xFF, - 0x84, 0xFF, 0xC1, 0x60, 0x6B, 0x64, 0x40, 0x42, 0xB7, 0x60, 0xA2, 0x64, 0x40, 0x40, 0x9C, 0xF3, - 0x65, 0xFB, 0x0F, 0x60, 0xF6, 0x63, 0xA9, 0xF3, 0xBD, 0xDB, 0x00, 0x60, 0x9A, 0x64, 0xBD, 0xDB, - 0x02, 0x64, 0xBD, 0xDB, 0x04, 0x64, 0xA3, 0xDB, 0x5C, 0x49, 0x0A, 0x64, 0x40, 0x4B, 0x5C, 0x5C, - 0x01, 0x60, 0x39, 0xE2, 0x04, 0x60, 0x00, 0x7A, 0x89, 0xFF, 0x03, 0x60, 0xFF, 0x73, 0x88, 0xFF, - 0xB7, 0x60, 0xA2, 0x78, 0xFF, 0xFF, 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x06, 0x02, 0x40, 0xFF, - 0x42, 0xFF, 0x43, 0xFF, 0x44, 0xFF, 0x45, 0xFF, 0xA1, 0xFF, 0x88, 0xFF, 0x85, 0xFF, 0x21, 0xE1, - 0x5C, 0x40, 0xC3, 0x60, 0x53, 0x78, 0xFF, 0xFF, 0xA2, 0xFF, 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, - 0x01, 0x02, 0xA1, 0xFF, 0x86, 0xFF, 0x88, 0xFF, 0x5C, 0x46, 0x5C, 0x49, 0x5C, 0x40, 0xE1, 0x60, - 0x58, 0x4F, 0x7A, 0x78, 0xFF, 0xFF, 0xD0, 0x60, 0x58, 0x4F, 0xA2, 0x78, 0xFF, 0xFF, 0xEB, 0x60, - 0x58, 0x4F, 0x10, 0x78, 0xFF, 0xFF, 0xDD, 0x60, 0x58, 0x4F, 0xF5, 0x78, 0xFF, 0xFF, 0x1F, 0xE1, - 0xA3, 0xFF, 0xCA, 0x60, 0x7E, 0x78, 0xFF, 0xFF, 0x03, 0xE1, 0xA3, 0xFF, 0x1E, 0x60, 0x9E, 0x63, - 0x17, 0xFD, 0xAE, 0xFF, 0xF0, 0x60, 0xC7, 0x78, 0xFF, 0xFF, 0x86, 0xF3, 0x87, 0xF3, 0xDC, 0x81, - 0x00, 0x7C, 0x01, 0x00, 0x00, 0xFA, 0x60, 0x46, 0xFE, 0x63, 0xA3, 0xD8, 0xFE, 0x1F, 0xCD, 0x81, - 0xD8, 0x84, 0xF8, 0x02, 0x86, 0xF3, 0x87, 0xF5, 0xDC, 0x81, 0x80, 0x67, 0x40, 0x4A, 0x05, 0x18, - 0x2A, 0x43, 0x02, 0xFC, 0x5F, 0x8A, 0x00, 0xF4, 0xFA, 0x01, 0x2E, 0x58, 0xFF, 0xFF, 0x88, 0xF3, - 0x06, 0x61, 0x00, 0x7C, 0x60, 0x46, 0xFE, 0x63, 0xA3, 0xD8, 0xFE, 0x1F, 0xCD, 0x81, 0x66, 0x44, - 0xD8, 0x84, 0xF8, 0x02, 0x09, 0x60, 0x2B, 0x7C, 0x88, 0xF3, 0x06, 0x61, 0x60, 0x46, 0x01, 0x63, - 0x76, 0xF8, 0x00, 0xFC, 0x63, 0x47, 0x06, 0xFA, 0x76, 0xF8, 0x03, 0x64, 0x77, 0xFA, 0xDF, 0x83, - 0x66, 0x44, 0xCD, 0x81, 0x02, 0xA6, 0xF4, 0x02, 0x2E, 0x58, 0xFF, 0xFF, 0x8A, 0xF1, 0x89, 0xF3, - 0x7C, 0x63, 0x8C, 0xFB, 0x60, 0x46, 0x01, 0xFC, 0xDC, 0x84, 0xD0, 0x80, 0x00, 0xFA, 0xFA, 0x04, - 0x8D, 0xFB, 0x60, 0x46, 0x00, 0x64, 0x00, 0xFA, 0x63, 0x44, 0x80, 0x7F, 0x01, 0xFA, 0x8A, 0xF3, - 0x89, 0xF1, 0xDC, 0x84, 0xD0, 0x84, 0x8B, 0xFB, 0x03, 0x60, 0x26, 0x61, 0xB5, 0x60, 0x58, 0x4D, - 0x8C, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x2E, 0xFB, 0x82, 0xFF, 0x40, 0x42, 0x87, 0xFF, 0x8B, 0xF3, - 0x93, 0xFB, 0x00, 0x64, 0x40, 0x50, 0x63, 0xFF, 0x60, 0xFF, 0x66, 0xFF, 0x65, 0xFF, 0x64, 0xFF, - 0x61, 0xFF, 0x62, 0xFF, 0x49, 0x60, 0x02, 0xE1, 0x52, 0x60, 0x02, 0xE1, 0x5C, 0x60, 0x02, 0xE1, - 0x65, 0x60, 0x02, 0xE1, 0x6B, 0x60, 0x02, 0xE1, 0x76, 0x60, 0x02, 0xE1, 0x41, 0x60, 0x02, 0xE1, - 0x04, 0x64, 0x0F, 0x60, 0x9F, 0xFB, 0x1F, 0x60, 0x64, 0x64, 0x7F, 0xFB, 0x2D, 0xFF, 0x0A, 0x61, - 0x41, 0x4B, 0x09, 0x60, 0x08, 0x61, 0xB5, 0x60, 0x58, 0x4D, 0x8C, 0x78, 0xFF, 0xFF, 0xF0, 0x67, - 0x0E, 0xFA, 0x1F, 0x60, 0x0A, 0x64, 0x0F, 0x60, 0x93, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x2B, 0x41, 0x4D, 0x8B, 0xFF, 0xFF, 0xEA, 0x02, 0x09, 0x61, - 0x41, 0x4B, 0x09, 0x60, 0x08, 0x61, 0xB5, 0x60, 0x58, 0x4D, 0x8C, 0x78, 0xFF, 0xFF, 0x1E, 0x60, - 0xFE, 0x64, 0x0F, 0x60, 0x93, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0x2B, 0x41, 0x4D, 0x8B, 0xFF, 0xFF, 0xEC, 0x02, 0x1E, 0x60, 0xB0, 0x78, 0xFF, 0xFF, - 0x00, 0xEA, 0x00, 0xEB, 0x50, 0x60, 0x03, 0xEA, 0x51, 0x60, 0x13, 0xEA, 0x52, 0x60, 0x30, 0xEA, - 0x53, 0x60, 0x40, 0xEA, 0x54, 0x60, 0x52, 0xEA, 0x55, 0x60, 0x6D, 0xEA, 0x56, 0x60, 0x71, 0xEA, - 0x57, 0x60, 0x8B, 0xEA, 0x58, 0x60, 0x47, 0xEA, 0x59, 0x60, 0xA0, 0xEA, 0x5A, 0x60, 0xB2, 0xEA, - 0x5B, 0x60, 0xC1, 0xEA, 0x5C, 0x60, 0xD7, 0xEA, 0x5D, 0x60, 0xEB, 0xEA, 0x5E, 0x60, 0xA0, 0xEA, - 0x50, 0x60, 0x36, 0xEB, 0x51, 0x60, 0x37, 0xEB, 0x52, 0x60, 0x20, 0xEB, 0x53, 0x60, 0xE4, 0xEB, - 0x54, 0x60, 0x34, 0xEB, 0x55, 0x60, 0x58, 0xEB, 0x56, 0x60, 0x48, 0xEB, 0x57, 0x60, 0xD0, 0xEB, - 0x58, 0x60, 0xC3, 0xEB, 0x59, 0x60, 0xFC, 0xEB, 0x5A, 0x60, 0x34, 0xEB, 0x5B, 0x60, 0x58, 0xEB, - 0x5C, 0x60, 0xC0, 0xEB, 0x5D, 0x60, 0xD0, 0xEB, 0x5E, 0x60, 0x91, 0xEB, 0x00, 0xEA, 0x00, 0xEB, - 0xE0, 0x60, 0x02, 0xEA, 0xE0, 0x60, 0x03, 0xEB, 0xA0, 0x60, 0x00, 0xEB, 0xB0, 0x60, 0x00, 0xEB, - 0xAB, 0x48, 0x40, 0x3B, 0x01, 0x00, 0xFC, 0x01, 0x00, 0xEB, 0x03, 0x60, 0x02, 0x64, 0xA0, 0xDB, - 0x0F, 0x64, 0x60, 0x7F, 0xA0, 0x5A, 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, - 0x00, 0xEA, 0x24, 0x44, 0xFF, 0xB4, 0x04, 0xFB, 0x50, 0x60, 0x00, 0x64, 0x05, 0xFB, 0x10, 0x60, - 0x10, 0x75, 0xF0, 0x60, 0xC7, 0x78, 0xFF, 0xFF, 0x3F, 0x40, 0x40, 0x26, 0x40, 0x00, 0x05, 0x60, - 0xF9, 0xF1, 0x42, 0x60, 0x08, 0x64, 0x09, 0x60, 0x19, 0x63, 0x64, 0x40, 0x01, 0x2B, 0x04, 0x00, - 0x42, 0x60, 0x09, 0x64, 0x0A, 0x60, 0x19, 0x63, 0x18, 0x60, 0x22, 0xFB, 0x04, 0x60, 0x00, 0xBC, - 0x18, 0x60, 0x1E, 0xFB, 0x18, 0x60, 0x1D, 0xFD, 0x1D, 0x60, 0x19, 0x63, 0x18, 0x60, 0x21, 0xFD, - 0x80, 0x60, 0x1C, 0x64, 0x3F, 0x40, 0x01, 0x2A, 0x02, 0x00, 0x60, 0x60, 0x1C, 0x64, 0x18, 0x60, - 0x23, 0xFB, 0x18, 0x60, 0x1F, 0xFB, 0x18, 0x60, 0x22, 0xF3, 0xA0, 0x50, 0xA0, 0x50, 0x0B, 0x60, - 0xF8, 0x63, 0xA3, 0xD1, 0x30, 0x60, 0x38, 0x61, 0xA1, 0xD3, 0xF8, 0xA3, 0x90, 0x84, 0xA2, 0xDB, - 0xA3, 0xD1, 0x59, 0xD3, 0x06, 0xA3, 0x90, 0x84, 0xA2, 0xDB, 0xA3, 0xD1, 0x59, 0xD3, 0xFE, 0xA3, - 0x90, 0x84, 0xA2, 0xDB, 0xA3, 0xD1, 0x59, 0xD3, 0xFF, 0xFF, 0x90, 0x84, 0xA2, 0xDB, 0x80, 0x60, - 0x58, 0xEC, 0x80, 0x60, 0x00, 0xED, 0x80, 0x60, 0x80, 0xEE, 0x40, 0xEC, 0x00, 0xED, 0x00, 0xEE, - 0xC0, 0x60, 0x59, 0xEC, 0xC0, 0x60, 0x07, 0xED, 0xC0, 0x60, 0x8F, 0xEE, 0xAD, 0x4F, 0xFA, 0xB4, - 0xA0, 0x5D, 0x00, 0xF3, 0x28, 0xFB, 0x40, 0x44, 0xA2, 0x60, 0xE8, 0x7C, 0x20, 0xF9, 0x1D, 0x60, - 0xD0, 0x7C, 0x21, 0xF9, 0x1D, 0x60, 0xE6, 0x7C, 0x22, 0xF9, 0x1E, 0x60, 0x44, 0x7C, 0x23, 0xF9, - 0x1E, 0x60, 0x55, 0x7C, 0x24, 0xF9, 0x1E, 0x60, 0x7F, 0x7C, 0x25, 0xF9, 0x1E, 0x60, 0x90, 0x7C, - 0x26, 0xF9, 0xD0, 0x60, 0x00, 0xE8, 0x28, 0xE8, 0x44, 0x60, 0x01, 0xE6, 0x00, 0x64, 0x40, 0x52, - 0x10, 0x60, 0x04, 0xE6, 0x08, 0x60, 0x06, 0x63, 0xFD, 0x60, 0x0C, 0x65, 0x5B, 0xD3, 0xBF, 0xD1, - 0x0C, 0x18, 0xC3, 0x83, 0xD4, 0x80, 0xC3, 0x83, 0xF9, 0x02, 0xFA, 0xA3, 0xA3, 0xD3, 0x02, 0x60, - 0x00, 0x65, 0xF9, 0xA0, 0xFC, 0xA0, 0x09, 0x05, 0x00, 0x05, 0x21, 0x60, 0x00, 0x65, 0x3F, 0x43, - 0x21, 0x60, 0x00, 0x65, 0xC0, 0x60, 0x8F, 0xEE, 0x08, 0x00, 0x02, 0x60, 0x00, 0x65, 0x00, 0x60, - 0x00, 0x64, 0x18, 0xFB, 0x3F, 0x43, 0x11, 0x60, 0x10, 0xE6, 0xB7, 0x84, 0x40, 0x5F, 0x30, 0x60, - 0x20, 0x63, 0x3F, 0x40, 0x20, 0x27, 0x06, 0x00, 0x0F, 0x60, 0xFF, 0x64, 0xBD, 0xDB, 0x0F, 0x60, - 0xF0, 0x64, 0x03, 0x00, 0x0F, 0x64, 0xBD, 0xDB, 0x00, 0x64, 0xA3, 0xDB, 0x00, 0x60, 0x30, 0xE2, - 0x00, 0x60, 0x50, 0xE2, 0x00, 0x60, 0x79, 0xE2, 0x00, 0x60, 0x90, 0xE2, 0x01, 0x60, 0xD0, 0xE2, - 0x01, 0x60, 0xF0, 0xE2, 0x01, 0x60, 0xB0, 0xE2, 0x13, 0x64, 0xAD, 0xFB, 0x01, 0x60, 0x67, 0x64, - 0x37, 0xFB, 0x00, 0x60, 0x50, 0x64, 0x36, 0xFB, 0x09, 0x60, 0x2A, 0x64, 0x98, 0xFB, 0x82, 0xFF, - 0x92, 0xFF, 0x5C, 0x41, 0x5C, 0x46, 0x5C, 0x47, 0x00, 0xE1, 0xA4, 0x60, 0x7C, 0x63, 0x0C, 0x60, - 0x16, 0x64, 0xA0, 0xDD, 0x87, 0xFF, 0x97, 0xFF, 0x0C, 0x60, 0x02, 0x64, 0x40, 0x5A, 0x06, 0xA4, - 0x40, 0x5B, 0x5C, 0x5E, 0x13, 0x60, 0x52, 0xF3, 0x64, 0xFB, 0x3F, 0x40, 0x01, 0x22, 0x03, 0x00, - 0x80, 0x60, 0x37, 0x7C, 0x02, 0x00, 0x80, 0x60, 0x27, 0x7C, 0x16, 0x60, 0x55, 0xF9, 0x00, 0x60, - 0x80, 0x64, 0x89, 0xFB, 0x02, 0x60, 0x80, 0x66, 0x22, 0x60, 0x22, 0x64, 0x77, 0x60, 0x77, 0x63, - 0x00, 0xFA, 0x01, 0xFC, 0x00, 0xF0, 0x01, 0xF0, 0xD0, 0x80, 0xD3, 0x80, 0x1E, 0x02, 0x1D, 0x02, - 0x06, 0x60, 0x80, 0x65, 0x45, 0x4A, 0xAA, 0x46, 0x00, 0xFC, 0x01, 0xFA, 0xAA, 0x46, 0x00, 0xF0, - 0x2A, 0x41, 0x50, 0x65, 0xD3, 0x80, 0xCD, 0x84, 0x13, 0x03, 0x0A, 0x60, 0x80, 0x65, 0x45, 0x4A, - 0xAA, 0x46, 0x00, 0xFC, 0x01, 0xFA, 0xAA, 0x46, 0x00, 0xF0, 0x65, 0x41, 0xC8, 0x65, 0xD3, 0x80, - 0xCD, 0x84, 0x06, 0x03, 0x12, 0x60, 0x7F, 0x64, 0x03, 0x00, 0x10, 0x65, 0x02, 0x60, 0x7F, 0x64, - 0x65, 0x43, 0x86, 0xFD, 0x0F, 0x60, 0x5B, 0xFD, 0x07, 0x61, 0xC5, 0x81, 0xE1, 0x85, 0xD4, 0x84, - 0x8A, 0xFB, 0xDC, 0x84, 0x88, 0xFB, 0x0C, 0xA4, 0x87, 0xFB, 0x0F, 0x60, 0x5C, 0xFB, 0x1E, 0x60, - 0x58, 0x4E, 0xD3, 0x78, 0xFF, 0xFF, 0x1E, 0x60, 0x58, 0x4E, 0xB9, 0x78, 0xFF, 0xFF, 0x3F, 0x40, - 0x40, 0x26, 0x05, 0x00, 0x18, 0x60, 0x20, 0xF3, 0x5A, 0xD1, 0xA0, 0x50, 0xA4, 0x52, 0x00, 0x64, - 0x0A, 0x60, 0x7E, 0xFB, 0x1E, 0x60, 0xF2, 0x78, 0xFF, 0xFF, 0x5C, 0x51, 0x3F, 0x41, 0xA5, 0x4C, - 0x50, 0x37, 0x0B, 0x00, 0x01, 0xB9, 0x41, 0x5F, 0xB5, 0x60, 0x55, 0xE0, 0x05, 0x60, 0xF9, 0xF1, - 0xC0, 0x67, 0x90, 0x84, 0x3F, 0x40, 0x01, 0x26, 0xA0, 0x50, 0x06, 0x60, 0x08, 0xF3, 0x01, 0x60, - 0x01, 0x65, 0x01, 0x60, 0x02, 0x7C, 0xD4, 0x80, 0xD0, 0x80, 0x01, 0x03, 0x10, 0x02, 0x5A, 0xD1, - 0x5A, 0xD3, 0x3E, 0x60, 0x00, 0x66, 0xE0, 0x87, 0x40, 0x4A, 0xF7, 0x60, 0x8C, 0x61, 0x64, 0x44, - 0xC8, 0x84, 0x0C, 0x63, 0xAA, 0x46, 0x58, 0xD0, 0xAA, 0x46, 0x59, 0xD8, 0xFB, 0x1F, 0x08, 0x60, - 0x00, 0x63, 0xFA, 0x60, 0x00, 0x65, 0xBD, 0xD3, 0xA3, 0xD3, 0x02, 0xA8, 0xD4, 0x80, 0x07, 0x02, - 0x06, 0x02, 0x49, 0x60, 0x4C, 0x61, 0x3C, 0x60, 0x00, 0x66, 0x41, 0x4B, 0x03, 0x00, 0x24, 0x60, - 0x84, 0x78, 0xFF, 0xFF, 0x2B, 0x41, 0x49, 0x60, 0x94, 0x7C, 0xD1, 0x80, 0xA1, 0xD2, 0x25, 0x05, - 0x59, 0xD0, 0x60, 0x45, 0x59, 0xD2, 0x44, 0x47, 0xE0, 0x87, 0x40, 0x4A, 0x59, 0xD2, 0x59, 0x8B, - 0x40, 0x4C, 0x08, 0x60, 0x00, 0x63, 0xBE, 0xD3, 0xBD, 0xD1, 0xEC, 0x18, 0xD4, 0x80, 0xEA, 0x18, - 0x03, 0x03, 0xC3, 0x83, 0xC3, 0x83, 0xF7, 0x01, 0x67, 0x44, 0xC0, 0x84, 0xE0, 0x85, 0x2C, 0x44, - 0xD4, 0x80, 0x63, 0x41, 0x01, 0x06, 0x65, 0x44, 0xC8, 0x83, 0xAA, 0x46, 0x59, 0xD1, 0x27, 0xD8, - 0x5A, 0x87, 0xFC, 0x1F, 0xAA, 0x46, 0x2B, 0x41, 0xD5, 0x01, 0x49, 0x60, 0x94, 0x61, 0x41, 0x4B, - 0x2B, 0x41, 0x49, 0x60, 0x94, 0x7C, 0xD1, 0x80, 0xA1, 0xD2, 0x27, 0x05, 0x59, 0xD0, 0x60, 0x45, - 0x59, 0xD2, 0x44, 0x47, 0xE0, 0x87, 0x40, 0x4A, 0x59, 0xD2, 0x59, 0x8B, 0x40, 0x4C, 0x08, 0x60, - 0x00, 0x63, 0xBE, 0xD3, 0xBD, 0xD1, 0xEC, 0x18, 0xD4, 0x80, 0xEA, 0x18, 0x03, 0x03, 0xC3, 0x83, - 0xC3, 0x83, 0xF7, 0x01, 0x04, 0xA3, 0xA3, 0xD1, 0x5A, 0x88, 0x2C, 0x43, 0xD3, 0x80, 0xFF, 0xFF, - 0x01, 0x06, 0x64, 0x43, 0xCF, 0x83, 0xAA, 0x46, 0x60, 0xFE, 0x28, 0xD1, 0x5E, 0x88, 0x27, 0xD8, - 0x5A, 0x87, 0xFB, 0x1F, 0x20, 0xFE, 0xAA, 0x46, 0xD3, 0x01, 0xFA, 0x60, 0x39, 0x65, 0x24, 0x60, - 0x58, 0x4D, 0x97, 0x78, 0xFF, 0xFF, 0x03, 0x03, 0xBE, 0xD1, 0x07, 0x60, 0xED, 0xF9, 0x07, 0x60, - 0xED, 0xF3, 0x20, 0x60, 0x00, 0x7C, 0x60, 0x40, 0x10, 0x2A, 0x05, 0x00, 0x07, 0x60, 0xEC, 0xF9, - 0x07, 0x60, 0xEB, 0xF9, 0x12, 0x00, 0x04, 0xB0, 0x10, 0x60, 0x55, 0xF3, 0x0E, 0x03, 0x02, 0xBC, - 0xA2, 0xDB, 0x07, 0x60, 0xF5, 0xFB, 0x10, 0x60, 0xE8, 0xF3, 0x10, 0x60, 0xAC, 0xF3, 0x02, 0xBD, - 0x02, 0xBC, 0xA2, 0xDB, 0x65, 0x44, 0x10, 0x60, 0xE8, 0xFB, 0x07, 0x60, 0xED, 0xF3, 0x31, 0x41, - 0x60, 0x40, 0x20, 0x2A, 0x40, 0xB9, 0x40, 0x26, 0x03, 0x00, 0x60, 0x40, 0x01, 0x26, 0x80, 0xB9, - 0x41, 0x51, 0xFA, 0x60, 0x3A, 0x65, 0x24, 0x60, 0x58, 0x4D, 0x97, 0x78, 0xFF, 0xFF, 0x03, 0x02, - 0x23, 0x60, 0x1D, 0x78, 0xFF, 0xFF, 0x5B, 0xD3, 0xF8, 0x60, 0x3F, 0x65, 0x00, 0x7F, 0xE0, 0x84, - 0xE0, 0x84, 0x10, 0x60, 0xF7, 0xF3, 0xE0, 0x9C, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, - 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0xBD, 0xD3, 0xFF, 0xFF, 0x60, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0xE0, 0x84, 0x10, 0x60, 0xFA, 0xF3, 0xE0, 0x9C, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, - 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x21, 0x60, 0xFA, 0x61, 0xA3, 0xD3, - 0xFF, 0xFF, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0xA1, 0xD3, 0xE0, 0x9C, 0xA4, 0x84, - 0xB0, 0x84, 0xA1, 0xDB, 0xA3, 0xD3, 0xFF, 0xFF, 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0x59, 0xD3, - 0xE0, 0x9C, 0xA4, 0x84, 0xB0, 0x84, 0xA1, 0xDB, 0x11, 0x60, 0x00, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, - 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x11, 0x60, - 0x03, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, - 0xB0, 0x84, 0xA2, 0xDB, 0x11, 0x60, 0x06, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, - 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0xA3, 0xD3, 0xFF, 0xFF, 0x60, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0x11, 0x60, 0x09, 0xF3, 0xE0, 0x9C, 0xA4, 0x84, 0xB0, 0x84, - 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x11, 0x60, 0x0C, 0xF3, - 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, - 0xA2, 0xDB, 0x11, 0x60, 0x0F, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, - 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x02, 0xA3, 0xA3, 0xD3, 0xF8, 0x60, 0x3F, 0x65, - 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0x11, 0x60, 0x12, 0xF3, 0xE0, 0x9C, 0xA4, 0x84, 0xB0, 0x84, - 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0xBD, 0xD3, 0xFF, 0xFF, - 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0x11, 0x60, 0x15, 0xF3, 0xE0, 0x9C, 0xA4, 0x84, - 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x22, 0x60, - 0x30, 0x61, 0xA3, 0xD3, 0xFF, 0xFF, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0xA1, 0xD3, - 0xE0, 0x9C, 0xA4, 0x84, 0xB0, 0x84, 0xA1, 0xDB, 0xA3, 0xD3, 0xFF, 0xFF, 0x00, 0x7F, 0xE0, 0x84, - 0xE0, 0x84, 0x59, 0xD3, 0xE0, 0x9C, 0xA4, 0x84, 0xB0, 0x84, 0xA1, 0xDB, 0x11, 0x60, 0x1B, 0xF3, - 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, - 0xA2, 0xDB, 0x11, 0x60, 0x1E, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, - 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x11, 0x60, 0x21, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, - 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0xA3, 0xD3, - 0xFF, 0xFF, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0x11, 0x60, 0x24, 0xF3, 0xE0, 0x9C, - 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, - 0x11, 0x60, 0x27, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, - 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x11, 0x60, 0x2A, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, - 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x00, 0x60, 0x6A, 0x63, - 0x22, 0x60, 0x56, 0x61, 0x21, 0x60, 0xEA, 0x64, 0x58, 0xD1, 0x59, 0xD9, 0xFD, 0x1F, 0x11, 0x60, - 0x33, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, - 0x11, 0x60, 0x37, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x11, 0x60, 0x39, 0xF3, 0xFF, 0xFF, - 0x18, 0xAC, 0xA2, 0xDB, 0x11, 0x60, 0x40, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x11, 0x60, - 0x42, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x11, 0x60, 0x4E, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, - 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x11, 0x60, 0x52, 0xF3, 0xFF, 0xFF, - 0x18, 0xAC, 0xA2, 0xDB, 0x11, 0x60, 0x54, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x11, 0x60, - 0x5B, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x11, 0x60, 0x5D, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, - 0xA2, 0xDB, 0xFA, 0x60, 0x2C, 0x65, 0x24, 0x60, 0x58, 0x4D, 0x97, 0x78, 0xFF, 0xFF, 0x0E, 0x03, - 0x63, 0x45, 0x23, 0x60, 0xF0, 0x63, 0x06, 0x61, 0xA5, 0xD1, 0xDA, 0x85, 0x64, 0x44, 0x0F, 0xB4, - 0xBD, 0xDB, 0x64, 0x47, 0x0F, 0xB4, 0xCD, 0x81, 0xBD, 0xDB, 0xF6, 0x02, 0xFA, 0x60, 0x30, 0x65, - 0x24, 0x60, 0x58, 0x4D, 0x97, 0x78, 0xFF, 0xFF, 0x14, 0x03, 0xBD, 0xD3, 0x63, 0x46, 0x24, 0x60, - 0x88, 0x63, 0x12, 0x60, 0x53, 0xFB, 0xDA, 0x85, 0xBD, 0xDB, 0x0E, 0x61, 0xA6, 0xD1, 0xDA, 0x86, - 0x64, 0x44, 0xFF, 0xB4, 0xA5, 0xDB, 0xDA, 0x85, 0x64, 0x47, 0xFF, 0xB4, 0xCD, 0x81, 0xBD, 0xDB, - 0xF5, 0x02, 0xFA, 0x60, 0x31, 0x65, 0x24, 0x60, 0x58, 0x4D, 0x97, 0x78, 0xFF, 0xFF, 0x22, 0x03, - 0xBD, 0xD3, 0x12, 0x60, 0x71, 0xFB, 0x5A, 0x81, 0x12, 0x60, 0x80, 0xFB, 0x5A, 0x82, 0x12, 0x60, - 0x8F, 0xFB, 0x5A, 0x83, 0x12, 0x60, 0x9E, 0xFB, 0x5A, 0x84, 0x0E, 0x61, 0xBD, 0xD1, 0xBD, 0xD5, - 0x64, 0x44, 0xFF, 0xB4, 0x21, 0xDB, 0x5A, 0x81, 0x64, 0x47, 0xFF, 0xB4, 0x22, 0xDB, 0x5A, 0x82, - 0x66, 0x44, 0xFF, 0xB4, 0x23, 0xDB, 0x5A, 0x83, 0x66, 0x47, 0xFF, 0xB4, 0x24, 0xDB, 0xCD, 0x81, - 0x5A, 0x84, 0xEC, 0x02, 0xFA, 0x60, 0x47, 0x65, 0x24, 0x60, 0x58, 0x4D, 0x97, 0x78, 0xFF, 0xFF, - 0x11, 0x03, 0x63, 0x45, 0x25, 0x60, 0x5A, 0x63, 0xA5, 0xD1, 0xDA, 0x85, 0xBD, 0xD9, 0x02, 0x61, - 0xA5, 0xD1, 0xDA, 0x85, 0x64, 0x47, 0x00, 0x7E, 0xBD, 0xDB, 0x64, 0x44, 0x00, 0x7E, 0xCD, 0x81, - 0xBD, 0xDB, 0xF6, 0x02, 0xFA, 0x60, 0x2E, 0x65, 0x24, 0x60, 0x58, 0x4D, 0x97, 0x78, 0xFF, 0xFF, - 0x1F, 0x03, 0x63, 0x46, 0xFC, 0xA3, 0xA3, 0xD3, 0x24, 0x60, 0x08, 0x63, 0xCC, 0x84, 0xE8, 0x84, - 0xCC, 0x81, 0x00, 0x36, 0x0D, 0x00, 0x63, 0x45, 0xA6, 0xD3, 0x5A, 0xD1, 0xDA, 0x86, 0xFF, 0xB4, - 0xE0, 0x84, 0xC4, 0x84, 0x5C, 0x90, 0xBD, 0xD9, 0xFD, 0x02, 0xCD, 0x81, 0x66, 0x42, 0xF4, 0x02, - 0x66, 0x42, 0x5A, 0xD3, 0x24, 0x60, 0x48, 0x65, 0xBD, 0xDB, 0xD7, 0x80, 0xFF, 0xFF, 0xFC, 0x02, - 0x25, 0x60, 0x6E, 0x61, 0xFA, 0x60, 0x46, 0x65, 0x24, 0x60, 0x58, 0x4D, 0x97, 0x78, 0xFF, 0xFF, - 0x01, 0x03, 0xA1, 0xDD, 0xD9, 0x81, 0xFA, 0x60, 0x2F, 0x65, 0x24, 0x60, 0x58, 0x4D, 0x97, 0x78, - 0xFF, 0xFF, 0x01, 0x03, 0xA1, 0xDD, 0xD9, 0x81, 0xFA, 0x60, 0x3E, 0x65, 0x24, 0x60, 0x58, 0x4D, - 0x97, 0x78, 0xFF, 0xFF, 0x01, 0x03, 0xA1, 0xDD, 0xD9, 0x81, 0xFA, 0x60, 0x3F, 0x65, 0x24, 0x60, - 0x58, 0x4D, 0x97, 0x78, 0xFF, 0xFF, 0x01, 0x03, 0xA1, 0xDD, 0xD9, 0x81, 0xFA, 0x60, 0x40, 0x65, - 0x24, 0x60, 0x58, 0x4D, 0x97, 0x78, 0xFF, 0xFF, 0x01, 0x03, 0xA1, 0xDD, 0xD9, 0x81, 0xFA, 0x60, - 0x3B, 0x65, 0x24, 0x60, 0x58, 0x4D, 0x97, 0x78, 0xFF, 0xFF, 0x01, 0x03, 0xA1, 0xDD, 0xFA, 0x60, - 0x48, 0x65, 0x24, 0x60, 0x58, 0x4D, 0x97, 0x78, 0xFF, 0xFF, 0x10, 0x03, 0xBD, 0xD3, 0x25, 0x60, - 0xCA, 0x61, 0x0E, 0xB4, 0xBD, 0xD1, 0xA1, 0xDB, 0x64, 0x47, 0x0E, 0xB4, 0xA3, 0xD1, 0x59, 0xDB, - 0x64, 0x44, 0x0E, 0xB4, 0x59, 0xDB, 0x64, 0x47, 0x0E, 0xB4, 0x59, 0xDB, 0xFA, 0x60, 0x29, 0x65, - 0x24, 0x60, 0x58, 0x4D, 0x97, 0x78, 0xFF, 0xFF, 0x07, 0x03, 0x04, 0xA3, 0xA3, 0xD3, 0x20, 0x60, - 0x00, 0x65, 0xB4, 0x84, 0x10, 0x60, 0x29, 0xFB, 0xFA, 0x60, 0x2A, 0x65, 0x24, 0x60, 0x58, 0x4D, - 0x97, 0x78, 0xFF, 0xFF, 0x39, 0x03, 0x04, 0xA3, 0xBD, 0xD1, 0x10, 0x60, 0xCD, 0xF3, 0x64, 0x41, - 0x64, 0x5E, 0xA2, 0xDB, 0x64, 0x47, 0x5A, 0xD3, 0x60, 0x5C, 0x64, 0x5F, 0xA2, 0xDB, 0x10, 0x60, - 0xE3, 0xF3, 0xFF, 0x60, 0xC0, 0xB5, 0x61, 0x40, 0x80, 0x27, 0x05, 0x00, 0xE9, 0x87, 0x3F, 0xB4, - 0xB4, 0x84, 0xA2, 0xDB, 0x1E, 0x00, 0x65, 0x44, 0xA2, 0xDB, 0x10, 0x60, 0xDC, 0xF1, 0xE1, 0x80, - 0xF9, 0x81, 0xE1, 0x80, 0xF9, 0x84, 0xFF, 0x60, 0x80, 0xB4, 0xC0, 0x9C, 0xA2, 0xD9, 0x10, 0x60, - 0xDF, 0xF1, 0xFF, 0xFF, 0xC0, 0x9C, 0xA2, 0xD9, 0x10, 0x60, 0xE6, 0xF1, 0x01, 0x7E, 0x60, 0x47, - 0x60, 0x41, 0x64, 0x44, 0xFE, 0x60, 0x00, 0xB5, 0xC1, 0x84, 0x01, 0x60, 0xFF, 0xB4, 0xB4, 0x84, - 0xA2, 0xDB, 0xDB, 0x83, 0x11, 0x60, 0x62, 0xFD, 0xFA, 0x60, 0x2B, 0x65, 0x24, 0x60, 0x58, 0x4D, - 0x97, 0x78, 0xFF, 0xFF, 0x07, 0x03, 0x04, 0xA3, 0xBD, 0xD3, 0x10, 0x60, 0xD0, 0xFB, 0xA3, 0xD3, - 0x10, 0x60, 0x94, 0xFB, 0xFA, 0x60, 0x3C, 0x65, 0x24, 0x60, 0x58, 0x4D, 0x97, 0x78, 0xFF, 0xFF, - 0x1F, 0x03, 0xA3, 0xD3, 0xFC, 0x60, 0xFC, 0x65, 0xA4, 0x84, 0x60, 0x5C, 0x00, 0x7E, 0xC0, 0x60, - 0x00, 0xA0, 0x60, 0x43, 0x07, 0x04, 0x10, 0x60, 0xD4, 0xF3, 0xFF, 0xFF, 0x03, 0x60, 0xFF, 0xB4, - 0x3C, 0x94, 0xA2, 0xDB, 0x21, 0x60, 0x30, 0x61, 0x64, 0x44, 0x00, 0x7F, 0xC0, 0xA0, 0x60, 0x47, - 0x07, 0x04, 0x60, 0x43, 0xA1, 0xD3, 0xFF, 0xFF, 0x03, 0x60, 0xFF, 0xB4, 0x3C, 0x94, 0xA1, 0xDB, - 0xB8, 0xFE, 0xB9, 0xFE, 0xBA, 0xFE, 0xBB, 0xFE, 0xBD, 0xFE, 0xBF, 0xFE, 0x15, 0x60, 0xCB, 0xF3, - 0x12, 0x63, 0x60, 0x40, 0x01, 0x27, 0x04, 0x00, 0x0B, 0x60, 0xEA, 0x62, 0x5A, 0xDF, 0xFE, 0x1F, - 0x1F, 0x60, 0xC8, 0x78, 0xFF, 0xFF, 0x08, 0x60, 0x06, 0x63, 0xBE, 0xD3, 0xBD, 0xD1, 0x07, 0x18, - 0xD4, 0x80, 0x05, 0x18, 0x03, 0x03, 0xC3, 0x83, 0xC3, 0x83, 0xF7, 0x01, 0xDB, 0x83, 0x00, 0xBC, - 0x2D, 0x58, 0xFF, 0xFF, 0x86, 0xFD, 0xB0, 0x26, 0x00, 0x00, 0x06, 0x00, 0x10, 0xFD, 0x32, 0x01, - 0x00, 0x00, 0x02, 0x00, 0x14, 0xFD, 0x94, 0x2B, 0x00, 0x00, 0x0A, 0x00, 0x41, 0xFA, 0x46, 0x23, - 0x00, 0x00, 0x22, 0x00, 0x42, 0xFA, 0x68, 0x23, 0x00, 0x00, 0x22, 0x00, 0x43, 0xFA, 0x8A, 0x23, - 0x00, 0x00, 0x22, 0x00, 0x44, 0xFA, 0xAC, 0x23, 0x00, 0x00, 0x22, 0x00, 0x45, 0xFA, 0xCE, 0x23, - 0x00, 0x00, 0x22, 0x00, 0x25, 0xFD, 0x62, 0x01, 0x00, 0x00, 0x02, 0x00, - -}; /* fw_image_3_data */ - -static const hcf_8 fw_image_4_data[] = { - 0x6C, 0x40, 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x41, 0xFF, 0x33, 0xF3, 0x32, 0x11, 0x31, 0x18, 0x40, 0x64, 0x3A, 0xDB, 0x1C, 0x00, 0xFF, 0xFF, - 0xC4, 0xE2, 0x27, 0x44, 0x20, 0x2A, 0x01, 0x00, 0xFF, 0xFF, 0x42, 0x64, 0x3A, 0xDB, 0x23, 0x00, - 0x41, 0xFF, 0xA3, 0x60, 0x34, 0x78, 0xE2, 0xFE, 0x40, 0x49, 0x02, 0x60, 0x01, 0xE1, 0x1D, 0x00, - 0x44, 0xFF, 0x1B, 0x09, 0x29, 0x44, 0x10, 0x2A, 0x04, 0x74, 0xCD, 0xE2, 0x10, 0x65, 0x0B, 0x00, - 0xA4, 0x60, 0x49, 0x78, 0xA4, 0xE2, 0x29, 0x44, 0x20, 0x2A, 0x0D, 0x00, 0x20, 0xAC, 0xEC, 0x01, - 0xA4, 0x60, 0x49, 0x78, 0x46, 0xFF, 0xB4, 0x84, 0x40, 0x49, 0xA1, 0xFF, 0xFF, 0xFF, 0x80, 0x3E, - 0xA4, 0x60, 0x49, 0x78, 0xFF, 0xFF, 0x62, 0xFF, 0x08, 0xE1, 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, - 0xAA, 0x60, 0xF4, 0x78, 0x4C, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAA, 0x60, 0xFB, 0x78, 0x44, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC4, 0xE2, 0x84, 0xFF, 0x22, 0x58, 0x82, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA4, 0x60, 0xB9, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0xE1, 0x01, 0xFF, 0xFF, - 0x10, 0x29, 0xFA, 0x01, 0xE4, 0xE2, 0xAA, 0x60, 0xB0, 0x78, 0x94, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC1, 0x60, 0x35, 0x78, 0x64, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAA, 0x60, 0x97, 0x78, 0xAC, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0x29, 0xE2, 0x01, 0xAA, 0x60, 0xF3, 0x78, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB4, 0x60, 0xEF, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB5, 0x60, 0x1C, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB3, 0x60, 0x8B, 0x78, 0x42, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB3, 0x60, 0xBE, 0x78, 0x43, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB3, 0x60, 0xBE, 0x78, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB6, 0x60, 0x9D, 0x78, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB3, 0x60, 0xC1, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x60, 0x83, 0x64, 0x80, 0x29, 0x09, 0xFB, 0xB4, 0x60, 0xB7, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, - 0x98, 0xFF, 0xC2, 0x60, 0x69, 0x78, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC1, 0x60, 0xE0, 0x78, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC0, 0x60, 0x3D, 0x78, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBF, 0x60, 0xB8, 0x78, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB7, 0x60, 0x96, 0x78, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA1, 0xFF, 0x98, 0xFF, 0x83, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC3, 0x60, 0x58, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0x42, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xB0, 0xFF, 0xB1, 0xFF, 0x40, 0xFF, 0x43, 0xFF, 0xC3, 0x60, 0x53, 0x78, 0x44, 0xFF, 0xFF, 0x01, - 0xC3, 0x60, 0x58, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0x1C, 0x60, 0x28, 0x78, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xC3, 0x60, 0x53, 0x78, 0x84, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xC3, 0x60, 0x52, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xCA, 0x60, 0x76, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xE8, 0x60, 0x6C, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x42, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x85, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xCA, 0x60, 0x7E, 0x78, 0x24, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xE6, 0x60, 0x2A, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xCA, 0x60, 0x7E, 0x78, 0x44, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xCA, 0x60, 0x7E, 0x78, 0x84, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xCA, 0x60, 0x7E, 0x78, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x60, 0x9F, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x60, 0xCA, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x60, 0xE3, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x60, 0xC7, 0x78, 0x28, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x60, 0xC7, 0x78, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x60, 0xC7, 0x78, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x60, 0xC7, 0x78, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x60, 0x87, 0x64, 0x80, 0x29, 0x09, 0xFB, 0x47, 0xFF, 0xF0, 0x60, 0xC7, 0x78, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0xF7, 0xA7, 0xFF, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xA2, 0x60, 0x00, 0x78, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x2E, 0x60, 0x54, 0x63, 0x20, 0x44, 0xBD, 0xDB, 0x21, 0x44, 0xBD, 0xDB, 0x22, 0x44, 0xBD, 0xDB, - 0x23, 0x44, 0xBD, 0xDB, 0x24, 0x44, 0xBD, 0xDB, 0x25, 0x44, 0xBD, 0xDB, 0x26, 0x44, 0xBD, 0xDB, - 0x27, 0x44, 0xBD, 0xDB, 0x28, 0x44, 0xBD, 0xDB, 0x29, 0x44, 0xBD, 0xDB, 0x2A, 0x44, 0xBD, 0xDB, - 0x2B, 0x44, 0xBD, 0xDB, 0x2C, 0x44, 0xBD, 0xDB, 0x2D, 0x44, 0xBD, 0xDB, 0x2E, 0x44, 0xBD, 0xDB, - 0x2F, 0x44, 0xBD, 0xDB, 0x17, 0x60, 0x24, 0xFD, 0x2F, 0x60, 0x74, 0x63, 0x17, 0x60, 0x25, 0xFD, - 0x30, 0x44, 0x17, 0x60, 0x26, 0xFB, 0x31, 0x44, 0x17, 0x60, 0x27, 0xFB, 0x32, 0x44, 0x17, 0x60, - 0x28, 0xFB, 0x33, 0x44, 0x17, 0x60, 0x29, 0xFB, 0x81, 0xFF, 0x91, 0xFF, 0x58, 0x51, 0x44, 0x00, - 0x82, 0xFF, 0x92, 0xFF, 0x58, 0x51, 0x40, 0x00, 0x83, 0xFF, 0x93, 0xFF, 0x58, 0x51, 0x3C, 0x00, - 0x84, 0xFF, 0x94, 0xFF, 0x58, 0x51, 0x38, 0x00, 0x85, 0xFF, 0x95, 0xFF, 0x58, 0x51, 0x34, 0x00, - 0x86, 0xFF, 0x96, 0xFF, 0x58, 0x51, 0x30, 0x00, 0x87, 0xFF, 0x97, 0xFF, 0x58, 0x51, 0x2C, 0x00, - 0x80, 0xFF, 0x90, 0xFF, 0x99, 0xFF, 0x17, 0x60, 0x24, 0xF1, 0x30, 0x44, 0x64, 0x43, 0xBD, 0xDB, - 0x31, 0x44, 0xBD, 0xDB, 0x32, 0x44, 0xBD, 0xDB, 0x33, 0x44, 0xBD, 0xDB, 0x34, 0x44, 0xBD, 0xDB, - 0x35, 0x44, 0xBD, 0xDB, 0x36, 0x44, 0xBD, 0xDB, 0x37, 0x44, 0xBD, 0xDB, 0x38, 0x44, 0xBD, 0xDB, - 0x39, 0x44, 0xBD, 0xDB, 0x3A, 0x44, 0xBD, 0xDB, 0x3B, 0x44, 0xBD, 0xDB, 0x3C, 0x44, 0xBD, 0xDB, - 0x3D, 0x44, 0xBD, 0xDB, 0x3E, 0x44, 0xBD, 0xDB, 0x3F, 0x44, 0xBD, 0xDB, 0xEE, 0x60, 0x48, 0x64, - 0x0A, 0xFB, 0x40, 0x21, 0xFE, 0x01, 0x70, 0x00, 0x42, 0x50, 0x40, 0x53, 0x17, 0x60, 0x25, 0xF3, - 0xFF, 0xFF, 0x40, 0x52, 0x33, 0x44, 0x32, 0x42, 0xA2, 0xDB, 0xDA, 0x82, 0xA2, 0xDD, 0xDA, 0x83, - 0x65, 0x44, 0xBD, 0xDB, 0x61, 0x44, 0xBD, 0xDB, 0x66, 0x44, 0xBD, 0xDB, 0xBD, 0xD9, 0x30, 0x44, - 0xBD, 0xDB, 0x99, 0xFF, 0xA4, 0x4C, 0xBD, 0xDB, 0xA5, 0x4C, 0xBD, 0xDB, 0xA0, 0x4C, 0xBD, 0xDB, - 0xA1, 0x4C, 0xBD, 0xDB, 0x98, 0xFF, 0x17, 0x60, 0x25, 0xFD, 0x17, 0x60, 0x26, 0xF3, 0xFF, 0xFF, - 0x40, 0x50, 0x17, 0x60, 0x28, 0xF3, 0xFF, 0xFF, 0x40, 0x52, 0x17, 0x60, 0x29, 0xF3, 0xFF, 0xFF, - 0x40, 0x53, 0x31, 0x41, 0x17, 0x60, 0x27, 0xF3, 0xFF, 0xFF, 0x40, 0x51, 0x17, 0x60, 0x24, 0xF3, - 0xFF, 0xFF, 0x60, 0x43, 0x20, 0x44, 0xBD, 0xDB, 0x21, 0x44, 0xBD, 0xDB, 0x22, 0x44, 0xBD, 0xDB, - 0x23, 0x44, 0xBD, 0xDB, 0x24, 0x44, 0xBD, 0xDB, 0x25, 0x44, 0xBD, 0xDB, 0x26, 0x44, 0xBD, 0xDB, - 0x27, 0x44, 0xBD, 0xDB, 0x28, 0x44, 0xBD, 0xDB, 0x29, 0x44, 0xBD, 0xDB, 0x2A, 0x44, 0xBD, 0xDB, - 0x2B, 0x44, 0xBD, 0xDB, 0x2C, 0x44, 0xBD, 0xDB, 0x2D, 0x44, 0xBD, 0xDB, 0x2E, 0x44, 0xBD, 0xDB, - 0x2F, 0x44, 0xBD, 0xDB, 0x17, 0x60, 0x24, 0xFD, 0x61, 0x58, 0xFF, 0xFF, 0x28, 0x60, 0x76, 0x63, - 0xA3, 0xD3, 0x33, 0x5C, 0x02, 0xA4, 0xBD, 0xDB, 0xFE, 0xB4, 0xE0, 0x85, 0xC4, 0x85, 0x47, 0xD9, - 0x34, 0x44, 0x5B, 0xDB, 0x44, 0xF3, 0x5B, 0xDB, 0xA1, 0xFF, 0xFF, 0xFF, 0x87, 0x3E, 0xFF, 0x01, - 0x82, 0xE1, 0x80, 0xFF, 0x90, 0xFF, 0x88, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x87, 0x3E, 0x41, 0xFF, - 0x00, 0x60, 0x03, 0xE1, 0x21, 0x46, 0x66, 0x45, 0x00, 0xF4, 0x2E, 0x44, 0x09, 0xFA, 0x6A, 0x61, - 0x7F, 0x60, 0xFE, 0x63, 0xA1, 0xFF, 0x9A, 0xFF, 0x05, 0x11, 0x0A, 0x00, 0x00, 0xF4, 0x01, 0xF2, - 0x17, 0x18, 0x7A, 0x61, 0x02, 0x25, 0x04, 0x00, 0x6C, 0x44, 0x7A, 0xDA, 0xFB, 0x1C, 0xF6, 0x11, - 0xD9, 0x81, 0x41, 0xFF, 0x02, 0x1C, 0x00, 0xF4, 0xDA, 0x82, 0x41, 0xFF, 0xC9, 0x81, 0xCB, 0x83, - 0x6C, 0x44, 0x5A, 0xDA, 0x02, 0x1C, 0x00, 0xF4, 0x81, 0xF2, 0x6C, 0x44, 0x5A, 0xDA, 0xCB, 0x83, - 0x02, 0x74, 0x02, 0x60, 0x04, 0xE1, 0x80, 0x60, 0x00, 0x61, 0x5D, 0x93, 0xB5, 0xFF, 0x98, 0xFF, - 0x26, 0x44, 0xFD, 0xB4, 0x84, 0xBC, 0x40, 0x46, 0x65, 0x46, 0x00, 0x64, 0x23, 0xFA, 0x3F, 0xFC, - 0x63, 0x47, 0x0A, 0x63, 0x0F, 0xFC, 0x00, 0xF4, 0x08, 0xFA, 0xCB, 0xFE, 0x18, 0xE1, 0x44, 0xFF, - 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, 0xE2, 0xFE, 0x03, 0x04, 0xA3, 0x60, 0x99, 0x78, 0xFF, 0xFF, - 0xE0, 0xFE, 0x03, 0x04, 0xA3, 0x60, 0xAF, 0x78, 0xFF, 0xFF, 0xE1, 0xFE, 0x07, 0x05, 0x9F, 0xFE, - 0x03, 0x04, 0x18, 0x60, 0x24, 0x78, 0xFF, 0xFF, 0x43, 0xFF, 0xA9, 0x01, 0xD3, 0xF3, 0xFF, 0xFF, - 0x01, 0xB4, 0xFF, 0xFF, 0x08, 0x24, 0x15, 0x00, 0x29, 0x44, 0x08, 0x26, 0xE1, 0x01, 0x72, 0x44, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x94, 0xF3, 0xE8, 0x85, 0xFF, 0xB7, - 0xE0, 0x84, 0xE0, 0x84, 0xB4, 0x85, 0x73, 0x44, 0xD4, 0x84, 0x10, 0x65, 0xD4, 0x80, 0xFF, 0xFF, - 0x37, 0x04, 0x3F, 0x40, 0x40, 0x26, 0x09, 0x00, 0x18, 0x60, 0x1C, 0xF3, 0x5A, 0xD1, 0xA0, 0x50, - 0xA4, 0x52, 0x5A, 0xD3, 0x5A, 0xD1, 0xA0, 0x50, 0xA4, 0x50, 0xBC, 0xF3, 0xD2, 0xF1, 0x01, 0xA8, - 0x07, 0xA8, 0x0A, 0x03, 0x09, 0x03, 0x64, 0x40, 0x01, 0x26, 0x09, 0x00, 0x18, 0x60, 0x07, 0xF3, - 0xFF, 0xFF, 0x01, 0xB4, 0xFF, 0xFF, 0x03, 0x02, 0xAD, 0x4F, 0xFA, 0xB4, 0xA0, 0x5D, 0xAE, 0x4F, - 0x02, 0xBC, 0x00, 0x7F, 0xA0, 0x5E, 0x3F, 0x40, 0x02, 0x2B, 0x11, 0x00, 0x0C, 0x60, 0x00, 0x62, - 0x00, 0x60, 0x71, 0x7C, 0x00, 0x60, 0xB1, 0x65, 0x1A, 0x60, 0x58, 0x4D, 0x88, 0x78, 0xFF, 0xFF, - 0x08, 0xE1, 0x62, 0xFF, 0xA3, 0xFF, 0xFF, 0xFF, 0xA2, 0xFF, 0x02, 0x60, 0x08, 0xE1, 0xBD, 0xFE, - 0x97, 0x01, 0x21, 0x46, 0x01, 0x5D, 0x5C, 0x62, 0x03, 0xE1, 0x44, 0xFF, 0xA1, 0xFF, 0x9A, 0xFF, - 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x62, 0x62, 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0xA1, 0xFF, - 0x5A, 0xDC, 0x12, 0xE1, 0x02, 0x60, 0x01, 0xE1, 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, 0x28, 0x40, - 0x40, 0x2B, 0x03, 0x00, 0x29, 0x40, 0x20, 0x27, 0x97, 0x00, 0xC8, 0x74, 0xCD, 0xE2, 0x29, 0x44, - 0x08, 0xBC, 0x40, 0x49, 0x44, 0xFF, 0x05, 0xE1, 0x28, 0x40, 0x08, 0x2A, 0x07, 0x00, 0x28, 0x40, - 0x48, 0x36, 0x04, 0x00, 0xD2, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0xD2, 0xFB, 0x29, 0x44, 0xFF, 0x60, - 0xEF, 0x65, 0x24, 0x89, 0x40, 0x27, 0x3F, 0x00, 0x00, 0x00, 0x29, 0x40, 0x80, 0x27, 0x0B, 0x00, - 0x07, 0x61, 0xA1, 0xFF, 0xCD, 0x81, 0x04, 0x25, 0x61, 0x00, 0x87, 0x4C, 0xFB, 0x02, 0xF3, 0x60, - 0xA0, 0x64, 0x80, 0x4C, 0x07, 0x00, 0xA1, 0xFF, 0x9C, 0x4C, 0x9C, 0x4C, 0x9C, 0x4D, 0x05, 0x60, - 0xCF, 0x64, 0x80, 0x4C, 0x28, 0x40, 0x40, 0x2B, 0x05, 0x00, 0x29, 0x40, 0x20, 0x27, 0x02, 0x00, - 0x15, 0x60, 0x6F, 0x6B, 0x04, 0x25, 0x4A, 0x00, 0x30, 0x64, 0x3A, 0xDB, 0x44, 0xFF, 0x04, 0x25, - 0x45, 0x00, 0x04, 0x60, 0x00, 0x65, 0x25, 0x44, 0xB4, 0x84, 0x80, 0x4E, 0x2D, 0x41, 0x04, 0x25, - 0x3D, 0x00, 0x61, 0x4C, 0x00, 0x60, 0x8A, 0x65, 0xC5, 0x81, 0x61, 0x54, 0xA1, 0xFF, 0xFF, 0xFF, - 0x04, 0x25, 0x34, 0x00, 0x67, 0x4E, 0x07, 0x64, 0x1C, 0xFB, 0x00, 0xE1, 0x02, 0x60, 0x05, 0xE1, - 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, 0x28, 0x40, 0x40, 0x27, 0x0A, 0x00, 0x1C, 0x65, 0x28, 0x40, - 0xA4, 0x36, 0x14, 0x65, 0x23, 0x44, 0xC4, 0x84, 0x28, 0x40, 0x08, 0x2A, 0x0C, 0x00, 0x07, 0x00, - 0x23, 0x44, 0x1C, 0xA4, 0x29, 0x40, 0x20, 0x27, 0x02, 0x00, 0x11, 0x60, 0x0F, 0x6B, 0x3C, 0x46, - 0x98, 0xF0, 0x23, 0x44, 0xC4, 0x84, 0x06, 0x74, 0x25, 0x5C, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0xB0, 0x84, 0x80, 0x4C, 0x9C, 0x4C, 0x44, 0xFF, 0x18, 0xE1, 0x0A, 0x64, 0x1E, 0x74, - 0x02, 0x60, 0x05, 0xE1, 0x40, 0x40, 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, 0xC4, 0xE2, 0x27, 0x44, - 0x20, 0x2A, 0x06, 0x00, 0x42, 0x64, 0x3A, 0xDB, 0x67, 0x4C, 0xB0, 0x60, 0x80, 0x78, 0xFF, 0xFF, - 0x41, 0x64, 0x3A, 0xDB, 0x62, 0xFF, 0x08, 0xE1, 0xE2, 0xFE, 0x72, 0x52, 0xA1, 0xFF, 0x98, 0xFF, - 0x80, 0x3E, 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, 0x28, 0x40, 0x08, 0x27, 0x66, 0x01, 0x3C, 0x46, - 0x8B, 0xFF, 0x84, 0x60, 0x00, 0xE4, 0x0F, 0x60, 0x92, 0x64, 0xC9, 0x60, 0x58, 0x4F, 0x10, 0x78, - 0xFF, 0xFF, 0x3F, 0xF2, 0x00, 0x60, 0x18, 0x70, 0x18, 0x71, 0x20, 0x72, 0x00, 0xF2, 0x60, 0x53, - 0x20, 0xE1, 0xA1, 0xFF, 0x88, 0x75, 0x00, 0xE1, 0xFF, 0xFF, 0x60, 0x50, 0x75, 0x44, 0x12, 0x71, - 0x6E, 0x72, 0x81, 0x75, 0xFF, 0xFF, 0x88, 0xFF, 0xA3, 0x60, 0xB5, 0x78, 0xFF, 0xFF, 0x32, 0xF3, - 0x08, 0x29, 0x0A, 0x00, 0x60, 0x40, 0x07, 0x22, 0x07, 0x00, 0xFE, 0xB4, 0x32, 0xFB, 0x27, 0x44, - 0x10, 0xBC, 0xF7, 0xB4, 0x40, 0x47, 0x43, 0xFF, 0x00, 0x64, 0x3A, 0xDB, 0x01, 0x60, 0x08, 0xE1, - 0x31, 0x40, 0x01, 0x2A, 0x04, 0x00, 0x00, 0x64, 0x33, 0xFB, 0x01, 0x60, 0x0A, 0xE1, 0xE5, 0xFE, - 0x27, 0x05, 0x9F, 0xFE, 0x12, 0x05, 0x31, 0x41, 0x40, 0x2A, 0x0F, 0x00, 0x07, 0x60, 0xEA, 0xF1, - 0xAE, 0x4C, 0x90, 0x80, 0x10, 0x2A, 0x09, 0x00, 0x7F, 0xB1, 0x07, 0x60, 0xEA, 0xFB, 0x60, 0x40, - 0x10, 0x2A, 0x80, 0xB9, 0x41, 0x51, 0xDF, 0xFE, 0x19, 0xFF, 0x27, 0x44, 0x10, 0x26, 0x13, 0x00, - 0x9F, 0xFE, 0x02, 0x04, 0x40, 0xE1, 0x06, 0x00, 0x7C, 0xE1, 0x31, 0x44, 0x01, 0x2A, 0x02, 0x00, - 0x04, 0x0A, 0xFD, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0xAF, 0x60, 0x7B, 0x78, 0xFF, 0xFF, - 0xAA, 0x60, 0xC0, 0x78, 0xFF, 0xFF, 0x27, 0x44, 0x08, 0x26, 0xFF, 0xFF, 0xC0, 0x60, 0xEA, 0x78, - 0xFF, 0xFF, 0x48, 0xF3, 0x32, 0xF1, 0x00, 0x63, 0x64, 0x40, 0x07, 0x26, 0x03, 0x00, 0xA5, 0x60, - 0x6C, 0x78, 0xFF, 0xFF, 0x31, 0x40, 0x08, 0x26, 0xF1, 0x01, 0xCD, 0xE2, 0x84, 0xE1, 0x70, 0x41, - 0xAD, 0x80, 0x71, 0x40, 0x80, 0x27, 0xEA, 0x12, 0x03, 0x03, 0xC1, 0x60, 0x3B, 0x78, 0xFF, 0xFF, - 0xA1, 0xFF, 0xFF, 0xFF, 0xC4, 0xE2, 0x32, 0xFD, 0x60, 0x40, 0x01, 0x2A, 0xDC, 0x01, 0x3C, 0x46, - 0x3E, 0xF2, 0x2A, 0xF0, 0x27, 0x41, 0x44, 0x48, 0x20, 0xB9, 0x01, 0xB4, 0xF7, 0xB1, 0x0A, 0x03, - 0x64, 0x40, 0x08, 0x27, 0x07, 0x00, 0x0F, 0x60, 0xEE, 0x63, 0x00, 0x64, 0x45, 0xFB, 0x46, 0xFB, - 0xBD, 0xDB, 0xA3, 0xDB, 0xCB, 0x0A, 0xCA, 0x11, 0x41, 0x47, 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x40, - 0x10, 0x26, 0x04, 0x00, 0x01, 0x2A, 0x05, 0x00, 0x10, 0x2B, 0x03, 0x00, 0x29, 0x47, 0x20, 0xBF, - 0x40, 0x49, 0x05, 0xE1, 0x01, 0x60, 0x08, 0xE1, 0x2A, 0xE8, 0x3C, 0x46, 0x00, 0x63, 0x32, 0xFD, - 0x43, 0xFF, 0x0F, 0xF0, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x2A, 0x03, 0x00, 0xA8, 0x60, 0x76, 0x78, - 0xFF, 0xFF, 0x64, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x27, 0x0E, 0x00, 0x1F, 0xF2, 0xFF, 0xFF, - 0x60, 0x40, 0x40, 0x2B, 0x09, 0x00, 0x15, 0x60, 0xDD, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x02, 0x2A, - 0x03, 0x00, 0xA9, 0x60, 0x81, 0x78, 0xFF, 0xFF, 0x1F, 0xF2, 0xC0, 0x60, 0x00, 0x65, 0xA4, 0x9C, - 0x3F, 0x60, 0xCF, 0x65, 0x29, 0x44, 0xA4, 0x84, 0x30, 0x89, 0x15, 0x60, 0xD9, 0xF3, 0xFF, 0xFF, - 0x15, 0x60, 0xD8, 0xFB, 0x1F, 0xF2, 0x39, 0xF1, 0xE0, 0x60, 0xFF, 0xB5, 0x0A, 0x18, 0x60, 0x47, - 0x1F, 0xB4, 0xD0, 0x84, 0xE0, 0xA0, 0x02, 0x0D, 0x00, 0x64, 0x02, 0x00, 0x01, 0x04, 0x1F, 0x64, - 0x60, 0x47, 0xB4, 0x81, 0x07, 0x60, 0xEB, 0xF1, 0xFF, 0xFF, 0xB1, 0x8C, 0x29, 0x40, 0x40, 0x2B, - 0x10, 0x00, 0x22, 0x60, 0xC6, 0x65, 0x60, 0x47, 0x1F, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0x44, 0xD3, - 0x5A, 0xD1, 0x01, 0x60, 0x00, 0xE1, 0x01, 0x60, 0x09, 0x6B, 0x60, 0x4C, 0xB5, 0xFF, 0x64, 0x4C, - 0x14, 0x00, 0x22, 0x60, 0xC6, 0x65, 0x60, 0x47, 0x1F, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0x44, 0xD3, - 0x5A, 0xD1, 0x01, 0x60, 0x00, 0xE1, 0x05, 0x60, 0x69, 0x6B, 0x60, 0x4C, 0xB5, 0xFF, 0x64, 0x4C, - 0x7C, 0x44, 0x29, 0x40, 0x80, 0x2B, 0x67, 0x44, 0x60, 0x4C, 0x00, 0xE1, 0x84, 0xFF, 0xC1, 0x60, - 0x6B, 0x64, 0x40, 0x42, 0x82, 0xFF, 0x0D, 0x00, 0xE5, 0xFE, 0x03, 0x04, 0xAA, 0x60, 0xC0, 0x78, - 0xFF, 0xFF, 0x32, 0xF1, 0xFF, 0xFF, 0x64, 0x40, 0x07, 0x22, 0x43, 0xFF, 0xA4, 0x60, 0x7C, 0x78, - 0xFF, 0xFF, 0x3C, 0x44, 0x0B, 0x64, 0x3A, 0xDB, 0x01, 0x60, 0x0A, 0xE1, 0x1C, 0x42, 0x22, 0x46, - 0x13, 0xF2, 0xFF, 0x65, 0x60, 0x47, 0x2A, 0xF2, 0x40, 0x45, 0x40, 0x48, 0x04, 0x2B, 0x13, 0x00, - 0x16, 0xF2, 0x1D, 0xF2, 0x40, 0x43, 0x0F, 0xF2, 0x40, 0x4D, 0x0F, 0x64, 0x14, 0xF0, 0x35, 0xF2, - 0xA0, 0x82, 0x0F, 0xB4, 0xCA, 0x85, 0xD4, 0x80, 0x10, 0xF2, 0x01, 0x02, 0x2B, 0xFA, 0x27, 0x44, - 0x40, 0xBC, 0x40, 0x47, 0x13, 0x00, 0x17, 0xF2, 0x2C, 0xF0, 0x40, 0x43, 0x1B, 0xF2, 0x1D, 0xFA, - 0x40, 0x4D, 0x64, 0x40, 0x01, 0x2A, 0x02, 0x00, 0xAB, 0xFC, 0x05, 0x00, 0x28, 0x40, 0xA4, 0x36, - 0x02, 0x00, 0x11, 0xF2, 0x2B, 0xFA, 0x27, 0x44, 0xBF, 0xB4, 0x40, 0x47, 0xF0, 0xFE, 0xAF, 0x60, - 0x85, 0x78, 0xFF, 0xFF, 0x22, 0x46, 0x2C, 0xF0, 0x27, 0x44, 0xDF, 0xB4, 0x40, 0x47, 0x64, 0x40, - 0x01, 0x26, 0x01, 0x00, 0x01, 0x00, 0x11, 0x00, 0x2A, 0xF0, 0x01, 0x65, 0x64, 0x40, 0xA4, 0x3A, - 0x04, 0x65, 0x27, 0x44, 0x34, 0x87, 0x36, 0xF3, 0xFF, 0xFF, 0x60, 0x56, 0xAD, 0xE2, 0x04, 0x64, - 0x3A, 0xDB, 0x69, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x06, 0x64, 0x3A, 0xDB, 0x22, 0x46, - 0x01, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0xC1, 0x60, 0x44, 0x78, 0xFF, 0xFF, 0x28, 0x40, 0xC4, 0x3A, - 0x0C, 0x00, 0x27, 0x44, 0xFD, 0xB4, 0x40, 0x47, 0xA8, 0xE2, 0x05, 0xE1, 0x01, 0x60, 0x08, 0xE1, - 0x2A, 0xE8, 0x3C, 0x46, 0xA5, 0x60, 0x1C, 0x78, 0xFF, 0xFF, 0x3F, 0x40, 0x01, 0x2B, 0x05, 0x00, - 0x67, 0x4C, 0x01, 0x60, 0x00, 0xE1, 0x05, 0x60, 0x69, 0x6B, 0x07, 0x60, 0xEC, 0xF1, 0x1F, 0xF2, - 0x2A, 0xE8, 0xB0, 0x81, 0x29, 0x40, 0x40, 0x2B, 0x14, 0x00, 0x61, 0x4C, 0x22, 0x60, 0xC6, 0x65, - 0x61, 0x47, 0x1F, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0x44, 0xD3, 0x5A, 0xD1, 0x01, 0x60, 0x00, 0xE1, - 0x01, 0x60, 0x09, 0x6B, 0x60, 0x4C, 0xB5, 0xFF, 0xFF, 0x60, 0xF2, 0x64, 0x64, 0x4C, 0x40, 0x43, - 0x18, 0x00, 0x29, 0x47, 0x80, 0xB7, 0x34, 0x94, 0x60, 0x4C, 0x22, 0x60, 0xC6, 0x65, 0x61, 0x47, - 0x1F, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0x44, 0xD3, 0x5A, 0xD1, 0x01, 0x60, 0x00, 0xE1, 0x05, 0x60, - 0x69, 0x6B, 0x60, 0x4C, 0xB5, 0xFF, 0x64, 0x4C, 0x7C, 0x44, 0x29, 0x40, 0x80, 0x2B, 0x67, 0x44, - 0x60, 0x4C, 0x40, 0xE1, 0x01, 0x60, 0x08, 0xE1, 0x28, 0x45, 0xBF, 0x60, 0xFF, 0x64, 0x24, 0x88, - 0xC4, 0xE2, 0x08, 0x64, 0x3A, 0xDB, 0x21, 0x46, 0x2A, 0x44, 0x72, 0x45, 0x24, 0xFA, 0x94, 0xF3, - 0x06, 0x04, 0xE4, 0xE2, 0xDC, 0x9C, 0x29, 0x40, 0x01, 0x26, 0x64, 0x44, 0x94, 0xF9, 0x25, 0xFA, - 0x95, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0x95, 0xFB, 0x28, 0xFA, 0x96, 0xF3, 0x02, 0x04, 0xDC, 0x84, - 0x96, 0xFB, 0x29, 0xFA, 0x24, 0x44, 0x04, 0x2A, 0x06, 0x00, 0x28, 0x40, 0xA4, 0x36, 0x03, 0x00, - 0xA7, 0x60, 0x46, 0x78, 0xFF, 0xFF, 0x94, 0xFC, 0x13, 0x60, 0x4A, 0xF1, 0x28, 0x44, 0x08, 0x2A, - 0x51, 0x00, 0x03, 0x2B, 0x01, 0x00, 0x4E, 0x00, 0x64, 0x40, 0x00, 0x36, 0x4B, 0x00, 0x32, 0xF2, - 0x2F, 0xF0, 0x50, 0xFE, 0x01, 0x2A, 0x03, 0x00, 0x01, 0x61, 0x8E, 0xF3, 0x31, 0x00, 0xD0, 0x80, - 0x33, 0xF2, 0x30, 0xF0, 0x34, 0xF2, 0xD0, 0x80, 0x31, 0xF0, 0xFF, 0xFF, 0xD0, 0x80, 0x60, 0x47, - 0x34, 0x0C, 0xFF, 0xB4, 0x15, 0x60, 0x02, 0x65, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0xFF, 0xFF, - 0x31, 0x18, 0x60, 0x43, 0x50, 0xFE, 0x66, 0x41, 0x32, 0xF0, 0x63, 0x46, 0x03, 0xF2, 0x61, 0x46, - 0xD0, 0x80, 0x33, 0xF0, 0x63, 0x46, 0x04, 0xF2, 0x61, 0x46, 0xD0, 0x80, 0x34, 0xF0, 0x63, 0x46, - 0x05, 0xF2, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x04, 0x0C, 0x00, 0xF2, 0x61, 0x46, 0x1A, 0x18, - 0xE8, 0x01, 0x06, 0xF0, 0x8E, 0xF3, 0x61, 0x46, 0x02, 0x61, 0x64, 0x40, 0x02, 0x2A, 0x12, 0x00, - 0xFC, 0xA0, 0xFF, 0xFF, 0x04, 0x0E, 0x61, 0x44, 0x14, 0xFA, 0x11, 0xFC, 0x0B, 0x00, 0x2C, 0xF2, - 0x2F, 0xFA, 0x2D, 0xF2, 0x30, 0xFA, 0x2E, 0xF2, 0x31, 0xFA, 0x1D, 0xFF, 0x26, 0x44, 0x02, 0xBC, - 0x40, 0x46, 0x1E, 0x00, 0x26, 0x43, 0x84, 0xBB, 0xFC, 0xB3, 0x21, 0x46, 0x01, 0x5D, 0x0F, 0xFC, - 0x5C, 0x46, 0x05, 0xFF, 0x27, 0x44, 0x01, 0x2A, 0x13, 0x00, 0x50, 0xFE, 0x28, 0x40, 0x08, 0x3A, - 0x12, 0x00, 0x2F, 0xF2, 0x30, 0xF0, 0x60, 0x43, 0x31, 0xF2, 0x22, 0x46, 0x64, 0x41, 0x2C, 0xF0, - 0x2D, 0xF0, 0xD3, 0x80, 0x2E, 0xF0, 0xD1, 0x80, 0xD0, 0x80, 0x27, 0x44, 0x09, 0x0C, 0x03, 0x00, - 0x27, 0x44, 0x06, 0x22, 0x05, 0x00, 0xB8, 0xB4, 0x40, 0x47, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, - 0xD4, 0x64, 0x40, 0x48, 0x0D, 0x64, 0x3A, 0xDB, 0x21, 0x46, 0x1C, 0xF2, 0x00, 0xE1, 0xF0, 0xFE, - 0x00, 0x63, 0x28, 0x44, 0xA4, 0x36, 0x07, 0x00, 0x04, 0x2B, 0x05, 0x00, 0x30, 0xF3, 0x2D, 0x45, - 0xD4, 0x84, 0xCA, 0x65, 0xD4, 0x83, 0xD4, 0x64, 0x35, 0x00, 0x0F, 0x64, 0x3A, 0xDB, 0x21, 0x46, - 0x29, 0x40, 0x40, 0x27, 0x15, 0x00, 0x80, 0x27, 0x02, 0x00, 0xCA, 0x65, 0x01, 0x00, 0x6A, 0x65, - 0x1C, 0xF2, 0xFF, 0xFF, 0x04, 0x7F, 0x40, 0x45, 0x0A, 0x36, 0x70, 0x64, 0x14, 0x36, 0x38, 0x64, - 0x37, 0x36, 0x15, 0x64, 0x6E, 0x3A, 0x17, 0x00, 0x84, 0x7F, 0x40, 0x45, 0x0B, 0x64, 0x13, 0x00, - 0x1C, 0xF2, 0x1E, 0x65, 0x40, 0x45, 0x0B, 0x36, 0x1E, 0x64, 0x0F, 0x36, 0x16, 0x64, 0x0A, 0x36, - 0x12, 0x64, 0x0E, 0x36, 0x0E, 0x64, 0x09, 0x36, 0x0E, 0x64, 0x0D, 0x36, 0x0A, 0x64, 0x08, 0x36, - 0x0A, 0x64, 0x0C, 0x36, 0x0A, 0x64, 0x40, 0x4D, 0x00, 0xE1, 0xF0, 0xFE, 0x2B, 0xF2, 0xC4, 0x85, - 0xD4, 0x83, 0xC4, 0x64, 0x40, 0x48, 0x2F, 0xF0, 0xB0, 0xF0, 0xB1, 0xF2, 0xA1, 0xFF, 0x12, 0x74, - 0xCD, 0xE2, 0x80, 0x4E, 0x12, 0x74, 0x83, 0x4C, 0x12, 0x74, 0x9A, 0xFF, 0x84, 0x4C, 0x12, 0x74, - 0x85, 0x4C, 0x12, 0x74, 0x81, 0x4C, 0x12, 0x74, 0xA1, 0xFF, 0x98, 0xFF, 0xB1, 0x60, 0x58, 0x4F, - 0x00, 0x78, 0xFF, 0xFF, 0x01, 0x60, 0x18, 0xE1, 0x78, 0x44, 0x03, 0xA4, 0x35, 0xFB, 0xB1, 0x60, - 0x43, 0x78, 0xFF, 0xFF, 0x29, 0x44, 0xF7, 0xB4, 0x40, 0x49, 0x27, 0x44, 0x01, 0x2A, 0x05, 0x00, - 0xFE, 0xB4, 0x40, 0x47, 0xA5, 0x60, 0xCD, 0x78, 0xFF, 0xFF, 0x13, 0x60, 0x2E, 0xF3, 0xFF, 0xFF, - 0x60, 0x40, 0x02, 0x36, 0xC1, 0xFE, 0xA4, 0x60, 0x6F, 0x78, 0xFF, 0xFF, 0x28, 0x40, 0xB4, 0x3A, - 0x0B, 0x00, 0x27, 0x44, 0x07, 0x22, 0x05, 0x00, 0xF8, 0xB4, 0x40, 0x47, 0x02, 0x64, 0x31, 0xFB, - 0xC0, 0xFE, 0xA6, 0x60, 0xDD, 0x78, 0xFF, 0xFF, 0x28, 0x44, 0xD4, 0x36, 0x03, 0x00, 0xA8, 0x60, - 0x5D, 0x78, 0xFF, 0xFF, 0xA8, 0xE2, 0x27, 0x44, 0xFB, 0xB4, 0x40, 0x47, 0x1C, 0x42, 0x22, 0x46, - 0x16, 0x60, 0x2B, 0xF3, 0xFF, 0xFF, 0x34, 0xFB, 0x2A, 0xF0, 0xF7, 0x60, 0xFF, 0x64, 0xA0, 0x84, - 0xA2, 0xDA, 0x60, 0x40, 0x40, 0x2B, 0xC4, 0x00, 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x22, 0x26, - 0x3F, 0x00, 0x01, 0x26, 0x03, 0x00, 0x04, 0x26, 0x05, 0x00, 0xBA, 0x00, 0x04, 0x2B, 0xB8, 0x00, - 0x87, 0xF5, 0x01, 0x00, 0x07, 0xF4, 0x4B, 0xF2, 0xFF, 0xFF, 0xDC, 0x84, 0x4B, 0xFA, 0x0C, 0x60, - 0xFE, 0x62, 0x80, 0xFF, 0xC8, 0x60, 0x78, 0x44, 0x02, 0xA4, 0xA2, 0xDB, 0x46, 0x78, 0xFF, 0xFF, - 0x82, 0xFF, 0x87, 0xF3, 0x66, 0x5C, 0xD0, 0x80, 0x00, 0x7C, 0x07, 0x03, 0x66, 0x43, 0x22, 0x46, - 0x22, 0xF2, 0x63, 0x46, 0x60, 0x40, 0x01, 0x2A, 0x01, 0x00, 0x3C, 0xF1, 0x4B, 0xF0, 0x64, 0x41, - 0x64, 0x47, 0x60, 0x5F, 0x20, 0xBC, 0x80, 0x26, 0x80, 0xAC, 0x60, 0x47, 0x22, 0x46, 0x3A, 0xFA, - 0x64, 0x44, 0x20, 0x7F, 0x34, 0x94, 0x3B, 0xFA, 0x08, 0x60, 0x00, 0xEA, 0x0F, 0x64, 0x60, 0x7F, - 0xA0, 0x5A, 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0x80, 0x00, - 0x2A, 0xF2, 0x00, 0x60, 0x7C, 0x62, 0x60, 0x40, 0x40, 0x2B, 0x24, 0x00, 0xA2, 0xD3, 0x00, 0x61, - 0x60, 0xFE, 0xA0, 0xD3, 0x5E, 0xD1, 0xFF, 0xFF, 0x20, 0xFE, 0x64, 0x5F, 0xDC, 0x84, 0xF1, 0x81, - 0xC0, 0x2B, 0x04, 0x00, 0x80, 0x2A, 0x02, 0x00, 0x7F, 0xA4, 0xDC, 0x84, 0xFF, 0x3B, 0x03, 0x00, - 0x60, 0x47, 0xDC, 0x87, 0x01, 0x61, 0xC0, 0x80, 0x00, 0x36, 0xDC, 0x84, 0x4E, 0xDB, 0x60, 0xFE, - 0x5A, 0xD1, 0xFF, 0xFF, 0xC1, 0x84, 0xF0, 0x22, 0x10, 0xA4, 0xF0, 0x2A, 0x01, 0x00, 0x00, 0x64, - 0xA2, 0xDB, 0x20, 0xFE, 0x00, 0x60, 0x3E, 0xF3, 0xFF, 0xFF, 0xA0, 0xD3, 0x5A, 0xD1, 0x3A, 0xFA, - 0x3B, 0xF8, 0x74, 0x62, 0xA2, 0xD0, 0xFF, 0xFF, 0x64, 0x44, 0xE0, 0x7F, 0xA0, 0x5A, 0x64, 0x47, - 0xE1, 0x7F, 0x5A, 0xD0, 0xA0, 0x5A, 0x64, 0x44, 0xE2, 0x7F, 0xA0, 0x5A, 0x00, 0x60, 0x40, 0xF3, - 0xFF, 0xFF, 0xA0, 0xD1, 0x5A, 0xD1, 0x64, 0x45, 0x64, 0x44, 0xE3, 0x7F, 0xA0, 0x5A, 0x64, 0x47, - 0xE4, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xE5, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xE6, 0x7F, - 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xE7, 0x7F, 0xA0, 0x5A, 0x65, 0x40, 0x0D, 0x3A, 0x1C, 0x00, - 0x64, 0x47, 0xE8, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xE9, 0x7F, 0xA0, 0x5A, 0x64, 0x47, - 0xEA, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xEB, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xEC, 0x7F, - 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xED, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xEE, 0x7F, 0x5A, 0xD1, - 0xA0, 0x5A, 0x64, 0x44, 0xEF, 0x7F, 0xA0, 0x5A, 0x08, 0x60, 0x00, 0xEA, 0x65, 0x44, 0x02, 0xA4, - 0x60, 0x7F, 0xA0, 0x5A, 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, - 0x0B, 0xF2, 0xFF, 0xFF, 0x7F, 0xB4, 0x0C, 0xF0, 0x04, 0x02, 0x64, 0x46, 0x00, 0xF0, 0x04, 0x64, - 0x22, 0x46, 0x03, 0xFA, 0x60, 0x41, 0x64, 0x46, 0x01, 0xF2, 0xFC, 0xA1, 0x61, 0x45, 0xD4, 0x84, - 0xFF, 0xFF, 0x08, 0x02, 0x00, 0xF0, 0x04, 0x63, 0x64, 0x46, 0x01, 0xF2, 0x22, 0x46, 0x1A, 0xFA, - 0x03, 0xFC, 0x02, 0x00, 0x22, 0x46, 0x1A, 0xFA, 0x35, 0xF2, 0x04, 0xF8, 0xDC, 0x84, 0x35, 0xFA, - 0x14, 0xF2, 0x0F, 0xB5, 0x0F, 0xB4, 0xCC, 0x84, 0x94, 0x80, 0x04, 0x60, 0x00, 0x65, 0x2A, 0xF2, - 0x01, 0x02, 0x94, 0x84, 0x2A, 0xFA, 0x95, 0xFC, 0x06, 0x00, 0xC4, 0x3A, 0x07, 0x00, 0x27, 0x44, - 0xFD, 0xB4, 0x40, 0x47, 0xA8, 0xE2, 0xA5, 0x60, 0x7A, 0x78, 0xFF, 0xFF, 0x28, 0x44, 0x04, 0x26, - 0x05, 0x00, 0x68, 0x3A, 0x03, 0x00, 0x32, 0x44, 0x00, 0x27, 0x03, 0x00, 0xA4, 0x60, 0x7C, 0x78, - 0xFF, 0xFF, 0x0A, 0x64, 0x3A, 0xDB, 0xA4, 0x60, 0x7C, 0x78, 0xFF, 0xFF, 0x0E, 0x64, 0x3A, 0xDB, - 0x3C, 0x44, 0x60, 0x46, 0x1E, 0xF0, 0x40, 0x42, 0x64, 0x40, 0x40, 0x27, 0x48, 0x00, 0x1F, 0xF2, - 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x27, 0x3C, 0x00, 0x80, 0x2B, 0x0B, 0x00, 0xBF, 0x60, 0xFF, 0x65, - 0x29, 0x44, 0x24, 0x89, 0x80, 0x60, 0x00, 0x65, 0x29, 0x44, 0x34, 0x89, 0x80, 0x60, 0x00, 0x63, - 0x05, 0x00, 0x3F, 0x60, 0xFF, 0x65, 0x29, 0x44, 0x24, 0x89, 0x00, 0x63, 0x1E, 0xF2, 0x39, 0xF1, - 0xC0, 0x60, 0xFF, 0xB5, 0x0A, 0x18, 0x60, 0x47, 0x1F, 0xB4, 0xD0, 0x84, 0xE0, 0xA0, 0x02, 0x0D, - 0x00, 0x64, 0x02, 0x00, 0x01, 0x04, 0x1F, 0x64, 0x60, 0x47, 0xB4, 0x84, 0x07, 0x60, 0xEB, 0xF1, - 0x3C, 0x94, 0xB0, 0x84, 0x60, 0x4C, 0x22, 0x60, 0xC6, 0x65, 0x60, 0x47, 0x1F, 0xB4, 0xE0, 0x84, - 0xE0, 0x84, 0x44, 0xD3, 0x5A, 0xD1, 0x01, 0x60, 0x00, 0xE1, 0x05, 0x60, 0x69, 0x6B, 0x60, 0x4C, - 0xB5, 0xFF, 0x64, 0x4C, 0x7C, 0x44, 0x29, 0x40, 0x80, 0x2B, 0x67, 0x44, 0x60, 0x4C, 0x32, 0x00, - 0x15, 0x60, 0xDD, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x04, 0x26, 0xCB, 0x01, 0xBF, 0x01, 0x40, 0x60, - 0x00, 0x65, 0x29, 0x44, 0x34, 0x89, 0x40, 0x60, 0x00, 0x63, 0x9F, 0xF2, 0x1E, 0xF2, 0x39, 0xF1, - 0xC0, 0x60, 0xFF, 0xB5, 0x0A, 0x18, 0x60, 0x47, 0x1F, 0xB4, 0xD0, 0x84, 0xE0, 0xA0, 0x02, 0x0D, - 0x00, 0x64, 0x02, 0x00, 0x01, 0x04, 0x1F, 0x64, 0x60, 0x47, 0xB4, 0x84, 0x07, 0x60, 0xEB, 0xF1, - 0x3C, 0x94, 0xB0, 0x81, 0x61, 0x4C, 0x22, 0x60, 0xC6, 0x65, 0x61, 0x47, 0x1F, 0xB4, 0xE0, 0x84, - 0xE0, 0x84, 0x44, 0xD3, 0x5A, 0xD1, 0x01, 0x60, 0x00, 0xE1, 0x01, 0x60, 0x09, 0x6B, 0x60, 0x4C, - 0xB5, 0xFF, 0x64, 0x4C, 0x40, 0xE1, 0x01, 0x60, 0x08, 0xE1, 0x84, 0xFF, 0xC1, 0x60, 0x6B, 0x64, - 0x40, 0x42, 0x82, 0xFF, 0x2A, 0xF2, 0x10, 0x60, 0x00, 0x65, 0xA4, 0x84, 0xB4, 0xBC, 0x1E, 0xF0, - 0x40, 0x48, 0x64, 0x40, 0x40, 0x27, 0x17, 0x00, 0x1C, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x0A, 0x36, - 0x06, 0x00, 0x14, 0x36, 0x07, 0x00, 0x37, 0x36, 0x08, 0x00, 0x6E, 0x36, 0x09, 0x00, 0x70, 0x7C, - 0xA0, 0x63, 0x0F, 0x00, 0x38, 0x7C, 0x50, 0x63, 0x0C, 0x00, 0x15, 0x7C, 0x1E, 0x63, 0x09, 0x00, - 0x0B, 0x7C, 0x0F, 0x63, 0x06, 0x00, 0x9C, 0xF4, 0xFF, 0x65, 0x63, 0x47, 0xA4, 0x9C, 0xA7, 0x84, - 0x23, 0x00, 0x40, 0x45, 0x43, 0x4D, 0x00, 0xE1, 0xF0, 0xFE, 0x29, 0x40, 0x80, 0x2B, 0x03, 0x00, - 0x00, 0x60, 0x6A, 0x65, 0x02, 0x00, 0x00, 0x60, 0xCA, 0x65, 0x1F, 0xF2, 0xFF, 0xFF, 0x60, 0x40, - 0x40, 0x27, 0x0E, 0x00, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x04, 0x27, 0x03, 0x00, 0x65, 0x44, - 0xE0, 0x85, 0x12, 0x00, 0x2B, 0xF2, 0x11, 0xF0, 0xC0, 0x84, 0xD0, 0x84, 0xC4, 0x83, 0x11, 0x00, - 0x1E, 0x64, 0xC4, 0x84, 0x60, 0x45, 0x08, 0x00, 0x40, 0x45, 0xFF, 0x60, 0xF8, 0x64, 0x40, 0x43, - 0x00, 0xE1, 0xF0, 0xFE, 0x00, 0x60, 0x3C, 0x65, 0x91, 0xF4, 0x1B, 0xF0, 0xC3, 0x84, 0xC4, 0x84, - 0xC0, 0x83, 0x28, 0x44, 0xA1, 0xFF, 0x12, 0x74, 0x80, 0x4E, 0x12, 0x74, 0x83, 0x4C, 0x9A, 0xFF, - 0x12, 0x74, 0x56, 0x62, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, - 0x5C, 0x62, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0xA1, 0xFF, - 0x98, 0xFF, 0xB1, 0x60, 0x58, 0x4F, 0x00, 0x78, 0xFF, 0xFF, 0xBC, 0xFF, 0xB5, 0xFF, 0x01, 0x60, - 0x18, 0xE1, 0x47, 0xFF, 0x27, 0x44, 0x02, 0xBC, 0x40, 0x47, 0x36, 0xF3, 0xB6, 0xFF, 0xB7, 0xFF, - 0xB4, 0xFF, 0xC8, 0x60, 0x09, 0x7D, 0x7C, 0x4B, 0x60, 0x56, 0xAD, 0xE2, 0xA5, 0x60, 0xC7, 0x78, - 0xFF, 0xFF, 0x15, 0x60, 0xDD, 0xF3, 0x15, 0x60, 0xBE, 0xF3, 0x60, 0x40, 0x04, 0x26, 0x0B, 0x00, - 0x07, 0xB4, 0x60, 0x40, 0x01, 0x36, 0x07, 0x00, 0x29, 0x44, 0xBF, 0x60, 0xFF, 0xB7, 0x80, 0xBF, - 0x40, 0x49, 0x80, 0x67, 0x05, 0x00, 0x3F, 0x60, 0xFF, 0x65, 0x29, 0x44, 0x24, 0x89, 0x00, 0x64, - 0x12, 0x60, 0xD3, 0xF1, 0xFF, 0xFF, 0x15, 0x60, 0xD8, 0xF9, 0x39, 0xF1, 0x12, 0x60, 0xBF, 0xF1, - 0x64, 0x41, 0x64, 0x5E, 0x60, 0x45, 0x64, 0x47, 0x1F, 0xB4, 0x54, 0x94, 0xE0, 0xA0, 0x02, 0x0D, - 0x00, 0x64, 0x02, 0x00, 0x01, 0x04, 0x1F, 0x64, 0x60, 0x47, 0x07, 0x60, 0xEB, 0xF1, 0xB4, 0x84, - 0xB0, 0x8C, 0x22, 0x60, 0xC6, 0x7C, 0x60, 0x47, 0x1F, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0x40, 0xD3, - 0x5A, 0xD1, 0x01, 0x60, 0x00, 0xE1, 0x05, 0x60, 0x69, 0x6B, 0x60, 0x4C, 0xB5, 0xFF, 0x64, 0x4C, - 0x7C, 0x44, 0x29, 0x40, 0x80, 0x2B, 0x67, 0x44, 0x60, 0x4C, 0x40, 0xE1, 0x01, 0x60, 0x08, 0xE1, - 0x84, 0xFF, 0xC1, 0x60, 0x6B, 0x64, 0x40, 0x42, 0x82, 0xFF, 0x3C, 0x44, 0x60, 0x46, 0x40, 0x42, - 0x13, 0x64, 0x3A, 0xDB, 0x10, 0x60, 0x00, 0x65, 0x3C, 0x46, 0x2A, 0xF2, 0x15, 0x60, 0xBE, 0xF1, - 0xA4, 0x84, 0xC4, 0xBC, 0x40, 0x48, 0x64, 0x44, 0x04, 0x26, 0x09, 0x00, 0x02, 0x26, 0x0A, 0x00, - 0x01, 0x26, 0x0B, 0x00, 0x08, 0x2A, 0x03, 0x00, 0x0B, 0x63, 0x6E, 0x64, 0x08, 0x00, 0x15, 0x63, - 0x37, 0x64, 0x05, 0x00, 0x38, 0x63, 0x14, 0x64, 0x02, 0x00, 0x70, 0x63, 0x0A, 0x64, 0x43, 0x4D, - 0x40, 0x45, 0x00, 0xE1, 0xF0, 0xFE, 0x00, 0x60, 0x1E, 0x64, 0x1B, 0xF0, 0x11, 0xF0, 0xC0, 0x84, - 0xC0, 0x84, 0x60, 0x43, 0x28, 0x44, 0xA1, 0xFF, 0x12, 0x74, 0x80, 0x4E, 0x12, 0x74, 0x83, 0x4C, - 0x9A, 0xFF, 0x12, 0x74, 0x5C, 0x62, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, - 0x12, 0x74, 0xA1, 0xFF, 0x98, 0xFF, 0xB1, 0x60, 0x58, 0x4F, 0x00, 0x78, 0xFF, 0xFF, 0x01, 0x60, - 0x18, 0xE1, 0x78, 0x44, 0x03, 0xA4, 0x35, 0xFB, 0xB1, 0x60, 0x43, 0x78, 0xFF, 0xFF, 0xC4, 0xE2, - 0x08, 0x64, 0x3A, 0xDB, 0xA5, 0x60, 0x1C, 0x78, 0xFF, 0xFF, 0x24, 0x40, 0x01, 0x2A, 0x0E, 0x00, - 0x1D, 0xFF, 0x26, 0x44, 0x02, 0xBC, 0x40, 0x46, 0x27, 0x44, 0x07, 0x22, 0x05, 0x00, 0xF8, 0xB4, - 0x40, 0x47, 0x06, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x30, 0xF1, 0x52, 0x00, 0xFC, 0xB3, 0x32, 0x40, - 0x01, 0x2A, 0x06, 0x00, 0x0A, 0xBB, 0x0F, 0xFC, 0xCB, 0xFE, 0xA4, 0x60, 0x7C, 0x78, 0xFF, 0xFF, - 0x24, 0x44, 0x04, 0x26, 0x02, 0x00, 0x0F, 0xFC, 0x05, 0xFF, 0x30, 0xF1, 0x27, 0x44, 0x05, 0x22, - 0x2C, 0x00, 0xFA, 0xB4, 0x40, 0x47, 0x24, 0x44, 0x10, 0x2A, 0x23, 0x00, 0x28, 0x40, 0xD4, 0x3A, - 0x20, 0x00, 0x31, 0x40, 0x08, 0x26, 0x00, 0x7C, 0x2B, 0x44, 0xD0, 0x80, 0x70, 0x45, 0x02, 0x28, - 0x64, 0x44, 0xC4, 0x84, 0xFF, 0xFF, 0x04, 0x24, 0x00, 0xB4, 0x60, 0x50, 0x08, 0x28, 0x01, 0x00, - 0x20, 0x29, 0x6D, 0xE2, 0x1D, 0xF0, 0xC0, 0x64, 0xC0, 0x84, 0x0A, 0x60, 0x7B, 0xF1, 0xE8, 0x84, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xC0, 0x84, 0xA2, 0xDB, 0xA5, 0x60, 0xCD, 0x78, - 0xFF, 0xFF, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x07, 0x00, 0x02, 0x2A, 0x05, 0x00, 0xFD, 0xB4, - 0x40, 0x47, 0x06, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x05, 0x64, 0x3A, 0xDB, 0x28, 0x44, 0xA4, 0x3A, - 0x07, 0x00, 0x01, 0x60, 0x02, 0x7C, 0x25, 0x44, 0x0A, 0x3A, 0x02, 0x00, 0x01, 0x60, 0x3A, 0x7C, - 0x31, 0x40, 0x08, 0x26, 0x00, 0x7C, 0x2B, 0x44, 0xD0, 0x80, 0x70, 0x45, 0x02, 0x28, 0x64, 0x44, - 0xC4, 0x84, 0xFF, 0xFF, 0x04, 0x24, 0x00, 0xB4, 0x28, 0x40, 0xE4, 0x36, 0x00, 0xB4, 0x60, 0x50, - 0x08, 0x28, 0x01, 0x00, 0x20, 0x29, 0x6D, 0xE2, 0xA4, 0x60, 0x6F, 0x78, 0xFF, 0xFF, 0x27, 0x44, - 0x05, 0x22, 0x09, 0x00, 0xBA, 0xB4, 0x40, 0x47, 0x3C, 0x46, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, - 0xA4, 0x60, 0x7C, 0x78, 0xFF, 0xFF, 0x27, 0x44, 0x02, 0x2A, 0x06, 0x00, 0xFD, 0xB4, 0x40, 0x47, - 0x06, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0xF4, 0x01, 0xF3, 0x0A, 0x7C, 0x50, 0x6D, 0xE2, 0xF0, 0x01, - 0x72, 0x45, 0xDC, 0x84, 0x94, 0xFB, 0x11, 0x64, 0x3A, 0xDB, 0x95, 0xF3, 0x06, 0x04, 0xDC, 0x84, - 0x95, 0xFB, 0x96, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0x96, 0xFB, 0xA4, 0x60, 0x87, 0x78, 0xFF, 0xFF, - 0x00, 0x61, 0x12, 0x64, 0x3A, 0xDB, 0x18, 0x60, 0xEE, 0x63, 0xBD, 0xD3, 0x72, 0x45, 0x44, 0x8A, - 0x02, 0x28, 0x03, 0x00, 0xE4, 0xE2, 0xDD, 0x81, 0x04, 0x00, 0x02, 0x28, 0x02, 0x00, 0xE4, 0xE2, - 0xDD, 0x81, 0xBD, 0xD3, 0x94, 0xF1, 0x61, 0x45, 0xC0, 0x84, 0x00, 0x61, 0x02, 0x24, 0x01, 0xB9, - 0xC4, 0x84, 0x60, 0x55, 0x2A, 0x52, 0xE4, 0xE2, 0x94, 0xFB, 0x02, 0x24, 0x01, 0xB9, 0xBD, 0xD3, - 0x95, 0xF1, 0x61, 0x45, 0xC0, 0x84, 0x00, 0x61, 0x02, 0x24, 0x01, 0xB9, 0xC4, 0x84, 0x95, 0xFB, - 0x02, 0x24, 0x01, 0xB9, 0xBD, 0xD3, 0x96, 0xF1, 0x61, 0x45, 0xC0, 0x84, 0xC4, 0x84, 0x96, 0xFB, - 0xA5, 0x60, 0x71, 0x78, 0xFF, 0xFF, 0xAC, 0x01, 0x47, 0xFF, 0x44, 0xFF, 0xC8, 0x74, 0xCD, 0xE2, - 0xAA, 0x60, 0xFE, 0x78, 0x00, 0x61, 0xA4, 0x60, 0x7C, 0x78, 0xFF, 0xFF, 0x5C, 0x44, 0x26, 0x44, - 0x02, 0x26, 0x0C, 0x00, 0x3E, 0x46, 0x09, 0xF2, 0x1E, 0x41, 0x03, 0x1B, 0xAC, 0x60, 0x14, 0x78, - 0xFF, 0xFF, 0x40, 0x5E, 0xFD, 0xFB, 0x21, 0x44, 0x02, 0x64, 0x40, 0x46, 0x41, 0x5D, 0x21, 0x46, - 0x00, 0x64, 0x31, 0xFA, 0x00, 0xF2, 0x46, 0x45, 0x87, 0xFC, 0xAC, 0xE2, 0x01, 0x64, 0x33, 0xFB, - 0x32, 0x40, 0x01, 0x2A, 0x21, 0x00, 0x19, 0xF3, 0x01, 0x60, 0x1E, 0xE1, 0x1D, 0x18, 0x80, 0x64, - 0x40, 0x49, 0x00, 0xE1, 0x19, 0xFF, 0x08, 0x64, 0x2A, 0xFA, 0x5A, 0xDA, 0x2C, 0xFA, 0x5A, 0xDA, - 0x5A, 0xDA, 0xD2, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0xD2, 0xFB, 0x72, 0x44, 0x24, 0xFA, 0x94, 0xF3, - 0x25, 0xFA, 0xA1, 0xFF, 0xFF, 0xFF, 0xB6, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0xC8, 0x60, 0x09, 0x7D, - 0x7C, 0x4B, 0xA4, 0x60, 0x7C, 0x78, 0xFF, 0xFF, 0x01, 0xE1, 0x01, 0x60, 0x1A, 0xE1, 0x3F, 0x60, - 0xCF, 0x65, 0x29, 0x44, 0x24, 0x89, 0x2E, 0x44, 0x00, 0x36, 0x41, 0x00, 0x01, 0x3A, 0xC9, 0x00, - 0x88, 0xFF, 0x40, 0x67, 0x29, 0x45, 0x34, 0x89, 0x04, 0x64, 0x89, 0xFF, 0x60, 0x54, 0x88, 0xFF, - 0xA1, 0xFF, 0x6C, 0x45, 0x65, 0x44, 0x0F, 0xB4, 0x40, 0x45, 0x1C, 0xFA, 0x65, 0x44, 0x29, 0x41, - 0xF9, 0x81, 0x52, 0x4A, 0x71, 0x89, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x83, 0x1D, 0xFC, - 0x1B, 0xFC, 0x98, 0xF1, 0xFC, 0xA3, 0xD3, 0x80, 0x43, 0x43, 0x03, 0x04, 0xAC, 0x60, 0x0A, 0x78, - 0xFF, 0xFF, 0x09, 0x7C, 0xD3, 0x80, 0x9A, 0xFF, 0x03, 0x07, 0xAC, 0x60, 0x0A, 0x78, 0xFF, 0xFF, - 0x25, 0x44, 0x01, 0x26, 0x0F, 0xAC, 0x1F, 0x60, 0x50, 0x65, 0x44, 0xD3, 0x12, 0x65, 0x45, 0x46, - 0x60, 0x47, 0x40, 0x7F, 0x27, 0xFA, 0x8F, 0xFC, 0x18, 0x61, 0xCB, 0xF1, 0xA1, 0xFF, 0x6C, 0x44, - 0xDC, 0x80, 0xFF, 0xFF, 0x21, 0x03, 0x50, 0xFE, 0xAC, 0x60, 0x20, 0x78, 0xFF, 0xFF, 0xC8, 0x60, - 0x0B, 0x7D, 0x08, 0x60, 0x00, 0x6B, 0xB5, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0xAA, 0x74, 0xCD, 0xE2, - 0x02, 0x64, 0x89, 0xFF, 0x60, 0x54, 0x88, 0xFF, 0x01, 0x60, 0x08, 0xE1, 0x05, 0xE1, 0xA1, 0xFF, - 0xFF, 0xFF, 0x04, 0x25, 0x76, 0x00, 0x6C, 0x44, 0x0A, 0x36, 0x07, 0x00, 0x14, 0x36, 0x05, 0x00, - 0x37, 0x36, 0x03, 0x00, 0x6E, 0x36, 0x01, 0x00, 0x6C, 0x00, 0x40, 0x45, 0x32, 0x74, 0xA1, 0xFF, - 0x1C, 0xFA, 0x40, 0x4E, 0x8C, 0x44, 0x60, 0x43, 0x1D, 0xFA, 0x01, 0xE1, 0x20, 0x64, 0x3A, 0xDB, - 0x2E, 0x44, 0x14, 0x36, 0x12, 0x00, 0x0A, 0x36, 0x0F, 0x00, 0x63, 0x45, 0xE3, 0x83, 0xE3, 0x83, - 0xC7, 0x83, 0xE3, 0x83, 0xC7, 0x83, 0xFF, 0xFF, 0x37, 0x36, 0x05, 0x00, 0x6E, 0x36, 0x04, 0x00, - 0xAC, 0x60, 0x1E, 0x78, 0xFF, 0xFF, 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0xFF, 0xFF, - 0x80, 0x27, 0xCF, 0x83, 0x1B, 0xFC, 0x01, 0x64, 0x4F, 0xFB, 0xA1, 0xFF, 0x29, 0x41, 0xF9, 0x81, - 0x52, 0x4A, 0x71, 0x89, 0x2E, 0x44, 0x27, 0xFA, 0x98, 0xF1, 0xFC, 0xA3, 0xD3, 0x80, 0x43, 0x43, - 0x03, 0x04, 0xAC, 0x60, 0x0A, 0x78, 0xFF, 0xFF, 0x9A, 0xFF, 0x54, 0x63, 0x12, 0x64, 0x40, 0x46, - 0x8F, 0xFC, 0x18, 0x61, 0xCB, 0xF1, 0x50, 0xFE, 0x6C, 0x40, 0x9E, 0x15, 0x01, 0x60, 0x08, 0xE1, - 0x80, 0xE1, 0x00, 0x64, 0x33, 0xFB, 0x01, 0x60, 0x18, 0xE1, 0x01, 0x11, 0x0F, 0x00, 0x29, 0x44, - 0x20, 0xBC, 0x40, 0x49, 0x01, 0x64, 0x33, 0xFB, 0xB6, 0xFF, 0x00, 0xE1, 0x01, 0x60, 0x1A, 0xE1, - 0xA1, 0xFF, 0xFF, 0xFF, 0x6C, 0x40, 0xFC, 0x11, 0x01, 0x60, 0x18, 0xE1, 0xB5, 0xFF, 0xB6, 0xFF, - 0xB7, 0xFF, 0xB4, 0xFF, 0xC8, 0x60, 0x09, 0x7D, 0x7C, 0x4B, 0x35, 0xE1, 0xAC, 0xE2, 0xAA, 0x60, - 0x97, 0x78, 0xFF, 0xFF, 0x13, 0x60, 0x02, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, 0x00, 0x36, 0x00, 0x3B, - 0xA2, 0xDB, 0x21, 0x64, 0x3A, 0xDB, 0xD2, 0x01, 0x25, 0x60, 0xF2, 0x64, 0xE5, 0x60, 0x78, 0x41, - 0xC7, 0x78, 0x97, 0xF1, 0x2A, 0x64, 0x3A, 0xDB, 0x5C, 0x41, 0xC8, 0x01, 0x29, 0x64, 0x3A, 0xDB, - 0x88, 0x60, 0x85, 0x71, 0x8D, 0xE2, 0xA2, 0xFC, 0x32, 0x40, 0x01, 0x2A, 0xA8, 0x00, 0x01, 0x60, - 0x1A, 0xE1, 0x23, 0x43, 0xA1, 0xFF, 0xEC, 0x44, 0x2A, 0xFA, 0x40, 0x48, 0xA1, 0xFF, 0x7A, 0xDC, - 0x7E, 0x36, 0x04, 0xA2, 0xFC, 0x1C, 0x03, 0x1D, 0x00, 0x64, 0x3F, 0xFA, 0x2E, 0x00, 0x03, 0x2B, - 0x04, 0x00, 0xA1, 0xFF, 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x8F, 0xB0, 0x88, 0x3A, 0x03, 0x00, - 0x70, 0x62, 0xA1, 0xFF, 0x7A, 0xDC, 0x28, 0x40, 0x40, 0x2B, 0x06, 0x00, 0x72, 0x62, 0xA1, 0xFF, - 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x3F, 0xFC, 0x00, 0xF4, 0x10, 0x62, 0x6E, 0x61, - 0xA1, 0xFF, 0x05, 0x1D, 0x12, 0x1E, 0x0C, 0x00, 0x00, 0xF4, 0x7C, 0x61, 0x02, 0x62, 0x7A, 0xDC, - 0x63, 0x40, 0xFD, 0x1C, 0xF9, 0x1D, 0xFF, 0xB1, 0x08, 0x1E, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x62, - 0xB6, 0xFF, 0xB7, 0xFF, 0xA1, 0xFF, 0x6C, 0x44, 0x5A, 0xDA, 0x98, 0xFF, 0xA1, 0xFF, 0x6C, 0x40, - 0xA1, 0xFF, 0x47, 0xFF, 0x7C, 0x44, 0x33, 0xFB, 0x26, 0x44, 0xFD, 0xB4, 0x84, 0xBC, 0x01, 0x15, - 0x7F, 0xB4, 0x40, 0x46, 0x6C, 0x40, 0xB6, 0xFF, 0xB7, 0xFF, 0xA1, 0xFF, 0x6C, 0x45, 0xA1, 0xFF, - 0x7F, 0x60, 0x7F, 0x7C, 0x6C, 0x44, 0xA0, 0x84, 0x15, 0xA7, 0x15, 0xA4, 0x21, 0x46, 0x26, 0xFA, - 0x29, 0x40, 0x40, 0x2B, 0x07, 0x00, 0xB6, 0xFF, 0x40, 0x60, 0x00, 0x65, 0xA1, 0xFF, 0x6C, 0x44, - 0x1A, 0xFA, 0x09, 0x00, 0x65, 0x44, 0x0F, 0xB4, 0x06, 0xA8, 0x80, 0x60, 0x00, 0x65, 0x08, 0x28, - 0x7C, 0x45, 0x29, 0x44, 0x34, 0x89, 0x27, 0xF0, 0x65, 0x44, 0x64, 0x5E, 0x27, 0xFA, 0x81, 0xE1, - 0x01, 0x60, 0x18, 0xE1, 0x01, 0x11, 0x0F, 0x00, 0x29, 0x44, 0x20, 0xBC, 0x40, 0x49, 0x01, 0x64, - 0x33, 0xFB, 0xB6, 0xFF, 0x00, 0xE1, 0x01, 0x60, 0x1A, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x6C, 0x40, - 0xFC, 0x11, 0x01, 0x60, 0x18, 0xE1, 0x21, 0x46, 0xB5, 0xFF, 0xBC, 0xFF, 0x47, 0xFF, 0xB6, 0xFF, - 0xB7, 0xFF, 0xB4, 0xFF, 0xC8, 0x60, 0x09, 0x7D, 0x7C, 0x4B, 0x26, 0x43, 0x2A, 0x44, 0x72, 0x45, - 0x24, 0xFA, 0x94, 0xF3, 0x06, 0x04, 0xE4, 0xE2, 0xDC, 0x9C, 0x29, 0x40, 0x01, 0x26, 0x64, 0x44, - 0x94, 0xF9, 0x25, 0xFA, 0x95, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0x95, 0xFB, 0x28, 0xFA, 0x96, 0xF3, - 0x02, 0x04, 0xDC, 0x84, 0x96, 0xFB, 0x29, 0xFA, 0xAA, 0x60, 0x1D, 0x78, 0xFF, 0xFF, 0xA1, 0xFF, - 0x12, 0x61, 0x8C, 0x44, 0xCC, 0xF0, 0x2A, 0xFA, 0x40, 0x48, 0x04, 0x26, 0x43, 0x00, 0xA1, 0xFF, - 0x8C, 0x44, 0x5A, 0xDA, 0x30, 0xFB, 0x6C, 0x44, 0x2C, 0xFA, 0xFF, 0xFF, 0x01, 0x26, 0x26, 0x00, - 0xD0, 0x80, 0xA1, 0xFF, 0x8C, 0x44, 0x6C, 0x5C, 0x00, 0xE1, 0xF2, 0xFE, 0x2D, 0xFA, 0xCD, 0xF3, - 0xD4, 0x80, 0xD0, 0x80, 0x2E, 0xF8, 0x24, 0x44, 0x16, 0x0C, 0x32, 0x40, 0x02, 0x2A, 0x07, 0x00, - 0x28, 0x42, 0x0C, 0xB2, 0x08, 0x3A, 0x03, 0x00, 0x10, 0xBC, 0x40, 0x44, 0x5C, 0x00, 0x04, 0x0A, - 0xA1, 0xFF, 0xAC, 0x60, 0x13, 0x78, 0xFF, 0xFF, 0x11, 0xBC, 0x40, 0x44, 0x28, 0x45, 0xBF, 0x60, - 0xFF, 0x64, 0x24, 0x88, 0x50, 0x00, 0x30, 0xBC, 0x40, 0x44, 0x4D, 0x00, 0x20, 0xB9, 0x5C, 0x8E, - 0xA1, 0xFF, 0x8C, 0x44, 0x2D, 0xFA, 0xDC, 0x9C, 0x6C, 0x44, 0x00, 0xE1, 0xF2, 0xFE, 0x2E, 0xFA, - 0x08, 0x28, 0x44, 0x4E, 0xDC, 0x84, 0x2E, 0x5C, 0xB0, 0x84, 0xEF, 0xB1, 0x08, 0x24, 0x40, 0xB9, - 0x41, 0x46, 0x39, 0x00, 0x23, 0x41, 0x13, 0x64, 0x51, 0x90, 0x56, 0x63, 0x03, 0x04, 0xAC, 0x60, - 0x0A, 0x78, 0xFF, 0xFF, 0x8C, 0x44, 0x04, 0x61, 0x2B, 0xFA, 0x50, 0xFE, 0x80, 0x27, 0x00, 0x64, - 0x30, 0xFB, 0x8C, 0x44, 0x2C, 0xFA, 0xD0, 0x80, 0x8C, 0x44, 0x2D, 0xFA, 0xD4, 0x80, 0x00, 0x65, - 0x8C, 0x44, 0xCD, 0xF1, 0x2E, 0xFA, 0xD0, 0x80, 0x28, 0x44, 0x03, 0x0C, 0xA0, 0x2A, 0x0A, 0x00, - 0x11, 0x00, 0x10, 0x65, 0x60, 0x40, 0xC4, 0x36, 0x04, 0x00, 0xD4, 0x3A, 0x08, 0x00, 0x27, 0x40, - 0x40, 0x26, 0x30, 0x65, 0x00, 0x64, 0x3F, 0xFA, 0x46, 0x4E, 0x35, 0x84, 0x66, 0x00, 0x40, 0x26, - 0xF9, 0x01, 0x30, 0x65, 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x04, 0x61, 0xF3, 0x01, 0xA1, 0xFF, - 0xAB, 0x60, 0xE6, 0x78, 0xFF, 0xFF, 0xFF, 0x60, 0xFE, 0x65, 0x23, 0x43, 0xE8, 0xA3, 0x80, 0x27, - 0xF6, 0x01, 0x20, 0xE6, 0x08, 0x60, 0x00, 0xEB, 0x28, 0x44, 0x03, 0x2B, 0x05, 0x00, 0x6A, 0x62, - 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x28, 0x44, 0x8F, 0xB0, 0x88, 0x3A, 0x03, 0x00, 0x70, 0x62, - 0x7A, 0xDC, 0x28, 0x44, 0x40, 0x2B, 0x0D, 0x00, 0x72, 0x62, 0x7A, 0xDC, 0xA1, 0xFF, 0x6C, 0x5C, - 0x5A, 0xD8, 0xE4, 0x40, 0x20, 0x2B, 0x03, 0x00, 0x7A, 0xDC, 0x7A, 0xDC, 0xF8, 0xA3, 0x25, 0xFF, - 0xB0, 0xFF, 0x3F, 0xFC, 0x00, 0xF4, 0x10, 0x62, 0x10, 0x61, 0x57, 0x90, 0x6C, 0x61, 0xA1, 0xFF, - 0x09, 0x07, 0x02, 0x1D, 0x2A, 0x1E, 0x21, 0x00, 0xCB, 0x83, 0x7A, 0xDC, 0xFE, 0x1C, 0xD9, 0x81, - 0x24, 0x1E, 0x1B, 0x00, 0xCB, 0x83, 0x0E, 0xA3, 0xA7, 0x84, 0xF2, 0xA3, 0x7A, 0xDC, 0xFE, 0x1C, - 0x05, 0x1D, 0x01, 0x60, 0x18, 0xE1, 0x7C, 0xA8, 0xD9, 0x81, 0x0A, 0x02, 0x00, 0xF4, 0x02, 0x62, - 0xA7, 0x84, 0x7A, 0x61, 0x7A, 0xDC, 0xFE, 0x1C, 0xF9, 0x1D, 0x7C, 0xA8, 0xD9, 0x81, 0xF6, 0x03, - 0xFF, 0xB1, 0x0B, 0x1E, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x62, 0xA1, 0xFF, 0xFF, 0xFF, 0xB6, 0xFF, - 0xB7, 0xFF, 0x6C, 0x44, 0x5A, 0xDA, 0xCD, 0x81, 0x64, 0x40, 0x46, 0x45, 0x28, 0x44, 0x40, 0x2B, - 0x0E, 0x00, 0x64, 0x40, 0x20, 0x2B, 0x0B, 0x00, 0x01, 0xA2, 0x62, 0x44, 0x46, 0x45, 0x21, 0x46, - 0x00, 0xF4, 0x02, 0x62, 0x9A, 0xFF, 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x98, 0xFF, - 0x00, 0xE6, 0x01, 0xF2, 0x61, 0x45, 0xD4, 0x9E, 0x21, 0x46, 0x16, 0xFA, 0x25, 0x44, 0x06, 0xFA, - 0xA1, 0xFF, 0x8C, 0x44, 0xA1, 0xFF, 0x47, 0xFF, 0x50, 0x4B, 0x67, 0x50, 0x69, 0xE2, 0x25, 0x46, - 0x01, 0xF2, 0x61, 0x45, 0xD4, 0x9E, 0x21, 0x46, 0x16, 0xFA, 0x25, 0x45, 0x86, 0xF8, 0xFF, 0xFF, - 0x6A, 0x44, 0x40, 0x2B, 0x03, 0x15, 0xAF, 0x60, 0x10, 0x78, 0xFF, 0xFF, 0x29, 0x40, 0x10, 0x26, - 0x04, 0x00, 0x04, 0x74, 0xCD, 0xE2, 0xA1, 0xFF, 0xFF, 0xFF, 0x6C, 0x44, 0xB6, 0xFF, 0xB7, 0xFF, - 0xC4, 0xE2, 0x01, 0x60, 0x18, 0xE1, 0x05, 0x76, 0xAD, 0xE2, 0x41, 0xE1, 0xA1, 0xFF, 0x6C, 0x45, - 0xA1, 0xFF, 0x65, 0x41, 0x7F, 0x60, 0x7F, 0x7C, 0x6C, 0x44, 0xA0, 0x84, 0x15, 0xA7, 0x15, 0xA4, - 0x21, 0x46, 0x26, 0xFA, 0x22, 0x46, 0x10, 0xFA, 0x21, 0x46, 0x29, 0x40, 0x40, 0x2B, 0x07, 0x00, - 0xB6, 0xFF, 0xA1, 0xFF, 0x40, 0x60, 0x00, 0x65, 0x6C, 0x44, 0x1A, 0xFA, 0x09, 0x00, 0x65, 0x44, - 0x0F, 0xB4, 0x06, 0xA8, 0x80, 0x60, 0x00, 0x65, 0x08, 0x28, 0x7C, 0x45, 0x29, 0x44, 0x34, 0x89, - 0x27, 0xF0, 0x65, 0x47, 0x1F, 0xB1, 0x34, 0x97, 0x64, 0x5E, 0x07, 0x60, 0xF5, 0xF1, 0x29, 0x40, - 0x40, 0x2B, 0x04, 0x00, 0x64, 0x40, 0x02, 0x26, 0x10, 0x60, 0x00, 0xBC, 0x27, 0xFA, 0x01, 0x60, - 0x18, 0xE1, 0x00, 0x64, 0x33, 0xFB, 0xA8, 0xE2, 0x05, 0xE1, 0x28, 0x40, 0x03, 0x26, 0xCE, 0x00, - 0x31, 0x40, 0x20, 0x2A, 0x03, 0x00, 0x28, 0x40, 0x50, 0x3A, 0xC8, 0x00, 0x24, 0x44, 0x20, 0x2A, - 0xC5, 0x00, 0x2B, 0x44, 0xAC, 0x80, 0x28, 0x40, 0xB4, 0x3A, 0x03, 0x00, 0x02, 0x03, 0x30, 0xFB, - 0xBD, 0x00, 0x28, 0x44, 0xBF, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0x40, 0x48, 0x2B, 0x50, 0xA1, 0xFF, - 0xFF, 0xFF, 0x01, 0x60, 0x08, 0xE1, 0x1C, 0xF2, 0xC4, 0xE2, 0x40, 0x45, 0x28, 0x40, 0xC4, 0x36, - 0x9D, 0x00, 0x29, 0x40, 0x40, 0x2B, 0x49, 0x00, 0x2B, 0x60, 0xBE, 0x63, 0x60, 0x40, 0x0B, 0x36, - 0x20, 0x00, 0x0F, 0x36, 0x1B, 0x00, 0x0A, 0x36, 0x16, 0x00, 0x0E, 0x36, 0x11, 0x00, 0x09, 0x36, - 0x0C, 0x00, 0x0D, 0x36, 0x07, 0x00, 0x08, 0x36, 0x02, 0x00, 0xA3, 0xD3, 0x15, 0x00, 0x02, 0xA3, - 0xA3, 0xD3, 0x12, 0x00, 0x04, 0xA3, 0xA3, 0xD3, 0x0F, 0x00, 0x06, 0xA3, 0xA3, 0xD3, 0x0C, 0x00, - 0x08, 0xA3, 0xA3, 0xD3, 0x09, 0x00, 0x0A, 0xA3, 0xA3, 0xD3, 0x06, 0x00, 0x0C, 0xA3, 0xA3, 0xD3, - 0x03, 0x00, 0x0E, 0xA3, 0xA3, 0xD3, 0xFF, 0xFF, 0x25, 0x60, 0x82, 0x63, 0x60, 0x40, 0x0C, 0x36, - 0x19, 0x00, 0x08, 0x36, 0x15, 0x00, 0x0D, 0x36, 0x11, 0x00, 0x09, 0x36, 0x0D, 0x00, 0x0E, 0x36, - 0x09, 0x00, 0x0A, 0x36, 0x05, 0x00, 0x0F, 0x36, 0x01, 0x00, 0x3A, 0x00, 0x02, 0xA3, 0x38, 0x00, - 0x04, 0xA3, 0x36, 0x00, 0x06, 0xA3, 0x34, 0x00, 0x08, 0xA3, 0x32, 0x00, 0x0A, 0xA3, 0x30, 0x00, - 0x0C, 0xA3, 0x2E, 0x00, 0x0E, 0xA3, 0x2C, 0x00, 0x2B, 0x00, 0x2B, 0x60, 0xCE, 0x63, 0x25, 0x44, - 0x0A, 0x36, 0x0C, 0x00, 0x14, 0x36, 0x07, 0x00, 0x37, 0x36, 0x02, 0x00, 0xA3, 0xD3, 0x09, 0x00, - 0x02, 0xA3, 0xA3, 0xD3, 0x06, 0x00, 0x04, 0xA3, 0xA3, 0xD3, 0x03, 0x00, 0x06, 0xA3, 0xA3, 0xD3, - 0xFF, 0xFF, 0x40, 0x45, 0x0A, 0x36, 0x0D, 0x00, 0x14, 0x36, 0x38, 0x64, 0x37, 0x3A, 0x03, 0x00, - 0x04, 0x7F, 0x40, 0x45, 0x15, 0x64, 0x6E, 0x3A, 0x09, 0x00, 0x84, 0x7F, 0x40, 0x45, 0x0B, 0x64, - 0x05, 0x00, 0x29, 0x44, 0x7F, 0x60, 0xFF, 0xB4, 0x40, 0x49, 0x70, 0x64, 0x40, 0x4D, 0x02, 0x00, - 0x40, 0x45, 0x0A, 0x00, 0x25, 0x60, 0x7A, 0x63, 0x0A, 0x36, 0x06, 0x00, 0x14, 0x36, 0x02, 0xA3, - 0x37, 0x36, 0x04, 0xA3, 0x6E, 0x36, 0x06, 0xA3, 0x28, 0xA3, 0xA3, 0xD1, 0xD8, 0xA3, 0x15, 0x60, - 0xD8, 0xF9, 0x39, 0xF1, 0xA3, 0xD1, 0x64, 0x41, 0x64, 0x5E, 0x60, 0x45, 0x64, 0x47, 0x1F, 0xB4, - 0x54, 0x94, 0xE0, 0xA0, 0x02, 0x0D, 0x00, 0x64, 0x02, 0x00, 0x01, 0x04, 0x1F, 0x64, 0x60, 0x47, - 0xB4, 0x85, 0x29, 0x44, 0xC0, 0x60, 0x00, 0xB4, 0xB4, 0x84, 0x1F, 0xFA, 0xB5, 0xFF, 0xA1, 0xFF, - 0xAD, 0xF3, 0xC4, 0xE2, 0x89, 0xFF, 0x60, 0x54, 0x88, 0xFF, 0xDC, 0x84, 0xE0, 0x94, 0xFF, 0x60, - 0xCF, 0x65, 0x29, 0x44, 0x24, 0x89, 0xA5, 0x60, 0xD6, 0x78, 0x04, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, - 0xC4, 0xE2, 0xA1, 0xFF, 0xFF, 0x60, 0xCF, 0x65, 0x29, 0x44, 0x24, 0x89, 0xAD, 0xF3, 0xC4, 0xE2, - 0x89, 0xFF, 0x60, 0x54, 0x88, 0xFF, 0xDC, 0x84, 0xE0, 0x94, 0x26, 0x44, 0x84, 0xBC, 0x24, 0x40, - 0x0C, 0x22, 0xFD, 0xB4, 0x40, 0x46, 0x23, 0x64, 0x3A, 0xDB, 0xAC, 0x60, 0xAB, 0x78, 0xFF, 0xFF, - 0x27, 0x40, 0x26, 0x22, 0x05, 0x00, 0xF8, 0xB4, 0x40, 0x47, 0x06, 0x64, 0x31, 0xFB, 0xC0, 0xFE, - 0x29, 0x40, 0x10, 0x26, 0x02, 0x00, 0x04, 0x74, 0xCD, 0xE2, 0x01, 0x60, 0x18, 0xE1, 0x01, 0x60, - 0x18, 0xE1, 0x01, 0x11, 0x0F, 0x00, 0x29, 0x44, 0x20, 0xBC, 0x40, 0x49, 0x01, 0x64, 0x33, 0xFB, - 0xB6, 0xFF, 0x00, 0xE1, 0x01, 0x60, 0x1A, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x6C, 0x40, 0xFC, 0x11, - 0x01, 0x60, 0x18, 0xE1, 0xB5, 0xFF, 0x47, 0xFF, 0xB6, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0xC8, 0x60, - 0x09, 0x7D, 0x7C, 0x4B, 0x37, 0xF3, 0x2B, 0x45, 0xD4, 0x80, 0xFF, 0xFF, 0x02, 0x28, 0x65, 0x44, - 0x60, 0x50, 0xA0, 0x4C, 0x20, 0xBC, 0xFF, 0xB4, 0xA0, 0x51, 0x00, 0x60, 0x2E, 0x7C, 0x74, 0x44, - 0xC0, 0x94, 0x32, 0x40, 0x02, 0x2A, 0x19, 0x00, 0x28, 0x44, 0xA4, 0x36, 0x03, 0x00, 0x0C, 0xB4, - 0x04, 0x36, 0x13, 0x00, 0x26, 0x43, 0xFD, 0xB3, 0x04, 0xBB, 0x43, 0x46, 0x01, 0x2A, 0x03, 0x00, - 0x28, 0x47, 0x40, 0xBF, 0x40, 0x48, 0x0A, 0xBB, 0x0F, 0xFC, 0x50, 0x4B, 0x67, 0x50, 0x00, 0x64, - 0x30, 0xFB, 0x05, 0xFF, 0xAC, 0x60, 0xAB, 0x78, 0xFF, 0xFF, 0x24, 0x64, 0x3A, 0xDB, 0x28, 0x44, - 0x04, 0x2A, 0x03, 0x00, 0xA4, 0x60, 0x6F, 0x78, 0xFF, 0xFF, 0x1D, 0xFF, 0xA8, 0xE2, 0x26, 0x40, - 0x10, 0x2A, 0x06, 0x00, 0x25, 0x60, 0xF0, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, - 0xA4, 0x60, 0x6F, 0x78, 0xFF, 0xFF, 0x03, 0x0A, 0xA4, 0x60, 0x7C, 0x78, 0xFF, 0xFF, 0x01, 0x64, - 0x4F, 0xFB, 0xE1, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x54, 0x62, 0x22, 0x46, 0xA2, 0xD0, - 0x16, 0x63, 0x7C, 0x41, 0x44, 0x48, 0x80, 0x36, 0x04, 0x61, 0x28, 0x40, 0x50, 0x36, 0x04, 0x61, - 0x41, 0x4E, 0x28, 0x44, 0xA4, 0x36, 0x0E, 0x63, 0x0A, 0x60, 0x7C, 0xF1, 0x2D, 0x44, 0xE8, 0x84, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xC0, 0x84, 0xA2, 0xDB, 0x9A, 0xFF, 0xA1, 0xFF, - 0x12, 0x74, 0xCD, 0xE2, 0x54, 0x62, 0xA2, 0xD2, 0xFF, 0xFF, 0x6A, 0x40, 0x80, 0x4E, 0x12, 0x74, - 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, - 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0xFF, 0xFF, 0x01, 0x1D, - 0xB2, 0x00, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, - 0x12, 0x74, 0x28, 0x40, 0x03, 0x2B, 0x06, 0x00, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, - 0x7A, 0xD4, 0x12, 0x74, 0x70, 0x62, 0x28, 0x44, 0x8F, 0xB0, 0x88, 0x3A, 0x02, 0x00, 0x7A, 0xD4, - 0x12, 0x74, 0x28, 0x40, 0x40, 0x2B, 0x16, 0x00, 0x72, 0x62, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD2, - 0x12, 0x74, 0x80, 0x4C, 0x20, 0x2B, 0x05, 0x00, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, - 0x12, 0x74, 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x10, 0x26, 0x04, 0x00, 0x26, 0x26, 0x4D, 0x00, - 0x26, 0x27, 0x4B, 0x00, 0x23, 0x43, 0xFF, 0xFF, 0x06, 0x1D, 0x2E, 0x1E, 0x00, 0x00, 0x03, 0xF0, - 0x04, 0xF4, 0x64, 0x42, 0x3D, 0x00, 0x2E, 0x40, 0x04, 0x2A, 0x27, 0x00, 0xA1, 0xFF, 0x02, 0xFE, - 0x10, 0x25, 0x42, 0xFE, 0x12, 0x74, 0x72, 0x45, 0x65, 0x4C, 0x94, 0xF3, 0x03, 0x04, 0xE4, 0xE2, - 0xDC, 0x84, 0x94, 0xFB, 0xA1, 0xFF, 0x12, 0x74, 0x80, 0x4C, 0x12, 0x74, 0x95, 0xF3, 0x02, 0x04, - 0xDC, 0x84, 0x95, 0xFB, 0x80, 0x4C, 0x12, 0x74, 0x96, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0x96, 0xFB, - 0x80, 0x4C, 0x12, 0x74, 0x5C, 0x4E, 0xF8, 0xA3, 0x03, 0xF2, 0x9A, 0xF2, 0x04, 0xF4, 0xFF, 0xB1, - 0xF8, 0xA1, 0x06, 0xA4, 0x60, 0x42, 0x0A, 0x00, 0x4E, 0x00, 0x03, 0xF2, 0x9A, 0xF2, 0x04, 0xF4, - 0xC8, 0x82, 0xFF, 0xB1, 0x03, 0x00, 0x00, 0xF4, 0x81, 0xF2, 0xFF, 0xB1, 0x7A, 0xD4, 0x12, 0x74, - 0xFD, 0x1C, 0xF9, 0x1D, 0xFF, 0xB1, 0x1B, 0x1E, 0x02, 0x02, 0x00, 0xF4, 0xDA, 0x82, 0xDA, 0x82, - 0xA2, 0xD2, 0xA1, 0xFF, 0x09, 0x74, 0x60, 0x4D, 0x12, 0x00, 0x03, 0xF2, 0x9A, 0xF2, 0x04, 0xF4, - 0x23, 0x43, 0xA1, 0xFF, 0x12, 0x74, 0xA0, 0xD2, 0xFE, 0xA1, 0xCB, 0x83, 0x60, 0x4E, 0xAF, 0x83, - 0x03, 0x1D, 0x05, 0x03, 0x12, 0x74, 0xEB, 0x01, 0xA1, 0xFF, 0x12, 0x74, 0xDF, 0x01, 0x12, 0x74, - 0xDA, 0x83, 0x66, 0x44, 0x22, 0x46, 0x0C, 0xFA, 0x22, 0xF2, 0x0B, 0xFC, 0x28, 0x40, 0x40, 0x2B, - 0x1A, 0x00, 0x10, 0x26, 0x04, 0x00, 0x26, 0x26, 0x0F, 0x00, 0x26, 0x27, 0x0D, 0x00, 0x00, 0xF4, - 0x02, 0x62, 0xA1, 0xFF, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, - 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x07, 0x00, 0xA1, 0xFF, 0x12, 0x74, 0x9C, 0x4E, 0x12, 0x74, - 0x9C, 0x4C, 0x12, 0x74, 0x00, 0x00, 0x88, 0xFF, 0xA1, 0xFF, 0xB1, 0x60, 0x58, 0x4F, 0x00, 0x78, - 0xFF, 0xFF, 0x01, 0x60, 0x18, 0xE1, 0x78, 0x44, 0x02, 0xA4, 0x35, 0xFB, 0xCC, 0x00, 0x29, 0x44, - 0xF7, 0xB4, 0x40, 0x49, 0x34, 0x64, 0x3A, 0xDB, 0x44, 0xE1, 0xA5, 0x60, 0xB2, 0x78, 0xFF, 0xFF, - 0x00, 0x6B, 0xBC, 0xFF, 0x15, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, 0x15, 0xFB, 0x78, 0x5C, 0x07, 0x00, - 0x78, 0x5C, 0x2F, 0x00, 0x62, 0xFF, 0xFF, 0xFF, 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, 0x80, 0x60, - 0x01, 0xE0, 0xD5, 0x60, 0x84, 0xE7, 0x82, 0xF3, 0x40, 0x60, 0x60, 0x40, 0x01, 0x23, 0x48, 0x60, - 0x5E, 0x65, 0x80, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, - 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x80, 0x60, - 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, - 0x00, 0x60, 0x01, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x95, 0x60, 0x84, 0xE7, 0x64, 0x58, - 0xFF, 0xFF, 0x80, 0x60, 0x01, 0xE0, 0xD5, 0x60, 0x84, 0xE7, 0x82, 0xF3, 0x7C, 0x45, 0x60, 0x40, - 0x01, 0x23, 0x02, 0x65, 0x8C, 0x60, 0x48, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, - 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x7F, 0x6A, 0xFF, 0xFF, 0x01, 0x16, - 0xFE, 0x01, 0x84, 0x60, 0x04, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x48, 0x60, 0x08, 0x6A, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x84, 0x60, - 0x04, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x40, 0x60, 0x08, 0x6A, 0xFF, 0xFF, 0x01, 0x16, - 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x8C, 0x60, 0x48, 0x6A, 0xFF, 0xFF, - 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, - 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x95, 0x60, 0x84, 0xE7, 0x64, 0x58, 0xFF, 0xFF, - 0x12, 0x74, 0x6A, 0x40, 0x87, 0x4F, 0x12, 0x74, 0x87, 0x4C, 0x12, 0x74, 0x29, 0x40, 0x40, 0x2B, - 0x08, 0x00, 0x0A, 0x64, 0x89, 0xFF, 0x60, 0x54, 0x88, 0xFF, 0x87, 0x4D, 0x12, 0x74, 0x87, 0x4D, - 0x09, 0x00, 0x03, 0x64, 0x89, 0xFF, 0x60, 0x54, 0x88, 0xFF, 0x87, 0x4F, 0x12, 0x74, 0x87, 0x4D, - 0x12, 0x74, 0x87, 0x4D, 0x7C, 0x44, 0x01, 0x08, 0x01, 0x00, 0x67, 0x44, 0x12, 0x74, 0x87, 0x4C, - 0x12, 0x74, 0x87, 0x4C, 0x12, 0x74, 0x87, 0x4C, 0x12, 0x74, 0x87, 0x4D, 0x12, 0x74, 0x87, 0x4D, - 0x12, 0x74, 0x87, 0x4D, 0x12, 0x74, 0x04, 0x21, 0x04, 0x00, 0xFF, 0x2A, 0x01, 0x00, 0x04, 0x00, - 0x03, 0x00, 0xFF, 0x2A, 0x0D, 0x00, 0x0C, 0x00, 0xBC, 0xFF, 0x61, 0xFF, 0x78, 0x5C, 0x57, 0x01, - 0x78, 0x5C, 0x7F, 0x01, 0xB6, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0xC8, 0x60, 0x09, 0x7D, 0x7C, 0x4B, - 0x6A, 0x44, 0x2F, 0x58, 0xFF, 0xFF, 0x04, 0x74, 0xC4, 0xE2, 0x04, 0xE1, 0x29, 0x40, 0x40, 0x2B, - 0x05, 0x00, 0xA1, 0xFF, 0xFF, 0xFF, 0xBC, 0xFF, 0x14, 0x74, 0x01, 0x00, 0x04, 0x74, 0xC4, 0xE2, - 0x04, 0xE1, 0xBC, 0xFF, 0xB5, 0xFF, 0x47, 0xFF, 0xB6, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0xC8, 0x60, - 0x09, 0x7D, 0x7C, 0x4B, 0x29, 0x40, 0x40, 0x27, 0x04, 0x00, 0xC2, 0x60, 0x58, 0x4F, 0xC8, 0x78, - 0xFF, 0xFF, 0xA1, 0xFF, 0x29, 0x40, 0x10, 0x26, 0x6D, 0x00, 0x80, 0x60, 0x01, 0xE0, 0xD5, 0x60, - 0x84, 0xE7, 0x82, 0xF3, 0x40, 0x60, 0x60, 0x40, 0x01, 0x23, 0x48, 0x60, 0x5E, 0x65, 0x80, 0x60, - 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, - 0x00, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x80, 0x60, 0x00, 0x6A, 0xFF, 0xFF, - 0x01, 0x16, 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x01, 0x6A, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x95, 0x60, 0x84, 0xE7, 0x80, 0x60, 0x01, 0xE0, 0xD5, 0x60, - 0x84, 0xE7, 0x82, 0xF3, 0x7C, 0x45, 0x60, 0x40, 0x01, 0x23, 0x02, 0x65, 0x8C, 0x60, 0x48, 0x6A, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, - 0x00, 0x60, 0x7F, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x84, 0x60, 0x04, 0x6A, 0xFF, 0xFF, - 0x01, 0x16, 0xFE, 0x01, 0x48, 0x60, 0x08, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x65, 0x4A, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x84, 0x60, 0x04, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, - 0x40, 0x60, 0x08, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, - 0xFE, 0x01, 0x8C, 0x60, 0x48, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x00, 0x6A, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, - 0x95, 0x60, 0x84, 0xE7, 0x01, 0x60, 0x08, 0xE1, 0xFF, 0xFF, 0xC4, 0xE2, 0x29, 0x40, 0x40, 0x2B, - 0x04, 0x00, 0xC2, 0x60, 0x58, 0x4F, 0xC8, 0x78, 0xFF, 0xFF, 0xC2, 0x60, 0x58, 0x4F, 0xD0, 0x78, - 0xFF, 0xFF, 0xA1, 0xFF, 0xAD, 0xF3, 0xC4, 0xE2, 0x89, 0xFF, 0x60, 0x54, 0x88, 0xFF, 0xDC, 0x84, - 0xE0, 0x94, 0x35, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x08, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, - 0x43, 0xFF, 0x01, 0x60, 0x00, 0xE1, 0x28, 0xF3, 0x47, 0xFF, 0x60, 0x40, 0x07, 0x37, 0x66, 0x00, - 0x05, 0x3B, 0x04, 0x00, 0xFF, 0x0A, 0x80, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x18, 0x60, 0x07, 0xF1, - 0xAD, 0x4F, 0x00, 0x7F, 0xFA, 0xB4, 0x64, 0x41, 0x64, 0xF1, 0x02, 0xB1, 0x04, 0x65, 0x02, 0x02, - 0x64, 0x40, 0x01, 0x2B, 0x01, 0x65, 0xB4, 0x84, 0xA0, 0x5D, 0x29, 0xF5, 0x2A, 0xF3, 0x47, 0xFF, - 0x3F, 0xF0, 0x01, 0x1B, 0x01, 0x64, 0x60, 0x56, 0xAD, 0xE2, 0xB5, 0xFF, 0x6C, 0x40, 0x40, 0xE1, - 0xA1, 0xFF, 0x00, 0xF4, 0x6E, 0x61, 0x12, 0x62, 0x64, 0x43, 0x01, 0xE1, 0x03, 0x64, 0xE2, 0xD0, - 0xC9, 0x81, 0x64, 0x4C, 0xCC, 0x84, 0xDA, 0x82, 0xFA, 0x02, 0x01, 0x60, 0x00, 0x6B, 0x9A, 0xFF, - 0xCA, 0x82, 0x03, 0x00, 0x00, 0xF4, 0x81, 0xF2, 0xFF, 0xFF, 0x7A, 0xD0, 0xA1, 0xFF, 0x64, 0x4C, - 0xFC, 0x1C, 0xF8, 0x1D, 0x00, 0xB9, 0x06, 0x1E, 0x02, 0x02, 0x00, 0xF4, 0xDA, 0x82, 0x5A, 0xD2, - 0xA1, 0xFF, 0x60, 0x4D, 0x3F, 0x40, 0x02, 0x2B, 0x10, 0x00, 0x28, 0xF3, 0xA5, 0x60, 0xC4, 0x65, - 0x60, 0x40, 0x0E, 0x3B, 0x0A, 0x00, 0xD2, 0xF3, 0xFF, 0xFF, 0x10, 0xBC, 0xD2, 0xFB, 0xAD, 0x4F, - 0x02, 0xBC, 0x00, 0x7F, 0xA0, 0x5D, 0x85, 0x4C, 0xFE, 0x01, 0xD2, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, - 0xD2, 0xFB, 0xA1, 0xFF, 0x87, 0x4E, 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0x67, 0x4C, - 0xFF, 0xFF, 0xBC, 0xFF, 0x00, 0xE1, 0xD5, 0xFE, 0xA1, 0xFF, 0xFF, 0xFF, 0x00, 0x64, 0x40, 0x46, - 0x60, 0x41, 0xB5, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0x29, 0xF5, 0x3F, 0xF0, 0x24, 0xF2, 0x44, 0x43, - 0x40, 0x4D, 0x00, 0xF4, 0xF3, 0x60, 0xA0, 0x65, 0x10, 0x62, 0x5A, 0xD2, 0xD9, 0x81, 0xD4, 0x80, - 0xFF, 0xFF, 0xFB, 0x02, 0x61, 0x45, 0x2D, 0x44, 0xD4, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, - 0xFD, 0xA5, 0x48, 0x60, 0x00, 0x64, 0xC4, 0x9D, 0x0D, 0x60, 0x00, 0x6B, 0x2D, 0x44, 0xC0, 0x83, - 0xBB, 0xFF, 0x29, 0xF5, 0x01, 0xE1, 0x00, 0xF4, 0x6C, 0x61, 0x10, 0x62, 0x05, 0x00, 0x00, 0xF4, - 0x01, 0xF2, 0xFF, 0xFF, 0x60, 0x41, 0x04, 0x62, 0xA1, 0xFF, 0xFF, 0xFF, 0x01, 0x10, 0x1A, 0x00, - 0x26, 0x44, 0x01, 0x26, 0x0C, 0x00, 0x2D, 0x44, 0xC8, 0x84, 0x40, 0x4D, 0x02, 0x03, 0x6C, 0x45, - 0xF3, 0x01, 0x03, 0x15, 0x01, 0x64, 0x05, 0xFA, 0x15, 0x00, 0x6C, 0x45, 0xED, 0x01, 0x23, 0x44, - 0xC8, 0x84, 0x40, 0x43, 0x02, 0x03, 0x6C, 0x45, 0xE7, 0x01, 0x00, 0x64, 0x01, 0x15, 0x01, 0x64, - 0x6C, 0x45, 0x05, 0xFB, 0xE2, 0xD2, 0xDA, 0x82, 0xC9, 0x81, 0x60, 0x4C, 0xDD, 0x1C, 0xD7, 0x03, - 0xBC, 0xFF, 0xDA, 0x01, 0x00, 0xE1, 0xD5, 0xFE, 0xA1, 0xFF, 0xFF, 0xFF, 0x08, 0xE1, 0xA1, 0xFF, - 0x67, 0x4C, 0x43, 0xFF, 0xD2, 0xF3, 0xFF, 0xFF, 0x10, 0xBC, 0xD2, 0xFB, 0xAD, 0x4F, 0x02, 0xBC, - 0x00, 0x7F, 0xA0, 0x5D, 0x01, 0xE1, 0x01, 0x60, 0x69, 0x6B, 0xA5, 0x60, 0xC4, 0x64, 0x60, 0x4C, - 0xBB, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x60, 0x4C, 0xA1, 0xFF, 0xFF, 0xFF, 0x60, 0x4C, 0xFC, 0x01, - 0x29, 0xF3, 0x2A, 0xF1, 0x07, 0xB5, 0x04, 0xE1, 0x65, 0x41, 0x64, 0x54, 0xCD, 0xE2, 0x95, 0x81, - 0xA1, 0x5D, 0xA1, 0xFF, 0xFF, 0xFF, 0xF9, 0x01, 0x10, 0x61, 0x7F, 0x60, 0xC0, 0x64, 0xA0, 0x80, - 0x7F, 0x67, 0x02, 0x63, 0x25, 0x02, 0x98, 0xFE, 0x19, 0x05, 0x0F, 0x60, 0x7F, 0xF5, 0x0E, 0xF2, - 0x15, 0x18, 0x02, 0x18, 0x09, 0xF4, 0xFB, 0x01, 0x23, 0x44, 0x00, 0xA8, 0x08, 0x7E, 0x0A, 0x02, - 0x66, 0x44, 0x11, 0xFB, 0x46, 0x43, 0x23, 0x47, 0x80, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, - 0x28, 0xB9, 0x10, 0x7E, 0x00, 0x7F, 0x0E, 0xFA, 0x00, 0x67, 0x0A, 0x00, 0x20, 0x44, 0xDC, 0x85, - 0x0F, 0xB4, 0xF7, 0xA0, 0x7F, 0x67, 0x07, 0x63, 0x03, 0x05, 0x45, 0x40, 0x00, 0x67, 0xD8, 0xFE, - 0xFF, 0x27, 0x05, 0xFD, 0x0A, 0x7E, 0x04, 0xFB, 0x61, 0x55, 0x48, 0x00, 0x28, 0xFB, 0x01, 0xF3, - 0x29, 0xFB, 0x44, 0x46, 0x40, 0x45, 0x10, 0x61, 0x7E, 0x60, 0xC0, 0x64, 0xA0, 0x80, 0x7F, 0x67, - 0x02, 0x63, 0x30, 0x02, 0xB5, 0x60, 0x58, 0x4F, 0x4B, 0x78, 0xFF, 0xFF, 0x7F, 0x67, 0x03, 0x63, - 0x29, 0x02, 0x26, 0x40, 0x01, 0x2B, 0x23, 0x00, 0x98, 0xFE, 0x18, 0x05, 0x0F, 0x60, 0x7F, 0xF5, - 0x0E, 0xF2, 0x14, 0x18, 0x02, 0x18, 0x09, 0xF4, 0xFB, 0x01, 0x23, 0x44, 0x00, 0xA8, 0x08, 0x7E, - 0x0A, 0x02, 0x66, 0x44, 0x11, 0xFB, 0x46, 0x43, 0x23, 0x47, 0x80, 0xBF, 0x3B, 0x42, 0x04, 0xA2, - 0xA2, 0xDB, 0x08, 0xB9, 0x10, 0x7E, 0x00, 0x7F, 0x0E, 0xFA, 0x09, 0x00, 0x20, 0x44, 0xDC, 0x85, - 0x0F, 0xB4, 0xF7, 0xA0, 0x7F, 0x67, 0x07, 0x63, 0x05, 0x05, 0x45, 0x40, 0xD8, 0xFE, 0x00, 0x67, - 0xD0, 0xFE, 0xD9, 0xFE, 0xFF, 0x27, 0x05, 0xFD, 0x0B, 0x7E, 0x04, 0xFB, 0x0A, 0x60, 0x7E, 0xF3, - 0xFF, 0xFF, 0x20, 0xB0, 0x80, 0xBC, 0x08, 0x28, 0xA2, 0xDB, 0x61, 0x55, 0x66, 0x00, 0x04, 0xB5, - 0x82, 0xB5, 0x25, 0x02, 0x04, 0x03, 0x20, 0x44, 0x7F, 0xB4, 0x40, 0x40, 0xA3, 0xD3, 0x99, 0xFE, - 0x04, 0x04, 0x02, 0xBC, 0xFE, 0xB4, 0xA3, 0xDB, 0x59, 0x00, 0xBC, 0xF3, 0x20, 0x40, 0x80, 0x26, - 0x55, 0x00, 0xA3, 0xD3, 0xFF, 0xA0, 0xF8, 0xB4, 0x02, 0x02, 0xA3, 0xDB, 0x1C, 0x00, 0x04, 0xBC, - 0xBF, 0xB4, 0xA3, 0xDB, 0x08, 0xB0, 0x01, 0x64, 0x08, 0x24, 0x02, 0x64, 0x28, 0xFB, 0x20, 0x44, - 0x80, 0xBC, 0x40, 0x40, 0xD0, 0xFE, 0x42, 0x00, 0xBF, 0xB4, 0xA3, 0xDB, 0x3F, 0x00, 0x40, 0xB0, - 0xFF, 0xFF, 0xFA, 0x02, 0xF8, 0xB4, 0xA3, 0xDB, 0x08, 0xB5, 0x07, 0x7C, 0x01, 0x02, 0xBC, 0xF9, - 0x20, 0x44, 0x7F, 0xB4, 0x40, 0x40, 0x14, 0x60, 0xFC, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0x20, 0xB5, - 0x07, 0xB5, 0x08, 0x28, 0xC4, 0x02, 0x99, 0xFE, 0x29, 0x05, 0x20, 0x44, 0x80, 0x26, 0x26, 0x00, - 0x20, 0x2A, 0x03, 0x00, 0xDF, 0xB4, 0x40, 0x40, 0x6A, 0x00, 0x40, 0x2A, 0x1F, 0x00, 0xBF, 0xB4, - 0x40, 0x40, 0x09, 0x00, 0xA8, 0xFF, 0x20, 0x44, 0x99, 0xFE, 0x02, 0x05, 0x80, 0x2A, 0x03, 0x00, - 0x40, 0xBC, 0x40, 0x40, 0x13, 0x00, 0x00, 0xF1, 0x80, 0xBC, 0x40, 0x40, 0x64, 0x44, 0xE0, 0x84, - 0xE8, 0x84, 0x0A, 0x36, 0x29, 0x01, 0x0B, 0x36, 0x59, 0x01, 0x28, 0xFB, 0x01, 0xF1, 0x29, 0xF9, - 0x02, 0xF1, 0x2A, 0xF9, 0x03, 0xF1, 0x2B, 0xF9, 0xD0, 0xFE, 0xAE, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, - 0x82, 0x3E, 0x75, 0x44, 0x02, 0xB0, 0x01, 0xB0, 0x4A, 0x02, 0xDC, 0x02, 0x04, 0xB0, 0x08, 0xB0, - 0x0B, 0x02, 0x20, 0x02, 0x40, 0x26, 0xA7, 0xFF, 0x8C, 0xFF, 0x75, 0x40, 0x80, 0x2B, 0x01, 0x00, - 0xAB, 0xFF, 0x75, 0x44, 0x8D, 0xFF, 0xEA, 0x01, 0x0A, 0xF3, 0xAA, 0xFF, 0x60, 0x40, 0x20, 0x2B, - 0x02, 0x00, 0x38, 0xFF, 0x0D, 0x00, 0x01, 0x26, 0x0C, 0x00, 0xC0, 0x60, 0x00, 0x7C, 0xA0, 0x84, - 0x80, 0x3B, 0x02, 0x00, 0xC0, 0x67, 0x03, 0x00, 0x40, 0x3B, 0x02, 0x00, 0x00, 0x67, 0x0A, 0xFB, - 0xD5, 0x01, 0xD4, 0x01, 0x0B, 0xF1, 0xAB, 0xFF, 0x64, 0x44, 0xFF, 0x27, 0x1F, 0x00, 0x20, 0x26, - 0x03, 0x00, 0x02, 0x60, 0x00, 0x75, 0x1A, 0x00, 0x19, 0xF3, 0xFF, 0xFF, 0x03, 0x1B, 0x04, 0x60, - 0x00, 0x75, 0x0A, 0x64, 0xCC, 0x84, 0x19, 0xFB, 0x01, 0x60, 0x00, 0x75, 0x64, 0x40, 0x03, 0x22, - 0x0D, 0x00, 0x20, 0x44, 0x80, 0x2A, 0x03, 0x00, 0x20, 0xBC, 0x40, 0x40, 0x07, 0x00, 0xD9, 0xFE, - 0x81, 0x60, 0x0B, 0x64, 0x28, 0xFB, 0x2C, 0x44, 0x29, 0xFB, 0xD0, 0xFE, 0xAF, 0x01, 0xA9, 0xFF, - 0x77, 0x44, 0x60, 0x57, 0x40, 0x4A, 0x01, 0x2A, 0x20, 0x00, 0x24, 0x44, 0xAC, 0x86, 0x08, 0xF2, - 0x1C, 0x03, 0x1F, 0x60, 0x04, 0x65, 0xD4, 0x80, 0x0E, 0xF2, 0x02, 0x03, 0xA5, 0xD5, 0x04, 0x00, - 0x01, 0xBC, 0x0E, 0xFA, 0x09, 0xF4, 0xD1, 0xFE, 0x46, 0x44, 0x0F, 0x18, 0x3F, 0xF2, 0x48, 0x65, - 0xC4, 0x84, 0x13, 0xFB, 0x66, 0x44, 0x10, 0xFB, 0x66, 0x47, 0x20, 0xBF, 0x3B, 0x42, 0x04, 0xA2, - 0xA2, 0xDB, 0x0E, 0xF2, 0x41, 0x75, 0x10, 0xBC, 0x0E, 0xFA, 0x2A, 0x44, 0x08, 0x2A, 0x17, 0x00, - 0x23, 0x44, 0x00, 0xA8, 0x5C, 0x43, 0x13, 0x03, 0x0F, 0x60, 0x7F, 0xF5, 0x01, 0x00, 0x09, 0xF4, - 0x0E, 0xF2, 0x0D, 0x18, 0x08, 0xB0, 0x18, 0xAC, 0xFA, 0x03, 0x0E, 0xFA, 0x66, 0x43, 0x11, 0xFD, - 0x46, 0x43, 0x23, 0x47, 0x80, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x28, 0x75, 0x2A, 0x44, - 0x06, 0x22, 0x2D, 0x00, 0x22, 0x44, 0x00, 0xA8, 0x60, 0x46, 0x0E, 0xF2, 0x28, 0x03, 0x10, 0xB0, - 0x01, 0xBC, 0x03, 0x02, 0x00, 0x64, 0x40, 0x42, 0x22, 0x00, 0x0E, 0xFA, 0xD1, 0xFE, 0x1E, 0x60, - 0xF8, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x80, 0x00, 0x46, 0x42, 0x19, 0x02, 0x22, 0x47, 0x40, 0xBF, - 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x23, 0xF2, 0x66, 0x43, 0x00, 0xA8, 0x0E, 0xF2, 0x08, 0x02, - 0x60, 0x40, 0x02, 0x2A, 0xE4, 0x01, 0x12, 0xFD, 0x10, 0x64, 0x0E, 0xFA, 0x02, 0x75, 0x07, 0x00, - 0x60, 0x40, 0x04, 0x2A, 0xDC, 0x01, 0x12, 0xFD, 0x10, 0x64, 0x0E, 0xFA, 0x04, 0x75, 0x2A, 0x44, - 0x80, 0x2A, 0x19, 0x00, 0x21, 0x44, 0xAC, 0x86, 0x0E, 0xF2, 0x15, 0x03, 0x01, 0xBC, 0x0E, 0xFA, - 0xD1, 0xFE, 0x1F, 0x60, 0x10, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x56, 0x00, 0x46, 0x41, 0x0B, 0x02, - 0x21, 0x47, 0x10, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x0E, 0xF2, 0x66, 0x43, 0x08, 0xFD, - 0x10, 0xBC, 0x0E, 0xFA, 0x80, 0x75, 0x2A, 0x44, 0x10, 0xB0, 0x20, 0x44, 0x15, 0x03, 0x7F, 0xB4, - 0x40, 0x40, 0x14, 0x60, 0xFC, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0x20, 0xB0, 0x80, 0xB0, 0x09, 0x03, - 0x08, 0x03, 0x40, 0xBC, 0x7F, 0xB4, 0x04, 0xB0, 0xA3, 0xDB, 0x03, 0x03, 0x20, 0x44, 0x80, 0xBC, - 0x40, 0x40, 0xB3, 0x60, 0x8B, 0x78, 0xFF, 0xFF, 0xB3, 0x60, 0xBE, 0x78, 0xFF, 0xFF, 0xE8, 0xFE, - 0x14, 0x05, 0xEA, 0xFE, 0x24, 0x05, 0xE9, 0xFE, 0x1C, 0x05, 0xE7, 0xFE, 0x09, 0x05, 0x47, 0xFF, - 0x20, 0x44, 0x0F, 0x22, 0x03, 0x00, 0xCC, 0x84, 0x40, 0x40, 0x0F, 0x22, 0xB8, 0xFE, 0xEC, 0x01, - 0x23, 0x41, 0x00, 0xB9, 0x5C, 0x4A, 0xE8, 0x02, 0x6F, 0x01, 0x24, 0x41, 0x00, 0xB9, 0x1F, 0x60, - 0x04, 0x65, 0x45, 0x47, 0xE1, 0x02, 0x58, 0x4F, 0x0F, 0x00, 0xDE, 0x02, 0x5C, 0x4A, 0x46, 0x44, - 0x4D, 0x01, 0x22, 0x41, 0x00, 0xB9, 0x5C, 0x4A, 0x08, 0x24, 0x81, 0x01, 0xD5, 0x01, 0x21, 0x41, - 0x00, 0xB9, 0x5C, 0x4A, 0xA6, 0x03, 0xD0, 0x01, 0x27, 0xD3, 0x03, 0x00, 0x10, 0xB0, 0x09, 0xF2, - 0x04, 0x03, 0xAC, 0x86, 0x0E, 0xF2, 0xFA, 0x02, 0x08, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0E, 0xF3, - 0x0F, 0x60, 0xFE, 0x65, 0x0C, 0xF3, 0x24, 0x86, 0x24, 0x46, 0x60, 0x40, 0xFB, 0x3B, 0x07, 0x00, - 0x80, 0x26, 0x02, 0x00, 0x23, 0x46, 0x03, 0x4C, 0x46, 0x61, 0x3A, 0x65, 0x0C, 0x00, 0x2E, 0xF3, - 0x40, 0x45, 0xF8, 0x2B, 0x02, 0x00, 0x40, 0x45, 0x03, 0x00, 0x58, 0x4F, 0x44, 0x00, 0x07, 0x02, - 0x58, 0x4F, 0x50, 0x00, 0x04, 0x05, 0x66, 0x50, 0x65, 0x52, 0x61, 0x51, 0x09, 0x00, 0x26, 0x47, - 0x00, 0xBF, 0x0E, 0xFB, 0x2E, 0xF5, 0x05, 0xF0, 0x80, 0x60, 0x64, 0x50, 0x00, 0x72, 0x7E, 0x71, - 0xAC, 0xFF, 0xB3, 0x60, 0xBE, 0x78, 0xFF, 0xFF, 0x8E, 0xFF, 0x0F, 0xF3, 0x0F, 0x60, 0xFE, 0x65, - 0x24, 0x86, 0x0D, 0xF3, 0x24, 0x46, 0x60, 0x40, 0xFB, 0x3B, 0x07, 0x00, 0x80, 0x26, 0x02, 0x00, - 0x23, 0x46, 0x03, 0x4C, 0x46, 0x61, 0x3A, 0x65, 0x0C, 0x00, 0x2E, 0xF3, 0x40, 0x45, 0xF8, 0x2B, - 0x02, 0x00, 0x40, 0x45, 0x03, 0x00, 0x58, 0x4F, 0x16, 0x00, 0x07, 0x02, 0x58, 0x4F, 0x22, 0x00, - 0x04, 0x05, 0x66, 0x50, 0x65, 0x52, 0x61, 0x51, 0x09, 0x00, 0x26, 0x47, 0x00, 0xBF, 0x0F, 0xFB, - 0x2E, 0xF5, 0x05, 0xF0, 0x80, 0x60, 0x64, 0x50, 0x00, 0x72, 0x7E, 0x71, 0x8D, 0xFF, 0xAD, 0xFF, - 0xB3, 0x60, 0xBE, 0x78, 0xFF, 0xFF, 0x25, 0x44, 0x89, 0xF1, 0x8A, 0xF1, 0xD0, 0x80, 0xD0, 0x80, - 0x07, 0x04, 0x01, 0x06, 0x05, 0x00, 0x25, 0x46, 0x01, 0xF0, 0x03, 0x67, 0xA0, 0x85, 0x94, 0x80, - 0x2F, 0x58, 0xFF, 0xFF, 0x25, 0x46, 0x26, 0x41, 0x46, 0x63, 0x01, 0xF2, 0xFF, 0xFF, 0xFF, 0xB5, - 0xD5, 0x81, 0x00, 0xF2, 0x05, 0x04, 0x04, 0x63, 0x60, 0x46, 0xF7, 0x1B, 0x42, 0xFE, 0x0D, 0x00, - 0x61, 0x44, 0xC5, 0x81, 0x63, 0x45, 0xC5, 0x81, 0x9C, 0x84, 0xDC, 0x84, 0x01, 0xF2, 0xF0, 0x85, - 0xF0, 0x80, 0x65, 0x44, 0xF8, 0x85, 0xFF, 0xFF, 0x02, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xA2, 0xFF, - 0x0F, 0x60, 0x8B, 0xF3, 0xFF, 0xFF, 0xAC, 0x86, 0x0E, 0xF2, 0x07, 0x03, 0x00, 0xA8, 0x09, 0xF2, - 0xFA, 0x02, 0x01, 0x67, 0x0E, 0xFA, 0x08, 0xFE, 0x17, 0x00, 0x8B, 0xF3, 0xFF, 0xFF, 0xD8, 0xA0, - 0x00, 0xB4, 0x12, 0x06, 0x09, 0x60, 0x08, 0x61, 0x41, 0x4A, 0x7C, 0xA1, 0x0E, 0xA1, 0xA2, 0xFF, - 0xB5, 0x60, 0x58, 0x4E, 0xC1, 0x78, 0xFF, 0xFF, 0xA3, 0xFF, 0x06, 0x03, 0x2A, 0x43, 0xB5, 0x60, - 0x58, 0x4E, 0xE2, 0x78, 0xFF, 0xFF, 0x08, 0xFE, 0xA3, 0xFF, 0x2D, 0x58, 0xFF, 0xFF, 0x41, 0x4A, - 0x42, 0xA1, 0x03, 0x00, 0x41, 0x4A, 0x7C, 0xA1, 0x0E, 0xA1, 0xA2, 0xFF, 0xB5, 0x60, 0x58, 0x4E, - 0xC1, 0x78, 0xFF, 0xFF, 0x07, 0x03, 0x2A, 0x43, 0xB5, 0x60, 0x58, 0x4E, 0xE2, 0x78, 0xFF, 0xFF, - 0x08, 0xFE, 0x0C, 0x00, 0x0F, 0x60, 0x8B, 0xF3, 0xFF, 0xFF, 0xAC, 0x86, 0x0E, 0xF2, 0x06, 0x03, - 0x00, 0xA8, 0x09, 0xF2, 0xFA, 0x02, 0x01, 0x67, 0x0E, 0xFA, 0x08, 0xFE, 0xA3, 0xFF, 0x2D, 0x58, - 0xFF, 0xFF, 0x8C, 0xF3, 0x7C, 0x63, 0x00, 0xBE, 0x40, 0x45, 0x1A, 0x03, 0x00, 0x65, 0x65, 0x44, - 0xDC, 0x85, 0x84, 0xA1, 0x00, 0xF2, 0x06, 0x06, 0x01, 0xFC, 0x00, 0xA8, 0x60, 0x46, 0xF7, 0x02, - 0x40, 0x45, 0x0E, 0x00, 0x8B, 0xF3, 0x00, 0x63, 0xD4, 0x84, 0x8B, 0xFB, 0x80, 0x60, 0x7C, 0x64, - 0x01, 0xFA, 0x00, 0xF0, 0x00, 0xFC, 0xD3, 0x80, 0x8C, 0xF9, 0x02, 0x02, 0x8D, 0xF9, 0x08, 0xFE, - 0x2E, 0x58, 0xFF, 0xFF, 0x66, 0x44, 0x25, 0x46, 0x05, 0xFA, 0x06, 0xFA, 0x01, 0xF0, 0x03, 0x67, - 0x02, 0xFC, 0xB0, 0x84, 0x3A, 0x7E, 0x01, 0xFA, 0x12, 0x64, 0x03, 0xFA, 0x00, 0xF0, 0x04, 0xF8, - 0x00, 0x64, 0x0C, 0x61, 0x10, 0x63, 0x59, 0xDA, 0xFE, 0x1F, 0x2E, 0x58, 0xFF, 0xFF, 0x27, 0x43, - 0xE3, 0x81, 0xE9, 0x81, 0x03, 0x05, 0x16, 0x03, 0x00, 0x61, 0x01, 0x00, 0xEC, 0x63, 0x61, 0x46, - 0xBF, 0xD2, 0x27, 0x45, 0xDC, 0x84, 0xA2, 0xDA, 0xBE, 0xD2, 0x25, 0x46, 0x88, 0xF8, 0x04, 0x1B, - 0x25, 0x44, 0x61, 0x46, 0xA3, 0xDA, 0x04, 0x00, 0x0A, 0xFA, 0x60, 0x46, 0x25, 0x44, 0x09, 0xFA, - 0x61, 0x46, 0xBE, 0xDA, 0x2F, 0x58, 0xFF, 0xFF, 0x25, 0x44, 0x00, 0xA8, 0x07, 0x4B, 0x0C, 0x03, - 0x58, 0x4F, 0x33, 0x00, 0x0B, 0x47, 0x1F, 0x60, 0x0A, 0x65, 0x27, 0x44, 0xD4, 0x80, 0x00, 0x64, - 0x01, 0x02, 0x0F, 0xFA, 0x58, 0x4F, 0xD3, 0x01, 0x70, 0x00, 0x25, 0x43, 0xE3, 0x84, 0x7C, 0x41, - 0x02, 0x04, 0xE8, 0x81, 0xEC, 0x63, 0x61, 0x46, 0xA3, 0xD2, 0x00, 0x7C, 0x40, 0x45, 0xBF, 0xD8, - 0xA3, 0xD8, 0xBE, 0xD8, 0x27, 0x42, 0x5A, 0xD3, 0x25, 0x5C, 0x60, 0x41, 0x02, 0x1B, 0x27, 0xD9, - 0x05, 0x00, 0x25, 0x46, 0x0A, 0xFA, 0x61, 0x46, 0x25, 0x44, 0x09, 0xFA, 0x25, 0x44, 0x27, 0x43, - 0x00, 0x61, 0x60, 0x46, 0x09, 0xF2, 0x08, 0xFC, 0x00, 0xA8, 0xDD, 0x81, 0xFA, 0x02, 0xBF, 0xD1, - 0x66, 0x44, 0xBE, 0xDB, 0xC1, 0x84, 0xBF, 0xDB, 0x48, 0x00, 0x25, 0x46, 0xEC, 0x63, 0x08, 0xF2, - 0x89, 0xF2, 0x1E, 0x18, 0x40, 0x47, 0xE0, 0x84, 0xE8, 0x85, 0x02, 0x05, 0xE8, 0x83, 0x00, 0x65, - 0x65, 0x46, 0xBF, 0xD2, 0x61, 0x5C, 0xCC, 0x84, 0xA2, 0xDA, 0x25, 0x46, 0x0A, 0xF2, 0x00, 0xB9, - 0x65, 0x46, 0x08, 0x24, 0xBE, 0xDA, 0x02, 0x1B, 0xA3, 0xD8, 0x02, 0x00, 0x60, 0x46, 0x89, 0xFA, - 0x00, 0xB9, 0x61, 0x46, 0x08, 0x28, 0x0A, 0xFA, 0x25, 0x46, 0x89, 0xFC, 0x8A, 0xFC, 0x88, 0xFC, - 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x61, 0x28, 0x65, 0x25, 0x43, 0x8D, 0xF3, 0xAF, 0x83, 0x00, 0xBE, - 0x18, 0x03, 0x02, 0x03, 0x00, 0xFC, 0x01, 0x00, 0x8C, 0xFD, 0x63, 0x46, 0x65, 0x44, 0xCC, 0x85, - 0x00, 0xF2, 0x07, 0x02, 0x8D, 0xF5, 0x00, 0x64, 0x00, 0xFA, 0xDE, 0x60, 0xAF, 0x64, 0x09, 0xFB, - 0x08, 0x00, 0x66, 0x43, 0x00, 0xBE, 0xDD, 0x81, 0xF1, 0x02, 0x8B, 0xF1, 0x8D, 0xFD, 0xC1, 0x84, - 0x8B, 0xFB, 0x2E, 0x58, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x45, 0x29, 0x43, 0xFC, 0xA3, 0x66, 0x44, - 0xBD, 0xDB, 0x25, 0x44, 0xBD, 0xDB, 0x00, 0x64, 0xBD, 0xDB, 0x03, 0x61, 0x0E, 0x65, 0x1F, 0x60, - 0x1E, 0x63, 0x43, 0x49, 0xA3, 0xD3, 0x06, 0xA3, 0x00, 0xA8, 0xCD, 0x81, 0x04, 0x02, 0xF9, 0x02, - 0xB3, 0x60, 0xBE, 0x78, 0xFF, 0xFF, 0x01, 0x26, 0xE6, 0x01, 0xD4, 0x80, 0x60, 0x45, 0xE3, 0x05, - 0xF6, 0xA3, 0xBD, 0xD1, 0xBD, 0xD1, 0x44, 0x47, 0x44, 0x48, 0x44, 0x45, 0x1F, 0x60, 0x60, 0x64, - 0x44, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x48, 0xFE, 0x8C, 0xF5, 0x8B, 0xF3, 0x0D, 0x18, 0xCC, 0x84, - 0x8B, 0xFB, 0x80, 0x60, 0x7C, 0x64, 0x01, 0xFA, 0x00, 0x64, 0x00, 0xF0, 0x00, 0xFA, 0xD0, 0x80, - 0x8C, 0xF9, 0x02, 0x02, 0x8D, 0xF9, 0x08, 0xFE, 0x2E, 0x58, 0xFF, 0xFF, 0x1E, 0x60, 0xCE, 0x63, - 0x0D, 0x65, 0x00, 0x61, 0x41, 0x48, 0xA3, 0xD3, 0x06, 0xA3, 0xAC, 0x86, 0x00, 0x61, 0x09, 0x03, - 0x00, 0xF2, 0x09, 0xF0, 0xAC, 0x86, 0x00, 0xF2, 0xDD, 0x81, 0xFC, 0x02, 0x64, 0x44, 0xAC, 0x86, - 0xF6, 0x01, 0x61, 0x44, 0x25, 0x46, 0x27, 0xDA, 0x65, 0x44, 0x28, 0x45, 0x45, 0x88, 0xCC, 0x85, - 0x5A, 0x87, 0xE9, 0x02, 0x00, 0x64, 0x27, 0xDA, 0x5A, 0xDA, 0x5A, 0x87, 0x87, 0xF3, 0x86, 0xF1, - 0x02, 0xA4, 0x60, 0x46, 0x60, 0x45, 0x00, 0x61, 0x22, 0xF2, 0xFF, 0xFF, 0xAC, 0x86, 0x00, 0xF2, - 0x04, 0x03, 0xAC, 0x86, 0x00, 0xF2, 0xDD, 0x81, 0xFC, 0x02, 0x65, 0x44, 0x02, 0xA5, 0x65, 0x46, - 0x64, 0x44, 0xCC, 0x9C, 0xFF, 0xFF, 0xF0, 0x02, 0x61, 0x44, 0x25, 0x46, 0x27, 0xDA, 0x5A, 0x87, - 0x28, 0x45, 0x45, 0x88, 0x87, 0xF3, 0x86, 0xF1, 0x02, 0xA4, 0x60, 0x46, 0x60, 0x45, 0x00, 0x61, - 0x76, 0xF2, 0xFF, 0xFF, 0xAC, 0x86, 0x00, 0xF2, 0x09, 0x03, 0x00, 0xF2, 0x09, 0xF0, 0xAC, 0x86, - 0x00, 0xF2, 0xDD, 0x81, 0xFC, 0x02, 0x64, 0x44, 0xAC, 0x86, 0xF6, 0x01, 0x65, 0x44, 0x02, 0xA5, - 0x65, 0x46, 0x64, 0x44, 0xCC, 0x9C, 0x61, 0x44, 0xEB, 0x02, 0x25, 0x46, 0x27, 0xDA, 0x5A, 0x87, - 0x28, 0x45, 0x45, 0x88, 0x06, 0x60, 0x40, 0x65, 0x8C, 0xF3, 0x01, 0x61, 0xAC, 0x86, 0x00, 0xF2, - 0x03, 0x03, 0xD5, 0x80, 0xDD, 0x81, 0xFA, 0x04, 0xCD, 0x84, 0x25, 0x46, 0x27, 0xDA, 0x28, 0x45, - 0xC4, 0x84, 0x5A, 0xDA, 0xDA, 0x81, 0x8B, 0xF1, 0x59, 0xD8, 0x1E, 0x60, 0xCC, 0x64, 0x18, 0x63, - 0xA0, 0xD1, 0x06, 0xA4, 0x59, 0xD8, 0xFC, 0x1F, 0x00, 0x64, 0x59, 0xDA, 0x59, 0xDA, 0x01, 0x60, - 0x1A, 0x64, 0x0A, 0x63, 0x58, 0xD1, 0x59, 0xD8, 0xFD, 0x1F, 0x7D, 0xF1, 0x59, 0xD8, 0x45, 0x01, - 0x07, 0x4B, 0xB6, 0x60, 0x58, 0x4F, 0x4D, 0x78, 0xFF, 0xFF, 0x0B, 0x47, 0x58, 0x4F, 0x21, 0x00, - 0x3C, 0x01, 0x07, 0x4B, 0xB6, 0x60, 0x58, 0x4F, 0x4D, 0x78, 0xFF, 0xFF, 0x0B, 0x47, 0x27, 0x44, - 0x00, 0xBE, 0x08, 0xF0, 0x15, 0x03, 0x64, 0x42, 0x4A, 0xD3, 0x09, 0xF2, 0xDC, 0x83, 0xA2, 0xDD, - 0x25, 0x43, 0x09, 0xFC, 0x63, 0x46, 0x27, 0x43, 0x0A, 0xFC, 0x09, 0xFA, 0x08, 0xF8, 0x00, 0xA8, - 0x66, 0x43, 0x03, 0x02, 0x64, 0x44, 0x58, 0xDD, 0x03, 0x00, 0x60, 0x46, 0x25, 0x44, 0x0A, 0xFA, - 0x1C, 0x01, 0x27, 0x43, 0xE3, 0x81, 0xE9, 0x81, 0x03, 0x05, 0x16, 0x03, 0x00, 0x61, 0x01, 0x00, - 0xEC, 0x63, 0x61, 0x46, 0xBF, 0xD2, 0x27, 0x45, 0xDC, 0x84, 0xA2, 0xDA, 0xA3, 0xD2, 0x25, 0x46, - 0x88, 0xF8, 0x04, 0x1B, 0x25, 0x44, 0x61, 0x46, 0xBE, 0xDA, 0x04, 0x00, 0x09, 0xFA, 0x60, 0x46, - 0x25, 0x44, 0x0A, 0xFA, 0x61, 0x46, 0xA3, 0xDA, 0x2F, 0x58, 0xFF, 0xFF, 0xA0, 0xFE, 0x07, 0x05, - 0xA3, 0xFE, 0x07, 0x05, 0xA1, 0xFE, 0x46, 0x05, 0x60, 0x64, 0x3B, 0xDB, 0x0F, 0x00, 0x20, 0x58, - 0xFF, 0xFF, 0xFA, 0x01, 0x0A, 0x60, 0x80, 0xF3, 0xFF, 0xFF, 0xFB, 0xB4, 0xA2, 0xDB, 0xA0, 0x4C, - 0x59, 0xBC, 0xFF, 0xB4, 0xA0, 0x51, 0xA0, 0x4C, 0x7D, 0xB4, 0xA0, 0x51, 0xA1, 0xFF, 0xFF, 0xFF, - 0x83, 0x3E, 0x40, 0x60, 0x0B, 0x65, 0x2B, 0x44, 0x00, 0x63, 0xE8, 0x80, 0xF8, 0x84, 0x02, 0x24, - 0x94, 0x84, 0xF3, 0x83, 0xCD, 0x81, 0xFF, 0xFF, 0xF8, 0x02, 0xDF, 0x83, 0x2F, 0x58, 0x40, 0x4B, - 0x00, 0x62, 0x01, 0x64, 0xD4, 0x80, 0xE0, 0x84, 0x1A, 0x03, 0xD4, 0x80, 0xE0, 0x84, 0x15, 0x03, - 0x61, 0x44, 0x11, 0x61, 0xE0, 0x84, 0xCD, 0x81, 0xFD, 0x04, 0x01, 0x00, 0xE0, 0x84, 0xF2, 0x82, - 0xFF, 0xFF, 0x02, 0x24, 0xC6, 0x82, 0x02, 0x28, 0xD6, 0x82, 0xE2, 0x80, 0xCD, 0x81, 0x02, 0x28, - 0x01, 0xBC, 0xF4, 0x02, 0x01, 0x2A, 0xC6, 0x82, 0x03, 0x00, 0xE9, 0x81, 0xF2, 0x82, 0x61, 0x44, - 0x2D, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x3B, 0xDB, 0x0C, 0x60, 0x6E, 0xF3, 0x5A, 0xD1, 0x60, 0x40, - 0x04, 0x3A, 0x2C, 0x00, 0x00, 0x64, 0x4A, 0xDB, 0x1E, 0x60, 0xCE, 0x63, 0xA3, 0xD3, 0x46, 0x43, - 0xAC, 0x86, 0x3C, 0x45, 0x22, 0x03, 0xD4, 0x80, 0x07, 0xF2, 0x02, 0x02, 0x09, 0xF2, 0xF8, 0x01, - 0xD0, 0x80, 0x09, 0xF2, 0xF5, 0x02, 0x60, 0x43, 0x80, 0x67, 0xB0, 0x81, 0x61, 0x44, 0x0F, 0x60, - 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x09, 0x60, - 0x08, 0x65, 0x0E, 0xF2, 0x02, 0xF2, 0x60, 0x40, 0xF0, 0x37, 0x05, 0x00, 0x8F, 0xF3, 0xD4, 0x80, - 0xCC, 0x84, 0x01, 0x02, 0x8F, 0xFB, 0x63, 0x44, 0xDB, 0x01, 0x23, 0x46, 0x3C, 0x44, 0xAC, 0x80, - 0xFF, 0xFF, 0x94, 0x02, 0x69, 0xF3, 0x6A, 0xF3, 0x02, 0xA8, 0x02, 0xA8, 0x08, 0x02, 0x00, 0x64, - 0x6B, 0xFB, 0x69, 0xFB, 0x6A, 0xFB, 0x00, 0x64, 0x6C, 0xFB, 0xCA, 0xFE, 0x92, 0x00, 0x03, 0x02, - 0x00, 0x64, 0x6A, 0xFB, 0xCA, 0xFE, 0x01, 0x64, 0x3B, 0xDB, 0x0F, 0x60, 0x6A, 0xF3, 0xFF, 0xFF, - 0x00, 0xA8, 0x60, 0x46, 0x35, 0x03, 0x2C, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x26, 0x86, 0x00, - 0x2E, 0xF2, 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, - 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x2E, 0xF0, 0x63, 0x46, 0xD0, 0x80, - 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x2D, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, - 0x61, 0x46, 0x2C, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, - 0x63, 0x46, 0xE8, 0x1B, 0x87, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x5F, 0x02, 0x66, 0x45, - 0x63, 0x46, 0x06, 0xF2, 0x65, 0x46, 0x80, 0xB0, 0x09, 0xF2, 0x58, 0x03, 0xAC, 0x86, 0xCA, 0x01, - 0x6A, 0xF3, 0xFF, 0xFF, 0x01, 0xA8, 0xFF, 0xFF, 0x4C, 0x02, 0x0F, 0x60, 0x73, 0xF3, 0xFF, 0xFF, - 0x00, 0xA8, 0x60, 0x46, 0x0F, 0x03, 0x76, 0xF1, 0x07, 0xF2, 0xFF, 0xFF, 0xD0, 0x80, 0x09, 0xF2, - 0x03, 0x02, 0xAC, 0x86, 0x07, 0xF2, 0xFA, 0x02, 0x03, 0x02, 0x00, 0x64, 0x76, 0xFB, 0xED, 0x01, - 0x46, 0x5C, 0x3C, 0x00, 0x0F, 0x60, 0x76, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x01, 0x03, - 0x35, 0x02, 0x6B, 0xF3, 0xFF, 0xFF, 0x01, 0xA8, 0xFF, 0xFF, 0x13, 0x02, 0x0F, 0x60, 0x6D, 0xF3, - 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x0B, 0x03, 0x2A, 0xF0, 0x20, 0x67, 0x09, 0xF2, 0xB0, 0x83, - 0x00, 0xA8, 0x00, 0x64, 0x02, 0x03, 0x2A, 0xFC, 0x01, 0x00, 0x6B, 0xFB, 0x1F, 0x00, 0x00, 0x64, - 0x6B, 0xFB, 0x0F, 0x60, 0x67, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x12, 0x03, 0x2A, 0xF0, - 0x08, 0x67, 0xA0, 0x80, 0xFF, 0xFF, 0x12, 0x03, 0x76, 0xF1, 0x07, 0xF2, 0xFF, 0xFF, 0xD0, 0x80, - 0x09, 0xF2, 0x03, 0x02, 0xAC, 0x86, 0x07, 0xF2, 0xFA, 0x02, 0x08, 0x02, 0x00, 0x64, 0x76, 0xFB, - 0xE8, 0x01, 0x00, 0x64, 0x76, 0xFB, 0xB7, 0x60, 0xA2, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0xFC, 0xFB, - 0x46, 0x5C, 0x16, 0x60, 0x2B, 0xF3, 0x0D, 0xF2, 0x60, 0x5C, 0x64, 0x5F, 0x0D, 0xFA, 0x07, 0xF0, - 0x2A, 0xF2, 0xFF, 0xFF, 0x76, 0xF9, 0x60, 0x40, 0x08, 0x2B, 0x05, 0x00, 0x00, 0x64, 0x48, 0xFB, - 0xBA, 0x60, 0x03, 0x78, 0xFF, 0xFF, 0x00, 0x64, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x02, 0x23, 0xF0, - 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0xBF, 0x60, 0x16, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x00, 0x63, - 0x40, 0x47, 0x50, 0x36, 0x01, 0x00, 0x01, 0x63, 0x48, 0xFD, 0x4A, 0xF3, 0x35, 0xFA, 0x10, 0xA4, - 0x4A, 0xFB, 0x00, 0x64, 0x15, 0xFA, 0x16, 0xFA, 0x0F, 0xFA, 0x07, 0xF0, 0x87, 0xF3, 0xFF, 0xFF, - 0xD0, 0x80, 0xFF, 0xFF, 0x05, 0x03, 0x66, 0x43, 0x64, 0x46, 0x11, 0xF2, 0xBA, 0xFB, 0x63, 0x46, - 0x03, 0xF2, 0x00, 0xF4, 0x01, 0xF2, 0xFC, 0xA5, 0x00, 0x7F, 0xD4, 0x84, 0x27, 0x45, 0x3C, 0x46, - 0x1A, 0xFA, 0x22, 0x63, 0x7B, 0x60, 0xFF, 0x64, 0xA4, 0x84, 0x03, 0x2B, 0x1C, 0x63, 0x2A, 0xFA, - 0x8F, 0xB0, 0x88, 0x36, 0x02, 0xA3, 0x60, 0x40, 0xA4, 0x36, 0x14, 0x63, 0x43, 0x4C, 0x18, 0xFC, - 0x00, 0x7C, 0x22, 0xF8, 0x64, 0x41, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x3A, 0xF2, 0x63, 0x46, - 0xFF, 0xB4, 0x22, 0xFA, 0x60, 0x40, 0x00, 0x36, 0x92, 0x00, 0x2A, 0xF2, 0xFF, 0xFF, 0x0C, 0xB0, - 0x08, 0x3A, 0x8D, 0x00, 0x60, 0x40, 0x40, 0x26, 0x8A, 0x00, 0x03, 0xF2, 0x00, 0xF4, 0xA0, 0xD2, - 0xAA, 0x60, 0xAA, 0x65, 0x5A, 0xD0, 0xD4, 0x80, 0x03, 0x64, 0x0A, 0x02, 0xD0, 0x80, 0x00, 0x64, - 0x5A, 0xD0, 0x06, 0x02, 0xD0, 0x80, 0xF8, 0x7F, 0xD0, 0x80, 0x01, 0x03, 0x01, 0x02, 0x01, 0x61, - 0x62, 0x43, 0x46, 0x43, 0x3C, 0x46, 0x07, 0xF4, 0x3A, 0xF2, 0xFF, 0xFF, 0xA3, 0x46, 0x60, 0x40, - 0x22, 0x26, 0x49, 0x00, 0x60, 0x45, 0x63, 0x42, 0x5A, 0xD0, 0xCD, 0x81, 0x3C, 0x46, 0x18, 0x02, - 0x64, 0x44, 0x88, 0x3A, 0x15, 0x00, 0x8E, 0x37, 0x00, 0x00, 0x65, 0x44, 0x01, 0x26, 0x5F, 0x00, - 0x04, 0x26, 0x03, 0x00, 0x10, 0x26, 0x01, 0x00, 0x31, 0x00, 0xA3, 0x46, 0x3B, 0xF2, 0xFF, 0xFF, - 0x60, 0x40, 0x80, 0x27, 0x3E, 0x00, 0xA3, 0x46, 0x00, 0x7C, 0x22, 0xF8, 0xA3, 0x46, 0x4F, 0x00, - 0xA3, 0x46, 0x65, 0x44, 0x01, 0x26, 0x0B, 0x00, 0x04, 0x26, 0x03, 0x00, 0x10, 0x26, 0x01, 0x00, - 0x1D, 0x00, 0x3B, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x27, 0x2B, 0x00, 0x17, 0x00, 0x87, 0xF3, - 0xFF, 0xFF, 0x60, 0x46, 0x3A, 0xF2, 0x66, 0x43, 0xFF, 0xB4, 0x3C, 0x46, 0x22, 0xF0, 0x60, 0x47, - 0xB0, 0x84, 0x22, 0xFA, 0x63, 0x46, 0x3B, 0xF0, 0x60, 0x40, 0x04, 0x27, 0x03, 0x00, 0x10, 0x27, - 0x01, 0x00, 0x04, 0x00, 0x64, 0x40, 0x80, 0x27, 0x14, 0x00, 0x00, 0x00, 0x3C, 0x46, 0x02, 0x65, - 0xBE, 0x60, 0xB6, 0x78, 0xFF, 0xFF, 0xCD, 0x81, 0x63, 0x42, 0x5A, 0xD0, 0x3C, 0x46, 0x09, 0x02, - 0x64, 0x44, 0x88, 0x3A, 0x06, 0x00, 0x77, 0x37, 0x1A, 0x00, 0x78, 0x37, 0x18, 0x00, 0x8E, 0x37, - 0x16, 0x00, 0x3C, 0x46, 0x22, 0xF0, 0x80, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0xFF, 0xFF, 0x3F, 0xF2, - 0x3E, 0xF0, 0x08, 0xA4, 0x60, 0x41, 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x26, 0x03, 0x00, - 0x04, 0x26, 0x03, 0x00, 0x04, 0x00, 0x04, 0x2B, 0x02, 0x00, 0x61, 0x44, 0x3F, 0xFA, 0x3C, 0x46, - 0x2C, 0xF2, 0x27, 0x40, 0x01, 0x27, 0x32, 0xF2, 0xB4, 0xF1, 0x60, 0x40, 0x01, 0x26, 0x47, 0x00, - 0x09, 0x60, 0x00, 0x64, 0xD0, 0x80, 0x3F, 0xF2, 0x09, 0x06, 0x2C, 0x45, 0xC4, 0x84, 0xD0, 0x80, - 0x40, 0x4A, 0x34, 0x06, 0x60, 0x43, 0x64, 0x44, 0x54, 0x88, 0x17, 0x00, 0x60, 0x45, 0x13, 0x60, - 0x4B, 0xF3, 0xBB, 0xF3, 0x00, 0xBC, 0x60, 0x47, 0xEC, 0xA0, 0x28, 0x03, 0x27, 0x07, 0x2C, 0x44, - 0xC4, 0x81, 0x02, 0x60, 0x1C, 0x65, 0x45, 0x4A, 0xD5, 0x80, 0x2C, 0x45, 0x1F, 0x06, 0x27, 0x40, - 0x04, 0x27, 0x25, 0x00, 0x2A, 0x43, 0xD7, 0x85, 0x45, 0x48, 0xB5, 0xF1, 0x0F, 0xF2, 0xD3, 0x80, - 0x01, 0x65, 0x01, 0x07, 0x00, 0x65, 0xB4, 0x84, 0x0F, 0xFA, 0x00, 0x63, 0x3F, 0xF2, 0x28, 0x45, - 0x60, 0x41, 0xD4, 0x84, 0xDF, 0x83, 0xFC, 0x07, 0x14, 0xFC, 0x17, 0xFA, 0x04, 0x60, 0x00, 0x64, - 0x27, 0x45, 0xB4, 0x84, 0x2A, 0xFA, 0x28, 0x43, 0x16, 0xFC, 0x0D, 0x00, 0x3F, 0xF2, 0x2C, 0x45, - 0xB5, 0xF1, 0xC4, 0x81, 0xD1, 0x80, 0x0F, 0xF2, 0x01, 0x06, 0x01, 0xBC, 0x0F, 0xFA, 0x3F, 0xF2, - 0x17, 0xFA, 0x01, 0x64, 0x14, 0xFA, 0x0F, 0xF0, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x2A, 0x6F, 0x00, - 0x64, 0xF1, 0x15, 0x60, 0xDD, 0xF3, 0x64, 0x40, 0x01, 0x27, 0x03, 0x00, 0x60, 0x40, 0x02, 0x26, - 0x14, 0x00, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x12, 0xF0, 0x15, 0x60, 0xDE, 0xF3, 0x63, 0x46, - 0x64, 0x40, 0x10, 0x2A, 0x20, 0x00, 0x60, 0x40, 0x02, 0x26, 0x07, 0x00, 0x01, 0x26, 0x08, 0x00, - 0x04, 0x26, 0x09, 0x00, 0x06, 0x61, 0x6E, 0x63, 0x08, 0x00, 0x02, 0x61, 0x14, 0x63, 0x05, 0x00, - 0x00, 0x61, 0x0A, 0x63, 0x02, 0x00, 0x04, 0x61, 0x37, 0x63, 0x00, 0x64, 0x25, 0x60, 0xA2, 0x65, - 0x45, 0xD1, 0xD5, 0x81, 0x15, 0x60, 0xDA, 0xF9, 0x25, 0x60, 0x7A, 0x65, 0x45, 0xD1, 0x1C, 0xFC, - 0xB0, 0x84, 0x1E, 0xFA, 0x3C, 0x00, 0x60, 0x40, 0x10, 0x2A, 0x04, 0x00, 0x08, 0x61, 0x1E, 0x60, - 0x0B, 0x63, 0x27, 0x00, 0x20, 0x2A, 0x04, 0x00, 0x0A, 0x61, 0x16, 0x60, 0x0F, 0x63, 0x21, 0x00, - 0x40, 0x2A, 0x04, 0x00, 0x0C, 0x61, 0x12, 0x60, 0x0A, 0x63, 0x1B, 0x00, 0x80, 0x2A, 0x04, 0x00, - 0x0E, 0x61, 0x0E, 0x60, 0x0E, 0x63, 0x15, 0x00, 0x01, 0x2B, 0x04, 0x00, 0x10, 0x61, 0x0E, 0x60, - 0x09, 0x63, 0x0F, 0x00, 0x02, 0x2B, 0x04, 0x00, 0x12, 0x61, 0x0A, 0x60, 0x0D, 0x63, 0x09, 0x00, - 0x04, 0x2B, 0x04, 0x00, 0x14, 0x61, 0x0A, 0x60, 0x08, 0x63, 0x03, 0x00, 0x16, 0x61, 0x0A, 0x60, - 0x0C, 0x63, 0x1E, 0xF0, 0x40, 0x67, 0x25, 0x60, 0xA2, 0x65, 0x45, 0xD1, 0xD5, 0x81, 0x15, 0x60, - 0xDA, 0xF9, 0x25, 0x60, 0x7A, 0x65, 0x45, 0xD1, 0x1C, 0xFC, 0xB0, 0x84, 0x1E, 0xFA, 0xAA, 0xF2, - 0x15, 0x60, 0xC2, 0xF3, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x44, 0x44, 0x61, 0x40, 0x08, 0x26, - 0x02, 0x00, 0x61, 0x40, 0x80, 0x36, 0x12, 0xF2, 0x63, 0x46, 0x2C, 0x60, 0x26, 0x61, 0x00, 0x7F, - 0x60, 0x45, 0x45, 0xD3, 0xFF, 0xFF, 0x60, 0x45, 0x00, 0x7F, 0x4B, 0xFB, 0x65, 0x44, 0x00, 0x7E, - 0xBB, 0xFB, 0x62, 0xF1, 0x60, 0x43, 0x60, 0x47, 0xD0, 0x80, 0xC0, 0x65, 0x01, 0x06, 0x64, 0x44, - 0x0A, 0x36, 0x70, 0x64, 0x14, 0x36, 0x38, 0x64, 0x37, 0x36, 0x15, 0x64, 0x6E, 0x36, 0x0B, 0x64, - 0x44, 0x86, 0x2A, 0xF2, 0x07, 0xF0, 0x60, 0x40, 0xB0, 0x3A, 0x03, 0x00, 0x40, 0x3B, 0x01, 0x00, - 0x12, 0x00, 0x0C, 0xB4, 0x08, 0x3A, 0x44, 0x00, 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x2B, - 0x3F, 0x00, 0x17, 0xF2, 0x22, 0xF0, 0xFF, 0xFF, 0x64, 0x40, 0x22, 0x22, 0x04, 0x00, 0x00, 0xA8, - 0x01, 0xA8, 0x36, 0x03, 0x35, 0x03, 0x3C, 0x46, 0x2A, 0xF0, 0x40, 0x67, 0xB0, 0x84, 0xA2, 0xDA, - 0x60, 0x45, 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x43, 0x60, 0x40, 0x01, 0x26, 0x05, 0x00, 0x04, 0x26, - 0x1D, 0x00, 0x10, 0x26, 0x10, 0x00, 0x04, 0x00, 0x04, 0x27, 0x18, 0x00, 0x10, 0x27, 0x0B, 0x00, - 0x65, 0x44, 0x2A, 0x61, 0x60, 0x40, 0x03, 0x2B, 0x24, 0x61, 0x8F, 0xB0, 0x88, 0x36, 0x02, 0xA1, - 0x41, 0x4C, 0x98, 0xFA, 0x15, 0x00, 0x65, 0x44, 0x32, 0x61, 0x60, 0x40, 0x03, 0x2B, 0x2C, 0x61, - 0x8F, 0xB0, 0x88, 0x36, 0x02, 0xA1, 0x41, 0x4C, 0x98, 0xFA, 0x0A, 0x00, 0x65, 0x44, 0x2E, 0x61, - 0x60, 0x40, 0x03, 0x2B, 0x28, 0x61, 0x8F, 0xB0, 0x88, 0x36, 0x02, 0xA1, 0x41, 0x4C, 0x98, 0xFA, - 0xBB, 0x60, 0xFB, 0x78, 0xFF, 0xFF, 0x66, 0x45, 0xAA, 0xF2, 0x15, 0x60, 0xC2, 0xF3, 0x24, 0x46, - 0x61, 0x40, 0x08, 0x26, 0x02, 0x00, 0x61, 0x40, 0x80, 0x36, 0x12, 0xF2, 0x65, 0x46, 0x60, 0x40, - 0x10, 0x26, 0x34, 0x00, 0x2C, 0x45, 0x17, 0xF2, 0x4B, 0xF1, 0xC4, 0x84, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x81, 0x64, 0x45, 0x16, 0xA1, 0xB7, 0x60, 0x58, 0x4D, 0xC0, 0x78, 0xFF, 0xFF, 0x64, 0xF1, - 0x01, 0xA4, 0xE0, 0x84, 0xE0, 0x84, 0x64, 0x40, 0x01, 0x2B, 0x06, 0xA4, 0x1B, 0xFA, 0xBB, 0xF3, - 0x25, 0x60, 0x82, 0x65, 0x60, 0x40, 0x0B, 0x37, 0x00, 0x63, 0x0F, 0x37, 0x02, 0x63, 0x0A, 0x37, - 0x04, 0x63, 0x0E, 0x37, 0x06, 0x63, 0x09, 0x37, 0x08, 0x63, 0x0D, 0x37, 0x0A, 0x63, 0x08, 0x37, - 0x0C, 0x63, 0x0C, 0x37, 0x0E, 0x63, 0x28, 0xA3, 0x47, 0xD1, 0xD8, 0xA3, 0xD7, 0x83, 0x15, 0x60, - 0xD9, 0xF9, 0x47, 0xD1, 0x40, 0x67, 0xB0, 0x84, 0x1F, 0xFA, 0x56, 0x00, 0x2A, 0xF2, 0xFF, 0xFF, - 0x60, 0x40, 0x80, 0x36, 0x17, 0x00, 0x50, 0x36, 0x15, 0x00, 0x10, 0x36, 0x13, 0x00, 0x30, 0x36, - 0x11, 0x00, 0xA0, 0x36, 0x0F, 0x00, 0xB0, 0x36, 0x0D, 0x00, 0xC0, 0x36, 0x0B, 0x00, 0xBB, 0xF3, - 0xFF, 0xFF, 0x60, 0x40, 0x0A, 0x37, 0x06, 0x00, 0x15, 0x60, 0xDD, 0xF3, 0x80, 0x60, 0x00, 0x61, - 0x60, 0x40, 0x04, 0x26, 0x00, 0x61, 0xBB, 0xF3, 0x25, 0x60, 0x7A, 0x65, 0x60, 0x40, 0x0A, 0x37, - 0x00, 0x63, 0x14, 0x37, 0x02, 0x63, 0x37, 0x37, 0x04, 0x63, 0x6E, 0x37, 0x06, 0x63, 0x28, 0xA3, - 0x47, 0xD1, 0xD8, 0xA3, 0xD7, 0x83, 0x15, 0x60, 0xD9, 0xF9, 0x47, 0xD1, 0xFF, 0xFF, 0xB1, 0x84, - 0x1F, 0xFA, 0xBB, 0xF1, 0x2C, 0x45, 0x64, 0x43, 0x17, 0xF2, 0x4B, 0xF1, 0xC4, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0xE0, 0x81, 0x63, 0x40, 0x37, 0x37, 0xE1, 0x81, 0x64, 0x45, 0xB7, 0x60, 0x58, 0x4D, - 0xC0, 0x78, 0xFF, 0xFF, 0xAE, 0x82, 0xFC, 0xA2, 0x0A, 0x03, 0x63, 0x40, 0x6E, 0x3B, 0x06, 0x00, - 0x60, 0x41, 0x04, 0x0D, 0x63, 0x44, 0x80, 0x7E, 0xBB, 0xFB, 0x61, 0x44, 0xDC, 0x84, 0x2B, 0xF0, - 0x1B, 0xFA, 0x64, 0x44, 0x80, 0x27, 0x47, 0x00, 0x07, 0xF0, 0x66, 0x45, 0x64, 0x46, 0x12, 0xF2, - 0x65, 0x46, 0x60, 0x40, 0x10, 0x2A, 0x2E, 0x00, 0x16, 0xF2, 0x0F, 0xF0, 0xAC, 0x84, 0x2C, 0x45, - 0x29, 0x03, 0x4B, 0xF1, 0xC4, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x81, 0x63, 0x40, 0x37, 0x37, - 0xE1, 0x81, 0x64, 0x45, 0x0F, 0xF0, 0xB7, 0x60, 0x58, 0x4D, 0xC0, 0x78, 0xFF, 0xFF, 0xAE, 0x82, - 0xFC, 0xA2, 0x0A, 0x03, 0x63, 0x40, 0x6E, 0x3B, 0x06, 0x00, 0x60, 0x41, 0x04, 0x0D, 0x80, 0x67, - 0xB0, 0x84, 0x0F, 0xFA, 0x61, 0x44, 0xDC, 0x84, 0x1D, 0xFA, 0xDE, 0x65, 0xC4, 0x85, 0x26, 0x41, - 0xE1, 0x81, 0xC5, 0x84, 0x2B, 0xFA, 0x1B, 0xF0, 0xDE, 0x64, 0xC0, 0x85, 0x26, 0x44, 0xE0, 0x84, - 0xC4, 0x84, 0x10, 0xFA, 0x26, 0x44, 0x2C, 0xF0, 0x0A, 0xA4, 0x66, 0x45, 0x24, 0x46, 0x92, 0xF2, - 0x65, 0x46, 0x9F, 0xF0, 0x61, 0x40, 0x10, 0x2A, 0x03, 0x00, 0x65, 0x40, 0x80, 0x27, 0xA0, 0xA4, - 0x64, 0x40, 0x01, 0x26, 0x00, 0x64, 0x11, 0xFA, 0xBB, 0xF3, 0x13, 0xFA, 0x7C, 0x44, 0x1D, 0xFA, - 0xFF, 0xFF, 0x0D, 0xF2, 0x3E, 0xF0, 0x60, 0x47, 0xFF, 0xB4, 0x64, 0x41, 0x01, 0xB1, 0x01, 0x63, - 0x17, 0x02, 0x60, 0x41, 0xFF, 0x22, 0x04, 0x00, 0xB7, 0x60, 0x58, 0x4F, 0xB1, 0x78, 0xFF, 0xFF, - 0x07, 0x60, 0xF7, 0xFD, 0x16, 0x60, 0x2B, 0xF3, 0xFF, 0xFF, 0x60, 0x41, 0x01, 0x63, 0x61, 0x40, - 0xFF, 0x22, 0x04, 0x00, 0xB7, 0x60, 0x58, 0x4F, 0xB1, 0x78, 0xFF, 0xFF, 0x07, 0x60, 0xF8, 0xFD, - 0xBD, 0x60, 0x7A, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x27, 0x03, 0x00, - 0xBD, 0x60, 0x75, 0x78, 0xFF, 0xFF, 0x22, 0xF2, 0x46, 0x43, 0x60, 0x40, 0x22, 0x26, 0x09, 0x00, - 0x01, 0x26, 0x0A, 0x00, 0x04, 0x26, 0x4B, 0x00, 0x10, 0x26, 0x10, 0x00, 0xBD, 0x60, 0x75, 0x78, - 0xFF, 0xFF, 0xBC, 0x60, 0xF0, 0x78, 0xFF, 0xFF, 0x04, 0x27, 0x3D, 0x00, 0x10, 0x27, 0x03, 0x00, - 0xBD, 0x60, 0x75, 0x78, 0xFF, 0xFF, 0x87, 0xF3, 0x3C, 0xF1, 0x02, 0x00, 0x07, 0xF2, 0x00, 0x7C, - 0x40, 0x43, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x27, 0x21, 0x00, 0xA3, 0x46, 0x4B, 0xF2, - 0xFF, 0xFF, 0xDC, 0x84, 0x4B, 0xFA, 0x4A, 0xF2, 0x08, 0x04, 0xDC, 0x84, 0x4A, 0xFA, 0x49, 0xF2, - 0x04, 0x04, 0xDC, 0x84, 0x49, 0xFA, 0x01, 0x04, 0xFF, 0xFF, 0x87, 0xF3, 0x66, 0x5C, 0xD0, 0x80, - 0x00, 0x7C, 0x01, 0x02, 0x3C, 0xF1, 0x4B, 0xF0, 0x64, 0x47, 0x20, 0xBF, 0xA3, 0x46, 0x3A, 0xF8, - 0x3B, 0xFA, 0xA3, 0x46, 0x4A, 0xF2, 0x49, 0xF0, 0xA3, 0x46, 0x3C, 0xFA, 0x3D, 0xF8, 0x0F, 0x60, - 0xA0, 0x64, 0xA3, 0x46, 0x76, 0x61, 0x0E, 0x63, 0x59, 0xD0, 0x58, 0xD9, 0xFD, 0x1F, 0xA3, 0x46, - 0xBD, 0x60, 0x75, 0x78, 0xFF, 0xFF, 0x87, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0x02, 0x00, 0x07, 0xF4, - 0xFF, 0xFF, 0xA3, 0x46, 0x2A, 0xF2, 0xA3, 0x46, 0x60, 0x40, 0x08, 0x27, 0x48, 0x00, 0x87, 0xF3, - 0x66, 0x5C, 0xD0, 0x80, 0x3B, 0xF0, 0x08, 0x03, 0x64, 0x40, 0x10, 0x2A, 0x12, 0x00, 0xFF, 0x60, - 0xEF, 0x64, 0xA0, 0x84, 0x3B, 0xFA, 0x24, 0x00, 0x3D, 0xF3, 0x01, 0x61, 0x60, 0x43, 0xCF, 0x83, - 0xE1, 0x81, 0xFD, 0x0D, 0xE9, 0x81, 0xA1, 0x80, 0xFF, 0xFF, 0x03, 0x03, 0x91, 0x84, 0x3B, 0xFA, - 0x17, 0x00, 0x4B, 0xF2, 0xFF, 0xFF, 0x10, 0xA0, 0xFF, 0xFF, 0x02, 0x04, 0xFF, 0x60, 0xFF, 0x64, - 0xDC, 0x84, 0x4B, 0xFA, 0x4A, 0xF2, 0x16, 0x04, 0xDC, 0x84, 0x4A, 0xFA, 0x49, 0xF2, 0x08, 0x04, - 0xDC, 0x84, 0x49, 0xFA, 0x05, 0x04, 0x3B, 0xF2, 0xFF, 0xFF, 0xE0, 0x84, 0xE8, 0x84, 0x3B, 0xFA, - 0x0C, 0x60, 0xFE, 0x62, 0x80, 0xFF, 0x78, 0x44, 0x03, 0xA4, 0xA2, 0xDB, 0xC7, 0x60, 0xCF, 0x78, - 0xFF, 0xFF, 0x84, 0xFF, 0x06, 0x60, 0x17, 0xE1, 0x77, 0x40, 0x8B, 0xFF, 0x02, 0x60, 0x00, 0x75, - 0xC9, 0x60, 0x58, 0x4F, 0x67, 0x78, 0xFF, 0xFF, 0x01, 0x64, 0x06, 0x60, 0x80, 0xFB, 0x0C, 0x60, - 0xFE, 0x62, 0x80, 0xFF, 0x78, 0x44, 0x03, 0xA4, 0xA2, 0xDB, 0xC8, 0x60, 0x46, 0x78, 0xFF, 0xFF, - 0x84, 0xFF, 0x00, 0x7C, 0x06, 0x60, 0x80, 0xF3, 0xA2, 0xD9, 0x60, 0x40, 0x01, 0x2A, 0x04, 0x00, - 0xC9, 0x60, 0x58, 0x4F, 0xAF, 0x78, 0xFF, 0xFF, 0x3C, 0x46, 0x07, 0xF4, 0x87, 0xF3, 0x66, 0x5C, - 0xD0, 0x80, 0x00, 0x7C, 0x07, 0x03, 0x66, 0x43, 0x3C, 0x46, 0x22, 0xF2, 0x63, 0x46, 0x60, 0x40, - 0x01, 0x2A, 0x01, 0x00, 0x3C, 0xF1, 0x4B, 0xF0, 0x64, 0x41, 0x64, 0x47, 0xFF, 0xB4, 0x60, 0x5F, - 0x20, 0xBC, 0x80, 0x26, 0x80, 0xAC, 0x60, 0x47, 0xA3, 0x46, 0x3A, 0xFA, 0x64, 0x44, 0x20, 0x7F, - 0x34, 0x94, 0x3B, 0xFA, 0xA3, 0x46, 0x4A, 0xF2, 0x49, 0xF0, 0xA3, 0x46, 0x3C, 0xFA, 0x3D, 0xF8, - 0x80, 0x60, 0x10, 0xE0, 0x08, 0x60, 0x00, 0xEA, 0x0F, 0x64, 0x60, 0x7F, 0xA0, 0x5A, 0x80, 0x60, - 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0xBD, 0x60, 0x75, 0x78, 0xFF, 0xFF, - 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x27, 0x31, 0x00, 0x2A, 0xF2, 0x00, 0x60, 0x7C, 0x62, - 0x60, 0x40, 0x40, 0x2B, 0x24, 0x00, 0xA2, 0xD3, 0x00, 0x61, 0x60, 0xFE, 0xA0, 0xD3, 0x5E, 0xD1, - 0xFF, 0xFF, 0x20, 0xFE, 0x64, 0x5F, 0xDC, 0x84, 0xF1, 0x81, 0xC0, 0x2B, 0x04, 0x00, 0x80, 0x2A, - 0x02, 0x00, 0x7F, 0xA4, 0xDC, 0x84, 0xFF, 0x3B, 0x03, 0x00, 0x60, 0x47, 0xDC, 0x87, 0x01, 0x61, - 0xC0, 0x80, 0x00, 0x36, 0xDC, 0x84, 0x4E, 0xDB, 0x60, 0xFE, 0x5A, 0xD1, 0xFF, 0xFF, 0xC1, 0x84, - 0xF0, 0x22, 0x10, 0xA4, 0xF0, 0x2A, 0x01, 0x00, 0x00, 0x64, 0xA2, 0xDB, 0x20, 0xFE, 0x00, 0x60, - 0x3E, 0xF3, 0xFF, 0xFF, 0xA0, 0xD3, 0x5A, 0xD1, 0x3A, 0xFA, 0x3B, 0xF8, 0x74, 0x62, 0xA2, 0xD0, - 0xFF, 0xFF, 0x64, 0x44, 0xE0, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xE1, 0x7F, 0x5A, 0xD0, 0xA0, 0x5A, - 0x64, 0x44, 0xE2, 0x7F, 0xA0, 0x5A, 0x00, 0x60, 0x40, 0xF3, 0xFF, 0xFF, 0xA0, 0xD1, 0x5A, 0xD1, - 0x64, 0x45, 0x64, 0x44, 0xE3, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xE4, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, - 0x64, 0x44, 0xE5, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xE6, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, - 0xE7, 0x7F, 0xA0, 0x5A, 0x65, 0x40, 0x0D, 0x3A, 0x1C, 0x00, 0x64, 0x47, 0xE8, 0x7F, 0x5A, 0xD1, - 0xA0, 0x5A, 0x64, 0x44, 0xE9, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xEA, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, - 0x64, 0x44, 0xEB, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xEC, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, - 0xED, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xEE, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xEF, 0x7F, - 0xA0, 0x5A, 0x08, 0x60, 0x00, 0xEA, 0x65, 0x44, 0x02, 0xA4, 0x60, 0x7F, 0xA0, 0x5A, 0x80, 0x60, - 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0x02, 0x64, 0x3B, 0xDB, 0xBA, 0x60, - 0xF3, 0x78, 0xFF, 0xFF, 0xBF, 0x60, 0xBB, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0xFC, 0xFB, 0x07, 0xF0, - 0x00, 0x64, 0xD0, 0x80, 0x87, 0xF3, 0x0E, 0x03, 0xD0, 0x80, 0xFF, 0xFF, 0x0B, 0x03, 0x47, 0xF1, - 0x07, 0xF0, 0x64, 0x40, 0x02, 0x26, 0x01, 0x00, 0x08, 0x00, 0x03, 0x12, 0xBE, 0x60, 0x46, 0x78, - 0xFF, 0xFF, 0xFC, 0x0A, 0xBE, 0x60, 0xA6, 0x78, 0xFF, 0xFF, 0x87, 0xF0, 0x87, 0xF3, 0x10, 0xF0, - 0xD4, 0x80, 0xFF, 0xFF, 0x3D, 0x03, 0x66, 0x43, 0x65, 0x46, 0xFF, 0x67, 0x20, 0x85, 0x64, 0x5F, - 0x40, 0x44, 0x15, 0xF0, 0x25, 0x44, 0xD0, 0x84, 0x03, 0xA4, 0x03, 0x0E, 0xE8, 0x84, 0xE8, 0x84, - 0x04, 0x00, 0xFA, 0xA4, 0xE8, 0x84, 0xE8, 0x87, 0xC0, 0xBF, 0xC0, 0x84, 0x15, 0xFA, 0x40, 0x45, - 0x14, 0xF0, 0x24, 0x44, 0xD0, 0x84, 0x1F, 0xA4, 0x06, 0x0E, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, - 0xE8, 0x84, 0xE8, 0x84, 0x07, 0x00, 0xC2, 0xA4, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, - 0xE8, 0x87, 0xF8, 0xBF, 0xC0, 0x84, 0x14, 0xFA, 0x60, 0x5C, 0x2F, 0x67, 0xD0, 0x80, 0x60, 0x45, - 0x02, 0x28, 0x64, 0x45, 0x25, 0x5C, 0x8B, 0x67, 0xD0, 0x80, 0x60, 0x41, 0x02, 0x24, 0x64, 0x41, - 0xD5, 0x84, 0x80, 0x65, 0xC4, 0x87, 0x01, 0x05, 0x00, 0x64, 0xFF, 0xB4, 0x0E, 0xFA, 0x63, 0x46, - 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x17, 0xF2, 0x63, 0x46, 0x60, 0x40, 0x00, 0x36, 0x2E, 0x00, - 0x01, 0x36, 0x1E, 0x00, 0x03, 0x3A, 0x25, 0x00, 0x64, 0x46, 0x10, 0xF2, 0x11, 0xFA, 0x12, 0xF2, - 0x00, 0x61, 0x60, 0x47, 0x00, 0x7F, 0x12, 0xFA, 0x97, 0xFA, 0x46, 0x44, 0x63, 0x46, 0xC1, 0x60, - 0x58, 0x4E, 0x72, 0x78, 0xFF, 0xFF, 0x65, 0x40, 0x00, 0x3A, 0x04, 0x00, 0xC1, 0x60, 0x58, 0x4E, - 0xBC, 0x78, 0xFF, 0xFF, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x96, 0xFC, 0x63, 0x46, 0x43, 0x00, - 0x64, 0x46, 0x16, 0xF2, 0x00, 0x61, 0x20, 0x28, 0xFF, 0xA4, 0x97, 0xFA, 0x16, 0xFA, 0x63, 0x46, - 0x3A, 0x00, 0x64, 0x46, 0x00, 0x61, 0x97, 0xFA, 0x63, 0x46, 0x35, 0x00, 0x07, 0xF0, 0x66, 0x41, - 0x64, 0x46, 0x16, 0xF2, 0xFF, 0xFF, 0x20, 0x28, 0xFF, 0xA4, 0x16, 0xFA, 0x93, 0xF4, 0x12, 0xF2, - 0x20, 0x28, 0xFF, 0xA3, 0x13, 0xFC, 0x61, 0x46, 0x63, 0x40, 0x00, 0x3A, 0x24, 0x00, 0xC1, 0x60, - 0x58, 0x4E, 0x93, 0x78, 0xFF, 0xFF, 0x61, 0x40, 0xFF, 0x36, 0x1D, 0x00, 0x66, 0x41, 0x64, 0x46, - 0x12, 0xF2, 0x93, 0xF4, 0x61, 0x46, 0x20, 0x28, 0x16, 0x00, 0x44, 0x44, 0xC1, 0x60, 0x58, 0x4E, - 0x72, 0x78, 0xFF, 0xFF, 0x24, 0x5C, 0x65, 0x40, 0x00, 0x36, 0x06, 0x00, 0x66, 0x41, 0x64, 0x46, - 0x01, 0x64, 0x17, 0xFA, 0x61, 0x46, 0x07, 0x00, 0x66, 0x43, 0x64, 0x46, 0xC1, 0x60, 0x58, 0x4E, - 0xBC, 0x78, 0xFF, 0xFF, 0x63, 0x46, 0xBE, 0x60, 0xA6, 0x78, 0xFF, 0xFF, 0x07, 0xF0, 0x66, 0x43, - 0x64, 0x46, 0x17, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0xFF, 0x27, 0xFF, 0xFF, 0x00, 0x36, 0x07, 0x00, - 0x01, 0x36, 0x1C, 0x00, 0x02, 0x36, 0x24, 0x00, 0x03, 0x36, 0x43, 0x00, 0xFF, 0xFF, 0x15, 0x60, - 0xF9, 0xF1, 0x16, 0xF2, 0x43, 0x44, 0xD0, 0x80, 0x2C, 0x60, 0x24, 0x61, 0x09, 0x03, 0xA1, 0xD1, - 0x2C, 0x60, 0x22, 0x63, 0xC0, 0x84, 0x16, 0xFA, 0xA3, 0xD3, 0xFF, 0xFF, 0x13, 0xFA, 0x39, 0x00, - 0x96, 0xFC, 0xC1, 0x60, 0x58, 0x4E, 0xBC, 0x78, 0xFF, 0xFF, 0x33, 0x00, 0x43, 0x44, 0xC1, 0x60, - 0x58, 0x4E, 0xBC, 0x78, 0xFF, 0xFF, 0x16, 0x60, 0x11, 0xF3, 0x96, 0xFC, 0x13, 0xFA, 0x29, 0x00, - 0x63, 0x46, 0x2B, 0x60, 0xF4, 0x63, 0xA3, 0xD3, 0x15, 0xF2, 0x60, 0x45, 0xD4, 0x80, 0x07, 0xF0, - 0x0C, 0x03, 0x66, 0x41, 0x44, 0x44, 0x64, 0x46, 0x12, 0xF2, 0x61, 0x46, 0xC1, 0x60, 0x58, 0x4E, - 0x72, 0x78, 0xFF, 0xFF, 0x65, 0x40, 0x00, 0x3A, 0x19, 0x00, 0x66, 0x43, 0x24, 0x46, 0xC1, 0x60, - 0x58, 0x4E, 0xBC, 0x78, 0xFF, 0xFF, 0x12, 0xF2, 0x91, 0xF2, 0x90, 0xFA, 0x60, 0x5F, 0x12, 0xFA, - 0x04, 0x00, 0xC1, 0x60, 0x58, 0x4E, 0xBC, 0x78, 0xFF, 0xFF, 0x03, 0x64, 0x17, 0xFA, 0x63, 0x46, - 0x05, 0x00, 0x24, 0x43, 0x02, 0x64, 0x17, 0xFA, 0x63, 0x46, 0x00, 0x00, 0x03, 0x64, 0x3B, 0xDB, - 0xCA, 0xFE, 0x47, 0xF1, 0x01, 0x65, 0x32, 0x40, 0x04, 0x27, 0x08, 0x00, 0x2C, 0xF2, 0x64, 0x45, - 0x02, 0x22, 0x04, 0x00, 0x60, 0x40, 0x01, 0x26, 0x01, 0x00, 0x7B, 0x00, 0x14, 0xF2, 0x65, 0x40, - 0x01, 0x26, 0x0C, 0x00, 0x60, 0x45, 0x05, 0x64, 0x3B, 0xDB, 0x65, 0x44, 0xCC, 0x85, 0x25, 0x60, - 0xD6, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xD3, 0x78, 0x97, 0xF1, 0x50, 0x00, 0x60, 0x41, 0x2A, 0xF0, - 0x00, 0x60, 0x0C, 0x64, 0xA0, 0x84, 0x04, 0x36, 0x02, 0x00, 0x0C, 0x3A, 0x01, 0x00, 0x46, 0x00, - 0x61, 0x45, 0x60, 0x43, 0x25, 0x60, 0xD6, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xD3, 0x78, 0x97, 0xF1, - 0x63, 0x40, 0x08, 0x36, 0x01, 0x00, 0x3A, 0x00, 0x14, 0xF2, 0x1C, 0x65, 0x60, 0x41, 0x00, 0x63, - 0xCD, 0x81, 0xC7, 0x83, 0xFD, 0x02, 0x3F, 0xF0, 0x2C, 0xF2, 0xC3, 0x83, 0x60, 0x40, 0x01, 0x2A, - 0x0D, 0x00, 0x25, 0x60, 0xD4, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, 0x25, 0x60, - 0xDA, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xD2, 0x78, 0x63, 0x45, 0x20, 0x00, 0x25, 0x60, 0xD2, 0x64, - 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, 0x25, 0x60, 0xD8, 0x64, 0xE5, 0x60, 0x78, 0x41, - 0xD2, 0x78, 0x63, 0x45, 0x15, 0xF2, 0xFF, 0xFF, 0x0F, 0xB4, 0x00, 0xA8, 0x01, 0xA8, 0x0E, 0x03, - 0x07, 0x03, 0x25, 0x60, 0xE0, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, 0x06, 0x00, - 0x25, 0x60, 0xDE, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, 0x04, 0x64, 0x3B, 0xDB, - 0x07, 0xF0, 0x66, 0x41, 0x64, 0x46, 0x06, 0xF0, 0xFF, 0x60, 0x5F, 0x64, 0xA0, 0x84, 0x06, 0xFA, - 0x61, 0x46, 0x1E, 0x60, 0xF2, 0x64, 0x0F, 0x60, 0x8D, 0xFB, 0x3C, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x5C, 0x5C, 0xFC, 0xFC, 0xCE, 0xFE, 0xB7, 0x60, 0xE2, 0x78, - 0xFF, 0xFF, 0x13, 0x60, 0x2E, 0xF3, 0x07, 0xF4, 0x06, 0xF2, 0x02, 0xA8, 0x3C, 0x46, 0x10, 0x03, - 0x10, 0xB0, 0x2A, 0xF2, 0x0D, 0x03, 0x0E, 0xF2, 0x0C, 0xB0, 0x60, 0x40, 0xF0, 0x37, 0x20, 0xBC, - 0x02, 0x03, 0xFE, 0x7F, 0x0E, 0xFA, 0x23, 0xF0, 0x10, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0xCE, 0x01, - 0x2A, 0xF2, 0xFF, 0xFF, 0x50, 0xA8, 0x02, 0x7C, 0x10, 0x03, 0x0F, 0xF0, 0x15, 0xF2, 0x64, 0x41, - 0x01, 0x2A, 0x02, 0x00, 0xAF, 0xF1, 0x09, 0x00, 0x03, 0x65, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, - 0x06, 0xF0, 0x63, 0x46, 0xAE, 0xF1, 0x64, 0x40, 0x10, 0x2A, 0x64, 0x45, 0xDC, 0x84, 0xD4, 0x80, - 0x15, 0xFA, 0x38, 0x07, 0x61, 0x40, 0x01, 0x2A, 0x08, 0x00, 0x13, 0x60, 0x03, 0xF3, 0xFF, 0xFF, - 0xDC, 0x84, 0x00, 0x36, 0x00, 0x3B, 0xA2, 0xDB, 0x07, 0x00, 0x13, 0x60, 0x04, 0xF3, 0xFF, 0xFF, - 0xDC, 0x84, 0x00, 0x36, 0x00, 0x3B, 0xA2, 0xDB, 0x2A, 0xF0, 0x08, 0x67, 0xB0, 0x84, 0xA2, 0xDA, - 0x08, 0xF0, 0x1E, 0x60, 0xD4, 0x64, 0xD0, 0x80, 0x07, 0xF2, 0x46, 0x43, 0x87, 0xF1, 0x06, 0x03, - 0x60, 0x46, 0x86, 0xF4, 0xD0, 0x80, 0x80, 0xBB, 0x01, 0x03, 0x06, 0xFC, 0x23, 0x46, 0x3E, 0xF2, - 0x00, 0x63, 0x01, 0xB0, 0x43, 0x5C, 0xFC, 0xFC, 0x0A, 0x03, 0x1E, 0x60, 0xEC, 0x64, 0x0F, 0x60, - 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xB7, 0x60, - 0xE2, 0x78, 0xFF, 0xFF, 0x00, 0x64, 0x49, 0xFB, 0x25, 0x60, 0xE0, 0x64, 0xE5, 0x60, 0x78, 0x41, - 0xC7, 0x78, 0x97, 0xF1, 0x25, 0x60, 0xE2, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, - 0x27, 0x44, 0xF7, 0xB4, 0x40, 0x47, 0x23, 0xF0, 0x01, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0x07, 0xF0, - 0x66, 0x41, 0x64, 0x46, 0x06, 0xF2, 0x7F, 0x65, 0xA4, 0x9E, 0x06, 0xFA, 0x61, 0x46, 0x5E, 0x01, - 0xC0, 0x60, 0x35, 0x78, 0xFF, 0xFF, 0x21, 0x64, 0x3B, 0xDB, 0x31, 0xF3, 0x01, 0x63, 0xC4, 0xB4, - 0x31, 0xFB, 0x32, 0xFD, 0xBF, 0x60, 0xEB, 0x62, 0x42, 0x40, 0xA0, 0x4C, 0x40, 0xBC, 0x7D, 0xB4, - 0xA0, 0x51, 0xA0, 0xFE, 0x1A, 0xFF, 0x1E, 0x60, 0xE6, 0x64, 0x08, 0xF0, 0x07, 0xF0, 0xD0, 0x80, - 0x1E, 0x60, 0xEC, 0x62, 0x13, 0x02, 0xA2, 0xD3, 0x01, 0x63, 0xAC, 0x86, 0x07, 0xF2, 0x0E, 0x03, - 0xD0, 0x80, 0x09, 0xF2, 0xFA, 0x02, 0x23, 0xFC, 0x1E, 0x60, 0xF2, 0x64, 0x0F, 0x60, 0x8D, 0xFB, - 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x3C, 0x46, 0x06, 0x64, - 0xA1, 0xFF, 0x49, 0xFB, 0x83, 0x3E, 0x31, 0xF3, 0x87, 0x60, 0x80, 0x61, 0x1D, 0xF0, 0x60, 0x40, - 0x01, 0x2A, 0x0F, 0x00, 0xFE, 0xB4, 0x31, 0xFB, 0x00, 0x64, 0x49, 0xFB, 0x01, 0x64, 0x47, 0xFB, - 0x00, 0x71, 0x05, 0x64, 0x64, 0x5F, 0x0D, 0xFA, 0x40, 0x64, 0x3B, 0xDB, 0xC0, 0x60, 0x35, 0x78, - 0xFF, 0xFF, 0x02, 0x2A, 0x17, 0x00, 0xD1, 0x91, 0x8D, 0xE2, 0x41, 0x64, 0x3B, 0xDB, 0x31, 0xF3, - 0x2C, 0x60, 0x5E, 0x63, 0xFD, 0xB4, 0x31, 0xFB, 0xA3, 0xD3, 0x02, 0x63, 0x60, 0x5C, 0x0D, 0xF2, - 0x47, 0xFD, 0xFF, 0xB5, 0x60, 0x47, 0xD0, 0x80, 0xDC, 0x84, 0x1F, 0x03, 0x60, 0x47, 0xB4, 0x84, - 0x0D, 0xFA, 0x1B, 0x00, 0x08, 0x2A, 0x07, 0x00, 0x42, 0x64, 0x3B, 0xDB, 0x31, 0xF3, 0xFF, 0xFF, - 0xF7, 0xB4, 0x31, 0xFB, 0x12, 0x00, 0x10, 0x2A, 0x09, 0x00, 0x43, 0x64, 0x3B, 0xDB, 0x31, 0xF3, - 0xFF, 0xFF, 0xEF, 0xB4, 0x31, 0xFB, 0xBF, 0x60, 0xBB, 0x78, 0xFF, 0xFF, 0x44, 0x64, 0x3B, 0xDB, - 0x31, 0xF3, 0xFF, 0xFF, 0xDF, 0xB4, 0x31, 0xFB, 0x00, 0x00, 0x2A, 0x64, 0x3B, 0xDB, 0xB7, 0x60, - 0xA2, 0x64, 0x40, 0x40, 0xBD, 0x60, 0x7D, 0x78, 0xFF, 0xFF, 0x0A, 0x60, 0x80, 0xF3, 0xFF, 0xFF, - 0x02, 0xB5, 0x04, 0xB5, 0x04, 0x03, 0x03, 0x03, 0xC0, 0x60, 0xB8, 0x78, 0xFF, 0xFF, 0xF0, 0x60, - 0x58, 0x4E, 0x74, 0x78, 0xFF, 0xFF, 0x31, 0x40, 0x01, 0x2A, 0x28, 0x00, 0x9D, 0xFE, 0x26, 0x04, - 0x25, 0x0A, 0x9F, 0xFE, 0x23, 0x05, 0x85, 0xFF, 0x20, 0x44, 0x84, 0xFF, 0x40, 0x26, 0x1E, 0x00, - 0x3F, 0x40, 0x20, 0x2B, 0x1B, 0x00, 0x38, 0x69, 0xFF, 0xFF, 0x68, 0x44, 0x01, 0x16, 0xFD, 0x01, - 0x01, 0x2A, 0x14, 0x00, 0x13, 0x60, 0x09, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, 0x00, 0x36, 0x00, 0x3B, - 0xA2, 0xDB, 0x64, 0xF1, 0x02, 0x60, 0xEE, 0x64, 0x81, 0xFB, 0xFF, 0xFF, 0x80, 0x60, 0x00, 0x64, - 0xB0, 0x84, 0x82, 0xFB, 0x04, 0x64, 0x83, 0xFB, 0xDF, 0xFE, 0x19, 0xFF, 0x10, 0x64, 0x3B, 0xDB, - 0x65, 0xF3, 0x73, 0x45, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x93, 0x74, 0xF1, 0xC9, 0xFE, - 0x64, 0x40, 0x01, 0x26, 0x3B, 0x00, 0x49, 0xF3, 0x3C, 0x46, 0x31, 0x18, 0xCC, 0x84, 0x49, 0xFB, - 0x2E, 0x02, 0xC1, 0x60, 0x6B, 0x64, 0x40, 0x42, 0xFC, 0xFC, 0x00, 0x64, 0x5C, 0x5C, 0x32, 0xFB, - 0x82, 0xFF, 0x5C, 0x47, 0x84, 0xFF, 0x62, 0xFF, 0x13, 0x60, 0x01, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, - 0x00, 0x36, 0x00, 0x3B, 0xA2, 0xDB, 0x2A, 0xF2, 0x07, 0xF0, 0x0C, 0xB4, 0x08, 0x3A, 0x07, 0x00, - 0x66, 0x41, 0x64, 0x46, 0x06, 0xF0, 0xFF, 0x60, 0xDF, 0x64, 0xA0, 0x84, 0x06, 0xFA, 0x23, 0xF0, - 0x01, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0x1E, 0x60, 0xF2, 0x64, 0x0F, 0x60, 0x8D, 0xFB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0xCE, 0xFE, 0x06, 0x00, - 0x65, 0xF3, 0x73, 0x45, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x93, 0x14, 0x60, 0xFC, 0x63, - 0xA3, 0xD3, 0xAD, 0x49, 0x20, 0xB5, 0x08, 0xB1, 0x22, 0x03, 0xE1, 0x81, 0x10, 0xB5, 0x95, 0x81, - 0x60, 0x41, 0x18, 0x02, 0x14, 0x60, 0xFE, 0x7C, 0xA4, 0xD3, 0xFF, 0xFF, 0xCC, 0x84, 0xA4, 0xDB, - 0x16, 0x02, 0x0A, 0x64, 0xA4, 0xDB, 0x61, 0x44, 0x07, 0xB4, 0xFF, 0xFF, 0x10, 0x02, 0x08, 0xB1, - 0xE1, 0x81, 0x95, 0x81, 0xA3, 0xD3, 0x0B, 0x03, 0x08, 0xAC, 0x01, 0xBC, 0xA3, 0xDB, 0xFF, 0xFF, - 0x13, 0xFF, 0x05, 0x00, 0x10, 0xAC, 0xA3, 0xDB, 0x0A, 0x7C, 0x0A, 0x60, 0x7F, 0xF9, 0xB7, 0x60, - 0xAE, 0x78, 0xFF, 0xFF, 0x46, 0xF3, 0x45, 0xF1, 0x04, 0x1B, 0x64, 0x44, 0x02, 0x1B, 0x07, 0x60, - 0xF7, 0xF3, 0x45, 0xFB, 0x00, 0x63, 0x46, 0xFD, 0x60, 0x41, 0x25, 0x64, 0x3B, 0xDB, 0x27, 0x44, - 0xEF, 0xB4, 0x40, 0x47, 0x00, 0xB9, 0x71, 0x40, 0x80, 0x27, 0x01, 0x12, 0x19, 0x03, 0xC1, 0x60, - 0x0C, 0x62, 0x84, 0xFF, 0x42, 0x42, 0x82, 0xFF, 0xA0, 0x4C, 0x14, 0xBC, 0xFF, 0xB4, 0xA0, 0x51, - 0x1F, 0x0A, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x70, 0x44, 0xAC, 0x80, 0x19, 0x0A, 0x71, 0x40, - 0x80, 0x27, 0xF7, 0x12, 0x45, 0xF3, 0x27, 0x02, 0x03, 0x18, 0xCC, 0x84, 0x45, 0xFB, 0xF1, 0x02, - 0x06, 0x0A, 0xA0, 0x4C, 0xFB, 0xB4, 0xA0, 0x51, 0xA4, 0x60, 0xD7, 0x78, 0xFF, 0xFF, 0x84, 0xFF, - 0xC0, 0x60, 0xEA, 0x64, 0x40, 0x42, 0x82, 0xFF, 0xA0, 0x4C, 0x14, 0xBC, 0xFF, 0xB4, 0xA0, 0x51, - 0xAF, 0x60, 0x7B, 0x78, 0xFF, 0xFF, 0x3C, 0x44, 0xAC, 0x80, 0x32, 0xF1, 0x12, 0x03, 0x64, 0x40, - 0x07, 0x22, 0x0F, 0x00, 0xA4, 0x60, 0xB6, 0x78, 0xFF, 0xFF, 0xA0, 0x4C, 0x1C, 0xBC, 0xDF, 0xB4, - 0xA0, 0x51, 0xF1, 0x01, 0x06, 0x00, 0x28, 0x64, 0x3A, 0xDB, 0xA0, 0x4C, 0x30, 0xBC, 0xF3, 0xB4, - 0xA0, 0x51, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x28, 0x64, 0x3B, 0xDB, 0x07, 0x60, 0xF8, 0xF3, - 0x32, 0x40, 0x02, 0x27, 0x16, 0x00, 0x46, 0xFB, 0x14, 0x18, 0xC1, 0x60, 0x59, 0x64, 0x84, 0xFF, - 0x40, 0x42, 0x82, 0xFF, 0xA0, 0x4C, 0x15, 0xBC, 0xF7, 0xB4, 0xA0, 0x51, 0xA1, 0xFF, 0xFF, 0xFF, - 0x81, 0x3E, 0x70, 0x44, 0xAC, 0x80, 0x46, 0xF3, 0xCB, 0x0A, 0xDD, 0x02, 0xCC, 0x84, 0x46, 0xFB, - 0xF5, 0x02, 0x84, 0xFF, 0xC1, 0x60, 0x6B, 0x64, 0x40, 0x42, 0x82, 0xFF, 0x27, 0x44, 0x08, 0xBC, - 0x40, 0x47, 0xF9, 0xE1, 0x04, 0x00, 0x78, 0xE1, 0x31, 0x40, 0x01, 0x26, 0xF9, 0xE1, 0xA4, 0x60, - 0xAA, 0x78, 0xFF, 0xFF, 0x15, 0x60, 0xFB, 0xF1, 0x60, 0x45, 0x2C, 0x60, 0x0A, 0x61, 0xC5, 0x83, - 0xA3, 0xD3, 0xFF, 0xFF, 0x60, 0x41, 0x66, 0x45, 0x24, 0x46, 0x0E, 0xF2, 0x65, 0x46, 0x64, 0x45, - 0xD5, 0x81, 0x61, 0x45, 0x00, 0x7F, 0xD4, 0x80, 0x64, 0x43, 0x08, 0x04, 0xE3, 0x83, 0x63, 0x45, - 0xC5, 0x81, 0x61, 0x45, 0xD4, 0x80, 0x02, 0x65, 0x03, 0x07, 0x03, 0x00, 0x00, 0x65, 0x01, 0x00, - 0x01, 0x65, 0x2E, 0x58, 0xFF, 0xFF, 0x66, 0x43, 0x64, 0x46, 0x8F, 0xF0, 0x12, 0xF2, 0x91, 0xF2, - 0x60, 0x40, 0x10, 0x36, 0x05, 0x00, 0x12, 0x36, 0x08, 0x00, 0x0C, 0x36, 0x0B, 0x00, 0x0F, 0x00, - 0x40, 0x61, 0xA5, 0x80, 0x0A, 0x64, 0x13, 0x02, 0xF3, 0x01, 0x10, 0x61, 0xA5, 0x80, 0x0E, 0x64, - 0x0E, 0x02, 0xEE, 0x01, 0x08, 0x61, 0xA5, 0x80, 0x10, 0x64, 0x09, 0x02, 0xE9, 0x01, 0xE1, 0x81, - 0xA5, 0x80, 0x03, 0x05, 0xC8, 0x84, 0x03, 0x02, 0xE3, 0x01, 0xFF, 0x61, 0x02, 0x00, 0x12, 0xFA, - 0x91, 0xFA, 0x63, 0x46, 0x2E, 0x58, 0xFF, 0xFF, 0x8F, 0xF0, 0x12, 0xF2, 0x91, 0xF2, 0x60, 0x40, - 0x0A, 0x36, 0x05, 0x00, 0x0E, 0x36, 0x08, 0x00, 0x10, 0x36, 0x0B, 0x00, 0x0F, 0x00, 0x08, 0x61, - 0xA5, 0x80, 0x10, 0x7E, 0x11, 0x02, 0xF3, 0x01, 0x04, 0x61, 0xA5, 0x80, 0x12, 0x7E, 0x0C, 0x02, - 0xEE, 0x01, 0x20, 0x61, 0xA5, 0x80, 0x0C, 0x7E, 0x07, 0x02, 0xE9, 0x01, 0xE9, 0x81, 0xA5, 0x80, - 0x05, 0x05, 0xD8, 0x84, 0x01, 0x02, 0xE3, 0x01, 0x12, 0xFA, 0x91, 0xFA, 0x2E, 0x58, 0xFF, 0xFF, - 0x24, 0xE2, 0x2D, 0xF3, 0x2C, 0xF3, 0x00, 0xBD, 0xCC, 0x84, 0x08, 0x03, 0x2C, 0xFB, 0x06, 0x02, - 0x65, 0x44, 0x2C, 0xFB, 0x8A, 0xFF, 0x80, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x44, 0xF3, 0xFF, 0xFF, - 0xDC, 0x84, 0x44, 0xFB, 0x28, 0x60, 0x72, 0x65, 0x28, 0x60, 0x70, 0x61, 0xA5, 0xD3, 0xA1, 0xD3, - 0x11, 0x18, 0xCC, 0x84, 0xA1, 0xDB, 0x0E, 0x02, 0xA5, 0xD3, 0xA1, 0xDB, 0x14, 0x60, 0x3B, 0xF3, - 0x14, 0x60, 0x3A, 0xF1, 0xA2, 0xDB, 0xD0, 0x80, 0xFF, 0xFF, 0x04, 0x03, 0x8A, 0xFF, 0x20, 0x60, - 0x00, 0x75, 0x88, 0xFF, 0xD2, 0xF3, 0x31, 0x40, 0x01, 0x2A, 0x3D, 0x00, 0x60, 0x43, 0x04, 0xB0, - 0x02, 0xB0, 0x08, 0x24, 0x16, 0x02, 0x10, 0xB0, 0x29, 0x44, 0x34, 0x02, 0x00, 0xA8, 0xCC, 0x81, - 0x0D, 0x03, 0x41, 0x49, 0x2F, 0x02, 0x63, 0x40, 0x08, 0x2A, 0x08, 0x00, 0xF7, 0xB3, 0x18, 0x60, - 0x0A, 0xF1, 0xAD, 0x4F, 0xFD, 0xB4, 0xA0, 0x5D, 0x44, 0x49, 0x24, 0x00, 0x63, 0x40, 0x02, 0x2A, - 0x10, 0x00, 0x18, 0x60, 0x0B, 0xF3, 0x18, 0x60, 0x09, 0xFB, 0x40, 0x49, 0x18, 0x60, 0x0C, 0xF3, - 0x18, 0x60, 0x0A, 0xFB, 0x0C, 0xBB, 0xFD, 0xB3, 0xAD, 0x4F, 0x02, 0xBC, 0x00, 0x7F, 0xA0, 0x5D, - 0x11, 0x00, 0x18, 0x60, 0x0D, 0xF3, 0x30, 0x60, 0x12, 0x7C, 0x0C, 0x18, 0xA4, 0xDB, 0x40, 0x49, - 0x18, 0x60, 0x0E, 0xF3, 0x18, 0x60, 0x0A, 0xFB, 0x08, 0xBB, 0xFB, 0xB3, 0xAD, 0x4F, 0x02, 0xBC, - 0x00, 0x7F, 0xA0, 0x5D, 0xD2, 0xFD, 0x00, 0x60, 0x85, 0xF3, 0x62, 0x43, 0x17, 0x18, 0x58, 0xD3, - 0x62, 0x41, 0x03, 0x18, 0xCC, 0x84, 0xA1, 0xDB, 0x11, 0x00, 0x49, 0xD3, 0xA3, 0xDB, 0x06, 0xA1, - 0xA1, 0xD3, 0x59, 0xD1, 0x60, 0x45, 0xA5, 0xD3, 0x59, 0xD1, 0xB0, 0x84, 0xA5, 0xDB, 0x64, 0x44, - 0x06, 0x36, 0xCD, 0xFE, 0x07, 0x36, 0xD6, 0xFE, 0xE6, 0x01, 0x23, 0x46, 0xB7, 0x60, 0xAE, 0x78, - 0xFF, 0xFF, 0x46, 0x43, 0x1F, 0x60, 0x44, 0x61, 0xA1, 0xD3, 0x59, 0xD1, 0x06, 0x1B, 0x59, 0xD3, - 0x59, 0xD1, 0x03, 0x1B, 0x59, 0xD3, 0x59, 0xD1, 0xF0, 0x18, 0x00, 0x63, 0x49, 0xDD, 0x60, 0x40, - 0x02, 0x36, 0x11, 0x00, 0x03, 0x36, 0x32, 0x00, 0x01, 0x36, 0x08, 0x00, 0x05, 0x3A, 0xEA, 0x01, - 0xA4, 0xD3, 0x5A, 0xD3, 0x9C, 0x85, 0xA4, 0x84, 0xA2, 0xDB, 0xE4, 0x01, 0x01, 0x60, 0x0A, 0x61, - 0x00, 0x64, 0xA1, 0xDB, 0xDF, 0x01, 0xC2, 0x60, 0x8F, 0x64, 0x40, 0x45, 0x22, 0x00, 0x01, 0x60, - 0x0A, 0x66, 0xA6, 0xD3, 0x04, 0xA1, 0x60, 0x43, 0xA1, 0xD3, 0xC9, 0x81, 0x60, 0x45, 0x00, 0xBB, - 0xA1, 0xDB, 0xBE, 0xD3, 0x09, 0x03, 0xD4, 0x84, 0x9C, 0x84, 0xDC, 0x84, 0xFF, 0xFF, 0x04, 0x0E, - 0xA3, 0xD1, 0x63, 0x46, 0x64, 0x43, 0xF2, 0x01, 0x9C, 0x84, 0xDC, 0x85, 0x49, 0xDD, 0x61, 0x44, - 0x00, 0xBB, 0xA6, 0xDB, 0x02, 0x03, 0x65, 0x44, 0xBE, 0xDB, 0xBC, 0x01, 0xC2, 0x60, 0x6A, 0x64, - 0x40, 0x45, 0x01, 0x60, 0x0A, 0x66, 0xA6, 0xD3, 0xFF, 0xFF, 0xD0, 0x80, 0x0F, 0x18, 0x02, 0x03, - 0x60, 0x46, 0xF9, 0x01, 0x58, 0xD3, 0xA4, 0xD3, 0x60, 0x45, 0x00, 0x63, 0xA4, 0xDD, 0x05, 0x18, - 0x58, 0xD3, 0xFF, 0xFF, 0xC4, 0x83, 0xA2, 0xDD, 0xCA, 0x84, 0xA6, 0xDB, 0x25, 0x58, 0x64, 0x41, - 0x04, 0x60, 0x40, 0x62, 0x1A, 0x60, 0x58, 0x4D, 0xB4, 0x78, 0xFF, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, - 0x64, 0x40, 0x01, 0x2B, 0x50, 0x00, 0x28, 0x40, 0x08, 0x3A, 0x4D, 0x00, 0xE8, 0x84, 0xE8, 0x84, - 0xE8, 0x84, 0xE8, 0x84, 0x15, 0x60, 0xD5, 0xFB, 0x64, 0xF1, 0x24, 0x60, 0x88, 0x63, 0x64, 0x40, - 0x01, 0x27, 0x3C, 0xA3, 0x29, 0x40, 0x40, 0x2B, 0x1E, 0xA3, 0xBD, 0xD1, 0x63, 0x45, 0x44, 0x4E, - 0x0E, 0x61, 0xBD, 0xD1, 0xCD, 0x81, 0xD0, 0x80, 0x01, 0x03, 0xFB, 0x04, 0xCB, 0x83, 0x15, 0x60, - 0xD8, 0xF3, 0x39, 0xF1, 0xD7, 0x83, 0xEB, 0x83, 0x2E, 0x41, 0x5D, 0x93, 0xDF, 0x83, 0x15, 0x60, - 0xD4, 0xFD, 0x15, 0x60, 0xD3, 0xFB, 0x53, 0x93, 0xDF, 0x80, 0x10, 0x03, 0x38, 0xF3, 0xCF, 0x83, - 0x08, 0x03, 0xDF, 0x83, 0x0B, 0x02, 0xDF, 0x83, 0xDC, 0x84, 0xF0, 0xA0, 0x38, 0xFB, 0x06, 0x03, - 0x03, 0x00, 0xCC, 0x84, 0x38, 0xFB, 0x02, 0x03, 0x00, 0x63, 0x02, 0x00, 0x08, 0x64, 0x38, 0xFB, - 0xE3, 0x80, 0xFB, 0x83, 0xC3, 0x83, 0x63, 0x44, 0xFC, 0xA0, 0x02, 0x0E, 0x08, 0x07, 0x08, 0x00, - 0x04, 0xA4, 0xFF, 0xFF, 0x05, 0x0D, 0xFC, 0x64, 0xFF, 0x7F, 0x60, 0x43, 0x01, 0x00, 0x04, 0x63, - 0x39, 0xFD, 0x15, 0x60, 0xD7, 0xFD, 0x2F, 0x58, 0xFF, 0xFF, 0x15, 0x60, 0xD2, 0xF3, 0x40, 0x4E, - 0x60, 0x46, 0x2F, 0xDB, 0x44, 0x44, 0xA1, 0xD3, 0xD9, 0x81, 0x48, 0x94, 0x24, 0x5C, 0xD0, 0x9C, - 0x66, 0x42, 0x04, 0x06, 0xD2, 0x9C, 0x2F, 0xD9, 0x64, 0x46, 0x24, 0x44, 0xE0, 0x84, 0x44, 0xD3, - 0xA3, 0xDB, 0xFF, 0xB4, 0x60, 0x5C, 0x66, 0x44, 0x22, 0xA4, 0xD0, 0x84, 0xE0, 0xA0, 0x02, 0x0D, - 0x00, 0x64, 0x02, 0x00, 0x01, 0x04, 0x1F, 0x64, 0xA2, 0xD3, 0x60, 0x5C, 0x64, 0x5E, 0x60, 0x47, - 0x2F, 0xD1, 0x28, 0xA3, 0xA3, 0xD9, 0xD8, 0xA3, 0x2E, 0x42, 0x4E, 0x8E, 0xBD, 0xDB, 0xDB, 0x02, - 0x2D, 0x58, 0xFF, 0xFF, 0x43, 0xFF, 0x39, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x84, 0x3E, 0xFB, 0x01, - 0x3D, 0x44, 0x00, 0xA8, 0xFF, 0xFF, 0x03, 0x02, 0x40, 0xFF, 0x44, 0xFF, 0xF4, 0x01, 0xA0, 0x4C, - 0x3D, 0x46, 0x2A, 0xF2, 0x46, 0x4D, 0x10, 0x25, 0x12, 0x00, 0x09, 0xE1, 0xA1, 0xFF, 0x2D, 0x46, - 0x0F, 0xF2, 0x01, 0x29, 0x06, 0x00, 0x2A, 0xF0, 0x40, 0xFF, 0x64, 0x40, 0x40, 0x2B, 0x08, 0xBC, - 0x02, 0xBC, 0x0F, 0xFA, 0x08, 0x25, 0xDE, 0x01, 0xCB, 0xFE, 0x5C, 0x5D, 0xDC, 0x01, 0x44, 0xFF, - 0x03, 0x2B, 0x21, 0x00, 0x88, 0xF3, 0x06, 0x61, 0x60, 0x43, 0x66, 0x45, 0x31, 0xF0, 0x63, 0x46, - 0x05, 0xF2, 0x65, 0x46, 0xD0, 0x80, 0x30, 0xF0, 0x0F, 0x02, 0x63, 0x46, 0x04, 0xF2, 0x65, 0x46, - 0xD0, 0x80, 0x2F, 0xF0, 0x09, 0x02, 0x63, 0x46, 0x03, 0xF2, 0x65, 0x46, 0xD0, 0x80, 0xFF, 0xFF, - 0x03, 0x02, 0xFF, 0xFF, 0x48, 0xFE, 0x06, 0x00, 0xCD, 0x81, 0x02, 0xA3, 0xE7, 0x02, 0x87, 0xF1, - 0x08, 0xFE, 0x64, 0x43, 0x26, 0x03, 0x31, 0xF2, 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, - 0x31, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x30, 0xF0, 0x63, 0x46, - 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x2F, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, - 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0x87, 0xF3, 0x08, 0xFE, 0x60, 0x43, - 0x61, 0x46, 0x07, 0xFC, 0x3F, 0xF2, 0x09, 0x60, 0xB0, 0x65, 0xD4, 0x80, 0x2A, 0xF2, 0x9D, 0x05, - 0x08, 0x25, 0x88, 0x01, 0x5C, 0x4B, 0x0C, 0x60, 0xEC, 0x61, 0xA1, 0xDF, 0x2D, 0x46, 0x3B, 0xF2, - 0x87, 0xF1, 0x87, 0xF4, 0x60, 0x40, 0x20, 0x2B, 0xB7, 0x00, 0xD3, 0x80, 0x2C, 0xF0, 0x8D, 0x03, - 0x07, 0xF4, 0x64, 0x40, 0x01, 0x26, 0x87, 0xF5, 0xBA, 0xF4, 0x2D, 0x46, 0x04, 0x64, 0x04, 0xB3, - 0x22, 0xF0, 0x04, 0x03, 0xC5, 0x60, 0xBD, 0x78, 0xFF, 0xFF, 0xA6, 0x00, 0x10, 0x64, 0xB0, 0x9C, - 0x3B, 0xF2, 0x22, 0xF8, 0x60, 0x47, 0xC0, 0xB7, 0x02, 0xFE, 0xF0, 0x84, 0xF0, 0x84, 0xF0, 0x84, - 0x00, 0xA8, 0x40, 0x4A, 0x17, 0x03, 0xE0, 0x81, 0x61, 0x43, 0x42, 0xFE, 0x00, 0x64, 0xF0, 0x84, - 0xFE, 0x1F, 0x40, 0x4A, 0xE1, 0x84, 0xE0, 0x84, 0x2D, 0x46, 0x07, 0xF4, 0xE0, 0x81, 0x3B, 0xF0, - 0x2A, 0x47, 0x0C, 0x60, 0x3A, 0x63, 0xA0, 0x84, 0x47, 0x9C, 0x10, 0x03, 0x7C, 0x44, 0x00, 0x60, - 0xB2, 0x63, 0x14, 0x00, 0x07, 0xF4, 0x3B, 0xF0, 0x66, 0x44, 0x64, 0x40, 0x80, 0x2B, 0x06, 0x00, - 0x00, 0x60, 0x78, 0x7C, 0x00, 0x60, 0xA2, 0x63, 0x43, 0x4C, 0x08, 0x00, 0x2D, 0x46, 0xC5, 0x60, - 0xB0, 0x78, 0xFF, 0xFF, 0x2D, 0x46, 0xC5, 0x60, 0xB0, 0x78, 0xFF, 0xFF, 0xCE, 0xFB, 0xCF, 0xF9, - 0xD0, 0xFD, 0xAD, 0x46, 0x3D, 0xF2, 0xAD, 0x46, 0xA3, 0xD0, 0xAD, 0x46, 0xD0, 0x80, 0x3C, 0xF2, - 0xAD, 0x46, 0x02, 0x03, 0x15, 0x07, 0xEE, 0x04, 0x5B, 0xD0, 0xAD, 0x46, 0xD0, 0x80, 0x3A, 0xF2, - 0x03, 0x03, 0xAD, 0x46, 0x0D, 0x07, 0xE6, 0x04, 0x3A, 0xF0, 0xAD, 0x46, 0x5B, 0xD0, 0x64, 0x44, - 0xD0, 0x80, 0x2B, 0x44, 0x05, 0x07, 0xDE, 0x03, 0xD0, 0x84, 0x10, 0xA4, 0xFF, 0xFF, 0x00, 0x07, - 0xCF, 0xF3, 0xCE, 0xF5, 0xFE, 0xA4, 0x0F, 0x60, 0xC0, 0x61, 0x0E, 0x63, 0x58, 0xD0, 0x59, 0xD9, - 0xFD, 0x1F, 0x2D, 0x46, 0x8B, 0xFF, 0x2D, 0x46, 0x0F, 0x60, 0xB2, 0x64, 0xC9, 0x60, 0x58, 0x4F, - 0x10, 0x78, 0xFF, 0xFF, 0x3F, 0xF2, 0x00, 0x60, 0x18, 0x70, 0x18, 0x71, 0x20, 0x72, 0x60, 0x53, - 0x88, 0x75, 0x00, 0xF2, 0x09, 0xE1, 0x60, 0x50, 0x12, 0x71, 0x6E, 0x72, 0x83, 0x75, 0xA1, 0xFF, - 0xFF, 0xFF, 0x08, 0x25, 0x1F, 0x00, 0x40, 0xFF, 0x02, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x75, 0x40, - 0x03, 0x2A, 0x03, 0x00, 0x80, 0x75, 0x0A, 0x64, 0x0B, 0x00, 0x80, 0x75, 0x1B, 0xF3, 0x8B, 0xFF, - 0x02, 0x60, 0x00, 0x75, 0xFF, 0xFF, 0x02, 0x60, 0x00, 0x75, 0xDC, 0x84, 0xA2, 0xDB, 0x02, 0x64, - 0x98, 0xFF, 0x2D, 0x46, 0x0F, 0xF0, 0xFF, 0xFF, 0xB0, 0x84, 0xA2, 0xDA, 0x88, 0xFF, 0xC3, 0x60, - 0x74, 0x78, 0xFF, 0xFF, 0x8B, 0xFF, 0x02, 0x60, 0x00, 0x75, 0xFF, 0xFF, 0x02, 0x60, 0x00, 0x75, - 0x88, 0xFF, 0xC5, 0x60, 0x96, 0x78, 0xFF, 0xFF, 0x22, 0xF0, 0x22, 0x64, 0xB0, 0x84, 0x22, 0xFA, - 0x3A, 0xF0, 0xFF, 0xFF, 0x64, 0x44, 0xE0, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xE1, 0x7F, 0x5A, 0xD0, - 0xA0, 0x5B, 0x64, 0x44, 0xE2, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0x7C, 0x5F, 0xE8, 0x84, 0xE8, 0x85, - 0x0D, 0x60, 0x02, 0x64, 0x44, 0xD3, 0x5A, 0xD1, 0x03, 0x1B, 0xC5, 0x60, 0xB0, 0x78, 0xFF, 0xFF, - 0x60, 0x45, 0x64, 0x44, 0xE3, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xE4, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, - 0x64, 0x44, 0xE5, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xE6, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, - 0xE7, 0x7F, 0xA0, 0x5B, 0x65, 0x40, 0x0D, 0x3A, 0x1C, 0x00, 0x64, 0x47, 0xE8, 0x7F, 0x5A, 0xD1, - 0xA0, 0x5B, 0x64, 0x44, 0xE9, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xEA, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, - 0x64, 0x44, 0xEB, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xEC, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, - 0xED, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xEE, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, 0xEF, 0x7F, - 0xA0, 0x5B, 0x65, 0x44, 0xD8, 0x84, 0x08, 0x25, 0xB9, 0x00, 0x60, 0x7F, 0xA0, 0x5B, 0x80, 0x60, - 0x00, 0xEB, 0xA0, 0x60, 0x00, 0xEB, 0xD1, 0x60, 0x00, 0xEB, 0x3F, 0xF2, 0x3B, 0xF0, 0x60, 0x43, - 0xFC, 0xA4, 0x64, 0x40, 0x20, 0x2B, 0x03, 0x00, 0x08, 0xA4, 0x3F, 0xFA, 0x08, 0xA3, 0xF8, 0xA3, - 0x3F, 0xFA, 0x0A, 0xE1, 0xB3, 0xFF, 0x9A, 0xFF, 0xCB, 0x83, 0x00, 0xF4, 0x10, 0x62, 0x6C, 0x61, - 0x0E, 0xA3, 0xAB, 0x84, 0xF2, 0xA3, 0xA1, 0xFF, 0x08, 0x00, 0x00, 0xF4, 0x81, 0xF2, 0x6C, 0x18, - 0x02, 0x62, 0xC9, 0x81, 0xAB, 0x84, 0x01, 0x00, 0xA2, 0xDC, 0x7A, 0xD4, 0xFD, 0x1C, 0xA2, 0xDC, - 0x08, 0x25, 0x8C, 0x00, 0xF2, 0x1D, 0x41, 0x44, 0x7C, 0xA8, 0xD9, 0x81, 0xEE, 0x03, 0xFF, 0xB1, - 0x98, 0xFF, 0x09, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x08, 0x25, 0x80, 0x00, 0x40, 0xFF, 0x42, 0x42, - 0x46, 0x43, 0x06, 0x1E, 0x04, 0x02, 0x00, 0xF4, 0x02, 0x62, 0x42, 0x42, 0x46, 0x43, 0x01, 0xA2, - 0x63, 0x45, 0x01, 0xA2, 0x62, 0x43, 0x46, 0x4C, 0xC6, 0x60, 0x58, 0x4F, 0x4B, 0x78, 0xFF, 0xFF, - 0x0A, 0xE1, 0x9A, 0xFF, 0x24, 0x41, 0x02, 0xA1, 0x65, 0x43, 0x08, 0xA3, 0x23, 0x46, 0x22, 0x42, - 0x7E, 0x3A, 0x0A, 0x00, 0x00, 0xF4, 0x81, 0xF2, 0x37, 0x18, 0x02, 0x62, 0xC9, 0x81, 0xAB, 0x84, - 0x03, 0x00, 0xA2, 0xDC, 0x7E, 0x36, 0xF6, 0x01, 0x7A, 0xD4, 0xFF, 0xFF, 0xFA, 0x1C, 0xA2, 0xDC, - 0xF1, 0x1D, 0xD9, 0x81, 0xFF, 0xB1, 0x0B, 0x1E, 0x62, 0x40, 0x7E, 0x3A, 0x02, 0x00, 0x00, 0xF4, - 0x02, 0x62, 0x5A, 0xD2, 0x89, 0xFF, 0x80, 0x4F, 0x6F, 0x44, 0xA2, 0xDA, 0x88, 0xFF, 0x98, 0xFF, - 0x3D, 0x46, 0x0F, 0xF0, 0x0A, 0x64, 0xB0, 0x84, 0x18, 0x14, 0xF7, 0xB4, 0xA2, 0xDA, 0x06, 0x60, - 0x76, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x0C, 0x00, 0xD1, 0xF5, 0xD0, 0xF4, 0x0C, 0x60, - 0xEC, 0x61, 0x59, 0xD1, 0x3B, 0xF8, 0x05, 0x64, 0x59, 0xD1, 0xCC, 0x84, 0xBD, 0xD8, 0xFC, 0x02, - 0x2D, 0x46, 0xC3, 0x60, 0x74, 0x78, 0xFF, 0xFF, 0x28, 0x00, 0xA2, 0xDA, 0x2D, 0x46, 0x3B, 0xF0, - 0xFF, 0xFF, 0x64, 0x40, 0x20, 0x2B, 0x1E, 0x00, 0x07, 0xF4, 0xBB, 0xF0, 0x2A, 0x44, 0xA4, 0x84, - 0xFF, 0xFF, 0x2F, 0x26, 0x16, 0x00, 0x2D, 0x46, 0x64, 0x44, 0x3A, 0xF0, 0xBC, 0xF0, 0x64, 0x5F, - 0x3D, 0xF0, 0x07, 0xF4, 0xD0, 0xF4, 0xFF, 0xFF, 0x08, 0xA3, 0x5B, 0xD8, 0x65, 0x5C, 0x5B, 0xD8, - 0x5B, 0xDA, 0x2D, 0x46, 0xCE, 0xF3, 0x3C, 0xFA, 0xCF, 0xF3, 0x3D, 0xFA, 0x2A, 0x44, 0x23, 0xFA, - 0x01, 0x00, 0x2D, 0x46, 0xC3, 0x60, 0x74, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0xFF, 0x43, 0xFF, - 0x40, 0xFF, 0xB0, 0xFF, 0xB1, 0xFF, 0x2D, 0x46, 0x0C, 0x60, 0xEC, 0x61, 0xA1, 0xD3, 0x2D, 0x46, - 0x60, 0x40, 0x01, 0x2A, 0x0A, 0x00, 0xD1, 0xF5, 0xD0, 0xF4, 0x59, 0xD1, 0x3B, 0xF8, 0x05, 0x64, - 0x59, 0xD1, 0xCC, 0x84, 0xBD, 0xD8, 0xFC, 0x02, 0x2D, 0x46, 0xC3, 0x60, 0x53, 0x78, 0xFF, 0xFF, - 0x98, 0xFF, 0x09, 0xE1, 0xA1, 0xFF, 0x3D, 0x46, 0x08, 0x25, 0xE0, 0x01, 0x0F, 0xF2, 0x40, 0xFF, - 0x02, 0xBC, 0xA2, 0xDA, 0xC3, 0x60, 0x74, 0x78, 0xFF, 0xFF, 0xB0, 0x84, 0x22, 0xFA, 0x00, 0x63, - 0x3B, 0xF2, 0x06, 0x60, 0x76, 0xFD, 0x60, 0x47, 0xC0, 0xB7, 0x02, 0xFE, 0xF0, 0x84, 0xF0, 0x84, - 0xF0, 0x84, 0x00, 0xA8, 0x40, 0x4A, 0x16, 0x03, 0xE0, 0x81, 0x61, 0x43, 0x42, 0xFE, 0x00, 0x64, - 0xF0, 0x84, 0xFE, 0x1F, 0x40, 0x4A, 0xE1, 0x84, 0xE0, 0x84, 0x2D, 0x46, 0x07, 0xF4, 0xE0, 0x81, - 0x3B, 0xF0, 0x2A, 0x47, 0x0C, 0x60, 0x3A, 0x63, 0xA0, 0x84, 0x47, 0x9C, 0x10, 0x03, 0x7C, 0x44, - 0xA8, 0x63, 0x0F, 0x00, 0x07, 0xF4, 0x20, 0x64, 0x40, 0x4A, 0x3B, 0xF0, 0x66, 0x44, 0x64, 0x40, - 0x80, 0x2B, 0x05, 0x00, 0x00, 0x60, 0x78, 0x7C, 0x00, 0x60, 0x98, 0x63, 0x02, 0x00, 0x2D, 0x46, - 0xBF, 0x01, 0x2D, 0x46, 0xCE, 0xFB, 0xCF, 0xF9, 0xD0, 0xFD, 0x07, 0xF2, 0xD1, 0xFB, 0x60, 0x46, - 0x3B, 0xF0, 0x2A, 0x44, 0x06, 0x60, 0x77, 0xF9, 0x5C, 0x4B, 0xA0, 0x84, 0xFF, 0xFF, 0x3F, 0x22, - 0x05, 0x00, 0x90, 0x84, 0x3B, 0xFA, 0x01, 0x64, 0x40, 0x4B, 0x21, 0x00, 0xAD, 0x46, 0x0A, 0xA3, - 0x3D, 0xF2, 0xAD, 0x46, 0xA3, 0xD0, 0xAD, 0x46, 0xD0, 0x80, 0x3C, 0xF2, 0xAD, 0x46, 0x02, 0x03, - 0x16, 0x07, 0x14, 0x04, 0x5B, 0xD0, 0xAD, 0x46, 0xD0, 0x80, 0x3B, 0xF2, 0x03, 0x03, 0xAD, 0x46, - 0x0E, 0x07, 0x0C, 0x04, 0x3A, 0xF0, 0xAD, 0x46, 0x5B, 0xD0, 0x64, 0x5F, 0xD0, 0x80, 0x2B, 0x44, - 0x17, 0x07, 0x04, 0x03, 0xD0, 0x84, 0x10, 0xA4, 0xFF, 0xFF, 0x12, 0x07, 0x89, 0x01, 0x01, 0x64, - 0x06, 0x60, 0x76, 0xFB, 0x2D, 0x46, 0x0C, 0x60, 0xFC, 0x62, 0x80, 0xFF, 0x78, 0x44, 0x03, 0xA4, - 0xA2, 0xDB, 0xC6, 0x60, 0x76, 0x78, 0xFF, 0xFF, 0x85, 0xFF, 0x2D, 0x46, 0x08, 0x25, 0x5E, 0x01, - 0x2D, 0x46, 0x0C, 0x60, 0xFC, 0x62, 0x80, 0xFF, 0x78, 0x44, 0x03, 0xA4, 0xA2, 0xDB, 0xC6, 0x60, - 0xFE, 0x78, 0xFF, 0xFF, 0x85, 0xFF, 0x2D, 0x46, 0x08, 0x25, 0x50, 0x01, 0x00, 0x60, 0x0F, 0x64, - 0xC4, 0x60, 0xDB, 0x78, 0xFF, 0xFF, 0x2D, 0x46, 0x3B, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x20, 0x2B, - 0x23, 0x00, 0x00, 0xF4, 0x08, 0x61, 0x2D, 0x46, 0x00, 0xF4, 0x0A, 0x62, 0x56, 0x92, 0x5A, 0xD0, - 0x2C, 0x46, 0x64, 0x47, 0x63, 0x40, 0x7F, 0x2A, 0x03, 0x00, 0x00, 0xF4, 0x03, 0x63, 0x46, 0x4C, - 0x60, 0xFE, 0xDE, 0xD8, 0x7F, 0x3A, 0x03, 0x00, 0x00, 0xF4, 0x03, 0x63, 0x46, 0x4C, 0xDE, 0xDA, - 0xFE, 0xA1, 0x20, 0xFE, 0xE8, 0x02, 0x63, 0x41, 0xFD, 0xA1, 0x46, 0x4C, 0x01, 0xF2, 0x2D, 0x46, - 0x61, 0x5E, 0x16, 0xFA, 0x2C, 0x44, 0x06, 0xFA, 0x2F, 0x58, 0xFF, 0xFF, 0x07, 0xF4, 0x66, 0x41, - 0x03, 0xF2, 0x04, 0xF2, 0x40, 0x42, 0x05, 0xF2, 0x40, 0x43, 0x40, 0x44, 0x61, 0x46, 0x3C, 0xF2, - 0x3D, 0xF2, 0x40, 0x40, 0x40, 0x41, 0x0D, 0x60, 0x72, 0x65, 0x00, 0x61, 0xCF, 0xF1, 0xCE, 0xF5, - 0x44, 0x4C, 0x2C, 0x5C, 0xE9, 0x80, 0x00, 0x64, 0xF0, 0x84, 0xF0, 0x84, 0xC0, 0x83, 0xBD, 0xD2, - 0x24, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x20, 0x44, 0x40, 0x80, 0xDB, 0x83, 0xBD, 0xD2, - 0x20, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x21, 0x44, 0x40, 0x81, 0xDB, 0x83, 0xBD, 0xD2, - 0x21, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x22, 0x44, 0x40, 0x82, 0xDB, 0x83, 0xBD, 0xD2, - 0x22, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x23, 0x44, 0x40, 0x83, 0xF2, 0xA3, 0xBD, 0xD2, - 0x23, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x24, 0x44, 0xC0, 0x9C, 0x41, 0x84, 0xDD, 0x81, - 0x08, 0x2A, 0xA7, 0x01, 0x0C, 0x60, 0xEE, 0x61, 0x05, 0x64, 0xD0, 0xF4, 0xD1, 0xF5, 0xFE, 0xA3, - 0x5B, 0xD0, 0xCC, 0x84, 0x59, 0xD9, 0xFC, 0x02, 0xD0, 0xF3, 0xD1, 0xF5, 0x60, 0x42, 0x20, 0x44, - 0xA2, 0xDA, 0x21, 0x44, 0x5A, 0xDA, 0x22, 0x44, 0x5A, 0xDA, 0x23, 0x44, 0x5A, 0xDA, 0x24, 0x44, - 0x5A, 0xDA, 0x61, 0x46, 0x06, 0x60, 0x7E, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0x41, 0xD0, 0xF3, - 0xD1, 0xF5, 0xA0, 0xD2, 0x5A, 0xD0, 0x40, 0x40, 0x44, 0x41, 0x5A, 0xD2, 0x5A, 0xD0, 0x40, 0x42, - 0x5A, 0xD0, 0x44, 0x43, 0x61, 0x46, 0xBA, 0xF0, 0x3B, 0xF2, 0x44, 0x44, 0x65, 0x5F, 0x40, 0x85, - 0xCF, 0xF4, 0xCE, 0xF5, 0x43, 0x4C, 0x0D, 0x60, 0x72, 0x65, 0xBD, 0xD2, 0x25, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x20, 0x44, 0x40, 0x80, 0xBD, 0xD2, 0x20, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x21, 0x44, 0x40, 0x81, 0xBD, 0xD2, 0x21, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x22, 0x44, 0x40, 0x82, 0xBD, 0xD2, 0x22, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x23, 0x44, - 0x40, 0x83, 0xBD, 0xD2, 0x23, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x24, 0x44, 0x40, 0x84, - 0xBD, 0xD2, 0x24, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x25, 0x44, 0x40, 0x85, 0x61, 0x46, - 0x3A, 0xF0, 0xFF, 0xFF, 0x64, 0x44, 0xE0, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xE1, 0x7F, 0x5A, 0xD0, - 0xA0, 0x5B, 0x64, 0x44, 0xE2, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xCE, 0xF5, 0xBD, 0xD2, 0x25, 0x5C, - 0x90, 0x84, 0xE8, 0x80, 0xF8, 0x84, 0x20, 0x5C, 0x40, 0x80, 0x20, 0x44, 0xE4, 0x7F, 0xA0, 0x5B, - 0x20, 0x47, 0xE5, 0x7F, 0xA0, 0x5B, 0xBD, 0xD2, 0x20, 0x5C, 0x90, 0x84, 0xE8, 0x80, 0xF8, 0x84, - 0x21, 0x5C, 0x40, 0x81, 0x21, 0x44, 0xE6, 0x7F, 0xA0, 0x5B, 0x21, 0x47, 0xE7, 0x7F, 0xA0, 0x5B, - 0x21, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x22, 0x5C, 0x40, 0x82, 0x22, 0x44, 0xE8, 0x7F, 0xA0, 0x5B, - 0x22, 0x47, 0xE9, 0x7F, 0xA0, 0x5B, 0x22, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x23, 0x5C, 0x40, 0x83, - 0x23, 0x44, 0xEA, 0x7F, 0xA0, 0x5B, 0x23, 0x47, 0xEB, 0x7F, 0xA0, 0x5B, 0x23, 0x44, 0xE8, 0x80, - 0xF8, 0x84, 0x24, 0x5C, 0x40, 0x84, 0x24, 0x44, 0xEC, 0x7F, 0xA0, 0x5B, 0x24, 0x47, 0xED, 0x7F, - 0xA0, 0x5B, 0x24, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x25, 0x5C, 0x40, 0x85, 0x25, 0x44, 0xEE, 0x7F, - 0xA0, 0x5B, 0x25, 0x47, 0xEF, 0x7F, 0xA0, 0x5B, 0x2C, 0x43, 0xA3, 0xD2, 0x25, 0x5C, 0x90, 0x81, - 0xE9, 0x84, 0xE3, 0x7F, 0xA0, 0x5B, 0x06, 0x60, 0x7E, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF3, - 0x5A, 0xD3, 0x40, 0x48, 0x5A, 0xD3, 0x40, 0x49, 0x40, 0x4A, 0x00, 0x60, 0x78, 0x7C, 0x44, 0x4D, - 0x49, 0xF2, 0x4A, 0xF2, 0x40, 0x47, 0x40, 0x46, 0x0D, 0x60, 0x72, 0x65, 0x00, 0x61, 0x2D, 0x5C, - 0xE9, 0x80, 0x00, 0x64, 0xF0, 0x84, 0xF0, 0x84, 0xC0, 0x83, 0xBD, 0xD2, 0x2A, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x26, 0x44, 0x40, 0x86, 0xDB, 0x83, 0xBD, 0xD2, 0x26, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x27, 0x44, 0x40, 0x87, 0xDB, 0x83, 0xBD, 0xD2, 0x27, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x28, 0x44, 0x40, 0x88, 0xDB, 0x83, 0xBD, 0xD2, 0x28, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x29, 0x44, 0x40, 0x89, 0xF2, 0xA3, 0xBD, 0xD2, 0x29, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x2A, 0x44, 0xC0, 0x9C, 0x41, 0x8A, 0xDD, 0x81, 0x08, 0x2A, 0xA7, 0x01, - 0x26, 0x44, 0x44, 0xFA, 0x27, 0x44, 0x45, 0xFA, 0x28, 0x44, 0x46, 0xFA, 0x29, 0x44, 0x47, 0xFA, - 0x2A, 0x44, 0x48, 0xFA, 0x06, 0x60, 0x7F, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x88, 0x7C, - 0x44, 0x4D, 0x2D, 0x42, 0xA2, 0xD2, 0x5A, 0xD0, 0x40, 0x46, 0x44, 0x47, 0x5A, 0xD2, 0x5A, 0xD0, - 0x40, 0x48, 0x5A, 0xD0, 0x44, 0x49, 0x4B, 0xF2, 0x44, 0x4A, 0x40, 0x8B, 0x60, 0x5C, 0x64, 0x47, - 0xE0, 0x7F, 0xA0, 0x5A, 0xFF, 0xB4, 0x20, 0xBC, 0x7F, 0xB4, 0xE1, 0x7F, 0xA0, 0x5A, 0x64, 0x44, - 0xE2, 0x7F, 0xA0, 0x5A, 0x00, 0x60, 0x78, 0x63, 0x0D, 0x60, 0x72, 0x65, 0xBD, 0xD2, 0x2B, 0x5C, - 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x26, 0x44, 0x40, 0x86, 0xBD, 0xD2, 0x26, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x27, 0x44, 0x40, 0x87, 0xBD, 0xD2, 0x27, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x28, 0x44, 0x40, 0x88, 0xBD, 0xD2, 0x28, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x29, 0x44, 0x40, 0x89, 0xBD, 0xD2, 0x29, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x2A, 0x44, - 0x40, 0x8A, 0xBD, 0xD2, 0x2A, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x2B, 0x44, 0x40, 0x8B, - 0xBD, 0xD2, 0x2B, 0x5C, 0x90, 0x84, 0xE8, 0x80, 0xF8, 0x84, 0x26, 0x5C, 0x40, 0x86, 0x26, 0x44, - 0xE4, 0x7F, 0xA0, 0x5A, 0x26, 0x47, 0xE5, 0x7F, 0xA0, 0x5A, 0xBD, 0xD2, 0x26, 0x5C, 0x90, 0x84, - 0xE8, 0x80, 0xF8, 0x84, 0x27, 0x5C, 0x40, 0x87, 0x27, 0x44, 0xE6, 0x7F, 0xA0, 0x5A, 0x27, 0x47, - 0xE7, 0x7F, 0xA0, 0x5A, 0x27, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x28, 0x5C, 0x40, 0x88, 0x28, 0x44, - 0xE8, 0x7F, 0xA0, 0x5A, 0x28, 0x47, 0xE9, 0x7F, 0xA0, 0x5A, 0x28, 0x44, 0xE8, 0x80, 0xF8, 0x84, - 0x29, 0x5C, 0x40, 0x89, 0x29, 0x44, 0xEA, 0x7F, 0xA0, 0x5A, 0x29, 0x47, 0xEB, 0x7F, 0xA0, 0x5A, - 0x29, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x2A, 0x5C, 0x40, 0x8A, 0x2A, 0x44, 0xEC, 0x7F, 0xA0, 0x5A, - 0x2A, 0x47, 0xED, 0x7F, 0xA0, 0x5A, 0x2A, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x2B, 0x5C, 0x40, 0x8B, - 0x2B, 0x44, 0xEE, 0x7F, 0xA0, 0x5A, 0x2B, 0x47, 0xEF, 0x7F, 0xA0, 0x5A, 0x3C, 0xF0, 0x2B, 0x44, - 0x90, 0x84, 0xE8, 0x84, 0xE3, 0x7F, 0xA0, 0x5A, 0x06, 0x60, 0x7F, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, - 0x60, 0x45, 0x00, 0xF0, 0x84, 0x60, 0x00, 0xE3, 0x04, 0x71, 0x64, 0x50, 0x01, 0x2A, 0x04, 0x71, - 0x5C, 0x61, 0x04, 0x63, 0x59, 0xD0, 0x58, 0xD9, 0xFD, 0x1F, 0x3D, 0xF2, 0x60, 0x43, 0x60, 0x47, - 0x5B, 0xDB, 0x3C, 0xF2, 0xFF, 0xFF, 0x60, 0x47, 0x5B, 0xDB, 0x3A, 0xF2, 0xFF, 0xFF, 0x60, 0x47, - 0x5B, 0xDB, 0x3F, 0xF2, 0xFF, 0xFF, 0x60, 0x47, 0x5B, 0xDB, 0x81, 0x60, 0x18, 0xE3, 0x65, 0x43, - 0xE3, 0x84, 0x60, 0x47, 0x00, 0x7F, 0x60, 0x50, 0x7F, 0x64, 0x23, 0x94, 0x60, 0x51, 0x7C, 0x72, - 0x04, 0x75, 0x0C, 0x60, 0x16, 0x61, 0x16, 0x60, 0x00, 0x63, 0x59, 0xDD, 0x2A, 0xF2, 0x87, 0x60, - 0x8F, 0x65, 0xA4, 0x87, 0x40, 0xBF, 0x59, 0xDB, 0x56, 0x64, 0x0A, 0x63, 0x58, 0xD0, 0x59, 0xD9, - 0xFD, 0x1F, 0x62, 0x64, 0x04, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x35, 0xF2, 0x0F, 0x65, - 0xA4, 0x9C, 0x59, 0xD9, 0x06, 0x63, 0x59, 0xDF, 0xFE, 0x1F, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x45, - 0x03, 0x2B, 0x05, 0x00, 0x6A, 0x64, 0x04, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x65, 0x40, - 0x8F, 0xB0, 0x88, 0x3A, 0x02, 0x00, 0x39, 0xF0, 0x59, 0xD9, 0x2F, 0x58, 0xFF, 0xFF, 0x0C, 0x60, - 0x16, 0x61, 0xA3, 0x46, 0x00, 0xF4, 0x02, 0x64, 0x0A, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, - 0x59, 0xDF, 0x59, 0xDF, 0xA0, 0x4C, 0x04, 0xBC, 0xFF, 0xB4, 0xA0, 0x51, 0x23, 0x44, 0x01, 0xA7, - 0x80, 0xBF, 0x60, 0x50, 0x80, 0x60, 0x38, 0x71, 0x80, 0x60, 0x7C, 0x72, 0x01, 0x76, 0xFF, 0xFF, - 0x76, 0x44, 0x01, 0x3A, 0xFD, 0x01, 0x40, 0x76, 0x42, 0xFF, 0xFF, 0xFF, 0x40, 0x76, 0x80, 0x60, - 0x18, 0x70, 0x80, 0x60, 0x18, 0x71, 0x80, 0x60, 0x7C, 0x72, 0x80, 0x60, 0x10, 0x73, 0x02, 0x76, - 0x76, 0x44, 0xFF, 0xFF, 0x76, 0x44, 0x02, 0x3A, 0xFD, 0x01, 0x40, 0x76, 0x42, 0xFF, 0x3C, 0x46, - 0x00, 0xF2, 0x80, 0x60, 0x00, 0xBC, 0x60, 0x50, 0x80, 0x60, 0x12, 0x71, 0x80, 0x60, 0x6E, 0x72, - 0x3F, 0xF2, 0xFF, 0xFF, 0xF8, 0xA7, 0x80, 0xBF, 0x60, 0x53, 0x04, 0x76, 0xFF, 0xFF, 0x88, 0xFF, - 0x3C, 0x46, 0x07, 0xF2, 0xFF, 0xFF, 0x40, 0x43, 0xA3, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x77, 0x40, - 0x8B, 0xFF, 0xA0, 0x4C, 0x04, 0xE1, 0xFF, 0xFF, 0x76, 0x44, 0x04, 0x3A, 0xFD, 0x01, 0x40, 0x76, - 0x42, 0xFF, 0xFF, 0xFF, 0x10, 0x76, 0xFF, 0xFF, 0x76, 0x44, 0x20, 0x3A, 0xFD, 0x01, 0x40, 0x76, - 0x42, 0xFF, 0xA0, 0x48, 0x00, 0x7F, 0xA0, 0x51, 0x02, 0x60, 0x00, 0x75, 0x88, 0xFF, 0xA0, 0x4C, - 0xFB, 0xB4, 0xA0, 0x51, 0x06, 0x60, 0x1F, 0xE1, 0x16, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x26, 0x46, - 0x3F, 0xF2, 0xFF, 0xFF, 0xF8, 0xA4, 0x3F, 0xFA, 0x00, 0xF4, 0x60, 0x47, 0x08, 0xFA, 0xA0, 0x48, - 0x08, 0x26, 0x07, 0x00, 0xA0, 0x4C, 0x04, 0xE1, 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, - 0xA0, 0x51, 0x42, 0xFF, 0x26, 0x46, 0x8B, 0xFF, 0x02, 0x60, 0x00, 0x75, 0x3C, 0xF2, 0x40, 0x76, - 0x14, 0x1B, 0x26, 0x46, 0x3B, 0xF2, 0x0C, 0x60, 0xBC, 0x63, 0x60, 0x47, 0xC0, 0xB4, 0xE8, 0x84, - 0xE8, 0x84, 0xE8, 0x84, 0x43, 0x93, 0xE3, 0x9C, 0x64, 0x47, 0x80, 0x7C, 0x64, 0x5F, 0x60, 0x50, - 0x7F, 0x64, 0x23, 0x97, 0x80, 0xBF, 0x60, 0x51, 0x07, 0x00, 0x01, 0xA7, 0x80, 0xBF, 0x60, 0x50, - 0x80, 0x60, 0x40, 0x71, 0x80, 0x60, 0x7C, 0x72, 0x01, 0x76, 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, - 0x0C, 0x21, 0xFC, 0x01, 0x04, 0x25, 0xD5, 0x01, 0x40, 0x76, 0x43, 0xFF, 0x0C, 0x60, 0x22, 0x61, - 0x26, 0x46, 0x00, 0xF4, 0x02, 0x64, 0x0A, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x59, 0xDF, - 0x59, 0xDF, 0x80, 0x60, 0x18, 0x70, 0x80, 0x60, 0x24, 0x71, 0x80, 0x60, 0x7C, 0x72, 0x80, 0x60, - 0x10, 0x73, 0x02, 0x76, 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x0C, 0x21, 0xFC, 0x01, 0x04, 0x25, - 0xB8, 0x01, 0x40, 0x76, 0x43, 0xFF, 0x26, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0x60, 0x47, 0x80, 0xBF, - 0x60, 0x50, 0x80, 0x60, 0x12, 0x71, 0x3F, 0xF2, 0x80, 0x60, 0x6E, 0x72, 0x60, 0x47, 0x80, 0xBF, - 0x60, 0x53, 0x04, 0x76, 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x0C, 0x21, 0xFC, 0x01, 0x04, 0x25, - 0xA0, 0x01, 0x40, 0x76, 0x43, 0xFF, 0x08, 0x76, 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x0C, 0x21, - 0xFC, 0x01, 0x04, 0x25, 0x96, 0x01, 0x76, 0x5C, 0xFF, 0xFF, 0x40, 0x76, 0x43, 0xFF, 0x88, 0xFF, - 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0xDF, 0x60, 0x2A, 0x78, 0xFF, 0xFF, 0x08, 0x60, 0x11, 0xF1, - 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x20, 0x00, 0x74, 0xF3, 0x31, 0x40, - 0x01, 0x2A, 0x1C, 0x00, 0xDC, 0x84, 0x01, 0xB4, 0x74, 0xFB, 0x08, 0x02, 0x08, 0x60, 0x12, 0xF1, - 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x00, 0x08, 0x60, 0x18, 0xF1, - 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x08, 0x00, 0xA9, 0xFE, 0xE6, 0x05, - 0xAB, 0xFE, 0x07, 0x05, 0xA8, 0xFE, 0xD7, 0x05, 0xAA, 0xFE, 0xD8, 0x05, 0xA1, 0xFF, 0xFF, 0xFF, - 0x85, 0x3E, 0x0F, 0x60, 0x85, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x03, 0x02, 0xCA, 0x60, - 0x7E, 0x78, 0xFF, 0xFF, 0x26, 0x45, 0xD4, 0x80, 0x0F, 0xF0, 0xF9, 0x03, 0x64, 0x44, 0x70, 0xB0, - 0x70, 0x2A, 0x13, 0x00, 0x13, 0x60, 0x08, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, 0x00, 0x36, 0x00, 0x3B, - 0xA2, 0xDB, 0xA2, 0xFF, 0x8E, 0xF3, 0xFF, 0xFF, 0xCC, 0x84, 0xFE, 0xA0, 0x8E, 0xFB, 0x01, 0x07, - 0xD4, 0xFE, 0xA3, 0xFF, 0xCE, 0x60, 0x38, 0x78, 0xFF, 0xFF, 0x64, 0x40, 0x02, 0x26, 0x09, 0x00, - 0x66, 0x45, 0x09, 0xF4, 0x0F, 0xF2, 0x02, 0x18, 0x65, 0x46, 0xE4, 0x1B, 0x00, 0x64, 0x40, 0x46, - 0xCD, 0x01, 0xA2, 0xFF, 0x8E, 0xF3, 0x46, 0x46, 0xCC, 0x84, 0xFE, 0xA0, 0x8E, 0xFB, 0x01, 0x07, - 0xD4, 0xFE, 0xA3, 0xFF, 0x0F, 0xF0, 0xA3, 0xFC, 0x64, 0x44, 0x80, 0x26, 0x17, 0x00, 0x25, 0x60, - 0xF0, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, 0x32, 0x44, 0x01, 0x2A, 0x03, 0x00, - 0x07, 0x60, 0x01, 0x64, 0x04, 0x00, 0x02, 0x2A, 0x06, 0x00, 0x00, 0x60, 0x01, 0x64, 0x23, 0xFA, - 0xCE, 0x60, 0x44, 0x78, 0xFF, 0xFF, 0xCE, 0x60, 0x38, 0x78, 0xFF, 0xFF, 0x0F, 0xF0, 0xFF, 0xFF, - 0x64, 0x44, 0x08, 0x26, 0x34, 0x00, 0x2A, 0xF2, 0x60, 0x63, 0x60, 0x40, 0x02, 0x2B, 0x66, 0x63, - 0xBE, 0xD2, 0x68, 0xF1, 0xA3, 0xD2, 0xD0, 0x80, 0x67, 0xF1, 0x0D, 0x02, 0xBF, 0xD2, 0xD0, 0x80, - 0x66, 0xF1, 0x09, 0x02, 0xD0, 0x80, 0xFF, 0xFF, 0x06, 0x02, 0x25, 0x60, 0xFC, 0x64, 0xE5, 0x60, - 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, 0x32, 0x44, 0x01, 0x2A, 0x03, 0x00, 0x07, 0x60, 0x02, 0x64, - 0x04, 0x00, 0x02, 0x2A, 0x06, 0x00, 0x00, 0x60, 0x02, 0x64, 0x23, 0xFA, 0xCE, 0x60, 0x44, 0x78, - 0xFF, 0xFF, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0xB0, 0x3A, 0x06, 0x00, 0x00, 0x60, 0x02, 0x64, - 0x23, 0xFA, 0xCB, 0x60, 0x9D, 0x78, 0xFF, 0xFF, 0xCE, 0x60, 0x38, 0x78, 0xFF, 0xFF, 0x32, 0x44, - 0x01, 0x2A, 0x4A, 0x00, 0x27, 0x60, 0x6A, 0x63, 0xBF, 0xD3, 0x00, 0x65, 0xB4, 0x81, 0xDB, 0x83, - 0x3D, 0x03, 0xBF, 0xD3, 0xA3, 0xD3, 0x40, 0x48, 0xBE, 0xD3, 0x40, 0x4A, 0x2E, 0xF0, 0x40, 0x4C, - 0xD0, 0x80, 0x2D, 0xF0, 0x08, 0x02, 0x2A, 0x44, 0xD0, 0x80, 0x2C, 0xF0, 0x04, 0x02, 0x28, 0x44, - 0xD0, 0x80, 0xFF, 0xFF, 0x2B, 0x03, 0x31, 0xF0, 0x2C, 0x44, 0xD0, 0x80, 0x30, 0xF0, 0x08, 0x02, - 0x2A, 0x44, 0xD0, 0x80, 0x2F, 0xF0, 0x04, 0x02, 0x28, 0x44, 0xD0, 0x80, 0xFF, 0xFF, 0x1E, 0x03, - 0x34, 0xF0, 0x2C, 0x44, 0xD0, 0x80, 0x33, 0xF0, 0x08, 0x02, 0x2A, 0x44, 0xD0, 0x80, 0x32, 0xF0, - 0x04, 0x02, 0x28, 0x44, 0xD0, 0x80, 0xFF, 0xFF, 0x11, 0x03, 0x38, 0xF0, 0x2C, 0x44, 0xD0, 0x80, - 0x37, 0xF0, 0x08, 0x02, 0x2A, 0x44, 0xD0, 0x80, 0x36, 0xF0, 0x04, 0x02, 0x28, 0x44, 0xD0, 0x80, - 0xFF, 0xFF, 0x04, 0x03, 0xFA, 0xA1, 0x06, 0xA3, 0xB7, 0x03, 0xC3, 0x01, 0x07, 0x60, 0x00, 0x64, - 0x23, 0xFA, 0xCE, 0x60, 0x44, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x0F, 0xF0, 0x60, 0x45, 0xA4, 0x36, - 0x08, 0x00, 0x0C, 0xB4, 0x04, 0x36, 0x02, 0x00, 0x0C, 0x3A, 0x06, 0x00, 0xCE, 0x60, 0x38, 0x78, - 0xFF, 0xFF, 0xCC, 0x60, 0x35, 0x78, 0xFF, 0xFF, 0x26, 0xF2, 0x50, 0xF1, 0x60, 0x47, 0x00, 0x7E, - 0xD0, 0x84, 0x1F, 0xA4, 0x06, 0x0E, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, - 0x07, 0x00, 0xC2, 0xA4, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x87, 0xF8, 0xBF, - 0xC0, 0x84, 0xA2, 0xDB, 0x0F, 0xF0, 0x65, 0x40, 0x40, 0x2B, 0x17, 0x00, 0x32, 0x40, 0x08, 0x26, - 0x14, 0x00, 0x07, 0xF4, 0x3A, 0xF2, 0xFF, 0xFF, 0x37, 0xB4, 0x26, 0x46, 0x0E, 0x02, 0x2C, 0xF2, - 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x26, 0x06, 0x00, 0x25, 0x60, 0xF6, 0x64, 0xE5, 0x60, 0x78, 0x41, - 0xC7, 0x78, 0x97, 0xF1, 0xCE, 0x60, 0x38, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x64, 0x40, 0x60, 0x26, - 0x03, 0x00, 0xCC, 0x60, 0x0D, 0x78, 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x3A, 0xF3, 0x01, 0x25, 0x60, - 0xEA, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, 0x27, 0xF2, 0xFF, 0xFF, 0x60, 0x40, - 0x01, 0x3B, 0x07, 0x00, 0x25, 0x60, 0xF8, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, - 0x08, 0x00, 0x02, 0x3B, 0x06, 0x00, 0x25, 0x60, 0xFA, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, - 0x97, 0xF1, 0x2A, 0xF2, 0x28, 0x41, 0x40, 0xA8, 0x01, 0xB1, 0x02, 0x02, 0x43, 0x02, 0x6D, 0x00, - 0x60, 0x40, 0x08, 0x2A, 0x0F, 0x00, 0x25, 0x60, 0xE8, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, - 0x97, 0xF1, 0x1B, 0xF2, 0xFF, 0xFF, 0x60, 0x45, 0x25, 0x60, 0xEE, 0x64, 0xE5, 0x60, 0x78, 0x41, - 0xD3, 0x78, 0x97, 0xF1, 0x0F, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x26, 0x28, 0x00, 0x32, 0x44, - 0x02, 0x26, 0x25, 0x00, 0x10, 0x2B, 0x26, 0x00, 0x27, 0x60, 0x6A, 0x63, 0xBF, 0xD3, 0x2C, 0xF0, - 0x00, 0xA8, 0x60, 0x41, 0x0D, 0x03, 0x50, 0xFE, 0xBD, 0xD3, 0x2D, 0xF0, 0xD0, 0x80, 0xBD, 0xD3, - 0x2E, 0xF0, 0xD0, 0x80, 0xBD, 0xD3, 0x2C, 0xF0, 0xD0, 0x80, 0xFA, 0xA1, 0x10, 0x0C, 0xF3, 0x02, - 0x50, 0xFE, 0x60, 0x60, 0x01, 0x64, 0xD0, 0x80, 0x2D, 0xF0, 0x1D, 0x64, 0xD0, 0x80, 0x2E, 0xF0, - 0x01, 0x64, 0xD0, 0x80, 0xFF, 0xFF, 0x03, 0x0C, 0xCE, 0x60, 0x38, 0x78, 0xFF, 0xFF, 0x32, 0x40, - 0x40, 0x2A, 0x00, 0x00, 0xCD, 0x60, 0xEE, 0x78, 0xFF, 0xFF, 0x32, 0x40, 0x40, 0x26, 0xFA, 0x01, - 0x2A, 0xF0, 0xFF, 0xFF, 0x64, 0x40, 0x08, 0x2A, 0x20, 0x00, 0x32, 0x40, 0x02, 0x2A, 0x1D, 0x00, - 0x03, 0x67, 0xA0, 0x84, 0x00, 0x37, 0x64, 0x63, 0x60, 0x40, 0x02, 0x37, 0x5E, 0x63, 0x60, 0x40, - 0x01, 0x37, 0x58, 0x63, 0x60, 0x40, 0x03, 0x37, 0x0D, 0x00, 0xBD, 0xD2, 0x66, 0xF1, 0xBD, 0xD2, - 0xD0, 0x80, 0x67, 0xF1, 0x07, 0x02, 0xD0, 0x80, 0xBD, 0xD2, 0x68, 0xF1, 0x03, 0x02, 0xD0, 0x80, - 0xFF, 0xFF, 0x03, 0x03, 0xCE, 0x60, 0x38, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x87, 0xF4, 0x60, 0x40, - 0x03, 0x2B, 0x31, 0x00, 0x88, 0xF3, 0x06, 0x61, 0x60, 0x43, 0x66, 0x45, 0x31, 0xF0, 0x63, 0x46, - 0x05, 0xF2, 0x65, 0x46, 0xD0, 0x80, 0x30, 0xF0, 0x0F, 0x02, 0x63, 0x46, 0x04, 0xF2, 0x65, 0x46, - 0xD0, 0x80, 0x2F, 0xF0, 0x09, 0x02, 0x63, 0x46, 0x03, 0xF2, 0x65, 0x46, 0xD0, 0x80, 0xFF, 0xFF, - 0x03, 0x02, 0xFF, 0xFF, 0x48, 0xFE, 0x06, 0x00, 0xCD, 0x81, 0x02, 0xA3, 0xE7, 0x02, 0x87, 0xF1, - 0x08, 0xFE, 0x64, 0x43, 0x03, 0x03, 0xCE, 0x60, 0x38, 0x78, 0xFF, 0xFF, 0x43, 0x43, 0x23, 0x46, - 0x06, 0xF0, 0x26, 0x46, 0x07, 0x67, 0xA0, 0x84, 0x23, 0xFA, 0x64, 0x40, 0x02, 0x26, 0x2B, 0x00, - 0xCE, 0x60, 0x38, 0x78, 0xFF, 0xFF, 0x26, 0x1B, 0x31, 0xF2, 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, - 0x61, 0x46, 0x31, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x30, 0xF0, - 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x2F, 0xF0, 0x63, 0x46, 0xD0, 0x80, - 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0x87, 0xF3, 0x08, 0xFE, - 0x60, 0x43, 0x61, 0x46, 0x43, 0x43, 0x07, 0xFC, 0x43, 0x43, 0x1D, 0xF0, 0xC0, 0x64, 0xC0, 0x84, - 0x0A, 0x60, 0x7B, 0xF1, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xC0, 0x84, - 0xA2, 0xDB, 0x63, 0x45, 0x2A, 0xF2, 0x35, 0xF0, 0x60, 0x40, 0xA4, 0x36, 0x0B, 0x00, 0x08, 0x2B, - 0x0C, 0x00, 0x23, 0x46, 0x26, 0xF2, 0x26, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x06, 0x02, 0xCE, 0x60, - 0x38, 0x78, 0xFF, 0xFF, 0xCD, 0x60, 0xEE, 0x78, 0xFF, 0xFF, 0x23, 0x46, 0x22, 0xF2, 0x26, 0x46, - 0x44, 0x4C, 0x0F, 0x26, 0x19, 0x00, 0x00, 0xBC, 0x40, 0x45, 0x0B, 0x03, 0x00, 0x64, 0x23, 0x46, - 0x22, 0xFA, 0x26, 0x46, 0xA2, 0xFF, 0xB6, 0x60, 0x58, 0x4E, 0x72, 0x78, 0xFF, 0xFF, 0xA3, 0xFF, - 0x26, 0x46, 0x2A, 0xF0, 0x2C, 0x44, 0x64, 0x40, 0x04, 0x27, 0x06, 0x00, 0x23, 0x46, 0x26, 0xFA, - 0x26, 0x46, 0xCD, 0x60, 0xA5, 0x78, 0xFF, 0xFF, 0x3F, 0xF2, 0x02, 0xFA, 0xA2, 0xFF, 0x16, 0xF0, - 0xFF, 0xFF, 0x64, 0x44, 0x01, 0x26, 0xDC, 0x9C, 0x92, 0xF3, 0x2A, 0xF2, 0xDC, 0x83, 0x92, 0xFD, - 0x06, 0xF4, 0x01, 0xF8, 0x26, 0x46, 0x60, 0x40, 0x40, 0x2B, 0x18, 0x00, 0x64, 0x44, 0x00, 0x65, - 0xFF, 0xB4, 0xFC, 0xA4, 0x06, 0xF0, 0x03, 0x03, 0x64, 0x46, 0x0C, 0x0D, 0x02, 0x65, 0x26, 0x46, - 0x00, 0xF2, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x02, 0x03, 0x60, 0x46, 0xF9, 0x01, 0x01, 0xF2, - 0xFF, 0xFF, 0xD4, 0x84, 0x01, 0xFA, 0x66, 0x44, 0x26, 0x46, 0x06, 0xFA, 0x06, 0xF4, 0x00, 0xF2, - 0x80, 0xFC, 0x40, 0x45, 0xB6, 0x60, 0x58, 0x4E, 0x72, 0x78, 0xFF, 0xFF, 0xA3, 0xFF, 0x26, 0x46, - 0x2C, 0x44, 0x0F, 0x26, 0x0F, 0x00, 0x23, 0x46, 0x26, 0xFA, 0x26, 0x44, 0x22, 0xFA, 0x26, 0x46, - 0x00, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0x6E, 0x00, 0xA3, 0x46, 0x26, 0xF2, 0x60, 0x45, 0xDC, 0x84, 0xD4, 0x80, 0x26, 0xFA, - 0xA3, 0x46, 0x6B, 0x02, 0x2A, 0xF0, 0xA3, 0x46, 0x22, 0xF2, 0xA3, 0x46, 0x00, 0xBC, 0x00, 0xF2, - 0x01, 0x02, 0x63, 0x00, 0x44, 0x4C, 0x3F, 0xF0, 0x60, 0x43, 0x23, 0x46, 0x22, 0xF4, 0x09, 0x60, - 0x00, 0x65, 0x3F, 0xF2, 0x26, 0x46, 0xC0, 0x84, 0xD4, 0x80, 0x60, 0x45, 0x56, 0x07, 0x80, 0xFC, - 0x1B, 0xF2, 0x06, 0xF2, 0x60, 0x41, 0x23, 0x46, 0x22, 0xF4, 0x1B, 0xF0, 0x06, 0xF0, 0xC1, 0x81, - 0x06, 0xFA, 0x05, 0xFA, 0x9B, 0xFA, 0x65, 0x44, 0x3F, 0xFA, 0x64, 0x46, 0x00, 0xFC, 0x63, 0x46, - 0x01, 0xF2, 0x10, 0x61, 0xF2, 0xA4, 0x01, 0xFA, 0xC8, 0x83, 0x02, 0x64, 0x59, 0xD0, 0x58, 0xD8, - 0xFD, 0x1F, 0x06, 0x45, 0x00, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x25, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xA2, 0xFF, 0x00, 0xF4, 0x01, 0xF0, 0x0A, 0x18, 0x70, 0x67, - 0xA0, 0x80, 0xF0, 0x67, 0x06, 0x03, 0xC0, 0x84, 0x01, 0xFA, 0x25, 0x46, 0x25, 0x44, 0x80, 0xFC, - 0x05, 0xFA, 0xB6, 0x60, 0x58, 0x4E, 0x72, 0x78, 0xFF, 0xFF, 0xD4, 0xFE, 0xA3, 0xFF, 0x2C, 0x44, - 0x04, 0x27, 0x16, 0x00, 0x23, 0x46, 0x22, 0xF2, 0xA2, 0xFC, 0x60, 0x46, 0x46, 0x46, 0x3F, 0xF2, - 0x00, 0xF4, 0x60, 0x47, 0x08, 0xFA, 0x26, 0x46, 0x2C, 0x43, 0x2A, 0xFC, 0x06, 0xF4, 0x00, 0x64, - 0x00, 0xFA, 0x01, 0xF0, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0x01, 0xFA, 0x26, 0x46, 0x1D, 0x00, - 0x00, 0x66, 0x46, 0x46, 0xCA, 0x60, 0x81, 0x78, 0xFF, 0xFF, 0xA3, 0x46, 0x22, 0xF0, 0xA2, 0xFC, - 0x00, 0x63, 0x33, 0x85, 0xA3, 0x46, 0x0D, 0x03, 0xA3, 0x46, 0x26, 0xF2, 0x0F, 0x65, 0xA4, 0x85, - 0xD4, 0x84, 0x26, 0xFA, 0xA3, 0x46, 0xA2, 0xFF, 0xB6, 0x60, 0x58, 0x4E, 0x72, 0x78, 0xFF, 0xFF, - 0xA3, 0xFF, 0x26, 0x46, 0xCE, 0x60, 0x38, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x32, 0xF0, 0x60, 0x40, - 0x08, 0x2A, 0x24, 0x00, 0x01, 0x2B, 0x13, 0x00, 0x64, 0x40, 0x01, 0x2A, 0x10, 0x00, 0x25, 0x60, - 0xE8, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, 0x1B, 0xF2, 0xFF, 0xFF, 0x60, 0x45, - 0x25, 0x60, 0xEE, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xD3, 0x78, 0x97, 0xF1, 0x0F, 0x00, 0x25, 0x60, - 0xE6, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, 0x1B, 0xF2, 0xFF, 0xFF, 0x60, 0x45, - 0x25, 0x60, 0xEC, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xD3, 0x78, 0x97, 0xF1, 0x07, 0xF4, 0xFF, 0xFF, - 0x26, 0xF2, 0x26, 0x46, 0x0F, 0xB4, 0xDC, 0x85, 0x25, 0x60, 0xEA, 0x64, 0xE5, 0x60, 0x78, 0x41, - 0xD3, 0x78, 0x97, 0xF1, 0x27, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x3B, 0x07, 0x00, 0x25, 0x60, - 0xF8, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, 0x08, 0x00, 0x02, 0x3B, 0x06, 0x00, - 0x25, 0x60, 0xFA, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, 0x07, 0xF2, 0x26, 0xF0, - 0x41, 0x18, 0x60, 0x46, 0xFF, 0x67, 0x20, 0x88, 0x64, 0x5F, 0x40, 0x4A, 0x15, 0xF0, 0x28, 0x44, - 0xD0, 0x84, 0x03, 0xA4, 0x03, 0x0E, 0xE8, 0x84, 0xE8, 0x84, 0x04, 0x00, 0xFA, 0xA4, 0xE8, 0x84, - 0xE8, 0x87, 0xC0, 0xBF, 0xC0, 0x84, 0x15, 0xFA, 0x40, 0x48, 0x14, 0xF0, 0x2A, 0x44, 0xD0, 0x84, - 0x1F, 0xA4, 0x06, 0x0E, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x07, 0x00, - 0xC2, 0xA4, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x87, 0xF8, 0xBF, 0xC0, 0x84, - 0x14, 0xFA, 0x2B, 0x60, 0xEC, 0x63, 0xBD, 0xDB, 0x60, 0x5C, 0x2F, 0x67, 0xD0, 0x80, 0x60, 0x45, - 0x02, 0x28, 0x64, 0x45, 0x28, 0x5C, 0xBD, 0xD9, 0x8B, 0x67, 0xD0, 0x80, 0x60, 0x41, 0x02, 0x24, - 0x64, 0x41, 0xD5, 0x84, 0x80, 0x65, 0xC4, 0x87, 0x01, 0x05, 0x00, 0x64, 0xFF, 0xB4, 0x0E, 0xFA, - 0xA3, 0xDB, 0x26, 0x46, 0xCE, 0x60, 0x7F, 0x78, 0xFF, 0xFF, 0xCA, 0x60, 0x81, 0x78, 0xFF, 0xFF, - 0x1F, 0x60, 0x20, 0x64, 0x40, 0x4B, 0xF6, 0x60, 0x58, 0x4D, 0xB3, 0x78, 0xFF, 0xFF, 0x00, 0x66, - 0x46, 0x46, 0xCA, 0x60, 0x81, 0x78, 0xFF, 0xFF, 0x1F, 0x60, 0x04, 0x64, 0x0F, 0x60, 0x90, 0xFB, - 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF8, 0xFE, 0x00, 0x66, - 0x46, 0x46, 0xCA, 0x60, 0x81, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x58, 0x63, 0x60, 0x47, 0x01, 0x27, - 0x64, 0x63, 0x61, 0x5C, 0x18, 0x60, 0x0F, 0xF9, 0xBD, 0xD0, 0xBD, 0xD0, 0x64, 0x45, 0x64, 0x41, - 0xBD, 0xD0, 0x00, 0xF4, 0x04, 0xF8, 0x83, 0xFA, 0x82, 0xF8, 0xA6, 0x46, 0x02, 0xB0, 0x5E, 0x63, - 0x04, 0x03, 0x64, 0x63, 0x03, 0xB0, 0x02, 0x3A, 0x6C, 0x63, 0x3F, 0xF2, 0xBD, 0xD0, 0xBD, 0xD0, - 0x64, 0x45, 0x64, 0x41, 0xBD, 0xD0, 0xA6, 0x46, 0x07, 0xF8, 0x86, 0xFA, 0x85, 0xF8, 0x60, 0x47, - 0x08, 0xFA, 0x18, 0x60, 0x0F, 0xF1, 0x26, 0x46, 0x64, 0x41, 0x2F, 0x58, 0xFF, 0xFF, 0x2A, 0xF2, - 0x2C, 0xF0, 0x31, 0x40, 0x20, 0x26, 0x09, 0x00, 0x60, 0x40, 0xA4, 0x36, 0x21, 0x00, 0x08, 0x26, - 0x07, 0x00, 0x7D, 0xF1, 0xCF, 0x60, 0x47, 0x78, 0xFF, 0xFF, 0xCF, 0x60, 0x77, 0x78, 0xFF, 0xFF, - 0x64, 0x40, 0x01, 0x26, 0x12, 0x00, 0x3F, 0xF0, 0x32, 0x40, 0x10, 0x2A, 0x0A, 0x00, 0x64, 0x41, - 0x60, 0x40, 0x40, 0x27, 0x06, 0x00, 0xCD, 0x81, 0xDD, 0x81, 0x03, 0x03, 0x02, 0x03, 0x01, 0x61, - 0x01, 0x00, 0x00, 0x61, 0x60, 0x40, 0x18, 0x3A, 0x03, 0x00, 0xCF, 0x60, 0xC9, 0x78, 0xFF, 0xFF, - 0x07, 0xF2, 0x87, 0xF1, 0x66, 0x45, 0xD0, 0x80, 0x60, 0x46, 0x06, 0xF2, 0x65, 0x46, 0x03, 0x03, - 0xFF, 0xFF, 0x02, 0x26, 0x07, 0x00, 0xDD, 0x60, 0x58, 0x4F, 0x90, 0x78, 0xFF, 0xFF, 0xCF, 0x60, - 0xC5, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0xA4, 0x3A, 0x07, 0x00, 0xDF, 0x60, - 0x58, 0x4F, 0xE3, 0x78, 0xFF, 0xFF, 0xCF, 0x60, 0xC5, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0xCE, 0x60, - 0x58, 0x4F, 0x54, 0x78, 0xFF, 0xFF, 0x3F, 0xF2, 0x06, 0x65, 0xD4, 0x80, 0x60, 0x43, 0x5B, 0x04, - 0x00, 0xF4, 0xAA, 0x60, 0xAA, 0x65, 0x09, 0xF2, 0x0A, 0xF0, 0xD4, 0x80, 0x03, 0x64, 0x53, 0x02, - 0xD0, 0x80, 0x00, 0x64, 0x0B, 0xF0, 0x4F, 0x02, 0x64, 0x45, 0xD4, 0x80, 0xF8, 0x7F, 0x08, 0x02, - 0x0C, 0xF0, 0x26, 0x46, 0x64, 0x45, 0x23, 0xF0, 0x20, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0x0B, 0x00, - 0xD4, 0x80, 0x1D, 0x60, 0x60, 0x64, 0x11, 0x02, 0x0C, 0xF0, 0x26, 0x46, 0x64, 0x45, 0x23, 0xF0, - 0x40, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0x65, 0x44, 0x88, 0x3A, 0x35, 0x00, 0x77, 0x37, 0x03, 0x00, - 0x78, 0x37, 0x01, 0x00, 0x8E, 0x37, 0x00, 0x61, 0x2E, 0x00, 0xD4, 0x80, 0x08, 0x65, 0x2B, 0x02, - 0xD7, 0x80, 0x01, 0x60, 0x00, 0x64, 0x0C, 0xF0, 0x26, 0x04, 0xD0, 0x80, 0x0D, 0xF0, 0x23, 0x02, - 0x26, 0x46, 0x14, 0xF2, 0x01, 0x63, 0x02, 0xA8, 0x64, 0x47, 0x1D, 0x03, 0x7F, 0xB4, 0xFD, 0xA0, - 0x06, 0x03, 0x19, 0x07, 0x23, 0xF0, 0x60, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0x6B, 0x00, 0x26, 0x46, - 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x2A, 0x07, 0x00, 0x60, 0x40, 0x48, 0x36, 0x04, 0x00, - 0xD2, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0xD2, 0xFB, 0xE8, 0x60, 0x58, 0x4F, 0xEF, 0x78, 0xFF, 0xFF, - 0xCF, 0x60, 0xC5, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x61, 0x40, 0x01, 0x2A, 0x09, 0x00, 0x25, 0x60, - 0xFE, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, 0xCF, 0x60, 0xC9, 0x78, 0xFF, 0xFF, - 0xDF, 0x60, 0x58, 0x4F, 0xE3, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0xFF, 0xFF, 0xFF, 0xFF, 0x48, 0x36, - 0x88, 0x00, 0xCF, 0x60, 0xD6, 0x78, 0xFF, 0xFF, 0xCF, 0x60, 0xC5, 0x78, 0xFF, 0xFF, 0x60, 0x40, - 0x0C, 0x26, 0x7F, 0x00, 0x64, 0x40, 0x01, 0x2A, 0x7C, 0x00, 0xB0, 0x3A, 0x05, 0x00, 0xD4, 0x60, - 0x58, 0x4F, 0x5A, 0x78, 0xFF, 0xFF, 0x71, 0x00, 0x00, 0x3A, 0x05, 0x00, 0xD7, 0x60, 0x58, 0x4F, - 0xCA, 0x78, 0xFF, 0xFF, 0x6A, 0x00, 0x20, 0x3A, 0x05, 0x00, 0xD7, 0x60, 0x58, 0x4F, 0xCA, 0x78, - 0xFF, 0xFF, 0x63, 0x00, 0xC0, 0x3A, 0x05, 0x00, 0xDC, 0x60, 0x58, 0x4F, 0xFE, 0x78, 0xFF, 0xFF, - 0x5C, 0x00, 0xA0, 0x3A, 0x05, 0x00, 0xDD, 0x60, 0x58, 0x4F, 0x5B, 0x78, 0xFF, 0xFF, 0x55, 0x00, - 0x40, 0x3A, 0x0D, 0x00, 0xE3, 0x60, 0x58, 0x4F, 0xC3, 0x78, 0xFF, 0xFF, 0x4E, 0x00, 0x60, 0x40, - 0x50, 0x3A, 0x05, 0x00, 0xED, 0x60, 0x58, 0x4F, 0xEB, 0x78, 0xFF, 0xFF, 0x46, 0x00, 0xCF, 0x60, - 0xC9, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x2A, 0x07, 0x00, - 0x60, 0x40, 0x48, 0x36, 0x04, 0x00, 0xD2, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0xD2, 0xFB, 0x2A, 0xF2, - 0x3B, 0xF0, 0x60, 0x40, 0x40, 0x2B, 0x04, 0x00, 0x64, 0x40, 0x20, 0x2B, 0x01, 0x00, 0x03, 0x00, - 0xCF, 0x60, 0xB9, 0x78, 0xFF, 0xFF, 0x22, 0xF2, 0xFF, 0xFF, 0x04, 0xB4, 0xFF, 0xFF, 0xF8, 0x03, - 0x23, 0xF2, 0x07, 0xF4, 0xBB, 0xF0, 0x26, 0x46, 0xA4, 0x84, 0xFF, 0xFF, 0x60, 0x40, 0x2F, 0x26, - 0x20, 0x00, 0xC9, 0x60, 0x58, 0x4F, 0xCF, 0x78, 0xFF, 0xFF, 0x64, 0x40, 0x18, 0x36, 0x09, 0x00, - 0x04, 0x65, 0xE5, 0x60, 0x58, 0x4E, 0x27, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0xCF, 0x60, 0xC9, 0x78, - 0xFF, 0xFF, 0x1F, 0x60, 0x04, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF8, 0xFE, 0x0C, 0x00, 0x66, 0x44, 0x00, 0xA8, 0xFF, 0xFF, - 0x0A, 0x03, 0x26, 0x46, 0x1F, 0x60, 0x20, 0x64, 0x40, 0x4B, 0xF6, 0x60, 0x58, 0x4D, 0xB3, 0x78, - 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xCE, 0x60, 0x35, 0x78, 0xFF, 0xFF, 0x14, 0xF2, 0x00, 0x7C, - 0x3E, 0xF8, 0xCC, 0x84, 0xCC, 0x84, 0x18, 0x03, 0x5C, 0x02, 0x11, 0xF2, 0x07, 0xFA, 0xAB, 0xF3, - 0x19, 0xFA, 0xD0, 0x60, 0x58, 0x4E, 0x86, 0x78, 0xFF, 0xFF, 0x1E, 0x60, 0xE0, 0x64, 0x0F, 0x60, - 0x90, 0xFB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC8, 0xFE, - 0xF2, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x8D, 0x00, 0xA2, 0xFF, 0x46, 0x45, 0xB6, 0x60, 0x58, 0x4E, - 0xBB, 0x78, 0xFF, 0xFF, 0xA3, 0xFF, 0x11, 0x03, 0x7E, 0x63, 0x46, 0x4B, 0x25, 0x46, 0xA3, 0xD0, - 0x2B, 0x46, 0xA3, 0xD8, 0xFB, 0x1F, 0x89, 0xFC, 0x8A, 0xFC, 0x88, 0xFC, 0x05, 0x18, 0x64, 0x46, - 0x01, 0xF0, 0x10, 0x67, 0xC0, 0x84, 0x01, 0xFA, 0x08, 0xFE, 0x2B, 0x46, 0x46, 0x46, 0x25, 0x46, - 0xD0, 0x60, 0x58, 0x4E, 0x86, 0x78, 0xFF, 0xFF, 0x13, 0x60, 0x43, 0xF3, 0x87, 0xF3, 0x00, 0xA8, - 0x07, 0xFA, 0x0E, 0x03, 0x1E, 0x60, 0xDA, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x25, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF3, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x0D, 0x00, - 0x1E, 0x60, 0xCE, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x25, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xF4, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x26, 0x44, 0x00, 0xA8, 0xC1, 0xFE, - 0x48, 0x03, 0x26, 0x46, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x2A, 0x07, 0x00, 0x60, 0x40, - 0x48, 0x36, 0x04, 0x00, 0xD2, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0xD2, 0xFB, 0x26, 0x46, 0x2A, 0xF2, - 0x3B, 0xF0, 0x60, 0x40, 0x40, 0x2B, 0x06, 0x00, 0xC0, 0x60, 0x00, 0x64, 0x64, 0x40, 0x20, 0x2B, - 0x01, 0x00, 0x03, 0x00, 0xD0, 0x60, 0x73, 0x78, 0xFF, 0xFF, 0x22, 0xF2, 0xFF, 0xFF, 0x04, 0xB4, - 0xFF, 0xFF, 0xF8, 0x03, 0x23, 0xF2, 0x07, 0xF4, 0xBB, 0xF0, 0x26, 0x46, 0xA4, 0x84, 0xFF, 0xFF, - 0x60, 0x40, 0x2F, 0x26, 0x07, 0x00, 0xC9, 0x60, 0x58, 0x4F, 0xCF, 0x78, 0xFF, 0xFF, 0x64, 0x40, - 0x18, 0x36, 0x09, 0x00, 0x04, 0x65, 0xE5, 0x60, 0x58, 0x4E, 0x27, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0xCF, 0x60, 0xC9, 0x78, 0xFF, 0xFF, 0x1F, 0x60, 0x04, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x26, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF8, 0xFE, 0xF1, 0x64, 0x3B, 0x42, - 0x4A, 0xDB, 0x00, 0x66, 0x46, 0x46, 0xCF, 0x60, 0xC5, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x82, 0x60, - 0xFF, 0x65, 0xA4, 0x87, 0x02, 0xBF, 0x2A, 0xFA, 0x1C, 0xF2, 0x13, 0xFA, 0x32, 0xF2, 0x2C, 0xFA, - 0x33, 0xF2, 0x2D, 0xFA, 0x34, 0xF2, 0x2E, 0xFA, 0x2F, 0xF2, 0x32, 0xFA, 0x30, 0xF2, 0x33, 0xFA, - 0x31, 0xF2, 0x34, 0xFA, 0x66, 0xF3, 0x2F, 0xFA, 0x67, 0xF3, 0x30, 0xFA, 0x68, 0xF3, 0x31, 0xFA, - 0x2E, 0x58, 0xFF, 0xFF, 0xD3, 0x60, 0x59, 0x64, 0x08, 0x60, 0x26, 0xFB, 0x2F, 0x58, 0xFF, 0xFF, - 0xB1, 0xF3, 0x12, 0x60, 0x2C, 0x63, 0xF7, 0xA0, 0xFF, 0xFF, 0x02, 0x06, 0x00, 0x64, 0xB1, 0xFB, - 0xB1, 0xF3, 0xB1, 0xFB, 0x01, 0xA4, 0xCC, 0x84, 0xFF, 0xFF, 0x02, 0x03, 0x2A, 0xA3, 0xFB, 0x01, - 0x63, 0x46, 0x10, 0x60, 0xA6, 0x63, 0x0E, 0x61, 0x60, 0xFE, 0xA6, 0xD1, 0xDE, 0x86, 0x01, 0x64, - 0x64, 0x40, 0x7F, 0x36, 0x00, 0x64, 0xA3, 0xDB, 0xDB, 0x83, 0xA3, 0xD9, 0xCD, 0x81, 0x04, 0xA3, - 0xF4, 0x02, 0x11, 0x60, 0x16, 0x63, 0x1C, 0x61, 0xA6, 0xD1, 0xDE, 0x86, 0x01, 0x64, 0x64, 0x40, - 0x7F, 0x36, 0x00, 0x64, 0xA3, 0xDB, 0xDB, 0x83, 0xA3, 0xD9, 0xCD, 0x81, 0x06, 0xA3, 0xF4, 0x02, - 0x20, 0xFE, 0x13, 0x60, 0x7F, 0xF3, 0x13, 0x60, 0x2D, 0xFB, 0x1E, 0x63, 0x26, 0x60, 0x64, 0x61, - 0x27, 0x60, 0x08, 0x64, 0x58, 0xD1, 0x59, 0xD9, 0xFD, 0x1F, 0x13, 0x60, 0x95, 0xF3, 0x13, 0x60, - 0x43, 0xFB, 0x13, 0x60, 0x96, 0xF3, 0x13, 0x60, 0x44, 0xFB, 0x13, 0x60, 0x9C, 0xF3, 0x13, 0x60, - 0x4A, 0xFB, 0x13, 0x60, 0x9D, 0xF3, 0x13, 0x60, 0x4B, 0xFB, 0x13, 0x60, 0x9E, 0xF3, 0x13, 0x60, - 0x4C, 0xFB, 0x13, 0x60, 0x9F, 0xF3, 0x13, 0x60, 0x4D, 0xFB, 0x13, 0x60, 0x97, 0xF3, 0x13, 0x60, - 0x45, 0xFB, 0x13, 0x60, 0x98, 0xF3, 0x13, 0x60, 0x46, 0xFB, 0x13, 0x60, 0x99, 0xF3, 0x13, 0x60, - 0x47, 0xFB, 0x26, 0x60, 0xB0, 0x63, 0xBD, 0xD1, 0xCB, 0xF9, 0x66, 0xF9, 0xBD, 0xD1, 0xCC, 0xF9, - 0x67, 0xF9, 0xA3, 0xD1, 0xCD, 0xF9, 0x68, 0xF9, 0x01, 0x64, 0x6A, 0xFB, 0x13, 0x60, 0x51, 0xF3, - 0xC4, 0xFB, 0x00, 0x63, 0x4A, 0xFD, 0x5A, 0xFD, 0x6B, 0xFD, 0x6C, 0xFD, 0x13, 0x60, 0x45, 0xF3, - 0x15, 0x60, 0xCB, 0xF1, 0xFF, 0x60, 0xE7, 0x65, 0x32, 0x41, 0xA5, 0x81, 0xFF, 0xA0, 0xFF, 0xFF, - 0x01, 0x03, 0x06, 0x00, 0x13, 0x60, 0x47, 0xF3, 0x08, 0xB9, 0x60, 0x40, 0x01, 0x26, 0x10, 0xB9, - 0x41, 0x52, 0x87, 0xF5, 0x32, 0x44, 0x10, 0xB0, 0xFF, 0xFF, 0x0A, 0x03, 0x14, 0x60, 0x15, 0xF3, - 0x06, 0xF0, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0x80, 0xBF, 0xB0, 0x84, 0x06, 0xFA, - 0x13, 0x60, 0x45, 0xF3, 0x22, 0x7C, 0xFF, 0xA0, 0xFD, 0xA0, 0x05, 0x06, 0x03, 0x03, 0xFE, 0xA0, - 0x04, 0x7C, 0x01, 0x02, 0x3A, 0xF8, 0x13, 0x60, 0x4C, 0xF1, 0x20, 0x44, 0x20, 0xB5, 0x64, 0x41, - 0x00, 0xB9, 0xD4, 0x84, 0x08, 0x28, 0x20, 0xBC, 0x40, 0x40, 0x15, 0x60, 0xCB, 0xF3, 0x30, 0x60, - 0x0E, 0x63, 0xF0, 0x84, 0xF0, 0x84, 0xF0, 0x84, 0x02, 0xB5, 0xF0, 0x84, 0xF0, 0x84, 0x03, 0xB4, - 0x65, 0x5C, 0xA3, 0xD9, 0x02, 0xA8, 0x18, 0x60, 0x08, 0xFB, 0x15, 0x02, 0x00, 0x60, 0xC8, 0x64, - 0x18, 0x60, 0x09, 0xFB, 0x18, 0x60, 0x0D, 0xFB, 0x07, 0x60, 0xD0, 0x64, 0x18, 0x60, 0x0A, 0xFB, - 0x18, 0x60, 0x0E, 0xFB, 0x01, 0x60, 0x90, 0x64, 0x18, 0x60, 0x0B, 0xFB, 0x00, 0x60, 0x64, 0x64, - 0x18, 0x60, 0x0C, 0xFB, 0x06, 0x00, 0x64, 0x64, 0x18, 0x60, 0x0B, 0xFB, 0x64, 0x64, 0x18, 0x60, - 0x0C, 0xFB, 0xB1, 0xF1, 0x10, 0x60, 0xA0, 0x63, 0x2F, 0x18, 0x60, 0x40, 0x01, 0x27, 0x12, 0x00, - 0xCC, 0x84, 0x06, 0xA3, 0xFD, 0x02, 0xA3, 0xD3, 0x10, 0x60, 0xA6, 0x63, 0x25, 0x1B, 0x10, 0x60, - 0xF8, 0x65, 0xA3, 0xD3, 0x06, 0xA3, 0xD7, 0x80, 0x02, 0x1B, 0xFB, 0x04, 0x1D, 0x00, 0xF8, 0xA3, - 0xA3, 0xD3, 0x18, 0x00, 0x11, 0x60, 0x14, 0x63, 0x11, 0x60, 0xF4, 0x65, 0xA3, 0xD1, 0x08, 0xA3, - 0xD0, 0x80, 0xD7, 0x80, 0x02, 0x03, 0xFA, 0x04, 0x0F, 0x00, 0xFA, 0xA3, 0xA3, 0xD3, 0x11, 0x60, - 0x16, 0x63, 0x0A, 0x1B, 0xA3, 0xD3, 0x08, 0xA3, 0xD7, 0x80, 0x02, 0x1B, 0xFB, 0x04, 0x04, 0x00, - 0xF6, 0xA3, 0xA3, 0xD3, 0xC5, 0xFB, 0x64, 0xFB, 0x27, 0x60, 0x34, 0x64, 0x26, 0x60, 0x90, 0x63, - 0xA0, 0xD1, 0xA3, 0xD9, 0x64, 0x41, 0x58, 0xD1, 0x5B, 0xD9, 0x64, 0xF3, 0xFF, 0xFF, 0x60, 0x40, - 0x01, 0x2B, 0x03, 0x00, 0xD1, 0x60, 0xE9, 0x78, 0xFF, 0xFF, 0x91, 0xFA, 0x61, 0x44, 0xEF, 0x60, - 0x58, 0x4E, 0xAB, 0x78, 0xFF, 0xFF, 0x12, 0xFA, 0x15, 0x60, 0xBC, 0xF3, 0x3F, 0x40, 0x01, 0x27, - 0x08, 0x00, 0x0F, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0xEE, 0x60, 0x58, 0x4E, 0x26, 0x78, 0xFF, 0xFF, - 0x06, 0x00, 0x0F, 0x65, 0xA4, 0x84, 0xEE, 0x60, 0x58, 0x4E, 0x26, 0x78, 0xFF, 0xFF, 0x00, 0x65, - 0xEE, 0x60, 0x58, 0x4E, 0xC6, 0x78, 0xFF, 0xFF, 0xEF, 0x60, 0x58, 0x4E, 0x10, 0x78, 0xFF, 0xFF, - 0x15, 0x00, 0x11, 0xF8, 0x64, 0x44, 0xEF, 0x60, 0x58, 0x4E, 0xAB, 0x78, 0xFF, 0xFF, 0x12, 0xFA, - 0x15, 0x60, 0xBD, 0xF3, 0x0F, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0xEE, 0x60, 0x58, 0x4E, 0x26, 0x78, - 0xFF, 0xFF, 0xFF, 0x65, 0xEE, 0x60, 0x58, 0x4E, 0xC6, 0x78, 0xFF, 0xFF, 0xB5, 0xF1, 0x09, 0x60, - 0x2A, 0x64, 0xD0, 0x80, 0x03, 0x64, 0x01, 0x06, 0x06, 0x64, 0xAE, 0xFB, 0x46, 0x48, 0xC3, 0xF3, - 0xFF, 0xFF, 0x60, 0x40, 0x05, 0x3A, 0x03, 0x00, 0x14, 0x60, 0x00, 0x66, 0x11, 0x00, 0x04, 0x3A, - 0x03, 0x00, 0x13, 0x60, 0xF4, 0x66, 0x0C, 0x00, 0x03, 0x3A, 0x03, 0x00, 0x13, 0x60, 0xE8, 0x66, - 0x07, 0x00, 0x02, 0x3A, 0x03, 0x00, 0x13, 0x60, 0xDC, 0x66, 0x02, 0x00, 0x13, 0x60, 0xD0, 0x66, - 0x60, 0xFE, 0xA6, 0xD3, 0xDE, 0x86, 0x10, 0x60, 0x5F, 0xFB, 0xA6, 0xD3, 0xDE, 0x86, 0x21, 0x60, - 0x2F, 0x63, 0xA3, 0xDB, 0x21, 0x60, 0xA7, 0x63, 0xA3, 0xDB, 0xA6, 0xD3, 0xDE, 0x86, 0x10, 0x60, - 0x5E, 0xFB, 0xA6, 0xD3, 0xDE, 0x86, 0x20, 0x60, 0xBF, 0x63, 0xA3, 0xDB, 0x20, 0xFE, 0xA6, 0xD3, - 0xDA, 0x86, 0x60, 0x43, 0x1F, 0xB3, 0x63, 0x5C, 0x1F, 0x60, 0x00, 0xB4, 0xE8, 0x84, 0xE8, 0x84, - 0xE8, 0x84, 0xB0, 0x85, 0x10, 0x60, 0x95, 0xF3, 0xFF, 0xFF, 0xFC, 0x60, 0x00, 0xB4, 0xB4, 0x84, - 0xA2, 0xDB, 0x10, 0x60, 0xD1, 0xFB, 0x21, 0x60, 0xCA, 0x63, 0xA3, 0xD3, 0xA6, 0xD1, 0xDE, 0x86, - 0x80, 0x60, 0x7F, 0xB5, 0x64, 0x44, 0xE8, 0x84, 0x7F, 0x60, 0x80, 0xB4, 0xB4, 0x84, 0xA3, 0xDB, - 0x60, 0xFE, 0xA6, 0xD3, 0xDE, 0x86, 0x10, 0x60, 0x62, 0xFB, 0x20, 0xFE, 0x10, 0x60, 0x2A, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0A, 0x04, 0x40, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, - 0xD2, 0x60, 0x5E, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x64, 0xF1, 0x0F, 0x60, - 0x9D, 0xF9, 0x0C, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x20, 0x44, 0x01, 0x65, 0x34, 0x80, - 0x20, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD2, 0x60, 0x82, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x64, 0xF1, 0x0F, 0x60, - 0x9D, 0xF9, 0x0E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x20, 0x60, 0x00, 0x64, 0x08, 0x60, - 0x16, 0xFB, 0xD2, 0x60, 0x97, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, - 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xBE, 0xFE, 0x08, 0x60, 0x11, 0xF1, 0x40, 0x60, 0x00, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xBE, 0xFE, 0x08, 0x60, 0x11, 0xF1, 0x40, 0x60, 0x00, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x20, 0x40, 0x20, 0x2A, 0x04, 0x00, 0xF0, 0x60, 0x58, 0x4E, - 0x66, 0x78, 0xFF, 0xFF, 0x36, 0x40, 0x08, 0x3A, 0x6A, 0x00, 0x36, 0x40, 0x08, 0x3A, 0x05, 0x00, - 0x10, 0x60, 0x42, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x04, 0x00, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x4E, 0xF3, 0xFF, 0xFF, 0x1D, 0x1B, 0x13, 0x60, 0x54, 0xF3, 0xC7, 0xFB, 0x26, 0x60, - 0x16, 0x65, 0x26, 0x60, 0xB8, 0x61, 0x26, 0x60, 0x14, 0x64, 0x20, 0x63, 0x59, 0xD1, 0x58, 0xD9, - 0xA5, 0xD9, 0xDA, 0x85, 0xFB, 0x1F, 0x00, 0x60, 0x01, 0x64, 0x08, 0x60, 0x22, 0xFB, 0xD3, 0x60, - 0x3C, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x36, 0x40, 0x08, 0x3A, 0x41, 0x00, 0xE7, 0x60, 0xC5, 0x78, - 0xFF, 0xFF, 0x27, 0x60, 0x3E, 0x63, 0x60, 0x41, 0x00, 0x62, 0xCD, 0x81, 0x04, 0xA2, 0xFD, 0x02, - 0x2C, 0x60, 0x3E, 0x61, 0xFC, 0xA2, 0x62, 0x45, 0xC5, 0x81, 0xE0, 0x84, 0xE0, 0x85, 0xC4, 0x85, - 0xC7, 0x83, 0xFE, 0xA5, 0x88, 0xF3, 0xFF, 0xFF, 0xC4, 0x84, 0x66, 0x45, 0x60, 0x46, 0xBD, 0xD1, - 0x03, 0xF8, 0xBD, 0xD1, 0x04, 0xF8, 0xA3, 0xD1, 0x05, 0xF8, 0x06, 0xF2, 0xFF, 0xFF, 0x02, 0x7E, - 0x06, 0xFA, 0x64, 0xF3, 0x61, 0x43, 0x60, 0x40, 0x01, 0x27, 0x02, 0xA3, 0xA3, 0xD1, 0x0F, 0xF8, - 0x16, 0x64, 0x12, 0xFA, 0x01, 0x64, 0x11, 0xFA, 0x66, 0x5C, 0xC1, 0x60, 0x58, 0x4E, 0x93, 0x78, - 0xFF, 0xFF, 0x66, 0x43, 0x32, 0x40, 0x08, 0x2A, 0x0A, 0x00, 0x14, 0x60, 0x15, 0xF3, 0x06, 0xF0, - 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0x80, 0xBF, 0xB0, 0x84, 0x06, 0xFA, 0xC5, 0xFE, - 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x60, 0x30, 0x64, 0x08, 0x60, 0x16, 0xFB, - 0xD2, 0x60, 0xB5, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x2A, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x60, 0x03, 0x64, 0x08, 0x60, 0x22, 0xFB, 0xD2, 0x60, 0xB5, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x42, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x0F, 0x4E, 0xE1, 0x60, 0x58, 0x4F, 0xA9, 0x78, 0xFF, 0xFF, 0x0E, 0x4F, 0x0F, 0x4E, 0xDF, 0x60, - 0x58, 0x4F, 0x0F, 0x78, 0xFF, 0xFF, 0x0E, 0x4F, 0x0F, 0x4E, 0xDE, 0x60, 0x58, 0x4F, 0x9A, 0x78, - 0xFF, 0xFF, 0x0E, 0x4F, 0x0F, 0x4E, 0xDD, 0x60, 0x58, 0x4F, 0xFB, 0x78, 0xFF, 0xFF, 0x0E, 0x4F, - 0xD5, 0x01, 0x4E, 0xF3, 0x7D, 0xF5, 0x60, 0x40, 0xFF, 0x22, 0x0A, 0x00, 0x88, 0xF1, 0xCC, 0x84, - 0xE0, 0x84, 0xC0, 0x86, 0x06, 0xF2, 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, 0x7D, 0xF5, 0x07, 0x00, - 0x08, 0x60, 0x24, 0xF1, 0x00, 0x60, 0x11, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x4E, 0xF3, - 0x66, 0x40, 0xFF, 0x22, 0x05, 0x00, 0xFF, 0x22, 0x39, 0x00, 0xD4, 0x60, 0x0C, 0x78, 0xFF, 0xFF, - 0x02, 0x64, 0x69, 0xFB, 0xFF, 0xFF, 0xC1, 0xFE, 0x69, 0xF3, 0x00, 0x65, 0xD4, 0x80, 0x4E, 0xF3, - 0x0E, 0x03, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x80, 0x60, 0x00, 0x64, 0x08, 0x60, - 0x16, 0xFB, 0xD3, 0x60, 0x7C, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, - 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0A, 0x04, 0x20, 0x60, 0x00, 0x64, 0x08, 0x60, - 0x16, 0xFB, 0xD3, 0x60, 0x8F, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xD3, 0xF3, - 0xFF, 0xFF, 0xFE, 0xB4, 0xD3, 0xFB, 0x1F, 0x60, 0x3A, 0x62, 0x06, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x2D, 0xFF, 0x20, 0x44, 0x01, 0xB5, 0x54, 0x80, 0xDA, 0xFE, 0xBE, 0xFE, 0x87, 0xF1, 0x02, 0x64, - 0x86, 0xF3, 0xC0, 0x83, 0x40, 0x48, 0x75, 0xFD, 0xE7, 0x60, 0x58, 0x4E, 0x81, 0x78, 0xFF, 0xFF, - 0x28, 0x44, 0x4C, 0x88, 0x75, 0xF3, 0x02, 0x65, 0xC4, 0x83, 0xF5, 0x02, 0x1E, 0x60, 0x58, 0x4E, - 0xB9, 0x78, 0xFF, 0xFF, 0x17, 0x60, 0x06, 0x64, 0x0B, 0x60, 0x82, 0xFB, 0x4A, 0xDF, 0x01, 0x60, - 0xFE, 0x63, 0x15, 0x60, 0x00, 0x61, 0x00, 0x64, 0x59, 0xDB, 0xFE, 0x1F, 0x7D, 0xF1, 0x1E, 0x60, - 0xE0, 0x61, 0x64, 0x40, 0xFF, 0x26, 0x38, 0x00, 0xD4, 0x60, 0x58, 0x4E, 0x0F, 0x78, 0xFF, 0xFF, - 0x1E, 0x60, 0xCE, 0x61, 0xD4, 0x60, 0x58, 0x4E, 0x0F, 0x78, 0xFF, 0xFF, 0x1E, 0x60, 0xD4, 0x61, - 0xD4, 0x60, 0x58, 0x4E, 0x0F, 0x78, 0xFF, 0xFF, 0x1E, 0x60, 0xE6, 0x61, 0xD4, 0x60, 0x58, 0x4E, - 0x0F, 0x78, 0xFF, 0xFF, 0x1E, 0x60, 0xEC, 0x61, 0xD4, 0x60, 0x58, 0x4E, 0x0F, 0x78, 0xFF, 0xFF, - 0x1E, 0x60, 0xF8, 0x61, 0xD4, 0x60, 0x58, 0x4E, 0x0F, 0x78, 0xFF, 0xFF, 0x1F, 0x60, 0x04, 0x61, - 0xD4, 0x60, 0x58, 0x4E, 0x0F, 0x78, 0xFF, 0xFF, 0x1E, 0x60, 0xF2, 0x61, 0xD4, 0x60, 0x58, 0x4E, - 0x0F, 0x78, 0xFF, 0xFF, 0x1E, 0x60, 0xDA, 0x61, 0xD4, 0x60, 0x58, 0x4E, 0x3A, 0x78, 0xFF, 0xFF, - 0x00, 0x64, 0x08, 0x60, 0x15, 0xFB, 0x5A, 0xDB, 0xC5, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xA1, 0xD3, - 0x0E, 0x57, 0x23, 0x00, 0x0E, 0xF2, 0x44, 0x4C, 0x80, 0xB0, 0x10, 0xB0, 0x0A, 0x03, 0x00, 0x64, - 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0x13, 0x00, 0x12, 0x02, 0xF0, 0x37, 0x09, 0x00, 0x02, 0xF0, 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, - 0xA2, 0xFF, 0x8F, 0xF3, 0x02, 0x02, 0xCC, 0x84, 0x8F, 0xFB, 0x1F, 0x60, 0x20, 0x64, 0x40, 0x4B, - 0xF6, 0x60, 0x58, 0x4D, 0xB3, 0x78, 0xFF, 0xFF, 0x2C, 0x44, 0xAC, 0x86, 0x09, 0xF0, 0xDA, 0x02, - 0x37, 0x58, 0xFF, 0xFF, 0xA1, 0xD3, 0x0E, 0x57, 0x18, 0x00, 0x0E, 0xF2, 0x44, 0x4C, 0x80, 0xB0, - 0x10, 0xB0, 0x0A, 0x03, 0x00, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x08, 0x00, 0x07, 0x02, 0x1F, 0x60, 0x20, 0x64, 0x40, 0x4B, - 0xF6, 0x60, 0x58, 0x4D, 0xB3, 0x78, 0xFF, 0xFF, 0x2C, 0x44, 0xAC, 0x86, 0x09, 0xF0, 0xE5, 0x02, - 0x37, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0xB0, 0x64, 0x2A, 0xFA, 0x2F, 0xF2, - 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, 0x31, 0xF2, 0x2E, 0xFA, 0xCB, 0xF3, 0x2F, 0xFA, 0xCC, 0xF3, - 0x30, 0xFA, 0xCD, 0xF3, 0x31, 0xFA, 0x66, 0xF3, 0x32, 0xFA, 0x67, 0xF3, 0x33, 0xFA, 0x68, 0xF3, - 0x34, 0xFA, 0xAB, 0xF1, 0x19, 0xF8, 0x06, 0x63, 0x3F, 0xFC, 0x1C, 0xF2, 0x13, 0xFA, 0x00, 0x64, - 0x3E, 0xFA, 0x07, 0xF2, 0x87, 0xF1, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x0C, 0x03, 0x60, 0x46, - 0x06, 0xF2, 0x26, 0x46, 0x01, 0xB0, 0xFF, 0xFF, 0x03, 0x02, 0xD6, 0x60, 0x40, 0x78, 0xFF, 0xFF, - 0xD7, 0x60, 0x92, 0x78, 0xFF, 0xFF, 0x00, 0xF4, 0x0A, 0xF2, 0x09, 0xF2, 0xFF, 0xA0, 0x00, 0xA0, - 0x13, 0x02, 0xFF, 0xA0, 0x04, 0x03, 0x08, 0x03, 0xD4, 0x60, 0xAF, 0x78, 0xFF, 0xFF, 0x02, 0x64, - 0x55, 0xFB, 0xD4, 0x60, 0xBA, 0x78, 0xFF, 0xFF, 0x01, 0x63, 0x32, 0x40, 0x08, 0x2A, 0x0F, 0x00, - 0x55, 0xFD, 0xD4, 0x60, 0xBA, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x00, 0xF4, 0x0A, 0xF2, 0x0E, 0x63, - 0x01, 0xA4, 0x0A, 0xFA, 0x0B, 0xFC, 0x43, 0x59, 0xD7, 0x60, 0x6C, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0x00, 0xF4, 0x0A, 0xF2, 0x0D, 0x63, 0x01, 0xA4, 0x0A, 0xFA, 0x0B, 0xFC, 0x43, 0x59, 0xD7, 0x60, - 0x6C, 0x78, 0xFF, 0xFF, 0x87, 0xF5, 0x00, 0xF2, 0x26, 0x46, 0x00, 0xA0, 0x2E, 0xF0, 0x37, 0x03, - 0x66, 0x41, 0x15, 0x60, 0x02, 0x65, 0x64, 0x47, 0x00, 0x7F, 0x87, 0xF1, 0xE0, 0x84, 0x44, 0xD3, - 0x64, 0x43, 0x11, 0x18, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xFC, 0x1B, 0x66, 0x44, 0x64, 0x46, - 0x80, 0xF0, 0x60, 0x46, 0x80, 0xF8, 0x65, 0x46, 0x65, 0x43, 0x80, 0xF0, 0x01, 0xFA, 0x80, 0xFC, - 0x64, 0x46, 0x80, 0xF8, 0x0B, 0x00, 0x64, 0x46, 0x62, 0x43, 0x00, 0xF2, 0xA3, 0xDB, 0x60, 0x46, - 0x80, 0xF0, 0x81, 0xFC, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x60, 0x43, 0x61, 0x46, 0x86, 0xF1, - 0x17, 0x60, 0x02, 0x61, 0xA1, 0xD3, 0xDA, 0x81, 0xD0, 0x80, 0xDC, 0x9C, 0x05, 0x05, 0xA1, 0xD3, - 0x4A, 0xD9, 0xA0, 0xDD, 0xDA, 0x9C, 0xA1, 0xD9, 0xD6, 0x60, 0x09, 0x78, 0xFF, 0xFF, 0x0B, 0x60, - 0x81, 0xF3, 0xFF, 0xFF, 0x62, 0x18, 0x17, 0x60, 0x02, 0x64, 0x04, 0xA5, 0xA0, 0xD1, 0x72, 0x44, - 0xFF, 0xB4, 0x64, 0x40, 0xE0, 0x22, 0x1F, 0xB4, 0x64, 0x40, 0xF8, 0x22, 0x07, 0xB4, 0x02, 0x00, - 0x03, 0x04, 0xD0, 0x84, 0xD0, 0x80, 0xFC, 0x01, 0xE0, 0x84, 0x44, 0xD3, 0xFF, 0xFF, 0x60, 0x43, - 0x66, 0x41, 0x63, 0x46, 0x05, 0xF2, 0x00, 0xF0, 0x81, 0xF0, 0x02, 0x18, 0x64, 0x46, 0x81, 0xF8, - 0x07, 0x1B, 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD9, 0x02, 0x00, - 0x65, 0x46, 0x00, 0xF8, 0x87, 0xF3, 0x63, 0x45, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xD4, 0x80, - 0x01, 0x18, 0xFA, 0x04, 0x80, 0xF8, 0x65, 0x46, 0x00, 0xFA, 0x06, 0xF2, 0xFF, 0xFF, 0x00, 0x7E, - 0x06, 0xFA, 0x61, 0x46, 0x2E, 0xF0, 0x66, 0x41, 0x15, 0x60, 0x02, 0x65, 0x64, 0x47, 0x00, 0x7F, - 0x87, 0xF1, 0xE0, 0x84, 0x44, 0xD3, 0x64, 0x43, 0x11, 0x18, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, - 0xFC, 0x1B, 0x66, 0x44, 0x64, 0x46, 0x80, 0xF0, 0x60, 0x46, 0x80, 0xF8, 0x65, 0x46, 0x65, 0x43, - 0x80, 0xF0, 0x01, 0xFA, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x0B, 0x00, 0x64, 0x46, 0x62, 0x43, - 0x00, 0xF2, 0xA3, 0xDB, 0x60, 0x46, 0x80, 0xF0, 0x81, 0xFC, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, - 0x60, 0x43, 0x61, 0x46, 0xD6, 0x60, 0x09, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x02, 0x61, 0xB5, 0x60, - 0x58, 0x4D, 0xA2, 0x78, 0xFF, 0xFF, 0x86, 0xF1, 0x72, 0x44, 0xFF, 0xB4, 0xD0, 0x80, 0xFF, 0xFF, - 0x02, 0x04, 0xD0, 0x84, 0xFB, 0x01, 0xE0, 0x83, 0x87, 0xF3, 0x02, 0xA3, 0x43, 0x93, 0x66, 0x44, - 0x00, 0xA8, 0x56, 0xFD, 0x3A, 0x03, 0x00, 0x64, 0x2B, 0xFA, 0x00, 0x60, 0xC0, 0x64, 0x2A, 0xFA, - 0x66, 0x45, 0x63, 0x46, 0x03, 0xF2, 0x04, 0xF0, 0x85, 0xF2, 0x65, 0x46, 0x2C, 0xFA, 0x2D, 0xF8, - 0xAE, 0xFA, 0xCB, 0xF3, 0x2F, 0xFA, 0x32, 0xFA, 0xCC, 0xF3, 0x30, 0xFA, 0x33, 0xFA, 0xCD, 0xF3, - 0x31, 0xFA, 0x34, 0xFA, 0xAB, 0xF1, 0x19, 0xF8, 0xFF, 0x67, 0x0E, 0xFA, 0x66, 0x41, 0x43, 0x49, - 0x29, 0x46, 0x92, 0xF0, 0x2C, 0x60, 0x26, 0x63, 0x47, 0xD3, 0x61, 0x46, 0x02, 0x63, 0x00, 0x7E, - 0x13, 0xFA, 0x3F, 0xFC, 0x00, 0x64, 0x3E, 0xFA, 0x87, 0xF3, 0x07, 0xFA, 0x66, 0x41, 0x00, 0xF4, - 0x05, 0x64, 0x09, 0xFA, 0x1E, 0x60, 0xD4, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x61, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x56, 0xF3, 0xA3, 0xFF, 0x60, 0x43, - 0xE7, 0x60, 0x58, 0x4E, 0x81, 0x78, 0xFF, 0xFF, 0x56, 0xF3, 0xFF, 0xFF, 0x40, 0x58, 0x03, 0x65, - 0xE5, 0x60, 0x58, 0x4E, 0x51, 0x78, 0xFF, 0xFF, 0x56, 0xF3, 0x26, 0x46, 0x60, 0x43, 0x66, 0x41, - 0x63, 0x46, 0x05, 0xF2, 0x00, 0xF0, 0x81, 0xF0, 0x02, 0x18, 0x64, 0x46, 0x81, 0xF8, 0x07, 0x1B, - 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD9, 0x02, 0x00, 0x65, 0x46, - 0x00, 0xF8, 0x87, 0xF3, 0x63, 0x45, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x18, - 0xFA, 0x04, 0x80, 0xF8, 0x65, 0x46, 0x00, 0xFA, 0x06, 0xF2, 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, - 0x61, 0x46, 0x2E, 0xF0, 0x66, 0x41, 0x15, 0x60, 0x02, 0x65, 0x64, 0x47, 0x00, 0x7F, 0x87, 0xF1, - 0xE0, 0x84, 0x44, 0xD3, 0x64, 0x43, 0x11, 0x18, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xFC, 0x1B, - 0x66, 0x44, 0x64, 0x46, 0x80, 0xF0, 0x60, 0x46, 0x80, 0xF8, 0x65, 0x46, 0x65, 0x43, 0x80, 0xF0, - 0x01, 0xFA, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x0B, 0x00, 0x64, 0x46, 0x62, 0x43, 0x00, 0xF2, - 0xA3, 0xDB, 0x60, 0x46, 0x80, 0xF0, 0x81, 0xFC, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x60, 0x43, - 0x61, 0x46, 0x2C, 0xF2, 0x2D, 0xF0, 0xAE, 0xF2, 0x66, 0x45, 0x63, 0x46, 0x03, 0xFA, 0x04, 0xF8, - 0x55, 0xF3, 0x85, 0xFA, 0xFF, 0xA0, 0x65, 0x46, 0x03, 0x03, 0xD7, 0x60, 0xAE, 0x78, 0xFF, 0xFF, - 0x94, 0xF3, 0x66, 0x45, 0x63, 0x46, 0x1F, 0xFA, 0x65, 0x46, 0xBA, 0x65, 0x60, 0x44, 0xC4, 0x85, - 0x01, 0x60, 0xFE, 0x61, 0x00, 0x64, 0x80, 0x63, 0xC7, 0x85, 0x94, 0x84, 0x59, 0xDB, 0xFC, 0x1F, - 0x00, 0x60, 0x88, 0x64, 0x3F, 0xFA, 0x00, 0xF4, 0x02, 0x64, 0x0A, 0xFA, 0x00, 0x64, 0x0B, 0xFA, - 0x80, 0x7F, 0x10, 0x7E, 0x0C, 0xFA, 0x1A, 0x65, 0x80, 0x61, 0x02, 0x60, 0x00, 0x63, 0x0F, 0x4E, - 0xF8, 0x60, 0x58, 0x4F, 0x7A, 0x78, 0xFF, 0xFF, 0x0E, 0x4F, 0xD7, 0x60, 0x80, 0x78, 0xFF, 0xFF, - 0x26, 0x46, 0x23, 0xF0, 0x00, 0x60, 0x02, 0x64, 0xA0, 0x80, 0x00, 0xF4, 0x03, 0x03, 0xD7, 0x60, - 0x2A, 0x78, 0xFF, 0xFF, 0x09, 0xF2, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0xA0, 0x0C, 0x03, 0x03, 0x03, - 0xD6, 0x60, 0xA7, 0x78, 0xFF, 0xFF, 0x0A, 0xF2, 0x26, 0x46, 0xFF, 0xA0, 0x87, 0xF4, 0x10, 0x02, - 0xD7, 0x60, 0xAE, 0x78, 0xFF, 0xFF, 0x0A, 0xF2, 0xFF, 0xFF, 0xFF, 0xA0, 0xFD, 0xA0, 0x02, 0x03, - 0x04, 0x03, 0x06, 0x00, 0xD6, 0x60, 0xE6, 0x78, 0xFF, 0xFF, 0xD6, 0x60, 0xF1, 0x78, 0xFF, 0xFF, - 0x26, 0x46, 0x87, 0xF4, 0x66, 0x41, 0x63, 0x46, 0x05, 0xF2, 0x00, 0xF0, 0x81, 0xF0, 0x02, 0x18, - 0x64, 0x46, 0x81, 0xF8, 0x07, 0x1B, 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD9, 0x02, 0x00, 0x65, 0x46, 0x00, 0xF8, 0x87, 0xF3, 0x63, 0x45, 0x60, 0x46, 0x00, 0xF2, - 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x18, 0xFA, 0x04, 0x80, 0xF8, 0x65, 0x46, 0x00, 0xFA, 0x06, 0xF2, - 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, 0x61, 0x46, 0x0B, 0x60, 0x82, 0xF3, 0xDA, 0x81, 0x60, 0x45, - 0xD5, 0x80, 0xA1, 0xD1, 0x11, 0x03, 0xD3, 0x80, 0xD9, 0x81, 0xFA, 0x02, 0xC9, 0x81, 0xC8, 0x85, - 0xD5, 0x80, 0xA5, 0xD3, 0x08, 0x28, 0xA1, 0xDB, 0x17, 0x60, 0x04, 0x62, 0x65, 0x44, 0xA2, 0xDB, - 0x4A, 0xD3, 0xFF, 0xFF, 0xCC, 0x84, 0xA2, 0xDB, 0xD4, 0x60, 0xA4, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0x87, 0xF4, 0x66, 0x41, 0x63, 0x46, 0x05, 0xF2, 0x00, 0xF0, 0x81, 0xF0, 0x02, 0x18, 0x64, 0x46, - 0x81, 0xF8, 0x07, 0x1B, 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD9, - 0x02, 0x00, 0x65, 0x46, 0x00, 0xF8, 0x87, 0xF3, 0x63, 0x45, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, - 0xD4, 0x80, 0x01, 0x18, 0xFA, 0x04, 0x80, 0xF8, 0x65, 0x46, 0x00, 0xFA, 0x06, 0xF2, 0xFF, 0xFF, - 0x00, 0x7E, 0x06, 0xFA, 0x61, 0x46, 0x0B, 0x60, 0x82, 0xF3, 0xDA, 0x81, 0x60, 0x45, 0xD5, 0x80, - 0xA1, 0xD1, 0x11, 0x03, 0xD3, 0x80, 0xD9, 0x81, 0xFA, 0x02, 0xC9, 0x81, 0xC8, 0x85, 0xD5, 0x80, - 0xA5, 0xD3, 0x08, 0x28, 0xA1, 0xDB, 0x17, 0x60, 0x04, 0x62, 0x65, 0x44, 0xA2, 0xDB, 0x4A, 0xD3, - 0xFF, 0xFF, 0xCC, 0x84, 0xA2, 0xDB, 0xD4, 0x60, 0xAF, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x32, 0x44, - 0x08, 0xB0, 0x87, 0xF4, 0x03, 0x02, 0xD4, 0x60, 0xAF, 0x78, 0xFF, 0xFF, 0xD6, 0x60, 0x18, 0x78, - 0xFF, 0xFF, 0x32, 0x44, 0x26, 0x46, 0x08, 0xB0, 0x07, 0xF2, 0x03, 0x02, 0xD4, 0x60, 0xAF, 0x78, - 0xFF, 0xFF, 0x60, 0x46, 0x1F, 0xF2, 0x26, 0x46, 0xBA, 0x65, 0x60, 0x44, 0xC4, 0x85, 0x01, 0x60, - 0xFE, 0x61, 0x00, 0x64, 0x80, 0x63, 0xC7, 0x85, 0x94, 0x84, 0x59, 0xDB, 0xFC, 0x1F, 0x00, 0xF4, - 0x01, 0x60, 0xFE, 0x61, 0x7E, 0x65, 0x18, 0x63, 0x5B, 0xD2, 0x59, 0xD1, 0xFF, 0xFF, 0xD0, 0x80, - 0xD7, 0x80, 0x18, 0x02, 0xF9, 0x02, 0x00, 0xF4, 0x02, 0x63, 0x0E, 0x65, 0x5B, 0xD2, 0x59, 0xD1, - 0xFF, 0xFF, 0xD0, 0x80, 0xD7, 0x80, 0x0E, 0x02, 0xF9, 0x02, 0x26, 0x46, 0x07, 0xF4, 0x06, 0xF2, - 0xFF, 0xFF, 0x01, 0x7E, 0x06, 0xFA, 0x26, 0x46, 0x00, 0xF4, 0x04, 0x64, 0x0A, 0xFA, 0x00, 0x64, - 0x0B, 0xFA, 0x56, 0x00, 0x26, 0x46, 0x87, 0xF4, 0x66, 0x41, 0x63, 0x46, 0x05, 0xF2, 0x00, 0xF0, - 0x81, 0xF0, 0x02, 0x18, 0x64, 0x46, 0x81, 0xF8, 0x07, 0x1B, 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD9, 0x02, 0x00, 0x65, 0x46, 0x00, 0xF8, 0x87, 0xF3, 0x63, 0x45, - 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x18, 0xFA, 0x04, 0x80, 0xF8, 0x65, 0x46, - 0x00, 0xFA, 0x06, 0xF2, 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, 0x61, 0x46, 0x0B, 0x60, 0x82, 0xF3, - 0xDA, 0x81, 0x60, 0x45, 0xD5, 0x80, 0xA1, 0xD1, 0x11, 0x03, 0xD3, 0x80, 0xD9, 0x81, 0xFA, 0x02, - 0xC9, 0x81, 0xC8, 0x85, 0xD5, 0x80, 0xA5, 0xD3, 0x08, 0x28, 0xA1, 0xDB, 0x17, 0x60, 0x04, 0x62, - 0x65, 0x44, 0xA2, 0xDB, 0x4A, 0xD3, 0xFF, 0xFF, 0xCC, 0x84, 0xA2, 0xDB, 0x00, 0xF4, 0x04, 0x64, - 0x0A, 0xFA, 0x0F, 0x64, 0x0B, 0xFA, 0x40, 0x59, 0x02, 0x60, 0x00, 0x61, 0x41, 0x58, 0x26, 0x46, - 0x2C, 0xF2, 0xA1, 0xDB, 0x2D, 0xF2, 0x59, 0xDB, 0x2E, 0xF2, 0x59, 0xDB, 0x03, 0x65, 0xE5, 0x60, - 0x58, 0x4E, 0x27, 0x78, 0xFF, 0xFF, 0x03, 0x65, 0xE5, 0x60, 0x58, 0x4E, 0x51, 0x78, 0xFF, 0xFF, - 0x26, 0x46, 0x87, 0xF3, 0x07, 0xFA, 0x1E, 0x60, 0xD4, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x26, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x66, 0x46, 0x46, - 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0xF4, 0x0A, 0xF2, 0x09, 0xF2, 0xFF, 0xA0, 0x00, 0xA0, 0x06, 0x02, - 0xFF, 0xA0, 0x07, 0x03, 0x09, 0x03, 0xD6, 0x60, 0xA7, 0x78, 0xFF, 0xFF, 0xD6, 0x60, 0x68, 0x78, - 0xFF, 0xFF, 0xD7, 0x60, 0xB3, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x07, 0xF4, 0x06, 0xF2, 0x66, 0x43, - 0x00, 0x7E, 0x06, 0xFA, 0x26, 0x46, 0xD6, 0x60, 0x18, 0x78, 0xFF, 0xFF, 0x63, 0x46, 0x06, 0xF2, - 0xFF, 0xFF, 0x01, 0x7E, 0x06, 0xFA, 0x26, 0x46, 0x87, 0xF3, 0x07, 0xFA, 0x00, 0xF4, 0x02, 0x64, - 0x0A, 0xFA, 0x00, 0x64, 0x0B, 0xFA, 0x1E, 0x60, 0xD4, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x26, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x66, 0x46, 0x46, - 0x2F, 0x58, 0xFF, 0xFF, 0x01, 0x61, 0x00, 0x60, 0x10, 0x7C, 0x2A, 0xF2, 0x0C, 0x60, 0x70, 0xFB, - 0xFF, 0xB4, 0x16, 0x60, 0x83, 0xFB, 0x60, 0x40, 0x00, 0x36, 0x03, 0x00, 0x02, 0x61, 0x00, 0x60, - 0x30, 0x7C, 0x41, 0x47, 0x2A, 0xF8, 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, 0x31, 0xF2, - 0x2E, 0xFA, 0xCB, 0xF3, 0x2F, 0xFA, 0xCC, 0xF3, 0x30, 0xFA, 0xCD, 0xF3, 0x31, 0xFA, 0x66, 0xF3, - 0x32, 0xFA, 0x67, 0xF3, 0x33, 0xFA, 0x68, 0xF3, 0x34, 0xFA, 0xAB, 0xF1, 0x19, 0xF8, 0x00, 0x7C, - 0x3E, 0xF8, 0x1C, 0xF0, 0x13, 0xF8, 0x07, 0xF2, 0x87, 0xF1, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, - 0x03, 0x02, 0xDC, 0x60, 0x55, 0x78, 0xFF, 0xFF, 0x40, 0x4B, 0x01, 0x65, 0xEF, 0x60, 0x58, 0x4E, - 0xDC, 0x78, 0xFF, 0xFF, 0xAB, 0x46, 0x06, 0xF2, 0xAB, 0x46, 0x00, 0xF4, 0x01, 0xB0, 0xFF, 0xFF, - 0x03, 0x02, 0xDC, 0x60, 0x55, 0x78, 0xFF, 0xFF, 0x09, 0xF2, 0x16, 0x60, 0x84, 0xFB, 0x5A, 0x84, - 0x00, 0x63, 0x60, 0x40, 0x20, 0x26, 0x02, 0xBB, 0x60, 0x40, 0x04, 0x27, 0x04, 0xBB, 0xAB, 0x46, - 0x78, 0xFC, 0xAB, 0x46, 0xFF, 0xFF, 0x10, 0xB0, 0x80, 0x60, 0x00, 0x63, 0x0C, 0x03, 0x13, 0x60, - 0x45, 0xF1, 0xFF, 0xFF, 0x64, 0x44, 0xFE, 0x26, 0x08, 0x00, 0x32, 0x40, 0x08, 0x26, 0x06, 0x00, - 0xDC, 0x60, 0xB9, 0x78, 0xFF, 0xFF, 0x32, 0x40, 0x10, 0x2A, 0x00, 0x63, 0xAB, 0x46, 0x06, 0xF0, - 0x7F, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0x63, 0x45, 0xB4, 0x84, 0x06, 0xFA, 0xAB, 0x46, 0x0A, 0xF0, - 0x56, 0xF9, 0x24, 0xD9, 0x5A, 0x84, 0x01, 0x63, 0x32, 0x40, 0x10, 0x26, 0x10, 0xBB, 0x13, 0x60, - 0x45, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0xFE, 0x26, 0x10, 0xBB, 0x15, 0x60, 0xDD, 0xF1, 0x63, 0x44, - 0x20, 0xBC, 0xFB, 0x60, 0xFF, 0xB7, 0x64, 0x40, 0x10, 0x26, 0x04, 0xBC, 0x60, 0x47, 0x60, 0x43, - 0x09, 0xFC, 0x27, 0x44, 0xFE, 0xA0, 0xFF, 0xFF, 0x03, 0x03, 0xD8, 0x60, 0xC8, 0x78, 0xFF, 0xFF, - 0x18, 0x60, 0xD6, 0x64, 0x24, 0x43, 0x0B, 0xF0, 0xA0, 0xD9, 0xBD, 0xD9, 0x0C, 0xF0, 0x58, 0xD9, - 0xBD, 0xD9, 0x0D, 0xF0, 0x58, 0xD9, 0xBD, 0xD9, 0x43, 0x44, 0x26, 0x46, 0x87, 0xF2, 0x3F, 0xF2, - 0x41, 0x4B, 0x00, 0xF4, 0x60, 0x43, 0xF6, 0xA3, 0x00, 0x60, 0x1B, 0x61, 0x00, 0x60, 0x01, 0x65, - 0x01, 0x60, 0xFF, 0x64, 0x40, 0x4C, 0xEF, 0x60, 0x58, 0x4E, 0x79, 0x78, 0xFF, 0xFF, 0x00, 0xBB, - 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x64, 0x40, 0x4A, 0x60, 0xFE, 0x02, 0x60, 0x00, 0x63, 0xBD, 0xD3, - 0xBD, 0xD3, 0x60, 0x41, 0xF0, 0x60, 0x58, 0x4E, 0x27, 0x78, 0xFF, 0xFF, 0x20, 0xFE, 0x26, 0x46, - 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x43, 0xF6, 0xA3, 0x00, 0x60, 0x1B, 0x61, 0x00, 0x60, 0x32, 0x65, - 0x01, 0x60, 0xFF, 0x64, 0x40, 0x4C, 0xEF, 0x60, 0x58, 0x4E, 0x79, 0x78, 0xFF, 0xFF, 0x00, 0xBB, - 0xFF, 0xFF, 0x0B, 0x03, 0x60, 0xFE, 0x02, 0x60, 0x00, 0x63, 0xBD, 0xD3, 0xBD, 0xD3, 0x60, 0x41, - 0xF0, 0x60, 0x58, 0x4E, 0x27, 0x78, 0xFF, 0xFF, 0x00, 0x00, 0x20, 0xFE, 0x30, 0x60, 0x20, 0x61, - 0xA1, 0xD1, 0x82, 0xF3, 0x01, 0x60, 0x6E, 0x63, 0x60, 0x45, 0x2A, 0x44, 0x60, 0xFB, 0xA3, 0xD5, - 0x65, 0x40, 0x01, 0x27, 0x5B, 0xD5, 0x65, 0x40, 0x01, 0x27, 0x59, 0xD1, 0x66, 0x41, 0xA0, 0x84, - 0x24, 0x94, 0x2B, 0x46, 0x0F, 0xFA, 0x61, 0xFB, 0x16, 0x64, 0x12, 0xFA, 0x01, 0x64, 0x11, 0xFA, - 0x66, 0x5C, 0xC1, 0x60, 0x58, 0x4E, 0x93, 0x78, 0xFF, 0xFF, 0xD9, 0x60, 0x28, 0x78, 0xFF, 0xFF, - 0x26, 0x46, 0x87, 0xF2, 0x3F, 0xF2, 0x41, 0x4B, 0x00, 0xF4, 0x60, 0x43, 0xFC, 0xA3, 0x00, 0x60, - 0x15, 0x61, 0x00, 0x60, 0x01, 0x65, 0x01, 0x60, 0xFF, 0x64, 0x40, 0x4C, 0xEF, 0x60, 0x58, 0x4E, - 0x79, 0x78, 0xFF, 0xFF, 0x00, 0xBB, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x64, 0x40, 0x4A, 0x60, 0xFE, - 0x02, 0x60, 0x00, 0x63, 0xBD, 0xD3, 0xBD, 0xD3, 0x60, 0x41, 0xF0, 0x60, 0x58, 0x4E, 0x27, 0x78, - 0xFF, 0xFF, 0x20, 0xFE, 0x26, 0x46, 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x43, 0xFC, 0xA3, 0x00, 0x60, - 0x15, 0x61, 0x00, 0x60, 0x32, 0x65, 0x01, 0x60, 0xFF, 0x64, 0x40, 0x4C, 0xEF, 0x60, 0x58, 0x4E, - 0x79, 0x78, 0xFF, 0xFF, 0x00, 0xBB, 0xFF, 0xFF, 0x0B, 0x03, 0x60, 0xFE, 0x02, 0x60, 0x00, 0x63, - 0xBD, 0xD3, 0xBD, 0xD3, 0x60, 0x41, 0xF0, 0x60, 0x58, 0x4E, 0x27, 0x78, 0xFF, 0xFF, 0x00, 0x00, - 0x20, 0xFE, 0x30, 0x60, 0x20, 0x61, 0xA1, 0xD1, 0x82, 0xF3, 0x01, 0x60, 0x6E, 0x63, 0x60, 0x45, - 0x2A, 0x44, 0x60, 0xFB, 0xA3, 0xD5, 0x65, 0x40, 0x01, 0x27, 0x5B, 0xD5, 0x65, 0x40, 0x01, 0x27, - 0x59, 0xD1, 0x66, 0x41, 0xA0, 0x84, 0x24, 0x94, 0x2B, 0x46, 0x0F, 0xFA, 0x61, 0xFB, 0x16, 0x64, - 0x12, 0xFA, 0x01, 0x64, 0x11, 0xFA, 0x66, 0x5C, 0xC1, 0x60, 0x58, 0x4E, 0x93, 0x78, 0xFF, 0xFF, - 0x2B, 0x46, 0x0F, 0xF2, 0x12, 0x63, 0x7C, 0x18, 0x26, 0x46, 0x87, 0xF2, 0x01, 0x65, 0x41, 0x4B, - 0xAB, 0x46, 0x0F, 0xF2, 0xFF, 0xFF, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xFF, 0x22, - 0x00, 0x65, 0x78, 0xF2, 0xFF, 0xFF, 0xB4, 0x84, 0x78, 0xFA, 0xAB, 0x46, 0xFF, 0xFF, 0x26, 0x46, - 0x3F, 0xF2, 0x00, 0xF4, 0x16, 0x65, 0x27, 0x40, 0x02, 0x3A, 0x03, 0x00, 0x1C, 0x65, 0xF6, 0xA4, - 0x01, 0x00, 0xFC, 0xA4, 0x24, 0x43, 0x2D, 0x60, 0x5E, 0x61, 0x5D, 0x91, 0x51, 0x90, 0xFF, 0xFF, - 0x04, 0x28, 0x60, 0x41, 0xCD, 0x84, 0x4C, 0x91, 0x60, 0x43, 0x60, 0xFE, 0xA5, 0xD2, 0xDE, 0x85, - 0x7F, 0x26, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x5D, 0x93, 0xA3, 0xDB, 0x5D, 0x93, 0xA5, 0xD2, - 0xF6, 0x1F, 0x5D, 0x93, 0x20, 0xFE, 0xDF, 0x83, 0x2D, 0x60, 0x04, 0x7C, 0x03, 0x1E, 0x60, 0xFE, - 0xBD, 0xDF, 0x20, 0xFE, 0x2D, 0x60, 0x08, 0x64, 0x53, 0x93, 0xA4, 0xDD, 0x26, 0x46, 0x00, 0xF4, - 0x13, 0x60, 0x44, 0xF3, 0x00, 0x63, 0x00, 0xB8, 0x0A, 0xFC, 0x03, 0x02, 0xD9, 0x60, 0xCF, 0x78, - 0xFF, 0xFF, 0x0B, 0xF2, 0x27, 0x40, 0x02, 0x3A, 0x02, 0x00, 0x0E, 0xF2, 0xFF, 0xFF, 0x60, 0x47, - 0x00, 0x3A, 0x25, 0x00, 0x60, 0x41, 0x00, 0x36, 0x22, 0x00, 0xE0, 0xA0, 0xDA, 0x85, 0x1F, 0x07, - 0x13, 0x60, 0x0B, 0xF1, 0x65, 0x42, 0xD1, 0x80, 0x26, 0x60, 0x18, 0x63, 0x18, 0x02, 0x50, 0xFE, - 0x61, 0x40, 0xFE, 0x22, 0x08, 0x00, 0x62, 0x45, 0xBD, 0xD3, 0xA5, 0xD0, 0xDA, 0x82, 0xD0, 0x80, - 0xC9, 0x81, 0xF6, 0x0C, 0x0C, 0x00, 0x61, 0x40, 0x00, 0x36, 0x31, 0x00, 0x62, 0x45, 0xA3, 0xD3, - 0xA5, 0xD0, 0xFF, 0xFF, 0x90, 0x80, 0xFF, 0x26, 0x02, 0x00, 0xDE, 0x82, 0x28, 0x00, 0x0C, 0x63, - 0x0A, 0xFC, 0x00, 0x64, 0x09, 0xFA, 0x0B, 0xFA, 0x01, 0x7E, 0x0C, 0xFA, 0x26, 0x46, 0x08, 0x64, - 0x3F, 0xFA, 0x07, 0xF2, 0x87, 0xF1, 0x40, 0x58, 0x07, 0xF8, 0x1E, 0x60, 0xD4, 0x64, 0x0F, 0x60, - 0x90, 0xFB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, - 0xDC, 0x60, 0xD4, 0x78, 0xFF, 0xFF, 0x20, 0xFE, 0x16, 0x60, 0x50, 0xF3, 0xFF, 0xFF, 0x22, 0xB0, - 0xFF, 0xFF, 0x03, 0x03, 0xDB, 0x60, 0xB1, 0x78, 0xFF, 0xFF, 0x01, 0x63, 0xD9, 0x01, 0x13, 0x60, - 0x45, 0xF3, 0xFF, 0xFF, 0xFF, 0xA4, 0xFF, 0xFF, 0x0C, 0x20, 0x03, 0x00, 0xDB, 0x60, 0xB1, 0x78, - 0xFF, 0xFF, 0x00, 0x64, 0x16, 0x60, 0x56, 0xFB, 0x16, 0x60, 0x57, 0xFB, 0x16, 0x60, 0x58, 0xFB, - 0x16, 0x60, 0x5A, 0xFB, 0x16, 0x60, 0x5B, 0xFB, 0x16, 0x60, 0x5C, 0xFB, 0x16, 0x60, 0x5D, 0xFB, - 0x18, 0x60, 0x17, 0xFB, 0x2B, 0x46, 0x3B, 0xF2, 0x7F, 0x60, 0xCF, 0x65, 0xA4, 0x84, 0xA2, 0xDA, - 0x26, 0x46, 0x00, 0xF4, 0x0B, 0xF2, 0x27, 0x40, 0x02, 0x3A, 0x02, 0x00, 0x0E, 0xF2, 0xFF, 0xFF, - 0xCE, 0x81, 0x20, 0xFE, 0x30, 0x60, 0x28, 0x64, 0x40, 0x4A, 0xDA, 0x60, 0x58, 0x4D, 0x62, 0x78, - 0xFF, 0xFF, 0x20, 0xFE, 0x18, 0x60, 0x17, 0xF3, 0xFF, 0xFF, 0x08, 0x18, 0x18, 0x60, 0x19, 0xF3, - 0x18, 0x60, 0x1A, 0xF5, 0x60, 0x41, 0x30, 0x60, 0x2E, 0x62, 0xA2, 0xDF, 0x2A, 0xD1, 0xDA, 0x85, - 0x64, 0x44, 0x01, 0xA0, 0xFF, 0xFF, 0x01, 0x02, 0x75, 0x00, 0x45, 0x4A, 0x7C, 0x44, 0x60, 0xFE, - 0xA1, 0xD2, 0xFF, 0xFF, 0xD0, 0x80, 0x20, 0xFE, 0x01, 0x03, 0xE3, 0x01, 0x30, 0x60, 0x2E, 0x62, - 0xA2, 0xDF, 0x60, 0xFE, 0x5D, 0xD2, 0xFF, 0xFF, 0x60, 0x5C, 0x41, 0x94, 0x81, 0xA0, 0x20, 0xFE, - 0x2D, 0x04, 0x01, 0x64, 0x18, 0x60, 0x17, 0xFB, 0xC1, 0x84, 0x84, 0xA4, 0x18, 0x60, 0x19, 0xFB, - 0x00, 0xF2, 0x18, 0x60, 0x1A, 0xFB, 0x18, 0x60, 0x18, 0xFD, 0x02, 0x60, 0x00, 0x63, 0xCD, 0x85, - 0x64, 0x44, 0xD8, 0x81, 0xCD, 0x84, 0x4C, 0x91, 0x60, 0x43, 0x60, 0xFE, 0xA5, 0xD2, 0xDE, 0x85, - 0x7F, 0x26, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x5D, 0x93, 0xA3, 0xDB, 0x5D, 0x93, 0xA5, 0xD2, - 0xF6, 0x1F, 0x5D, 0x93, 0x20, 0xFE, 0xDF, 0x83, 0x00, 0x60, 0x01, 0x61, 0x02, 0x60, 0x00, 0x64, - 0xE0, 0x87, 0x60, 0x46, 0x18, 0x60, 0x18, 0xF3, 0xFF, 0xFF, 0x60, 0x43, 0x60, 0xFE, 0xCD, 0x81, - 0x20, 0xFE, 0x2A, 0x44, 0x00, 0x60, 0x02, 0x65, 0x44, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x60, - 0x5C, 0x78, 0xFF, 0xFF, 0x18, 0x60, 0x17, 0xF3, 0xFF, 0xFF, 0x08, 0x18, 0x18, 0x60, 0x19, 0xF3, - 0x18, 0x60, 0x1A, 0xF5, 0x60, 0x41, 0x30, 0x60, 0x2E, 0x62, 0xA2, 0xDF, 0x66, 0x5C, 0x26, 0x46, - 0x00, 0xF2, 0x64, 0x46, 0x58, 0x90, 0xFF, 0xFF, 0x03, 0x02, 0x61, 0x44, 0x0B, 0xA5, 0x04, 0x00, - 0x61, 0x44, 0xFC, 0xA4, 0x8B, 0x7C, 0xC0, 0x85, 0xDD, 0x81, 0x66, 0x44, 0x18, 0x60, 0x1A, 0xFB, - 0x26, 0x46, 0x1B, 0xF0, 0x18, 0x60, 0x1A, 0xF5, 0x64, 0x44, 0xD4, 0x80, 0xFF, 0xFF, 0xD7, 0x06, - 0x2D, 0x58, 0xFF, 0xFF, 0x60, 0xFE, 0x5D, 0xD2, 0xFF, 0xFF, 0x20, 0xFE, 0xFF, 0xB4, 0x41, 0x94, - 0x81, 0xA0, 0xFF, 0xFF, 0x02, 0x04, 0x00, 0xF4, 0x84, 0xA4, 0x60, 0x41, 0x62, 0x01, 0x60, 0xFE, - 0x5D, 0xD2, 0xFF, 0xFF, 0xFA, 0xA4, 0xFF, 0xFF, 0x04, 0x20, 0x02, 0x00, 0xFF, 0xA1, 0x61, 0x01, - 0x5D, 0xD0, 0xFF, 0xFF, 0x64, 0x40, 0x00, 0x36, 0x02, 0x00, 0xC9, 0x81, 0x5A, 0x01, 0x5D, 0xD0, - 0xFF, 0xFF, 0x64, 0x40, 0x50, 0x36, 0x02, 0x00, 0xFD, 0xA1, 0x53, 0x01, 0x5D, 0xD0, 0xFF, 0xFF, - 0x64, 0x40, 0xF2, 0x36, 0x04, 0x00, 0xFC, 0xA1, 0xDA, 0x60, 0x01, 0x78, 0xFF, 0xFF, 0x5D, 0xD0, - 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x36, 0x04, 0x00, 0xFB, 0xA1, 0xDA, 0x60, 0x01, 0x78, 0xFF, 0xFF, - 0x5D, 0xD0, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x36, 0x04, 0x00, 0xFA, 0xA1, 0xDA, 0x60, 0x01, 0x78, - 0xFF, 0xFF, 0x5D, 0xD0, 0xFF, 0xFF, 0x64, 0x40, 0x00, 0x36, 0x04, 0x00, 0xF9, 0xA1, 0xDA, 0x60, - 0x01, 0x78, 0xFF, 0xFF, 0x60, 0x5C, 0x00, 0x36, 0x2A, 0x00, 0x00, 0x64, 0xDB, 0x60, 0x58, 0x4E, - 0x16, 0x78, 0xFF, 0xFF, 0x16, 0x60, 0x5A, 0xFB, 0x64, 0x40, 0x00, 0x36, 0x25, 0x00, 0x5D, 0xD2, - 0xDD, 0x81, 0xDB, 0x60, 0x58, 0x4E, 0x16, 0x78, 0xFF, 0xFF, 0x16, 0x60, 0x5B, 0xFB, 0x64, 0x40, - 0x00, 0x36, 0x1F, 0x00, 0x5D, 0xD2, 0xDD, 0x81, 0xDB, 0x60, 0x58, 0x4E, 0x16, 0x78, 0xFF, 0xFF, - 0x16, 0x60, 0x5C, 0xFB, 0x64, 0x40, 0x00, 0x36, 0x19, 0x00, 0x5D, 0xD0, 0x16, 0x60, 0x5D, 0xF9, - 0x5D, 0xD0, 0x2C, 0x60, 0xBB, 0x62, 0xA2, 0xD9, 0xD9, 0x60, 0xF9, 0x78, 0xFF, 0xFF, 0x20, 0xFE, - 0x00, 0x60, 0x04, 0x64, 0x16, 0x60, 0x5A, 0xFB, 0x20, 0xFE, 0x00, 0x60, 0x04, 0x64, 0x16, 0x60, - 0x5B, 0xFB, 0x20, 0xFE, 0x00, 0x60, 0x02, 0x64, 0x16, 0x60, 0x5C, 0xFB, 0x20, 0xFE, 0x00, 0x60, - 0x00, 0x64, 0x16, 0x60, 0x5D, 0xFB, 0xD9, 0x60, 0xF9, 0x78, 0xFF, 0xFF, 0x16, 0x60, 0x5E, 0xFB, - 0xE0, 0x84, 0xE0, 0x84, 0x03, 0x02, 0x01, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x02, 0xA5, 0x64, 0x44, - 0xD4, 0x9C, 0x16, 0x60, 0x5F, 0xF9, 0x2C, 0x60, 0xC0, 0x62, 0xA2, 0xDF, 0x5D, 0xD0, 0x00, 0x65, - 0x64, 0x40, 0x00, 0x3A, 0x01, 0x65, 0x5D, 0xD0, 0xFF, 0xFF, 0x64, 0x40, 0x50, 0x3A, 0x01, 0x65, - 0x5D, 0xD0, 0xFF, 0xFF, 0x64, 0x40, 0xF2, 0x3A, 0x01, 0x65, 0x5D, 0xD0, 0x65, 0x40, 0x00, 0x3A, - 0x17, 0x00, 0x00, 0x60, 0x00, 0x65, 0x64, 0x40, 0x00, 0x36, 0x01, 0x65, 0x64, 0x40, 0x01, 0x36, - 0x02, 0x65, 0x64, 0x40, 0x02, 0x36, 0x04, 0x65, 0x64, 0x40, 0x04, 0x36, 0x10, 0x65, 0x64, 0x40, - 0x05, 0x36, 0x20, 0x65, 0x65, 0x5C, 0x16, 0x60, 0x60, 0xF3, 0xFF, 0xFF, 0xB0, 0x84, 0xA2, 0xDB, - 0x16, 0x60, 0x5E, 0xF3, 0xFF, 0xFF, 0xFF, 0xA4, 0xA2, 0xDB, 0xD0, 0x02, 0x16, 0x60, 0x60, 0xF3, - 0x16, 0x60, 0x5F, 0xF1, 0x2E, 0x58, 0xFF, 0xFF, 0x20, 0xFE, 0x16, 0x60, 0x50, 0xF1, 0x16, 0x60, - 0x5A, 0xF3, 0xFF, 0xFF, 0xA0, 0x84, 0xFF, 0xFF, 0x10, 0x26, 0x09, 0x00, 0x04, 0x26, 0x09, 0x00, - 0x20, 0x26, 0x09, 0x00, 0x02, 0x26, 0x09, 0x00, 0xD9, 0x60, 0xC3, 0x78, 0xFF, 0xFF, 0x10, 0x7C, - 0x05, 0x00, 0x04, 0x7C, 0x03, 0x00, 0x20, 0x7C, 0x01, 0x00, 0x02, 0x7C, 0x16, 0x60, 0x56, 0xF9, - 0x16, 0x60, 0x51, 0xF1, 0x16, 0x60, 0x5B, 0xF3, 0x2C, 0x60, 0xAC, 0x62, 0xA0, 0x84, 0xA2, 0xD1, - 0xFF, 0xFF, 0x10, 0x26, 0x07, 0x00, 0x04, 0x26, 0x07, 0x00, 0x01, 0x26, 0x0D, 0x00, 0xD9, 0x60, - 0xC3, 0x78, 0xFF, 0xFF, 0x10, 0x7C, 0x09, 0x00, 0x64, 0x40, 0x10, 0x22, 0x03, 0x00, 0xD9, 0x60, - 0xC3, 0x78, 0xFF, 0xFF, 0x04, 0x7C, 0x01, 0x00, 0x01, 0x7C, 0x16, 0x60, 0x57, 0xF9, 0x16, 0x60, - 0x52, 0xF1, 0x16, 0x60, 0x5C, 0xF3, 0xFF, 0xFF, 0xA0, 0x84, 0x02, 0x26, 0x07, 0x00, 0x04, 0x26, - 0x07, 0x00, 0x01, 0x26, 0x07, 0x00, 0xD9, 0x60, 0xC3, 0x78, 0xFF, 0xFF, 0x02, 0x7C, 0x03, 0x00, - 0x04, 0x7C, 0x01, 0x00, 0x20, 0x7C, 0x16, 0x60, 0x58, 0xF9, 0x16, 0x60, 0x5D, 0xF1, 0x16, 0x60, - 0x59, 0xF9, 0x16, 0x60, 0x58, 0xF3, 0x16, 0x60, 0x57, 0xF1, 0x60, 0x47, 0xB0, 0x84, 0x13, 0x60, - 0x45, 0xF1, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x36, 0x22, 0xBC, 0xAB, 0x46, 0x3A, 0xFA, 0xAB, 0x46, - 0x16, 0x60, 0x56, 0xF3, 0x13, 0x60, 0x45, 0xF1, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x36, 0x22, 0xBC, - 0x87, 0xF1, 0x66, 0x41, 0x64, 0x46, 0x3A, 0xFA, 0xFF, 0xFF, 0x61, 0x46, 0xAB, 0x46, 0x82, 0xF0, - 0xC0, 0x67, 0xB4, 0x84, 0xAB, 0x46, 0x0B, 0xFA, 0x13, 0x60, 0x4D, 0xF1, 0x2D, 0x60, 0xBE, 0x7C, - 0x04, 0x1B, 0xFF, 0x60, 0xFF, 0x63, 0xA4, 0xDD, 0x26, 0x00, 0x2E, 0x60, 0x34, 0x63, 0xA4, 0xDD, - 0xDB, 0x83, 0x60, 0xFE, 0x00, 0x64, 0xBD, 0xDB, 0x60, 0x64, 0xBD, 0xDB, 0x1D, 0x64, 0xBD, 0xDB, - 0xC3, 0xF3, 0xBD, 0xDB, 0x20, 0xFE, 0x01, 0x60, 0x78, 0x64, 0x06, 0x61, 0x58, 0xD1, 0xFF, 0xFF, - 0x60, 0xFE, 0xBD, 0xD9, 0x20, 0xFE, 0xCD, 0x81, 0x61, 0x40, 0x08, 0x28, 0xF7, 0x01, 0xB6, 0xF1, - 0xFF, 0xFF, 0x64, 0x47, 0x60, 0xFE, 0xBD, 0xD9, 0xBD, 0xDB, 0x20, 0xFE, 0x13, 0x60, 0x4B, 0xF1, - 0x60, 0xFE, 0xBD, 0xD9, 0x20, 0xFE, 0x2D, 0x60, 0xBC, 0x64, 0x40, 0x48, 0x18, 0x61, 0x26, 0x46, - 0x00, 0xF4, 0xFF, 0x60, 0xF2, 0x64, 0xE4, 0x60, 0x58, 0x4D, 0xA7, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0x3F, 0xFC, 0x2B, 0x46, 0x56, 0xF1, 0x1F, 0xF8, 0x0C, 0x60, 0x70, 0xF1, 0x10, 0x60, 0x00, 0x64, - 0xA0, 0x80, 0x06, 0xF2, 0x0B, 0x03, 0x10, 0xBC, 0x06, 0xFA, 0x86, 0xF3, 0x00, 0x60, 0x70, 0xF3, - 0x60, 0x45, 0xD4, 0x80, 0xDC, 0x84, 0x07, 0x07, 0xA2, 0xDB, 0x05, 0x00, 0x10, 0xB5, 0xFF, 0xFF, - 0x02, 0x03, 0xD4, 0x84, 0x06, 0xFA, 0x07, 0xF2, 0x66, 0x45, 0x60, 0x46, 0x06, 0xF2, 0x65, 0x46, - 0x02, 0xB0, 0xFF, 0xFF, 0x11, 0x03, 0x26, 0x46, 0x87, 0xF3, 0x07, 0xFA, 0x1E, 0x60, 0xD4, 0x64, - 0x0F, 0x60, 0x90, 0xFB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xC1, 0xFE, 0x00, 0x66, 0x46, 0x46, 0x50, 0x00, 0x26, 0x46, 0x87, 0xF3, 0x07, 0xFA, 0x1E, 0x60, - 0xD4, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x66, 0x46, 0x46, 0x19, 0x00, 0x00, 0x60, 0xC0, 0x64, 0x2A, 0xFA, - 0x02, 0x64, 0x3F, 0xFA, 0x87, 0xF3, 0x07, 0xFA, 0x00, 0xF4, 0x09, 0x64, 0x09, 0xFA, 0x1E, 0x60, - 0xD4, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x2B, 0x43, 0x0B, 0x60, - 0x82, 0xF3, 0xDA, 0x81, 0x60, 0x45, 0xD5, 0x80, 0xA1, 0xD1, 0x11, 0x03, 0xD3, 0x80, 0xD9, 0x81, - 0xFA, 0x02, 0xC9, 0x81, 0xC8, 0x85, 0xD5, 0x80, 0xA5, 0xD3, 0x08, 0x28, 0xA1, 0xDB, 0x17, 0x60, - 0x04, 0x62, 0x65, 0x44, 0xA2, 0xDB, 0x4A, 0xD3, 0xFF, 0xFF, 0xCC, 0x84, 0xA2, 0xDB, 0xAB, 0x46, - 0x06, 0xF2, 0xFF, 0xFF, 0x02, 0xBC, 0x06, 0xFA, 0x78, 0xF2, 0x15, 0x60, 0xDC, 0xF3, 0x60, 0x45, - 0xA4, 0x84, 0x15, 0x60, 0xDC, 0xFB, 0xAB, 0x46, 0xAB, 0x46, 0x0F, 0x60, 0xFF, 0x64, 0x02, 0xF0, - 0x71, 0xF1, 0xA0, 0x84, 0xD0, 0x80, 0x02, 0xFA, 0xAB, 0x46, 0x01, 0x06, 0x71, 0xFB, 0x27, 0x41, - 0x01, 0xB1, 0xFF, 0xFF, 0x08, 0x03, 0x2B, 0x46, 0x0B, 0x58, 0x01, 0x65, 0xE5, 0x60, 0x58, 0x4E, - 0x51, 0x78, 0xFF, 0xFF, 0x0A, 0x00, 0x2B, 0x46, 0x0B, 0x58, 0x18, 0x60, 0xD6, 0x64, 0x40, 0x59, - 0x02, 0x65, 0xE5, 0x60, 0x58, 0x4E, 0x51, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, - 0xFF, 0xFF, 0x26, 0x46, 0x00, 0xF4, 0x00, 0x64, 0x09, 0xFA, 0x0B, 0xFA, 0x01, 0x7E, 0x0C, 0xFA, - 0x0A, 0x64, 0x0A, 0xFA, 0x26, 0x46, 0x08, 0x64, 0x3F, 0xFA, 0x07, 0xF2, 0x87, 0xF1, 0x40, 0x58, - 0x07, 0xF8, 0x1E, 0x60, 0xD4, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0xFF, 0x60, 0xFD, 0x65, 0x38, 0x46, 0x06, 0xF2, - 0xFF, 0xFF, 0xA4, 0x83, 0x06, 0xFC, 0x02, 0xB0, 0x26, 0x46, 0x1C, 0x03, 0x38, 0x43, 0x86, 0xF1, - 0x17, 0x60, 0x02, 0x61, 0xA1, 0xD3, 0xDA, 0x81, 0xD0, 0x80, 0xDC, 0x9C, 0x05, 0x05, 0xA1, 0xD3, - 0x4A, 0xD9, 0xA0, 0xDD, 0xDA, 0x9C, 0xA1, 0xD9, 0x02, 0x60, 0x00, 0x61, 0x2C, 0xF2, 0xA1, 0xDB, - 0x2D, 0xF2, 0x41, 0x58, 0x59, 0xDB, 0x2E, 0xF2, 0x59, 0xDB, 0x03, 0x65, 0xE5, 0x60, 0x58, 0x4E, - 0x51, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x07, 0xF2, 0x87, 0xF1, - 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0x2F, 0x58, 0xFF, 0xFF, 0x40, 0x47, 0x07, 0xF2, - 0x66, 0x45, 0x60, 0x46, 0x06, 0xF2, 0x65, 0x46, 0x02, 0xB0, 0xFF, 0xFF, 0x1A, 0x02, 0x27, 0x43, - 0x0B, 0x60, 0x82, 0xF3, 0xDA, 0x81, 0x60, 0x45, 0xD5, 0x80, 0xA1, 0xD1, 0x11, 0x03, 0xD3, 0x80, - 0xD9, 0x81, 0xFA, 0x02, 0xC9, 0x81, 0xC8, 0x85, 0xD5, 0x80, 0xA5, 0xD3, 0x08, 0x28, 0xA1, 0xDB, - 0x17, 0x60, 0x04, 0x62, 0x65, 0x44, 0xA2, 0xDB, 0x4A, 0xD3, 0xFF, 0xFF, 0xCC, 0x84, 0xA2, 0xDB, - 0x0C, 0x00, 0x27, 0x44, 0x40, 0x58, 0x03, 0x65, 0xE5, 0x60, 0x58, 0x4E, 0x51, 0x78, 0xFF, 0xFF, - 0x27, 0x43, 0xE7, 0x60, 0x58, 0x4E, 0x81, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x87, 0xF4, 0x66, 0x41, - 0x63, 0x46, 0x05, 0xF2, 0x00, 0xF0, 0x81, 0xF0, 0x02, 0x18, 0x64, 0x46, 0x81, 0xF8, 0x07, 0x1B, - 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD9, 0x02, 0x00, 0x65, 0x46, - 0x00, 0xF8, 0x87, 0xF3, 0x63, 0x45, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x18, - 0xFA, 0x04, 0x80, 0xF8, 0x65, 0x46, 0x00, 0xFA, 0x06, 0xF2, 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, - 0x61, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x07, 0xF2, 0x87, 0xF1, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, - 0x02, 0x02, 0x2F, 0x58, 0xFF, 0xFF, 0x40, 0x47, 0x07, 0xF2, 0x66, 0x45, 0x60, 0x46, 0x06, 0xF2, - 0x65, 0x46, 0x02, 0xB0, 0xFF, 0xFF, 0x02, 0x02, 0x2F, 0x58, 0xFF, 0xFF, 0x27, 0x46, 0x06, 0xF0, - 0xFF, 0x60, 0xED, 0x64, 0xA0, 0x84, 0x06, 0xFA, 0x27, 0x43, 0x86, 0xF1, 0x17, 0x60, 0x02, 0x61, - 0xA1, 0xD3, 0xDA, 0x81, 0xD0, 0x80, 0xDC, 0x9C, 0x05, 0x05, 0xA1, 0xD3, 0x4A, 0xD9, 0xA0, 0xDD, - 0xDA, 0x9C, 0xA1, 0xD9, 0x07, 0x58, 0x03, 0x65, 0xE5, 0x60, 0x58, 0x4E, 0x51, 0x78, 0xFF, 0xFF, - 0x27, 0x43, 0xE7, 0x60, 0x58, 0x4E, 0x81, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, - 0x26, 0x46, 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, 0x31, 0xF2, 0x2E, 0xFA, 0xCB, 0xF3, - 0x2F, 0xFA, 0xCC, 0xF3, 0x30, 0xFA, 0xCD, 0xF3, 0x31, 0xFA, 0x66, 0xF3, 0x32, 0xFA, 0x67, 0xF3, - 0x33, 0xFA, 0x68, 0xF3, 0x34, 0xFA, 0xAB, 0xF1, 0x19, 0xF8, 0x00, 0x65, 0xEF, 0x60, 0x58, 0x4E, - 0xDC, 0x78, 0xFF, 0xFF, 0x61, 0x44, 0x15, 0x60, 0xC2, 0xFB, 0x02, 0x63, 0x3F, 0xFC, 0x00, 0x64, - 0x3E, 0xFA, 0x02, 0x60, 0x00, 0x61, 0x2C, 0xF2, 0xA1, 0xDB, 0x2D, 0xF2, 0x41, 0x58, 0x59, 0xDB, - 0x2E, 0xF2, 0x59, 0xDB, 0x06, 0x63, 0x07, 0xF2, 0x87, 0xF1, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, - 0x0D, 0x02, 0x43, 0x59, 0x02, 0x65, 0xE5, 0x60, 0x58, 0x4E, 0x27, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0xC0, 0x64, 0x2A, 0xFA, 0x00, 0xF4, 0x06, 0x64, 0x09, 0xFA, 0x15, 0x00, 0x07, 0xF2, 0x66, 0x45, - 0x60, 0x46, 0x06, 0xF2, 0x65, 0x46, 0x02, 0xB0, 0xFF, 0xFF, 0x1D, 0x02, 0x07, 0x63, 0x43, 0x59, - 0x01, 0x65, 0xE5, 0x60, 0x58, 0x4E, 0x27, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0xA0, 0x64, 0x2A, 0xFA, - 0x00, 0xF4, 0x07, 0x64, 0x09, 0xFA, 0x26, 0x46, 0x87, 0xF3, 0x07, 0xFA, 0x1E, 0x60, 0xD4, 0x64, - 0x0F, 0x60, 0x90, 0xFB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xC1, 0xFE, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0xDE, 0x60, 0x66, 0x64, 0x08, 0x60, - 0x29, 0xFB, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x60, 0x03, 0x64, 0x08, 0x60, 0x1F, 0xFB, 0xDE, 0x60, - 0x05, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x1E, 0xF1, 0x00, 0x60, - 0x02, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x59, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x71, 0xF3, 0x87, 0xF5, - 0xDC, 0x81, 0x66, 0x43, 0x02, 0xA3, 0x63, 0x46, 0xCD, 0x81, 0x06, 0xF2, 0xEE, 0x03, 0x60, 0x40, - 0x08, 0x2A, 0xF7, 0x01, 0x0C, 0xAC, 0x06, 0xFA, 0x46, 0x49, 0x00, 0x60, 0x02, 0x61, 0xB5, 0x60, - 0x58, 0x4D, 0xA2, 0x78, 0xFF, 0xFF, 0xE1, 0x03, 0x18, 0x60, 0x13, 0xF3, 0xFF, 0xFF, 0x03, 0x1B, - 0x00, 0x60, 0xA0, 0x64, 0x02, 0x00, 0x00, 0x60, 0xC0, 0x64, 0x2A, 0xFA, 0xAB, 0xFC, 0x66, 0x45, - 0x29, 0x44, 0x07, 0xFA, 0x29, 0x46, 0x03, 0xF2, 0x04, 0xF0, 0x85, 0xF2, 0x65, 0x46, 0x2C, 0xFA, - 0x2D, 0xF8, 0xAE, 0xFA, 0xCB, 0xF3, 0x2F, 0xFA, 0x32, 0xFA, 0xCC, 0xF3, 0x30, 0xFA, 0x33, 0xFA, - 0xCD, 0xF3, 0x31, 0xFA, 0x34, 0xFA, 0xAB, 0xF1, 0x19, 0xF8, 0x18, 0x67, 0x0E, 0xFA, 0x66, 0x41, - 0x29, 0x46, 0x92, 0xF0, 0x2C, 0x60, 0x26, 0x63, 0x47, 0xD3, 0x61, 0x46, 0x00, 0x7E, 0x13, 0xFA, - 0x02, 0x63, 0x3F, 0xFC, 0x00, 0x64, 0x3E, 0xFA, 0x66, 0x41, 0x00, 0xF4, 0x18, 0x60, 0x12, 0xF3, - 0x09, 0xFA, 0x1E, 0x60, 0xE0, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x61, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC8, 0xFE, 0xA0, 0x01, 0x95, 0x01, 0x00, 0x64, 0x08, 0x60, - 0x1E, 0xFB, 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x07, 0xF0, 0xFF, 0xFF, 0x64, 0x43, 0x0B, 0x60, - 0x82, 0xF3, 0xDA, 0x81, 0x60, 0x45, 0xD5, 0x80, 0xA1, 0xD1, 0x04, 0x03, 0xD3, 0x80, 0xD9, 0x81, - 0xFA, 0x02, 0x08, 0x00, 0xA1, 0xDD, 0xD9, 0x84, 0x0B, 0x60, 0x82, 0xFB, 0x4A, 0xD3, 0xFF, 0xFF, - 0xDC, 0x84, 0xA2, 0xDB, 0x66, 0x45, 0x63, 0x46, 0x06, 0xF2, 0xFF, 0x60, 0x01, 0x7C, 0xA0, 0x9C, - 0x06, 0xF8, 0x65, 0x46, 0x70, 0xF3, 0x60, 0x40, 0x10, 0x2A, 0x03, 0x00, 0xCC, 0x84, 0x80, 0x2B, - 0x70, 0xFB, 0x08, 0x60, 0x1E, 0xF1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x30, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x60, 0x02, 0x64, - 0x08, 0x60, 0x19, 0xFB, 0xDE, 0x60, 0xA8, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x70, 0xF3, 0x71, 0xF3, 0x00, 0xA8, 0x60, 0x88, 0x43, 0x03, 0xE0, 0x83, 0x5F, 0x03, 0xCB, 0x83, - 0x87, 0xF3, 0x72, 0xF1, 0x02, 0xA4, 0x40, 0x47, 0x64, 0x45, 0x27, 0x46, 0x76, 0xF4, 0x12, 0xF2, - 0x33, 0x18, 0xD4, 0x80, 0x02, 0x64, 0x30, 0x07, 0x23, 0xFA, 0x2A, 0xF2, 0x0E, 0xF2, 0x0C, 0xB0, - 0x02, 0xF0, 0x0C, 0x02, 0x1E, 0x60, 0xD4, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0xE7, 0x01, 0x60, 0x40, 0xF0, 0x37, - 0x08, 0x00, 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, 0xA2, 0xFF, 0x8F, 0xF3, 0x02, 0x02, 0xDC, 0x84, - 0x8F, 0xFB, 0x1E, 0x60, 0xF2, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xA3, 0xFF, 0xCE, 0xFE, 0x25, 0x60, 0xE4, 0x64, 0xE5, 0x60, - 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, 0xC9, 0x01, 0x27, 0x44, 0x02, 0xA4, 0x40, 0x47, 0xC5, 0x1F, - 0x28, 0x43, 0xCB, 0x83, 0x87, 0xF3, 0x1A, 0x0E, 0x02, 0xA4, 0x40, 0x4C, 0x43, 0x48, 0x2C, 0x46, - 0x22, 0xF2, 0x72, 0xF1, 0xAC, 0x86, 0x12, 0xF2, 0x0C, 0x03, 0xD0, 0x80, 0xFF, 0xFF, 0x09, 0x07, - 0x1F, 0x60, 0x20, 0x64, 0x40, 0x4B, 0xF6, 0x60, 0x58, 0x4D, 0xB3, 0x78, 0xFF, 0xFF, 0x2C, 0x46, - 0xA2, 0xFC, 0x2C, 0x44, 0x02, 0xA4, 0x28, 0x43, 0x40, 0x4C, 0xE8, 0x1F, 0x8B, 0x01, 0x01, 0x63, - 0x65, 0xF3, 0xAB, 0xF3, 0x00, 0xBD, 0xAC, 0x81, 0x06, 0x03, 0x05, 0x03, 0xB7, 0x60, 0x58, 0x4D, - 0xC0, 0x78, 0xFF, 0xFF, 0x60, 0x43, 0x5B, 0xFD, 0x3E, 0x63, 0x18, 0x60, 0x94, 0x61, 0x00, 0x64, - 0x59, 0xDB, 0xFE, 0x1F, 0x70, 0xFB, 0x71, 0xFB, 0x18, 0x60, 0xDC, 0x65, 0xA5, 0xDF, 0x5A, 0xDF, - 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0x70, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x03, 0x02, - 0xCA, 0x60, 0x7E, 0x78, 0xFF, 0xFF, 0x07, 0xF0, 0x66, 0x45, 0x64, 0x46, 0x1F, 0xF2, 0x65, 0x46, - 0x64, 0x45, 0x5B, 0xF1, 0xE0, 0x84, 0x72, 0xF1, 0xC0, 0x84, 0xC0, 0x84, 0x12, 0xFA, 0x2C, 0xF2, - 0x70, 0xF3, 0x60, 0x40, 0x01, 0x2A, 0x34, 0x00, 0x00, 0xA8, 0x13, 0x60, 0x43, 0xF3, 0x36, 0x03, - 0x00, 0xA8, 0xFF, 0xFF, 0x33, 0x03, 0xE1, 0x60, 0x58, 0x4D, 0x04, 0x78, 0xFF, 0xFF, 0x25, 0x46, - 0x09, 0x60, 0x08, 0x61, 0xA2, 0xFF, 0x0E, 0xF2, 0x02, 0xF0, 0x60, 0x40, 0xF0, 0x37, 0x0D, 0x00, - 0x91, 0xF3, 0x8F, 0xF3, 0xDC, 0x83, 0xD1, 0x80, 0x91, 0xFD, 0x0C, 0x03, 0x8B, 0xF3, 0xCC, 0x83, - 0xD8, 0xA0, 0x8F, 0xFD, 0x07, 0x04, 0xD4, 0xFE, 0x05, 0x00, 0xD1, 0x80, 0x92, 0xF3, 0x02, 0x03, - 0xDC, 0x84, 0x92, 0xFB, 0x1E, 0x60, 0xDA, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x25, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xA3, 0xFF, 0xDF, 0x60, 0x2A, 0x78, 0xFF, 0xFF, - 0x66, 0x41, 0x65, 0x46, 0x06, 0xF2, 0x61, 0x46, 0x60, 0x40, 0x10, 0x2A, 0x4B, 0x00, 0x80, 0x67, - 0xB4, 0x81, 0x61, 0x44, 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xE1, 0x60, 0x58, 0x4D, 0x04, 0x78, 0xFF, 0xFF, 0x25, 0x46, 0x2A, 0xF2, - 0x09, 0x60, 0x08, 0x61, 0x0C, 0xB0, 0xA2, 0xFF, 0x17, 0x03, 0x0E, 0xF2, 0x02, 0xF0, 0x60, 0x40, - 0xF0, 0x37, 0x0D, 0x00, 0x8F, 0xF3, 0x91, 0xF3, 0xCC, 0x83, 0xD1, 0x80, 0x8F, 0xFD, 0x0C, 0x03, - 0x8B, 0xF3, 0xDC, 0x83, 0xD8, 0xA0, 0x91, 0xFD, 0x07, 0x04, 0xD4, 0xFE, 0x05, 0x00, 0xD1, 0x80, - 0x92, 0xF3, 0x02, 0x03, 0xDC, 0x84, 0x92, 0xFB, 0x07, 0xF0, 0x0A, 0xF2, 0xA3, 0xFF, 0x64, 0x45, - 0x2F, 0x1B, 0x66, 0x41, 0x65, 0x46, 0x02, 0xF0, 0x61, 0x46, 0x0F, 0x60, 0xFF, 0x61, 0xA1, 0x84, - 0x60, 0x41, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0xE1, 0x82, 0x07, 0xB4, 0x01, 0x61, 0x03, 0x03, - 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x02, 0x18, 0x60, 0x96, 0x65, 0x46, 0xD1, 0x61, 0x44, 0xB0, 0x84, - 0xA2, 0xDB, 0x16, 0x00, 0x1E, 0x60, 0xD4, 0x61, 0x2A, 0xF2, 0x3E, 0xF2, 0x0C, 0xB0, 0x01, 0xB0, - 0x05, 0x03, 0x1E, 0x60, 0xE6, 0x61, 0x02, 0x02, 0x1E, 0x60, 0xCE, 0x61, 0x61, 0x44, 0x0F, 0x60, - 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, - 0xDF, 0x60, 0x2A, 0x78, 0xFF, 0xFF, 0x07, 0xF0, 0x2B, 0xF2, 0x2A, 0xF2, 0x60, 0x41, 0x44, 0x49, - 0x60, 0x45, 0xA4, 0x3A, 0x0D, 0x00, 0x61, 0x40, 0xC0, 0x3B, 0x79, 0x00, 0xA9, 0x46, 0x06, 0xF2, - 0xA9, 0x46, 0x60, 0x40, 0x20, 0x26, 0x73, 0x00, 0x20, 0xBC, 0xA9, 0x46, 0x06, 0xFA, 0xA9, 0x46, - 0xA9, 0x46, 0x06, 0xF0, 0xA9, 0x46, 0x65, 0x40, 0x10, 0x2B, 0x6C, 0x00, 0x64, 0x40, 0x10, 0x2A, - 0x35, 0x00, 0x65, 0x40, 0xA4, 0x3A, 0x63, 0x00, 0x29, 0x45, 0x65, 0x46, 0x76, 0xF2, 0xFF, 0xFF, - 0x00, 0xA8, 0x60, 0x46, 0x04, 0x02, 0x76, 0x00, 0xE0, 0x60, 0xEA, 0x78, 0xFF, 0xFF, 0x09, 0xF2, - 0x2A, 0xF0, 0x00, 0xA8, 0x20, 0x67, 0x02, 0x03, 0xB0, 0x84, 0x2A, 0xFA, 0x0E, 0xF2, 0x02, 0xF0, - 0x60, 0x40, 0xF0, 0x37, 0x08, 0x00, 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, 0xA2, 0xFF, 0x8F, 0xF3, - 0x02, 0x02, 0xDC, 0x84, 0x8F, 0xFB, 0x3E, 0xF2, 0xA3, 0xFF, 0x01, 0xB0, 0x1E, 0x60, 0xE6, 0x61, - 0x02, 0x02, 0x1E, 0x60, 0xD4, 0x61, 0x61, 0x44, 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x16, 0x00, 0x10, 0x64, 0xB0, 0x84, - 0xDF, 0x65, 0xA4, 0x9E, 0xA9, 0x46, 0x06, 0xFA, 0xA9, 0x46, 0xA2, 0xFF, 0x04, 0x64, 0x0C, 0x60, - 0x6E, 0xFB, 0x29, 0x44, 0x5A, 0xDB, 0x70, 0xF3, 0xC1, 0xFE, 0xD4, 0xFE, 0x86, 0xF1, 0xA3, 0xFF, - 0xD0, 0x80, 0xDC, 0x84, 0x01, 0x07, 0x70, 0xFB, 0xA9, 0x46, 0x76, 0xF2, 0xA9, 0x46, 0x64, 0x18, - 0xA9, 0x46, 0x02, 0xF0, 0xA9, 0x46, 0x0F, 0x60, 0xFF, 0x61, 0xA1, 0x84, 0x60, 0x41, 0xE9, 0x81, - 0xE9, 0x81, 0xE9, 0x81, 0xE1, 0x82, 0x07, 0xB4, 0x01, 0x61, 0x03, 0x03, 0xCC, 0x84, 0xE1, 0x81, - 0xFD, 0x02, 0x18, 0x60, 0x96, 0x65, 0x46, 0xD1, 0xFF, 0xFF, 0xB1, 0x84, 0xA2, 0xDB, 0xE1, 0x60, - 0x01, 0x78, 0xFF, 0xFF, 0x64, 0x40, 0x10, 0x2A, 0xFA, 0x01, 0xFF, 0x60, 0xEF, 0x64, 0xA0, 0x84, - 0xA9, 0x46, 0x06, 0xFA, 0xA9, 0x46, 0x65, 0x41, 0x70, 0xF3, 0x29, 0x45, 0xCC, 0x84, 0x80, 0x2B, - 0x70, 0xFB, 0x65, 0x46, 0x76, 0xF2, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x36, 0x02, 0x61, 0x40, - 0xA4, 0x3A, 0xE5, 0x01, 0x00, 0x60, 0x3A, 0x61, 0xB5, 0x60, 0x58, 0x4D, 0x9F, 0x78, 0xFF, 0xFF, - 0x83, 0x03, 0x02, 0x60, 0x48, 0x64, 0x2A, 0xFA, 0xCB, 0xF1, 0x2F, 0xF8, 0xCC, 0xF1, 0x30, 0xF8, - 0xCD, 0xF1, 0x31, 0xF8, 0x66, 0xF1, 0x32, 0xF8, 0x67, 0xF1, 0x33, 0xF8, 0x68, 0xF1, 0x34, 0xF8, - 0xA9, 0x46, 0x03, 0xF2, 0x04, 0xF0, 0x85, 0xF0, 0xA9, 0x46, 0x2C, 0xFA, 0x2D, 0xF8, 0xAE, 0xF8, - 0xAB, 0xF1, 0x19, 0xF8, 0xFF, 0x67, 0x0E, 0xFA, 0x00, 0x64, 0x3E, 0xFA, 0x3F, 0xFA, 0x29, 0x44, - 0x07, 0xFA, 0x1E, 0x60, 0xD4, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x35, 0x00, 0x80, 0x67, 0xB4, 0x83, 0x2A, 0xF2, - 0x09, 0x60, 0x08, 0x65, 0x0C, 0xB0, 0x09, 0xF0, 0x0C, 0x02, 0x1E, 0x60, 0xD4, 0x64, 0x0F, 0x60, - 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x9F, 0x18, - 0x64, 0x46, 0x3E, 0xF2, 0xA2, 0xFF, 0x01, 0xB0, 0x1E, 0x60, 0xE6, 0x61, 0x02, 0x02, 0x1E, 0x60, - 0xCE, 0x61, 0x02, 0xF2, 0x0E, 0xF0, 0xD4, 0x80, 0x09, 0xF4, 0x06, 0x02, 0x8F, 0xF3, 0x64, 0x40, - 0xF0, 0x37, 0x02, 0x00, 0xDC, 0x84, 0x8F, 0xFB, 0x66, 0x44, 0x00, 0xA8, 0xFF, 0xFF, 0xF1, 0x02, - 0x61, 0x44, 0x0F, 0x60, 0x90, 0xFB, 0x5A, 0xDD, 0x08, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xC1, 0xFE, 0xA3, 0xFF, 0xA9, 0x46, 0x02, 0xF0, 0xA9, 0x46, 0x0F, 0x60, 0xFF, 0x61, 0xA1, 0x84, - 0x60, 0x41, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0xE1, 0x82, 0x07, 0xB4, 0x01, 0x61, 0x03, 0x03, - 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x02, 0x18, 0x60, 0x96, 0x65, 0x46, 0xD3, 0x9D, 0x85, 0xA4, 0x84, - 0xA2, 0xDB, 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x46, 0x45, 0x3F, 0xF2, 0x05, 0x48, 0x00, 0xA8, - 0x60, 0x41, 0x66, 0x44, 0x0B, 0x03, 0x0E, 0xA1, 0x00, 0xF2, 0x42, 0xFE, 0xAC, 0x86, 0x01, 0xF2, - 0x1F, 0x03, 0x7F, 0xB5, 0xD5, 0x81, 0x66, 0x44, 0xF7, 0x07, 0x25, 0x46, 0x05, 0xF0, 0x06, 0xFA, - 0x05, 0xFA, 0xD0, 0x80, 0x64, 0x43, 0x13, 0x03, 0x60, 0x46, 0x01, 0xF0, 0x80, 0x67, 0xB0, 0x84, - 0x01, 0xFA, 0x00, 0xF0, 0x00, 0x64, 0x00, 0xFA, 0x44, 0x45, 0xA2, 0xFF, 0xB6, 0x60, 0x58, 0x4E, - 0x72, 0x78, 0xFF, 0xFF, 0xA3, 0xFF, 0x08, 0x45, 0x25, 0x46, 0x01, 0x64, 0x02, 0xFA, 0x02, 0xFE, - 0x2D, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x07, 0xF0, 0x10, 0xB0, 0x10, 0xAC, 0x3A, 0x03, 0x23, 0xFA, - 0x80, 0x67, 0xB0, 0x81, 0x61, 0x44, 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x04, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x46, 0x45, 0x64, 0x46, 0x02, 0xF0, 0x0F, 0x60, 0xFF, 0x61, - 0xA1, 0x84, 0x60, 0x41, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0xE1, 0x82, 0x07, 0xB4, 0x01, 0x61, - 0x03, 0x03, 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x02, 0x18, 0x60, 0x96, 0x65, 0x46, 0xD1, 0xFF, 0xFF, - 0xB1, 0x84, 0xA2, 0xDB, 0x9F, 0xF2, 0x25, 0x46, 0xE1, 0x81, 0x5B, 0xF1, 0x72, 0xF1, 0xC1, 0x81, - 0xC1, 0x81, 0x92, 0xFA, 0xA2, 0xFF, 0x02, 0xF0, 0x09, 0x60, 0x08, 0x61, 0xD1, 0x80, 0x0E, 0xF2, - 0x05, 0x02, 0x8F, 0xF3, 0x20, 0xB0, 0xCC, 0x84, 0x01, 0x02, 0x8F, 0xFB, 0xA3, 0xFF, 0x48, 0xFE, - 0x07, 0x00, 0x0E, 0xF2, 0x08, 0xFE, 0xF0, 0x7F, 0x60, 0x40, 0x20, 0x2A, 0x00, 0x7F, 0x0E, 0xFA, - 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x60, 0xC5, 0x61, 0xB5, 0x60, 0x58, 0x4D, 0xA2, 0x78, 0xFF, 0xFF, - 0x66, 0x44, 0x57, 0xFB, 0x04, 0x64, 0x03, 0xFA, 0x80, 0x64, 0x2A, 0xFA, 0xAB, 0xF1, 0x19, 0xF8, - 0x00, 0x64, 0x3E, 0xFA, 0x00, 0x60, 0x80, 0x64, 0x0E, 0xFA, 0x87, 0xF1, 0x07, 0xF8, 0x67, 0x44, - 0x2C, 0xFA, 0x2D, 0xFA, 0x2E, 0xFA, 0xE4, 0x60, 0x65, 0x64, 0x08, 0x60, 0x25, 0xFB, 0xE2, 0x60, - 0xA0, 0x64, 0x08, 0x60, 0x2B, 0xFB, 0x18, 0x60, 0xE6, 0x63, 0x65, 0x44, 0xBD, 0xDB, 0x10, 0x60, - 0x58, 0x64, 0xBD, 0xDB, 0x02, 0x64, 0xBD, 0xDB, 0x06, 0x64, 0xA3, 0xDB, 0xE9, 0x60, 0xB2, 0x78, - 0xFF, 0xFF, 0xE9, 0x60, 0x58, 0x4D, 0xBE, 0x78, 0xFF, 0xFF, 0x57, 0xF5, 0xCB, 0xF1, 0x2F, 0xF8, - 0xCC, 0xF1, 0x30, 0xF8, 0xCD, 0xF1, 0x31, 0xF8, 0x66, 0xF1, 0x32, 0xF8, 0x67, 0xF1, 0x33, 0xF8, - 0x68, 0xF1, 0x34, 0xF8, 0x13, 0x60, 0x45, 0xF1, 0x01, 0x64, 0x64, 0x40, 0xFE, 0x26, 0x10, 0xBC, - 0x32, 0x40, 0x10, 0x26, 0x10, 0xBC, 0x20, 0xBC, 0x04, 0x60, 0x00, 0x65, 0x60, 0x44, 0xB4, 0x84, - 0x17, 0x60, 0x22, 0xFB, 0x13, 0x60, 0x44, 0xF1, 0x26, 0x60, 0x16, 0x64, 0x02, 0x18, 0x26, 0x60, - 0x38, 0x64, 0x16, 0x60, 0xBF, 0xFB, 0x16, 0x60, 0xCF, 0xFB, 0x2C, 0x60, 0x84, 0x61, 0x13, 0x60, - 0x97, 0xF3, 0x2D, 0x60, 0x5E, 0x65, 0xFE, 0xA4, 0xE0, 0x84, 0x02, 0x05, 0x67, 0x44, 0x21, 0x00, - 0xE0, 0x84, 0xC4, 0x85, 0x16, 0x60, 0x55, 0xF3, 0xA5, 0xD1, 0xDA, 0x85, 0xA0, 0x83, 0x16, 0x60, - 0x51, 0xFD, 0xA5, 0xD1, 0x2C, 0x60, 0xA0, 0x62, 0xA0, 0x83, 0xA2, 0xDD, 0x2C, 0x60, 0x84, 0x61, - 0x50, 0x60, 0x00, 0x7C, 0x00, 0x60, 0xF2, 0x65, 0xE2, 0x60, 0x58, 0x4D, 0x06, 0x78, 0xFF, 0xFF, - 0x16, 0x60, 0x53, 0xF1, 0x59, 0xD9, 0x2C, 0x60, 0x7E, 0x65, 0xD5, 0x84, 0xDD, 0x7F, 0xA5, 0xDB, - 0x65, 0x44, 0x16, 0x60, 0xC4, 0xFB, 0x16, 0x60, 0xD4, 0xFB, 0x79, 0x00, 0x16, 0x60, 0x54, 0xF3, - 0x2C, 0x60, 0xA0, 0x62, 0xFD, 0xA0, 0xA2, 0xD3, 0xEE, 0x03, 0x60, 0x40, 0x02, 0x2A, 0x02, 0x00, - 0x01, 0x63, 0x0B, 0x00, 0x04, 0x2A, 0x02, 0x00, 0x02, 0x63, 0x07, 0x00, 0x10, 0x2A, 0x02, 0x00, - 0x04, 0x63, 0x03, 0x00, 0x20, 0x2A, 0x01, 0x00, 0x05, 0x63, 0x63, 0x47, 0xB4, 0x83, 0x59, 0xD9, - 0x59, 0xDD, 0x16, 0x60, 0x54, 0xF3, 0x16, 0x60, 0x51, 0xF3, 0xFE, 0xA0, 0x40, 0x4C, 0xD3, 0x03, - 0x00, 0x60, 0x00, 0x63, 0x59, 0xDD, 0x41, 0x4A, 0x2C, 0x40, 0x01, 0x2A, 0x05, 0x00, 0x00, 0x63, - 0x63, 0x47, 0xB4, 0x83, 0x59, 0xD9, 0x59, 0xDD, 0x2C, 0x40, 0x02, 0x2A, 0x03, 0x00, 0x01, 0x63, - 0x59, 0xD9, 0x59, 0xDD, 0x2C, 0x40, 0x04, 0x2A, 0x05, 0x00, 0x02, 0x63, 0x63, 0x47, 0xB4, 0x83, - 0x59, 0xD9, 0x59, 0xDD, 0x2C, 0x40, 0x10, 0x2A, 0x05, 0x00, 0x04, 0x63, 0x63, 0x47, 0xB4, 0x83, - 0x59, 0xD9, 0x59, 0xDD, 0x2C, 0x40, 0x20, 0x2A, 0x05, 0x00, 0x05, 0x63, 0x63, 0x47, 0xB4, 0x83, - 0x59, 0xD9, 0x59, 0xDD, 0x2A, 0x44, 0x51, 0x93, 0xEB, 0x83, 0xEB, 0x83, 0xA0, 0xDD, 0x16, 0x60, - 0x54, 0xF3, 0x16, 0x60, 0x52, 0xF3, 0xFF, 0xA0, 0x40, 0x4C, 0x9D, 0x03, 0x59, 0xDF, 0x41, 0x4A, - 0x2C, 0x40, 0x01, 0x2A, 0x05, 0x00, 0x00, 0x63, 0x63, 0x47, 0xB4, 0x83, 0x59, 0xD9, 0x59, 0xDD, - 0x2C, 0x40, 0x02, 0x2A, 0x05, 0x00, 0x01, 0x63, 0x63, 0x47, 0xB4, 0x83, 0x59, 0xD9, 0x59, 0xDD, - 0x2C, 0x40, 0x04, 0x2A, 0x05, 0x00, 0x02, 0x63, 0x63, 0x47, 0xB4, 0x83, 0x59, 0xD9, 0x59, 0xDD, - 0x2A, 0x44, 0x51, 0x93, 0xEB, 0x83, 0xEB, 0x83, 0xA0, 0xDD, 0x2D, 0x58, 0xFF, 0xFF, 0x57, 0xF5, - 0xCB, 0xF3, 0xCC, 0xF1, 0x00, 0x63, 0xC0, 0x87, 0xCD, 0xF1, 0x5A, 0xFD, 0xC0, 0x85, 0x65, 0x47, - 0xC4, 0x84, 0x07, 0xB5, 0x18, 0x60, 0xE2, 0x64, 0x0F, 0x60, 0xA5, 0xFB, 0x02, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0x10, 0x60, 0x24, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x60, 0x02, 0x64, - 0x08, 0x60, 0x13, 0xFB, 0xE2, 0x60, 0xA9, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x08, 0x60, 0x12, 0xF1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x10, 0x60, 0x24, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x57, 0xF5, 0x00, 0x64, 0x94, 0xFB, - 0x95, 0xFB, 0x96, 0xFB, 0x74, 0xFB, 0x65, 0xF3, 0x00, 0x75, 0x00, 0x72, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x93, 0xC7, 0xF3, 0xED, 0xE2, 0xCC, 0x84, 0x5A, 0xFB, 0x00, 0x60, 0x04, 0x64, 0x08, 0x60, - 0x13, 0xFB, 0xE2, 0x60, 0xC7, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, - 0x24, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x64, 0xF1, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x2B, 0x05, 0x00, - 0x67, 0x44, 0x16, 0x60, 0xC1, 0xFB, 0x16, 0x60, 0xD1, 0xFB, 0x16, 0x60, 0xF6, 0xF9, 0x2D, 0x60, - 0x86, 0x65, 0xE4, 0x60, 0x58, 0x4D, 0xE7, 0x78, 0xFF, 0xFF, 0x64, 0xF3, 0xFF, 0xFF, 0x60, 0x40, - 0x01, 0x2B, 0x05, 0x00, 0xFF, 0x60, 0xFF, 0x63, 0x16, 0x60, 0xC5, 0xFD, 0x08, 0x00, 0x2E, 0x60, - 0x1E, 0x63, 0x16, 0x60, 0xC5, 0xFD, 0xE4, 0x60, 0x58, 0x4D, 0xFF, 0x78, 0xFF, 0xFF, 0xE4, 0x60, - 0x58, 0x4D, 0x6E, 0x78, 0xFF, 0xFF, 0xE5, 0x60, 0x58, 0x4D, 0x18, 0x78, 0xFF, 0xFF, 0x57, 0xF5, - 0x00, 0xF4, 0x65, 0xF1, 0x06, 0xF8, 0x17, 0x60, 0x22, 0xF3, 0x15, 0x60, 0xDD, 0xF1, 0xFB, 0x60, - 0xFF, 0x65, 0x60, 0x44, 0xA4, 0x84, 0x60, 0x47, 0x64, 0x40, 0x10, 0x26, 0x04, 0xBC, 0x60, 0x47, - 0x07, 0xFA, 0x2D, 0x60, 0x7E, 0x64, 0x40, 0x48, 0x10, 0x61, 0x00, 0x60, 0x00, 0x64, 0xE4, 0x60, - 0x58, 0x4D, 0xA7, 0x78, 0xFF, 0xFF, 0x57, 0xF5, 0x3F, 0xFC, 0x5A, 0xF3, 0xC7, 0xF1, 0xAC, 0x83, - 0x01, 0x64, 0x02, 0x02, 0x6B, 0xFB, 0x64, 0x43, 0x1E, 0x60, 0xD4, 0x64, 0x0F, 0x60, 0x90, 0xFB, - 0x66, 0x44, 0x5A, 0xDB, 0x04, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0xCF, 0x83, - 0x72, 0xF3, 0x5A, 0xFD, 0xDC, 0x84, 0x72, 0xFB, 0x5C, 0xF3, 0xFF, 0xFF, 0xCC, 0x84, 0x5C, 0xFB, - 0x03, 0x03, 0xE3, 0x60, 0xBD, 0x78, 0xFF, 0xFF, 0x0A, 0x64, 0x5C, 0xFB, 0xA2, 0x4C, 0x20, 0x27, - 0xF8, 0x01, 0x46, 0x60, 0x50, 0x65, 0x72, 0x44, 0xD4, 0x80, 0xFF, 0xFF, 0xF2, 0x04, 0x5D, 0xFB, - 0x40, 0x48, 0x94, 0xF3, 0x5E, 0xFB, 0x40, 0x4A, 0x95, 0xF3, 0x96, 0xF3, 0x40, 0x4C, 0x60, 0x41, - 0x65, 0xF1, 0x40, 0x63, 0xAD, 0x80, 0xF0, 0xA3, 0x09, 0x02, 0x3C, 0x03, 0x2C, 0x41, 0x2A, 0x44, - 0x40, 0x4C, 0x28, 0x44, 0x40, 0x4A, 0x00, 0x64, 0x40, 0x48, 0xF4, 0x01, 0xD1, 0x80, 0x01, 0x02, - 0x31, 0x04, 0x10, 0xA3, 0x80, 0x60, 0x00, 0x65, 0xA5, 0x80, 0xCF, 0x83, 0x08, 0x02, 0x28, 0x44, - 0x60, 0x88, 0x2A, 0x44, 0x70, 0x8A, 0x2C, 0x44, 0x70, 0x8C, 0xF1, 0x81, 0xF5, 0x01, 0xE7, 0xA3, - 0x64, 0x44, 0x00, 0xA0, 0x00, 0x62, 0x02, 0x02, 0x00, 0x61, 0x1C, 0x00, 0xE0, 0x84, 0xDE, 0x82, - 0xFD, 0x04, 0x42, 0xFE, 0xF8, 0x84, 0x62, 0x45, 0xC7, 0x83, 0x60, 0x45, 0x02, 0xFE, 0xD5, 0x84, - 0x02, 0x05, 0x01, 0x05, 0x61, 0x44, 0xCF, 0x83, 0x60, 0x41, 0x08, 0x03, 0x28, 0x44, 0x60, 0x88, - 0x2A, 0x44, 0x70, 0x8A, 0x2C, 0x44, 0x70, 0x8C, 0xF1, 0x81, 0xF1, 0x01, 0xCE, 0x82, 0xE9, 0x81, - 0xFD, 0x02, 0xF1, 0x81, 0x61, 0x44, 0x00, 0xA8, 0xFF, 0xFF, 0x2F, 0x03, 0x73, 0x40, 0x5D, 0xF3, - 0xFF, 0xFF, 0x60, 0x47, 0xE8, 0x84, 0xE8, 0x84, 0x5E, 0xF3, 0x3F, 0xB5, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xB4, 0x84, 0x61, 0x45, 0xD4, 0x84, 0xC0, 0x84, - 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x81, 0x64, 0x44, 0x73, 0x45, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0xC4, 0x85, 0x61, 0x44, 0xD4, 0x80, 0xFF, 0xFF, 0x0F, 0x03, 0x60, 0x53, 0xD4, 0x84, - 0xFF, 0xFF, 0x74, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, 0x01, 0xB4, 0x74, 0xFB, 0x13, 0x60, 0x06, 0xF3, - 0xFF, 0xFF, 0xDC, 0x84, 0x00, 0x36, 0x00, 0x3B, 0xA2, 0xDB, 0xE9, 0x60, 0xFB, 0x78, 0xFF, 0xFF, - 0xC1, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x04, 0x64, 0x03, 0xFA, 0x00, 0xF4, 0x09, 0xF2, 0xFF, 0xFF, - 0x60, 0x47, 0x00, 0x3A, 0x1C, 0x00, 0x60, 0x43, 0x00, 0x36, 0x1C, 0x00, 0xE0, 0xA0, 0xDA, 0x85, - 0x16, 0x07, 0x26, 0x60, 0x16, 0x61, 0xA1, 0xD1, 0xFF, 0xFF, 0xD3, 0x80, 0xCB, 0x83, 0x0F, 0x02, - 0x07, 0x0E, 0x59, 0xD3, 0xA5, 0xD0, 0xDA, 0x85, 0xD0, 0x80, 0xFF, 0xFF, 0x08, 0x02, 0xF9, 0x1F, - 0x12, 0x1E, 0xA5, 0xD0, 0x59, 0xD3, 0xFF, 0xFF, 0x90, 0x80, 0xFF, 0x22, 0x0C, 0x00, 0xE4, 0x60, - 0x63, 0x78, 0xFF, 0xFF, 0x13, 0x60, 0x44, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x03, 0x00, - 0x26, 0x60, 0x38, 0x64, 0x02, 0x00, 0x26, 0x60, 0x16, 0x64, 0x16, 0x60, 0xCF, 0xFB, 0x26, 0x46, - 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, 0x31, 0xF2, 0x2E, 0xFA, 0xCB, 0xF1, 0x2F, 0xF8, - 0xCC, 0xF1, 0x30, 0xF8, 0xCD, 0xF1, 0x31, 0xF8, 0x66, 0xF1, 0x32, 0xF8, 0x67, 0xF1, 0x33, 0xF8, - 0x68, 0xF1, 0x34, 0xF8, 0x00, 0x65, 0xEF, 0x60, 0x58, 0x4E, 0xDC, 0x78, 0xFF, 0xFF, 0x61, 0x44, - 0x15, 0x60, 0xC2, 0xFB, 0x50, 0x63, 0x2A, 0xFC, 0xAB, 0xF3, 0x19, 0xFA, 0x00, 0x64, 0x3E, 0xFA, - 0x87, 0xF3, 0x07, 0xFA, 0x00, 0xF4, 0x65, 0xF1, 0x06, 0xF8, 0x17, 0x60, 0x22, 0xF3, 0x15, 0x60, - 0xDD, 0xF1, 0xFB, 0x60, 0xFF, 0xB7, 0x64, 0x40, 0x10, 0x26, 0x04, 0xBC, 0x60, 0x47, 0x07, 0xFA, - 0x2D, 0x60, 0xA6, 0x65, 0xE4, 0x60, 0x58, 0x4D, 0xE7, 0x78, 0xFF, 0xFF, 0x64, 0xF3, 0x2E, 0x60, - 0x1E, 0x63, 0x60, 0x40, 0x01, 0x27, 0x67, 0x43, 0x16, 0x60, 0xD5, 0xFD, 0x2D, 0x60, 0x9E, 0x64, - 0x40, 0x48, 0x10, 0x61, 0x00, 0x60, 0x00, 0x64, 0xE4, 0x60, 0x58, 0x4D, 0xA7, 0x78, 0xFF, 0xFF, - 0x26, 0x46, 0x3F, 0xFC, 0x1E, 0x60, 0xD4, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x26, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x20, 0x44, 0x80, 0x26, 0x11, 0x00, - 0x80, 0xBC, 0x40, 0x40, 0x00, 0x64, 0x94, 0xFB, 0x95, 0xFB, 0x96, 0xFB, 0x74, 0xFB, 0x65, 0xF3, - 0x00, 0x75, 0x00, 0x72, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x93, 0xC7, 0xF3, 0xED, 0xE2, 0xCC, 0x84, - 0x5A, 0xFB, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x08, 0x60, 0x12, 0xFB, - 0x5A, 0xDB, 0x00, 0x64, 0x72, 0xFB, 0x74, 0xFB, 0x2F, 0x58, 0xFF, 0xFF, 0x3E, 0x63, 0x18, 0x60, - 0x94, 0x61, 0x59, 0xD1, 0x61, 0x46, 0x07, 0x1B, 0xFC, 0x1F, 0x2D, 0x60, 0xC8, 0x62, 0xA2, 0xDF, - 0x01, 0x65, 0x00, 0x61, 0x16, 0x00, 0x18, 0x60, 0xD6, 0x61, 0x49, 0xD1, 0xCB, 0x83, 0xFD, 0x18, - 0x63, 0x41, 0x04, 0xA1, 0x61, 0x45, 0x66, 0x43, 0x2D, 0x60, 0xC8, 0x64, 0xDC, 0x84, 0x60, 0xFE, - 0xBD, 0xD1, 0xA0, 0xD9, 0xCD, 0x81, 0x20, 0xFE, 0xF9, 0x02, 0x66, 0x44, 0x18, 0x60, 0x96, 0x7C, - 0xD0, 0x81, 0x5A, 0xF3, 0xC7, 0xF1, 0x2D, 0x60, 0xC6, 0x63, 0x00, 0xA0, 0x64, 0x5F, 0xBD, 0xDB, - 0x0F, 0x60, 0x6D, 0xF1, 0x02, 0x02, 0x01, 0x18, 0x01, 0xB9, 0x61, 0x44, 0x60, 0xFE, 0xA3, 0xDB, - 0xFC, 0xA3, 0x65, 0x44, 0x03, 0xA4, 0xA3, 0xDB, 0x20, 0xFE, 0x2D, 0x58, 0xFF, 0xFF, 0x17, 0x60, - 0x23, 0xFB, 0xCD, 0x81, 0x28, 0xD3, 0x5A, 0x88, 0xDC, 0x83, 0x31, 0x18, 0xFB, 0x03, 0x61, 0x40, - 0x7F, 0x3A, 0x06, 0x00, 0x17, 0x60, 0x23, 0xF3, 0x03, 0x61, 0x7C, 0xA4, 0xA2, 0xDB, 0x00, 0xF4, - 0x60, 0xFE, 0xA3, 0xD1, 0x5D, 0xD8, 0x61, 0x40, 0x7F, 0x3A, 0x08, 0x00, 0x20, 0xFE, 0x17, 0x60, - 0x23, 0xF3, 0x03, 0x61, 0x7C, 0xA4, 0xA2, 0xDB, 0x00, 0xF4, 0x60, 0xFE, 0xBF, 0xD3, 0x5D, 0xDA, - 0xFF, 0xB4, 0x00, 0x7F, 0x12, 0x03, 0xDF, 0x83, 0x61, 0x40, 0x7F, 0x3A, 0x0A, 0x00, 0x20, 0xFE, - 0x60, 0x45, 0x17, 0x60, 0x23, 0xF3, 0x03, 0x61, 0x7C, 0xA4, 0xA2, 0xDB, 0x65, 0x44, 0x00, 0xF4, - 0x60, 0xFE, 0xBD, 0xD1, 0xCC, 0x84, 0x5D, 0xD8, 0xEF, 0x02, 0x20, 0xFE, 0xCB, 0x01, 0x17, 0x60, - 0x23, 0xF1, 0xFD, 0xA1, 0xFF, 0xB1, 0xC1, 0x83, 0xA2, 0xDD, 0x2D, 0x58, 0xFF, 0xFF, 0x67, 0x5C, - 0x14, 0x60, 0x26, 0x61, 0xA1, 0xD3, 0xA5, 0xD9, 0x10, 0x18, 0x60, 0x43, 0x2D, 0x60, 0xEE, 0x64, - 0xA5, 0xDB, 0x60, 0xFE, 0xA0, 0xDD, 0x20, 0xFE, 0xDC, 0x84, 0xCF, 0x83, 0xE3, 0x83, 0x59, 0xD1, - 0xDC, 0x84, 0x60, 0xFE, 0xA0, 0xD9, 0x20, 0xFE, 0xFA, 0x1F, 0x2D, 0x58, 0xFF, 0xFF, 0x15, 0x60, - 0xDC, 0xF1, 0x15, 0x60, 0xDD, 0xF3, 0x64, 0x40, 0x01, 0x2A, 0x02, 0xBC, 0x64, 0x40, 0x02, 0x2A, - 0x04, 0xBC, 0x64, 0x40, 0x04, 0x2A, 0xEF, 0xB4, 0x15, 0x60, 0xDD, 0xFB, 0x07, 0xB4, 0x60, 0xFE, - 0x17, 0x60, 0x10, 0xFB, 0x20, 0xFE, 0x07, 0x7C, 0x15, 0x60, 0xDC, 0xF9, 0x2D, 0x58, 0xFF, 0xFF, - 0x20, 0x40, 0x20, 0x2A, 0x0A, 0x00, 0x0A, 0x60, 0x77, 0xF1, 0x50, 0xF3, 0x2E, 0x60, 0x31, 0x63, - 0x60, 0xFE, 0xBD, 0xD9, 0x60, 0x47, 0xA3, 0xDB, 0x20, 0xFE, 0x2D, 0x58, 0xFF, 0xFF, 0x0E, 0x57, - 0x32, 0x40, 0x40, 0x26, 0x24, 0x00, 0x45, 0x48, 0x00, 0x60, 0x10, 0x61, 0xB5, 0x60, 0x58, 0x4D, - 0x9F, 0x78, 0xFF, 0xFF, 0x1C, 0x03, 0xF2, 0x60, 0x02, 0x64, 0x24, 0xFA, 0x00, 0x60, 0x48, 0x61, - 0x28, 0x44, 0x59, 0xDA, 0x03, 0x64, 0x38, 0x43, 0xBD, 0xD1, 0xCC, 0x84, 0x59, 0xD8, 0xFC, 0x02, - 0x39, 0x44, 0x59, 0xDA, 0x06, 0x64, 0x23, 0xFA, 0x1F, 0x60, 0x10, 0x64, 0x0F, 0x60, 0x90, 0xFB, - 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0x37, 0x58, - 0xFF, 0xFF, 0x0E, 0x57, 0x32, 0x40, 0x40, 0x26, 0x4F, 0x00, 0x45, 0x48, 0x00, 0x60, 0x68, 0x61, - 0xB5, 0x60, 0x58, 0x4D, 0x9F, 0x78, 0xFF, 0xFF, 0x47, 0x03, 0xF2, 0x60, 0x01, 0x64, 0x24, 0xFA, - 0x02, 0x60, 0x00, 0x61, 0x46, 0x4A, 0x38, 0x44, 0x54, 0x94, 0x03, 0x64, 0x01, 0x02, 0x09, 0x00, - 0x06, 0x63, 0x4A, 0x61, 0x38, 0x46, 0xBD, 0xD0, 0xCC, 0x84, 0x2A, 0x46, 0x59, 0xD8, 0xFA, 0x02, - 0x06, 0x00, 0xDA, 0x81, 0x38, 0x43, 0xBD, 0xD1, 0xCC, 0x84, 0x59, 0xD8, 0xFC, 0x02, 0x05, 0x63, - 0x28, 0x44, 0x02, 0xA8, 0x25, 0xFA, 0x07, 0x02, 0x03, 0x64, 0x39, 0x43, 0xBD, 0xD1, 0xCC, 0x84, - 0x59, 0xD8, 0xFC, 0x02, 0x08, 0x63, 0x28, 0x44, 0x03, 0xA8, 0x16, 0x60, 0x82, 0xF3, 0x0F, 0x03, - 0xE8, 0x85, 0xC7, 0x85, 0x60, 0x43, 0xFE, 0xA3, 0x2D, 0x60, 0x06, 0x64, 0x58, 0xD1, 0xD9, 0x81, - 0xA1, 0xD8, 0x7E, 0x2A, 0x02, 0x00, 0x00, 0xF4, 0x02, 0x61, 0xF8, 0x1F, 0x65, 0x43, 0x2A, 0x46, - 0x23, 0xFC, 0x1F, 0x60, 0x10, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0x37, 0x58, 0xFF, 0xFF, 0x0E, 0x57, 0x32, 0x40, - 0x40, 0x26, 0x1B, 0x00, 0x45, 0x48, 0x00, 0x60, 0x06, 0x61, 0xB5, 0x60, 0x58, 0x4D, 0x9F, 0x78, - 0xFF, 0xFF, 0x13, 0x03, 0x02, 0x64, 0x23, 0xFA, 0xF2, 0x60, 0x00, 0x64, 0x5A, 0xDA, 0x28, 0x44, - 0x5A, 0xDA, 0xFF, 0xFF, 0x1F, 0x60, 0x10, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0x37, 0x58, 0xFF, 0xFF, 0xA0, 0xD3, - 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x03, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, - 0xDD, 0x98, 0xFF, 0xFF, 0x97, 0xF1, 0xA0, 0xD3, 0xFF, 0xFF, 0xD8, 0x80, 0xC4, 0x84, 0x0C, 0x03, - 0x08, 0x05, 0xDC, 0x80, 0xD0, 0x80, 0x05, 0x03, 0xA2, 0xDB, 0x02, 0x24, 0xC6, 0xFE, 0xDD, 0x98, - 0xFF, 0xFF, 0xFF, 0x60, 0xFE, 0x64, 0xA2, 0xDB, 0xDD, 0x98, 0xFF, 0xFF, 0xA2, 0xFF, 0x32, 0x40, - 0x40, 0x26, 0x3C, 0x00, 0x7B, 0xF3, 0x67, 0x43, 0xDC, 0x84, 0xCC, 0x84, 0x37, 0x03, 0x60, 0x46, - 0x0A, 0x02, 0x7B, 0xFD, 0x00, 0x60, 0x46, 0x61, 0xB5, 0x60, 0x58, 0x4D, 0x9F, 0x78, 0xFF, 0xFF, - 0x66, 0x44, 0x7B, 0xFB, 0x2C, 0x03, 0x46, 0x4B, 0x25, 0x60, 0xD0, 0x61, 0x18, 0x64, 0x23, 0xFA, - 0xF1, 0x60, 0x00, 0x64, 0x24, 0xFA, 0x4A, 0x65, 0xA2, 0xFF, 0x2C, 0x63, 0x59, 0xD1, 0xA2, 0xDF, - 0xA5, 0xD8, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF7, 0x1F, 0x12, 0x63, - 0x59, 0xD1, 0xA5, 0xD8, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF8, 0x1F, - 0x1F, 0x60, 0x10, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x2B, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0xA6, 0xFE, 0x00, 0x64, 0x7B, 0xFB, 0xA3, 0xFF, 0xCA, 0x60, - 0x7E, 0x78, 0xFF, 0xFF, 0xA6, 0xFE, 0xBA, 0x05, 0xA7, 0xFE, 0x0A, 0x05, 0xA5, 0xFE, 0x03, 0x04, - 0xE6, 0x60, 0x8E, 0x78, 0xFF, 0xFF, 0xA4, 0xFE, 0xF2, 0x04, 0xE7, 0x60, 0x1F, 0x78, 0xFF, 0xFF, - 0x36, 0x45, 0x19, 0x60, 0x86, 0x64, 0x44, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0xF3, 0x7D, 0xF1, - 0x60, 0x47, 0x07, 0xB4, 0x4E, 0xFB, 0x01, 0x61, 0x03, 0x03, 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x02, - 0x9D, 0x84, 0xA1, 0x80, 0xA0, 0x83, 0x15, 0x03, 0x7D, 0xFD, 0x08, 0x60, 0x24, 0xF1, 0x00, 0x60, - 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x31, 0x44, 0xDE, 0xB4, 0x40, 0x51, 0x01, 0x7C, - 0xBC, 0xF9, 0x49, 0xF3, 0x01, 0x63, 0x60, 0x40, 0xFF, 0x26, 0x49, 0xFD, 0xCA, 0x60, 0x7E, 0x78, - 0xFF, 0xFF, 0xE6, 0x60, 0x8E, 0x78, 0xFF, 0xFF, 0x26, 0x60, 0xB0, 0x63, 0xBD, 0xD3, 0xBD, 0xD1, - 0xBD, 0xD1, 0xB0, 0x84, 0xB0, 0x84, 0xFF, 0xFF, 0x07, 0x02, 0x6A, 0xFB, 0x31, 0x44, 0xFE, 0xB4, - 0x40, 0x51, 0x0D, 0x64, 0x05, 0xFB, 0x1A, 0x00, 0x28, 0xF3, 0xFF, 0xFF, 0x13, 0x60, 0x52, 0xF3, - 0xC5, 0xFB, 0x64, 0xFB, 0x0F, 0x60, 0x85, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x46, 0x5E, - 0x31, 0x44, 0x21, 0xBC, 0x40, 0x51, 0xED, 0xE2, 0x0F, 0x4E, 0xD0, 0x60, 0x58, 0x4F, 0xA8, 0x78, - 0xFF, 0xFF, 0x0E, 0x4F, 0x00, 0x00, 0xE8, 0x60, 0x74, 0x78, 0xFF, 0xFF, 0xD7, 0xFE, 0xCA, 0x60, - 0x7E, 0x78, 0xFF, 0xFF, 0x2E, 0xF5, 0x27, 0xF2, 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, - 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x26, 0xF0, 0x63, 0x46, - 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x25, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, - 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0x87, 0xF3, 0x08, 0xFE, 0x60, 0x43, - 0x61, 0x46, 0x26, 0x02, 0x0B, 0x60, 0x82, 0xF3, 0xDA, 0x81, 0x60, 0x45, 0xD5, 0x80, 0xA1, 0xD1, - 0x04, 0x03, 0xD3, 0x80, 0xD9, 0x81, 0xFA, 0x02, 0x08, 0x00, 0xA1, 0xDD, 0xD9, 0x84, 0x0B, 0x60, - 0x82, 0xFB, 0x4A, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xA2, 0xDB, 0x66, 0x45, 0x63, 0x46, 0x06, 0xF2, - 0xFF, 0x60, 0x01, 0x7C, 0xA0, 0x9C, 0x06, 0xF8, 0x65, 0x46, 0x70, 0xF3, 0x60, 0x40, 0x10, 0x2A, - 0x03, 0x00, 0xCC, 0x84, 0x80, 0x2B, 0x70, 0xFB, 0xE7, 0x60, 0x58, 0x4E, 0x81, 0x78, 0xFF, 0xFF, - 0xAD, 0x01, 0x2E, 0xF5, 0x28, 0xF0, 0x18, 0x60, 0x12, 0xF9, 0x27, 0xF2, 0x15, 0x60, 0x02, 0x65, - 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, - 0x16, 0x18, 0x61, 0x46, 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, - 0x26, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x25, 0xF0, 0x63, 0x46, - 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0x87, 0xF3, - 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x12, 0x02, 0x63, 0x46, 0x06, 0xF2, 0xFF, 0xFF, 0x02, 0xB0, - 0x08, 0xBC, 0x0C, 0x03, 0x06, 0xFA, 0xE7, 0x60, 0x58, 0x4E, 0x81, 0x78, 0xFF, 0xFF, 0x08, 0x60, - 0x1E, 0xF1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x6F, 0x01, 0x01, 0x64, - 0x51, 0xFB, 0x28, 0x60, 0x4E, 0x64, 0x52, 0xFB, 0x15, 0x60, 0xC3, 0xF3, 0xFF, 0xFF, 0x15, 0x18, - 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x08, 0x60, 0x1B, 0xF1, 0x00, 0x60, 0x10, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xE7, 0x60, - 0x3D, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x2B, 0x60, 0x88, 0x61, 0xFF, 0x60, - 0x80, 0x65, 0xA1, 0xD3, 0xFF, 0xFF, 0xA4, 0x80, 0x59, 0xD3, 0x05, 0x02, 0x04, 0x1B, 0x59, 0xD3, - 0xFF, 0xFF, 0x01, 0x1B, 0x15, 0x00, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x08, 0x60, - 0x1B, 0xF1, 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, 0x00, 0x64, - 0x08, 0x60, 0x16, 0xFB, 0xE7, 0x60, 0x60, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x00, 0x60, 0x04, 0x61, 0xB5, 0x60, 0x58, 0x4D, 0x9F, 0x78, 0xFF, 0xFF, 0x01, 0x64, 0x23, 0xFA, - 0xF1, 0x60, 0x02, 0x64, 0x24, 0xFA, 0x1F, 0x60, 0x10, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0x00, 0x60, 0x30, 0x64, - 0x08, 0x60, 0x16, 0xFB, 0xD2, 0x60, 0xB5, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0xCA, 0x60, 0x7E, 0x78, - 0xFF, 0xFF, 0x0E, 0x57, 0x63, 0x46, 0x43, 0x47, 0x22, 0xF2, 0x76, 0xF2, 0x02, 0x1B, 0x01, 0x1B, - 0x0C, 0x00, 0x60, 0x46, 0x1F, 0x60, 0x20, 0x64, 0x40, 0x4B, 0xF6, 0x60, 0x58, 0x4D, 0xB3, 0x78, - 0xFF, 0xFF, 0x27, 0x46, 0x76, 0xF2, 0xFF, 0xFF, 0xF4, 0x1B, 0x37, 0x58, 0xFF, 0xFF, 0xE7, 0x60, - 0x9F, 0x64, 0x08, 0x60, 0x2A, 0xFB, 0x2F, 0x58, 0xFF, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x64, - 0x08, 0x60, 0x21, 0xFB, 0x5A, 0xDB, 0x10, 0x60, 0x42, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x2F, 0x58, - 0xFF, 0xFF, 0x28, 0xF3, 0x7D, 0xF1, 0x60, 0x47, 0x07, 0xB4, 0x4E, 0xFB, 0x01, 0x61, 0x03, 0x03, - 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x02, 0xA1, 0x80, 0xB1, 0x83, 0x16, 0x02, 0xCF, 0x85, 0xA7, 0x80, - 0x7D, 0xFD, 0x0B, 0x02, 0x01, 0x65, 0xE5, 0x60, 0x58, 0x4E, 0xA6, 0x78, 0xFF, 0xFF, 0x31, 0x44, - 0xDF, 0xB4, 0x40, 0x51, 0xD0, 0x60, 0xD9, 0x78, 0xFF, 0xFF, 0x08, 0x60, 0x21, 0xF1, 0x00, 0x60, - 0x01, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xE6, 0x60, 0x8E, 0x78, 0xFF, 0xFF, 0x28, 0xF3, - 0x7D, 0xF1, 0x60, 0x47, 0x07, 0xB4, 0x4E, 0xFB, 0x01, 0x61, 0x03, 0x03, 0xCC, 0x84, 0xE1, 0x81, - 0xFD, 0x02, 0x9D, 0x84, 0xA1, 0x80, 0xA0, 0x83, 0x13, 0x03, 0x7D, 0xFD, 0x08, 0x60, 0x24, 0xF1, - 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x7D, 0xF1, 0x31, 0x44, 0x64, 0x40, - 0xFF, 0x26, 0x03, 0x00, 0x21, 0xBC, 0x40, 0x51, 0x03, 0x00, 0xCA, 0x60, 0x7E, 0x78, 0xFF, 0xFF, - 0xE6, 0x60, 0x8E, 0x78, 0xFF, 0xFF, 0x0E, 0x57, 0x32, 0x40, 0x40, 0x26, 0x1B, 0x00, 0x45, 0x48, - 0x00, 0x60, 0x06, 0x61, 0xB5, 0x60, 0x58, 0x4D, 0x9F, 0x78, 0xFF, 0xFF, 0x13, 0x03, 0x02, 0x64, - 0x23, 0xFA, 0xF2, 0x60, 0x04, 0x64, 0x5A, 0xDA, 0x28, 0x44, 0x5A, 0xDA, 0xFF, 0xFF, 0x1F, 0x60, - 0x10, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xFA, 0xFE, 0x37, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0x79, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, - 0x60, 0x46, 0x0E, 0xF2, 0x59, 0x03, 0x60, 0x40, 0xF0, 0x37, 0x46, 0x00, 0xFF, 0x37, 0x3B, 0x00, - 0xFD, 0x37, 0x33, 0x00, 0x18, 0x37, 0x27, 0x00, 0xFE, 0x37, 0x2A, 0x00, 0xF8, 0x37, 0x0A, 0x00, - 0x60, 0x47, 0xFF, 0xB5, 0x10, 0x60, 0x24, 0x62, 0x46, 0xD1, 0x00, 0x60, 0x01, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x00, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xD8, 0x01, 0x06, 0xB4, 0xFD, 0x7F, 0x0E, 0xFA, 0x1E, 0x60, - 0xF8, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xF9, 0xFE, 0xC9, 0x01, 0xDE, 0x60, 0x58, 0x4F, 0x6C, 0x78, 0xFF, 0xFF, 0x14, 0x00, - 0xE1, 0x60, 0x58, 0x4F, 0x32, 0x78, 0xFF, 0xFF, 0xBF, 0x03, 0x23, 0xF0, 0x60, 0x40, 0x04, 0x26, - 0xE3, 0x1B, 0x02, 0x26, 0xE1, 0x18, 0xA2, 0xFF, 0x02, 0xF0, 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, - 0x8F, 0xF3, 0x02, 0x02, 0xCC, 0x84, 0x8F, 0xFB, 0x1F, 0x60, 0x20, 0x64, 0x40, 0x4B, 0xF6, 0x60, - 0x58, 0x4D, 0xB3, 0x78, 0xFF, 0xFF, 0xA8, 0x01, 0xAC, 0xFE, 0x09, 0x05, 0xAD, 0xFE, 0x0F, 0x05, - 0xAE, 0xFE, 0xA2, 0x05, 0xAF, 0xFE, 0x37, 0x05, 0xCA, 0x60, 0x7E, 0x78, 0xFF, 0xFF, 0x08, 0x60, - 0x11, 0xF1, 0x20, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xF5, 0x01, 0x10, 0x60, - 0x56, 0x65, 0x03, 0x61, 0x07, 0x00, 0xA2, 0xDD, 0x58, 0x4F, 0x64, 0x58, 0xFF, 0xFF, 0x00, 0xB9, - 0xFF, 0xFF, 0x08, 0x03, 0x00, 0x63, 0xA5, 0xD1, 0x5A, 0xD3, 0xDA, 0x85, 0x00, 0xA8, 0xCD, 0x81, - 0xF2, 0x02, 0xF8, 0x02, 0xE1, 0x01, 0x10, 0x60, 0x20, 0x62, 0x10, 0x60, 0x46, 0x65, 0xE8, 0x60, - 0xA9, 0x63, 0x5A, 0xDF, 0xD6, 0x80, 0xFF, 0xFF, 0x04, 0x03, 0x5A, 0xDF, 0x5A, 0xDF, 0x5A, 0xDD, - 0xF9, 0x01, 0x10, 0x60, 0x54, 0x65, 0x5A, 0xDF, 0xD6, 0x80, 0xFF, 0xFF, 0x02, 0x03, 0x5A, 0xDD, - 0xFB, 0x01, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x24, 0x64, 0x40, 0x41, 0x10, 0x60, 0x22, 0x63, - 0xA3, 0xD1, 0x00, 0x64, 0xD0, 0x80, 0x06, 0x61, 0x08, 0x03, 0xBD, 0xDB, 0xA3, 0xD3, 0xFF, 0xFF, - 0xB0, 0x84, 0xCD, 0x81, 0xA3, 0xDB, 0x06, 0xA3, 0xF9, 0x02, 0x10, 0x60, 0x48, 0x63, 0xA3, 0xD1, - 0x00, 0x64, 0xD0, 0x80, 0x07, 0x61, 0x19, 0x03, 0xBD, 0xDB, 0x64, 0x44, 0xFE, 0xA3, 0x02, 0xA3, - 0xCD, 0x81, 0xE8, 0x84, 0xE3, 0x03, 0x02, 0x05, 0xE1, 0x03, 0xF9, 0x01, 0x77, 0xFB, 0x79, 0xFD, - 0x61, 0x5C, 0xA3, 0xD3, 0x78, 0xF9, 0x03, 0x18, 0x58, 0x4F, 0x60, 0x58, 0xFF, 0xFF, 0x79, 0xF3, - 0x78, 0xF1, 0x60, 0x43, 0x77, 0xF3, 0x64, 0x41, 0xEA, 0x01, 0x21, 0x43, 0x10, 0x60, 0x48, 0x65, - 0xD7, 0x80, 0xBD, 0xD1, 0xBD, 0xD3, 0x03, 0x02, 0xCA, 0x60, 0x7E, 0x78, 0xFF, 0xFF, 0xA0, 0x84, - 0xBD, 0xD1, 0x43, 0x41, 0xF5, 0x03, 0xE8, 0x60, 0xAE, 0x64, 0x64, 0x58, 0x40, 0x4F, 0x2A, 0xF0, - 0x83, 0x60, 0xFF, 0x65, 0x64, 0x47, 0x03, 0x2B, 0x01, 0x00, 0x17, 0x00, 0x03, 0x26, 0x03, 0xAC, - 0x60, 0x47, 0xA4, 0x84, 0x2A, 0xFA, 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, 0x31, 0xF2, - 0x2E, 0xFA, 0x64, 0x41, 0xCB, 0xF3, 0x2F, 0xFA, 0x60, 0x43, 0xCC, 0xF3, 0x30, 0xFA, 0xCD, 0xF1, - 0x31, 0xF8, 0x32, 0xFC, 0x33, 0xFA, 0x34, 0xF8, 0x19, 0x00, 0x60, 0x47, 0xA4, 0x84, 0x2A, 0xFA, - 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, 0x31, 0xF2, 0x2E, 0xFA, 0x36, 0xF2, 0x32, 0xFA, - 0x37, 0xF2, 0x33, 0xFA, 0x38, 0xF2, 0x34, 0xFA, 0xCB, 0xF3, 0x2F, 0xFA, 0x36, 0xFA, 0xCC, 0xF3, - 0x30, 0xFA, 0x37, 0xFA, 0xCD, 0xF3, 0x31, 0xFA, 0x38, 0xFA, 0x64, 0x41, 0x1C, 0xF2, 0x13, 0xFA, - 0x00, 0xF4, 0x0D, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x2B, 0x28, 0x00, 0x26, 0x46, 0x04, 0x63, - 0x03, 0xFC, 0x00, 0xF4, 0x0D, 0xF2, 0x06, 0xFA, 0xEA, 0x60, 0x58, 0x4E, 0x49, 0x78, 0xFF, 0xFF, - 0xFF, 0xA0, 0x59, 0xF5, 0x19, 0x02, 0x39, 0xF2, 0x26, 0x46, 0x3F, 0xFA, 0x00, 0xF4, 0x00, 0x60, - 0x81, 0x67, 0x0D, 0xFA, 0x7C, 0x64, 0x01, 0xFA, 0x26, 0x46, 0x00, 0x64, 0x3E, 0xFA, 0x1E, 0x60, - 0xE0, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xC8, 0xFE, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x26, 0x46, 0x3F, 0xF0, - 0x42, 0x64, 0xD0, 0x80, 0xFF, 0xFF, 0x01, 0x04, 0x3F, 0xFA, 0x1C, 0xF2, 0x13, 0xFA, 0x26, 0xF2, - 0x27, 0xF0, 0x60, 0x47, 0x00, 0xF4, 0x1F, 0xFA, 0x64, 0x47, 0x20, 0xFA, 0x61, 0x44, 0x21, 0xFA, - 0x01, 0x67, 0x0D, 0xFA, 0x10, 0x61, 0x26, 0x60, 0x64, 0x64, 0x1E, 0x63, 0x58, 0xD1, 0xCD, 0x81, - 0xBD, 0xD8, 0xFC, 0x02, 0x9A, 0xF1, 0xB7, 0xF1, 0x64, 0x5E, 0x64, 0x5F, 0x44, 0x63, 0xBD, 0xDA, - 0x13, 0x60, 0x2F, 0xF3, 0xFF, 0xFF, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0x09, 0xBC, 0x4A, 0xD3, - 0x60, 0x45, 0x60, 0x40, 0x01, 0x36, 0x03, 0x64, 0x02, 0x36, 0x01, 0x64, 0xB4, 0x84, 0x06, 0xA2, - 0xA2, 0xD1, 0xBD, 0xDA, 0x64, 0x47, 0xBD, 0xDA, 0xB4, 0xF3, 0xB5, 0xF1, 0x60, 0x47, 0xBD, 0xDA, - 0x64, 0x47, 0xC3, 0xF1, 0xBD, 0xDA, 0x64, 0x44, 0xBD, 0xDA, 0x26, 0x46, 0x00, 0x64, 0x23, 0xF0, - 0x3B, 0xF0, 0x64, 0x40, 0x10, 0x2A, 0x06, 0x00, 0xC0, 0x67, 0xA0, 0x84, 0xE8, 0x84, 0xE8, 0x84, - 0xE8, 0x84, 0x10, 0xBC, 0x3E, 0xFA, 0x1E, 0x60, 0xE0, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x26, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC8, 0xFE, 0x00, 0x66, 0x46, 0x46, - 0x2F, 0x58, 0xFF, 0xFF, 0x04, 0x60, 0x5C, 0x61, 0xB5, 0x60, 0x58, 0x4D, 0xA2, 0x78, 0xFF, 0xFF, - 0x66, 0x44, 0x59, 0xFB, 0x04, 0x64, 0x03, 0xFA, 0x2F, 0x58, 0xFF, 0xFF, 0x59, 0xF5, 0xAB, 0xF1, - 0x19, 0xF8, 0x00, 0x64, 0x3E, 0xFA, 0x08, 0x64, 0x2A, 0xFA, 0x80, 0x7E, 0xF8, 0x7F, 0x0E, 0xFA, - 0x87, 0xF1, 0x07, 0xF8, 0x01, 0x60, 0x60, 0x67, 0x2C, 0xFA, 0x1D, 0x60, 0x00, 0x67, 0x2D, 0xFA, - 0x01, 0x60, 0x00, 0x67, 0x2E, 0xFA, 0xCB, 0xF1, 0x2F, 0xF8, 0x32, 0xF8, 0xCC, 0xF1, 0x30, 0xF8, - 0x33, 0xF8, 0xCD, 0xF1, 0x31, 0xF8, 0x34, 0xF8, 0x00, 0x63, 0x3B, 0xFC, 0x3D, 0xFC, 0x01, 0x64, - 0x3A, 0xFA, 0x66, 0x64, 0x39, 0xFA, 0x3C, 0xFC, 0xAA, 0x60, 0xAA, 0x64, 0x00, 0xF4, 0x02, 0xFA, - 0x00, 0x60, 0x03, 0x64, 0x5A, 0xDA, 0x1D, 0x60, 0x60, 0x64, 0x5A, 0xDA, 0x01, 0x60, 0x00, 0x64, - 0x5A, 0xDA, 0x81, 0x7F, 0x18, 0x7E, 0x08, 0xFA, 0x01, 0x60, 0x01, 0x64, 0x0A, 0xFA, 0x00, 0x64, - 0x0E, 0xFA, 0x2D, 0x58, 0xFF, 0xFF, 0x59, 0xF5, 0x3D, 0xF2, 0x3C, 0xF2, 0xCC, 0x83, 0x00, 0xA8, - 0x03, 0x03, 0x08, 0x28, 0x3D, 0xFC, 0x42, 0x00, 0x3D, 0xFA, 0x3A, 0xF2, 0x3B, 0xF0, 0x00, 0x63, - 0x00, 0xF4, 0x07, 0xFC, 0x01, 0xB0, 0x0B, 0xFA, 0x19, 0x03, 0x1F, 0xF8, 0xFF, 0xFF, 0x18, 0x64, - 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x0A, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0x1F, 0xF2, 0x1E, 0xF0, 0x59, 0xF5, 0x00, 0xA8, 0x3B, 0xF8, 0xD0, 0x80, 0x06, 0x03, 0x05, 0x03, - 0x04, 0x60, 0x5C, 0x63, 0x0F, 0x64, 0x3A, 0xFA, 0x39, 0xFC, 0x00, 0xF4, 0x00, 0x64, 0x06, 0xFA, - 0xEA, 0x60, 0x58, 0x4E, 0x49, 0x78, 0xFF, 0xFF, 0x59, 0xF5, 0x00, 0xF4, 0x81, 0x60, 0x00, 0x64, - 0x06, 0xFA, 0x32, 0x47, 0x07, 0xFA, 0xB7, 0xF1, 0x00, 0x7F, 0x64, 0x5E, 0x09, 0xFA, 0x59, 0xF5, - 0x00, 0x64, 0x15, 0xFA, 0x39, 0xF2, 0x3F, 0xFA, 0x1E, 0x60, 0xCE, 0x64, 0x0F, 0x60, 0x90, 0xFB, - 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xE3, 0x60, 0xC0, 0x78, - 0xFF, 0xFF, 0x66, 0x45, 0x0E, 0xF2, 0x0F, 0xF0, 0x10, 0xF0, 0x64, 0x41, 0x01, 0xA8, 0x59, 0xF5, - 0x09, 0x02, 0xAD, 0x83, 0x64, 0x44, 0xAC, 0x84, 0x08, 0x24, 0x0A, 0x63, 0x3C, 0xFC, 0x3D, 0xFC, - 0x1A, 0x02, 0x2D, 0x00, 0x03, 0x3A, 0x03, 0x00, 0x00, 0x64, 0x3C, 0xFA, 0x29, 0x00, 0x04, 0x3A, - 0x09, 0x00, 0x0A, 0x64, 0x3C, 0xFA, 0x01, 0x64, 0x3A, 0xFA, 0x00, 0xF4, 0x00, 0x64, 0x1F, 0xFA, - 0x1E, 0xFA, 0x1E, 0x00, 0x02, 0x3A, 0x1E, 0x00, 0x64, 0x44, 0xAD, 0x83, 0xAC, 0x84, 0x02, 0x03, - 0x3C, 0xFC, 0x3D, 0xFC, 0x15, 0x03, 0x3A, 0xFA, 0xF8, 0x65, 0x52, 0x63, 0x64, 0x44, 0x01, 0x36, - 0x0D, 0x00, 0x12, 0xA3, 0x64, 0x40, 0x02, 0x2A, 0x02, 0x00, 0xC7, 0x83, 0xC7, 0x83, 0x64, 0x40, - 0x08, 0x2A, 0x01, 0x00, 0xC7, 0x83, 0x64, 0x40, 0x04, 0x26, 0xC7, 0x83, 0x39, 0xFC, 0x00, 0x64, - 0x2E, 0x58, 0xFF, 0xFF, 0x3B, 0xF0, 0x3A, 0xF2, 0x65, 0x46, 0x06, 0xF2, 0x40, 0x47, 0x1C, 0x18, - 0x32, 0x47, 0x07, 0xFA, 0x18, 0x7E, 0x81, 0x7F, 0x08, 0xFA, 0x01, 0x60, 0x01, 0x63, 0xB7, 0xF3, - 0x0A, 0xFC, 0x00, 0x7F, 0x09, 0xFA, 0x27, 0x40, 0x01, 0x2A, 0x0E, 0x00, 0x1F, 0xF8, 0x18, 0x64, - 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x0A, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0x1E, 0xF0, 0x59, 0xF5, 0x3B, 0xF8, 0x65, 0x46, 0x27, 0x40, 0x02, 0x26, 0x02, 0x00, 0x00, 0xF4, - 0x13, 0x00, 0x6E, 0x61, 0xFF, 0x60, 0xFE, 0x64, 0x00, 0x60, 0x0E, 0x63, 0x58, 0xD1, 0x59, 0xD8, - 0xFD, 0x1F, 0x01, 0x60, 0xEE, 0x63, 0x00, 0xF4, 0x02, 0x61, 0x58, 0xD1, 0x59, 0xD8, 0x7E, 0x3A, - 0x02, 0x00, 0x00, 0xF4, 0x02, 0x61, 0xF9, 0x1F, 0x27, 0x40, 0x04, 0x26, 0x1A, 0x00, 0x46, 0x4B, - 0x0F, 0x60, 0x67, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x0E, 0x03, 0x89, 0xF0, 0xEB, 0x60, - 0x58, 0x4D, 0x00, 0x78, 0xFF, 0xFF, 0x65, 0x44, 0xAC, 0x86, 0xFF, 0xFF, 0x08, 0x03, 0xEB, 0x60, - 0x58, 0x4D, 0x00, 0x78, 0xFF, 0xFF, 0x04, 0x00, 0x2B, 0x46, 0x82, 0xFC, 0x00, 0xF4, 0x82, 0xFC, - 0x00, 0xF4, 0x27, 0x40, 0x08, 0x26, 0x19, 0x00, 0x46, 0x4B, 0x0F, 0x60, 0x85, 0xF3, 0xFF, 0xFF, - 0x00, 0xA8, 0x60, 0x46, 0x0E, 0x03, 0x89, 0xF0, 0xEB, 0x60, 0x58, 0x4D, 0x00, 0x78, 0xFF, 0xFF, - 0x65, 0x44, 0xAC, 0x86, 0xFF, 0xFF, 0x08, 0x03, 0xEB, 0x60, 0x58, 0x4D, 0x00, 0x78, 0xFF, 0xFF, - 0x04, 0x00, 0x65, 0x46, 0x02, 0xFA, 0x00, 0xF4, 0x82, 0xFC, 0x01, 0x64, 0x2E, 0x58, 0xFF, 0xFF, - 0x01, 0x61, 0x02, 0x64, 0x7A, 0x63, 0x58, 0xD0, 0xAB, 0x46, 0xA0, 0xD8, 0xAB, 0x46, 0xFB, 0x1F, - 0xAB, 0x46, 0x00, 0xF4, 0xCD, 0x81, 0xAB, 0x46, 0x00, 0xF4, 0xF3, 0x02, 0x2D, 0x58, 0xFF, 0xFF, - 0x00, 0x60, 0x2A, 0x61, 0xB5, 0x60, 0x58, 0x4D, 0xA2, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x58, 0xFB, - 0x04, 0x64, 0x03, 0xFA, 0x67, 0x44, 0x2C, 0xFA, 0x2D, 0xFA, 0x2E, 0xFA, 0x32, 0xFA, 0x33, 0xFA, - 0x34, 0xFA, 0x12, 0x60, 0x80, 0x64, 0x87, 0xF1, 0x0E, 0xFA, 0x07, 0xF8, 0x00, 0x64, 0x3E, 0xFA, - 0x0A, 0x60, 0x07, 0xFB, 0x06, 0xA2, 0x10, 0x60, 0x5C, 0x64, 0xA2, 0xDB, 0x04, 0x64, 0x5A, 0xDB, - 0x06, 0x64, 0x5A, 0xDB, 0xED, 0x60, 0xD9, 0x64, 0x08, 0x60, 0x2D, 0xFB, 0x00, 0x64, 0x0A, 0x60, - 0x0D, 0xFB, 0x06, 0xA2, 0x10, 0x60, 0x60, 0x64, 0xA2, 0xDB, 0x08, 0x64, 0x5A, 0xDB, 0x06, 0x64, - 0x5A, 0xDB, 0xED, 0x60, 0xE2, 0x64, 0x08, 0x60, 0x2F, 0xFB, 0xED, 0x60, 0xBE, 0x64, 0x08, 0x60, - 0x28, 0xFB, 0x00, 0x60, 0x30, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xEB, 0x60, 0x58, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0xED, 0x60, 0x70, 0x78, 0xFF, 0xFF, - 0x58, 0xF5, 0xCB, 0xF1, 0x2F, 0xF8, 0xCC, 0xF1, 0x30, 0xF8, 0xCD, 0xF1, 0x31, 0xF8, 0xAB, 0xF1, - 0x19, 0xF8, 0x58, 0xF5, 0x40, 0x64, 0x2A, 0xFA, 0x64, 0xF3, 0x63, 0xFB, 0x08, 0x60, 0x1B, 0xF1, - 0x00, 0x60, 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x03, 0x00, - 0xEC, 0x60, 0xCB, 0x78, 0xFF, 0xFF, 0x15, 0x60, 0xC0, 0xF3, 0xEF, 0x60, 0x58, 0x4E, 0xAB, 0x78, - 0xFF, 0xFF, 0x15, 0x60, 0xC2, 0xFB, 0x15, 0x60, 0xBC, 0xF3, 0x3F, 0x40, 0x01, 0x27, 0x08, 0x00, - 0x0F, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0xEE, 0x60, 0x58, 0x4E, 0x26, 0x78, 0xFF, 0xFF, 0x05, 0x00, - 0x0F, 0xB4, 0xEE, 0x60, 0x58, 0x4E, 0x26, 0x78, 0xFF, 0xFF, 0x58, 0xF5, 0x2D, 0x60, 0x94, 0x64, - 0x00, 0xF4, 0x40, 0x48, 0x28, 0x60, 0x4E, 0x64, 0x20, 0x40, 0x10, 0x27, 0x02, 0x00, 0x28, 0x60, - 0x2C, 0x64, 0x28, 0xDB, 0x04, 0x61, 0x00, 0x60, 0x00, 0x64, 0xE4, 0x60, 0x58, 0x4D, 0xA7, 0x78, - 0xFF, 0xFF, 0x58, 0xF5, 0x3F, 0xFC, 0x01, 0x64, 0x52, 0xF1, 0x0C, 0x60, 0x81, 0xFB, 0x64, 0xFB, - 0xA4, 0xD3, 0x04, 0x65, 0x51, 0xF3, 0x01, 0x18, 0x0C, 0x65, 0xF3, 0xB4, 0xB4, 0x84, 0x51, 0xFB, - 0x0D, 0x00, 0xED, 0x60, 0x70, 0x78, 0xFF, 0xFF, 0x51, 0xF1, 0x64, 0xF3, 0xFF, 0xFF, 0xF3, 0xA0, - 0x04, 0xA4, 0x01, 0x04, 0xF1, 0xA4, 0x10, 0x36, 0xF4, 0x01, 0x64, 0xFB, 0x64, 0xF3, 0x15, 0x60, - 0xC3, 0xF1, 0xCC, 0x84, 0x01, 0x61, 0x08, 0x24, 0x03, 0x00, 0xE1, 0x81, 0xCC, 0x84, 0xFB, 0x01, - 0xA1, 0x84, 0x51, 0xF1, 0xEA, 0x03, 0x0C, 0x60, 0x81, 0xFB, 0x9D, 0xFE, 0x3D, 0x05, 0xBA, 0xFE, - 0x10, 0x60, 0x36, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0A, 0x04, 0x40, 0x60, 0x00, 0x64, - 0x08, 0x60, 0x1C, 0xFB, 0xEB, 0x60, 0xD0, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x10, 0x60, 0x36, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x64, 0xF1, 0x0F, 0x60, 0x9D, 0xF9, 0x08, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x20, 0x60, 0x00, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xEB, 0x60, - 0xF5, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xBE, 0xFE, 0x08, 0x60, 0x11, 0xF1, - 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x18, 0x60, 0x07, 0xF1, 0xAD, 0x4F, - 0x00, 0x7F, 0xFA, 0xB4, 0x64, 0x41, 0x64, 0xF1, 0x02, 0xB1, 0x04, 0x65, 0x02, 0x02, 0x64, 0x40, - 0x01, 0x2B, 0x01, 0x65, 0xB4, 0x84, 0xA0, 0x5D, 0x10, 0x60, 0x36, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0xDE, 0xFE, 0x0A, 0x04, 0x40, 0x60, 0x00, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xEB, 0x60, 0xCD, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x64, 0xF1, 0x0F, 0x60, 0x9D, 0xF9, 0x0E, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x20, 0x60, 0x00, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xEC, 0x60, - 0x2D, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xBE, 0xFE, 0x08, 0x60, 0x11, 0xF1, - 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, 0x36, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x58, 0xF5, 0x1E, 0x60, 0xD4, 0x64, 0x0F, 0x60, 0x90, 0xFB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x00, 0x64, 0x4F, 0xFB, 0x00, 0x60, 0x01, 0x64, - 0x08, 0x60, 0x1C, 0xFB, 0xEC, 0x60, 0x51, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0xC1, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x10, 0x60, 0x36, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xA5, 0xF1, 0x0A, 0x60, 0x09, 0xF9, - 0x14, 0x60, 0x0E, 0x64, 0x0F, 0x60, 0xA5, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0xA6, 0xF1, 0x0A, 0x60, 0x0F, 0xF9, 0x1F, 0x60, 0x48, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xFD, 0x1B, - 0x14, 0x60, 0x1A, 0x64, 0x0F, 0x60, 0xA5, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0x00, 0x60, 0x08, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xEC, 0x60, 0x7A, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x4F, 0xF1, 0x10, 0x60, 0x36, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x64, 0x40, - 0xFF, 0x26, 0x0B, 0x00, 0x51, 0xF3, 0xFF, 0xFF, 0x80, 0xB0, 0xFF, 0xFF, 0x03, 0x03, 0xED, 0x60, - 0x6A, 0x78, 0xFF, 0xFF, 0xEB, 0x60, 0xB4, 0x78, 0xFF, 0xFF, 0x02, 0x0A, 0x00, 0x64, 0x4F, 0xFB, - 0xA7, 0xF1, 0x0A, 0x60, 0x0F, 0xF9, 0x00, 0x60, 0x0C, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xEC, 0x60, - 0xA5, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x14, 0x60, 0x1A, 0x64, 0x0F, 0x60, 0xA5, 0xFB, 0x02, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x1B, 0xF1, 0x00, 0x60, - 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0B, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x14, 0x60, 0x1A, 0x64, - 0x0F, 0x60, 0xA5, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x13, 0x00, 0xFF, 0x60, - 0xF7, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x4F, 0xF3, 0xDE, 0x0A, 0x00, 0xA0, 0x00, 0x64, 0x02, 0x03, - 0x4F, 0xFB, 0xD9, 0x01, 0x14, 0x60, 0x0E, 0x64, 0x0F, 0x60, 0xA5, 0xFB, 0x03, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0xB7, 0x01, 0x15, 0x60, 0xC1, 0xF3, 0xEF, 0x60, 0x58, 0x4E, 0xAB, 0x78, - 0xFF, 0xFF, 0x15, 0x60, 0xC2, 0xFB, 0x15, 0x60, 0xBD, 0xF3, 0x0F, 0x60, 0xFF, 0x65, 0xA4, 0x84, - 0xEE, 0x60, 0x58, 0x4E, 0x26, 0x78, 0xFF, 0xFF, 0x58, 0xF5, 0x2D, 0x60, 0x94, 0x64, 0x00, 0xF4, - 0x40, 0x48, 0x28, 0x60, 0x4E, 0x64, 0x20, 0x40, 0x10, 0x27, 0x02, 0x00, 0x28, 0x60, 0x2C, 0x64, - 0x28, 0xDB, 0x04, 0x61, 0x00, 0x60, 0x00, 0x64, 0xE4, 0x60, 0x58, 0x4D, 0xA7, 0x78, 0xFF, 0xFF, - 0x58, 0xF5, 0x3F, 0xFC, 0x51, 0xF3, 0x20, 0x40, 0x10, 0x23, 0x02, 0x00, 0x20, 0xBC, 0x04, 0x00, - 0x60, 0x40, 0x01, 0x22, 0x40, 0xBC, 0x04, 0xBC, 0x80, 0xBC, 0x51, 0xFB, 0x11, 0x60, 0x16, 0x64, - 0x08, 0x60, 0x46, 0xFB, 0x06, 0x64, 0x08, 0x60, 0x4D, 0xFB, 0x15, 0x60, 0xC6, 0xF3, 0xFF, 0xFF, - 0x07, 0xB4, 0xA2, 0xDB, 0x51, 0xF3, 0x08, 0x60, 0x46, 0xF1, 0x60, 0x40, 0x20, 0x26, 0x03, 0x00, - 0x01, 0x26, 0x32, 0x00, 0x45, 0x00, 0x08, 0x60, 0x4D, 0xF3, 0xFF, 0xFF, 0xDD, 0xA0, 0x01, 0xA4, - 0x57, 0x03, 0xA2, 0xDB, 0x2B, 0x60, 0x88, 0x61, 0xE0, 0xA0, 0xF0, 0xA0, 0x05, 0x05, 0x01, 0x05, - 0x05, 0x00, 0x02, 0xA1, 0xF0, 0xA4, 0x02, 0x00, 0x04, 0xA1, 0xE0, 0xA4, 0xA1, 0xD1, 0x01, 0x61, - 0xDC, 0x84, 0xCC, 0x84, 0xFF, 0xFF, 0x02, 0x03, 0xE1, 0x81, 0xFB, 0x01, 0xA1, 0x80, 0x10, 0x60, - 0x9A, 0x64, 0x01, 0x02, 0xE0, 0x01, 0xA0, 0xD3, 0x11, 0x60, 0x0E, 0x63, 0xFA, 0xA4, 0xCC, 0x84, - 0x08, 0xA3, 0xFD, 0x02, 0xB1, 0xF1, 0xA3, 0xD3, 0x01, 0x18, 0xD5, 0x18, 0xFE, 0xA3, 0xA3, 0xD3, - 0x64, 0xFB, 0xEB, 0x60, 0xCD, 0x78, 0xFF, 0xFF, 0x11, 0x60, 0xF4, 0x65, 0x64, 0x41, 0xA1, 0xD3, - 0xD5, 0x80, 0x00, 0xB8, 0x25, 0x07, 0x02, 0x02, 0x08, 0xA1, 0xF9, 0x01, 0x61, 0x44, 0x08, 0x60, - 0x46, 0xFB, 0x01, 0x64, 0xA1, 0xDB, 0x49, 0xD3, 0x64, 0xFB, 0xEB, 0x60, 0xCD, 0x78, 0xFF, 0xFF, - 0x11, 0x60, 0xF4, 0x65, 0x64, 0x41, 0xA1, 0xD3, 0xD5, 0x80, 0x04, 0xB0, 0x11, 0x07, 0x02, 0x02, - 0x08, 0xA1, 0xF9, 0x01, 0x61, 0x44, 0x08, 0x60, 0x46, 0xFB, 0x49, 0xD3, 0x64, 0xFB, 0xEB, 0x60, - 0xCD, 0x78, 0xFF, 0xFF, 0x08, 0x60, 0x46, 0xF3, 0xFF, 0xFF, 0x08, 0xA4, 0xA2, 0xDB, 0x9A, 0x01, - 0x14, 0x60, 0x0E, 0x64, 0x0F, 0x60, 0xA5, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0x51, 0xF3, 0xFF, 0xFF, 0xE3, 0xB4, 0x51, 0xFB, 0x0C, 0x60, 0x7F, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, - 0xA2, 0xDB, 0x10, 0x60, 0x36, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0A, 0x04, 0x40, 0x60, - 0x00, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xED, 0x60, 0x81, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x63, 0xF1, 0x64, 0xF9, 0x0F, 0x60, 0x9D, 0xF9, 0x0E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x2D, 0xFF, 0x20, 0x60, 0x00, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xED, 0x60, 0xA3, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xBE, 0xFE, 0x08, 0x60, 0x11, 0xF1, 0x40, 0x60, 0x00, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x08, 0x60, 0x11, 0xF1, 0x10, 0x60, 0x00, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x00, 0x60, 0x30, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xEB, 0x60, 0x58, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x14, 0x60, 0x0E, 0x64, - 0x0F, 0x60, 0xA5, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x64, 0x51, 0xFB, - 0x00, 0x64, 0x08, 0x60, 0x1B, 0xFB, 0x5A, 0xDB, 0xBE, 0xFE, 0x00, 0x60, 0x30, 0x64, 0x08, 0x60, - 0x1C, 0xFB, 0xEB, 0x60, 0x58, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x2F, 0x58, - 0xFF, 0xFF, 0x08, 0x60, 0x1B, 0xF1, 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x1B, 0xF1, 0x00, 0x60, 0x08, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x31, 0x40, 0x20, 0x2A, 0x35, 0x00, 0x3F, 0xF2, 0x47, 0x65, - 0xC4, 0x84, 0xE8, 0x84, 0x23, 0xFA, 0xF1, 0x60, 0x02, 0x64, 0x24, 0xFA, 0x64, 0xF3, 0x01, 0x60, - 0xFF, 0x65, 0xA4, 0x84, 0x01, 0x23, 0x14, 0x00, 0x11, 0x60, 0x14, 0x61, 0x11, 0x60, 0xF4, 0x65, - 0xA1, 0xD1, 0xD5, 0x80, 0xD0, 0x80, 0x0B, 0x03, 0x02, 0x03, 0x08, 0xA1, 0xF9, 0x01, 0x04, 0xA1, - 0xA1, 0xD3, 0x01, 0x60, 0x00, 0x65, 0x60, 0x47, 0xFF, 0xB4, 0xB4, 0x84, 0x01, 0x00, 0x01, 0x64, - 0x00, 0xF4, 0x08, 0xFA, 0xFF, 0xFF, 0x26, 0x46, 0x1F, 0x60, 0x10, 0x64, 0x0F, 0x60, 0x90, 0xFB, - 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0x00, 0x66, - 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x5F, 0xFB, 0xAC, 0x85, - 0x60, 0x41, 0x2E, 0x60, 0x22, 0x63, 0x16, 0x60, 0xC6, 0xFD, 0x16, 0x60, 0xCC, 0xFD, 0x16, 0x60, - 0xD6, 0xFD, 0x16, 0x60, 0xE0, 0xFD, 0x5C, 0x03, 0x61, 0x5C, 0x00, 0x63, 0xE9, 0x81, 0xFF, 0xFF, - 0x02, 0x24, 0xDF, 0x83, 0xFB, 0x02, 0x08, 0x64, 0x53, 0x90, 0x64, 0x41, 0x03, 0x04, 0x01, 0x60, - 0x08, 0x63, 0x0C, 0x00, 0x01, 0x60, 0x00, 0x63, 0x10, 0x64, 0xE9, 0x81, 0xFF, 0xFF, 0x02, 0x24, - 0xDF, 0x83, 0x08, 0x36, 0x03, 0x00, 0xCC, 0x84, 0xFF, 0xFF, 0xF7, 0x02, 0x15, 0x60, 0xEC, 0xFD, - 0x43, 0x48, 0x65, 0x41, 0x2B, 0x60, 0xDA, 0x63, 0x28, 0x44, 0xFF, 0xB5, 0x10, 0x60, 0x08, 0x64, - 0xE9, 0x81, 0x58, 0xD1, 0xFD, 0x04, 0xA3, 0xD9, 0x0C, 0x03, 0x58, 0xD1, 0xE9, 0x81, 0x40, 0x4A, - 0xFC, 0x04, 0xA3, 0xD1, 0x64, 0x47, 0xB0, 0x84, 0xBD, 0xDB, 0x65, 0x44, 0xC8, 0x85, 0x2A, 0x44, - 0xEF, 0x02, 0x28, 0x43, 0x08, 0x3A, 0x24, 0x00, 0x60, 0x45, 0x04, 0x64, 0x32, 0x60, 0x00, 0x63, - 0x41, 0x48, 0xE9, 0x81, 0xCC, 0x84, 0x02, 0x24, 0xDF, 0x83, 0xFB, 0x02, 0x63, 0x40, 0x00, 0x36, - 0x17, 0x00, 0x17, 0x60, 0x11, 0xFD, 0x2E, 0x60, 0x24, 0x63, 0x65, 0x44, 0x28, 0x41, 0xE9, 0x81, - 0x58, 0xD1, 0xFD, 0x04, 0xA3, 0xD9, 0x15, 0x03, 0x58, 0xD1, 0xE9, 0x81, 0x60, 0x45, 0xFC, 0x04, - 0xA3, 0xD1, 0x64, 0x47, 0xB0, 0x84, 0xBD, 0xDB, 0x00, 0xB9, 0x65, 0x44, 0xF0, 0x02, 0x09, 0x00, - 0x67, 0x43, 0x16, 0x60, 0xC6, 0xFD, 0x16, 0x60, 0xCC, 0xFD, 0x16, 0x60, 0xD6, 0xFD, 0x16, 0x60, - 0xE0, 0xFD, 0x20, 0x40, 0x10, 0x27, 0x0D, 0x00, 0x2B, 0x60, 0xE2, 0x61, 0x15, 0x60, 0xEC, 0xF3, - 0xA1, 0xDB, 0xFF, 0xB4, 0xCC, 0x84, 0xA8, 0x83, 0x2B, 0x60, 0xD8, 0x64, 0x58, 0xD1, 0x59, 0xD9, - 0xFD, 0x1F, 0x2B, 0x60, 0xE4, 0x63, 0x15, 0x60, 0xBE, 0xF3, 0x08, 0x61, 0x60, 0xFE, 0xA3, 0xD1, - 0xFF, 0xFF, 0x20, 0xFE, 0x00, 0xA8, 0xE8, 0x84, 0x0F, 0x03, 0x60, 0xFE, 0x02, 0x28, 0xF6, 0x01, - 0x80, 0x62, 0xB2, 0x9C, 0xBD, 0xD9, 0x62, 0xF9, 0xCD, 0x81, 0x00, 0x36, 0x01, 0x00, 0xEE, 0x01, - 0x2E, 0x60, 0x24, 0x63, 0x08, 0x61, 0xEA, 0x01, 0x2E, 0x58, 0xFF, 0xFF, 0x2B, 0x60, 0x7C, 0x63, - 0x65, 0x40, 0xFF, 0x36, 0x02, 0xA3, 0xA3, 0xD3, 0xFF, 0xFF, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, - 0xE8, 0x84, 0x40, 0x26, 0x7F, 0xB4, 0x20, 0x26, 0x3F, 0xB4, 0x60, 0x45, 0x80, 0x63, 0xEF, 0x60, - 0x58, 0x4D, 0x33, 0x78, 0xFF, 0xFF, 0x15, 0x60, 0xDF, 0xFB, 0x40, 0x63, 0xEF, 0x60, 0x58, 0x4D, - 0x33, 0x78, 0xFF, 0xFF, 0x15, 0x60, 0xE0, 0xFB, 0x20, 0x63, 0xEF, 0x60, 0x58, 0x4D, 0x33, 0x78, - 0xFF, 0xFF, 0x15, 0x60, 0xE1, 0xFB, 0x10, 0x63, 0xEF, 0x60, 0x58, 0x4D, 0x33, 0x78, 0xFF, 0xFF, - 0x15, 0x60, 0xE2, 0xFB, 0x08, 0x63, 0xEF, 0x60, 0x58, 0x4D, 0x33, 0x78, 0xFF, 0xFF, 0x15, 0x60, - 0xE3, 0xFB, 0x04, 0x63, 0xEF, 0x60, 0x58, 0x4D, 0x33, 0x78, 0xFF, 0xFF, 0x15, 0x60, 0xE4, 0xFB, - 0x02, 0x63, 0xEF, 0x60, 0x58, 0x4D, 0x33, 0x78, 0xFF, 0xFF, 0x15, 0x60, 0xE5, 0xFB, 0x01, 0x63, - 0xEF, 0x60, 0x58, 0x4D, 0x33, 0x78, 0xFF, 0xFF, 0x15, 0x60, 0xE6, 0xFB, 0x2E, 0x58, 0xFF, 0xFF, - 0x15, 0x60, 0xBE, 0xF3, 0xFF, 0xFF, 0x0F, 0xB4, 0x60, 0x45, 0x08, 0x63, 0xEF, 0x60, 0x58, 0x4D, - 0x5E, 0x78, 0xFF, 0xFF, 0x15, 0x60, 0xE7, 0xFB, 0x04, 0x63, 0xEF, 0x60, 0x58, 0x4D, 0x5E, 0x78, - 0xFF, 0xFF, 0x15, 0x60, 0xE8, 0xFB, 0x02, 0x63, 0xEF, 0x60, 0x58, 0x4D, 0x5E, 0x78, 0xFF, 0xFF, - 0x15, 0x60, 0xE9, 0xFB, 0x01, 0x63, 0xEF, 0x60, 0x58, 0x4D, 0x5E, 0x78, 0xFF, 0xFF, 0x15, 0x60, - 0xEA, 0xFB, 0x2E, 0x58, 0xFF, 0xFF, 0x63, 0x5C, 0xA7, 0x84, 0xEB, 0x83, 0x14, 0x02, 0x01, 0x03, - 0xFB, 0x01, 0x64, 0x44, 0x01, 0x36, 0x0B, 0x64, 0x02, 0x36, 0x0B, 0x64, 0x04, 0x36, 0x0A, 0x64, - 0x08, 0x36, 0x0A, 0x64, 0x10, 0x36, 0x09, 0x64, 0x20, 0x36, 0x09, 0x64, 0x40, 0x36, 0x09, 0x64, - 0x80, 0x36, 0x09, 0x64, 0x11, 0x00, 0x60, 0x40, 0x01, 0x36, 0x0B, 0x64, 0x02, 0x36, 0x0F, 0x64, - 0x04, 0x36, 0x0A, 0x64, 0x08, 0x36, 0x0E, 0x64, 0x10, 0x36, 0x09, 0x64, 0x20, 0x36, 0x0D, 0x64, - 0x40, 0x36, 0x08, 0x64, 0x80, 0x36, 0x0C, 0x64, 0x2D, 0x58, 0xFF, 0xFF, 0x63, 0x5C, 0xA7, 0x84, - 0xEB, 0x83, 0x0C, 0x02, 0x01, 0x03, 0xFB, 0x01, 0x64, 0x44, 0x01, 0x36, 0x0A, 0x64, 0x02, 0x36, - 0x14, 0x64, 0x04, 0x36, 0x37, 0x64, 0x08, 0x36, 0x6E, 0x64, 0x09, 0x00, 0x60, 0x40, 0x01, 0x36, - 0x0A, 0x64, 0x02, 0x36, 0x14, 0x64, 0x04, 0x36, 0x37, 0x64, 0x08, 0x36, 0x6E, 0x64, 0x2D, 0x58, - 0xFF, 0xFF, 0x60, 0xFE, 0x81, 0xA1, 0x7F, 0xA1, 0x02, 0x06, 0x00, 0xF4, 0x03, 0x61, 0x5D, 0xD2, - 0xCF, 0x83, 0xD4, 0x80, 0x25, 0x03, 0x16, 0x03, 0xCF, 0x83, 0x61, 0x44, 0x80, 0xA0, 0x20, 0x03, - 0x02, 0x02, 0x00, 0xF4, 0x03, 0x61, 0x5D, 0xD2, 0xCF, 0x83, 0x81, 0xA1, 0x19, 0x03, 0x05, 0x07, - 0x7F, 0xA1, 0xCC, 0x84, 0xDD, 0x81, 0xE6, 0x03, 0xF7, 0x01, 0x00, 0xF4, 0x00, 0xB8, 0x04, 0x61, - 0xE6, 0x03, 0xF2, 0x01, 0x2C, 0x43, 0x5D, 0xD0, 0xDE, 0xD9, 0x64, 0x44, 0x5D, 0xD0, 0xDE, 0xD9, - 0xCC, 0x84, 0x81, 0xA1, 0x05, 0x03, 0x7F, 0xA1, 0xF9, 0x04, 0x00, 0xF4, 0x03, 0x61, 0xF6, 0x01, - 0x20, 0xFE, 0x2E, 0x58, 0xFF, 0xFF, 0x01, 0x3A, 0x02, 0x00, 0x16, 0x64, 0x2B, 0x00, 0x02, 0x3A, - 0x02, 0x00, 0x14, 0x64, 0x27, 0x00, 0x04, 0x3A, 0x02, 0x00, 0x12, 0x64, 0x23, 0x00, 0x08, 0x3A, - 0x02, 0x00, 0x10, 0x64, 0x1F, 0x00, 0x10, 0x3A, 0x02, 0x00, 0x0E, 0x64, 0x1B, 0x00, 0x20, 0x3A, - 0x02, 0x00, 0x0C, 0x64, 0x17, 0x00, 0x40, 0x3A, 0x02, 0x00, 0x0A, 0x64, 0x13, 0x00, 0x80, 0x3A, - 0x02, 0x00, 0x08, 0x64, 0x0F, 0x00, 0x01, 0x3B, 0x02, 0x00, 0x06, 0x64, 0x0B, 0x00, 0x02, 0x3B, - 0x02, 0x00, 0x04, 0x64, 0x07, 0x00, 0x04, 0x3B, 0x02, 0x00, 0x02, 0x64, 0x03, 0x00, 0x08, 0x3B, - 0xFF, 0x01, 0x00, 0x64, 0x2E, 0x58, 0xFF, 0xFF, 0x27, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x36, 0x3A, - 0x02, 0x00, 0x00, 0x61, 0x2C, 0x00, 0x30, 0x3A, 0x02, 0x00, 0x02, 0x61, 0x28, 0x00, 0x24, 0x3A, - 0x02, 0x00, 0x04, 0x61, 0x24, 0x00, 0x18, 0x3A, 0x02, 0x00, 0x06, 0x61, 0x20, 0x00, 0x12, 0x3A, - 0x02, 0x00, 0x08, 0x61, 0x1C, 0x00, 0x0C, 0x3A, 0x02, 0x00, 0x0A, 0x61, 0x18, 0x00, 0x09, 0x3A, - 0x02, 0x00, 0x0C, 0x61, 0x14, 0x00, 0x06, 0x3A, 0x02, 0x00, 0x0E, 0x61, 0x10, 0x00, 0x6E, 0x3A, - 0x02, 0x00, 0x10, 0x61, 0x0C, 0x00, 0x37, 0x3A, 0x02, 0x00, 0x12, 0x61, 0x08, 0x00, 0x14, 0x3A, - 0x02, 0x00, 0x14, 0x61, 0x04, 0x00, 0x0A, 0x3A, 0xFF, 0xFF, 0x16, 0x61, 0x00, 0x00, 0x65, 0x40, - 0x01, 0x3A, 0x13, 0x00, 0x66, 0x45, 0x2B, 0x46, 0x92, 0xFA, 0x65, 0x46, 0x26, 0xF2, 0xFF, 0xFF, - 0x60, 0x41, 0x00, 0x7F, 0x60, 0x45, 0x61, 0x47, 0x00, 0x7F, 0xD4, 0x84, 0x66, 0x41, 0x2B, 0x46, - 0x0E, 0xF2, 0x60, 0x45, 0x65, 0x5E, 0x0E, 0xFA, 0x61, 0x46, 0x2E, 0x58, 0xFF, 0xFF, 0xCD, 0x81, - 0x7F, 0xB4, 0x02, 0x3A, 0x02, 0x00, 0x01, 0x64, 0x2E, 0x00, 0x04, 0x3A, 0x02, 0x00, 0x02, 0x64, - 0x2A, 0x00, 0x0B, 0x3A, 0x02, 0x00, 0x04, 0x64, 0x26, 0x00, 0x16, 0x3A, 0x02, 0x00, 0x08, 0x64, - 0x22, 0x00, 0x0C, 0x3A, 0x02, 0x00, 0x10, 0x64, 0x1E, 0x00, 0x12, 0x3A, 0x02, 0x00, 0x20, 0x64, - 0x1A, 0x00, 0x18, 0x3A, 0x02, 0x00, 0x40, 0x64, 0x16, 0x00, 0x24, 0x3A, 0x02, 0x00, 0x80, 0x64, - 0x12, 0x00, 0x30, 0x3A, 0x02, 0x00, 0x01, 0x7F, 0x0E, 0x00, 0x48, 0x3A, 0x02, 0x00, 0x02, 0x7F, - 0x0A, 0x00, 0x60, 0x3A, 0x02, 0x00, 0x04, 0x7F, 0x06, 0x00, 0x6C, 0x3A, 0x02, 0x00, 0x08, 0x7F, - 0x02, 0x00, 0x00, 0x64, 0x00, 0x00, 0x20, 0xFE, 0x2A, 0x45, 0x34, 0x8A, 0x60, 0xFE, 0x61, 0x40, - 0x00, 0x36, 0x02, 0x00, 0xBD, 0xD3, 0xC3, 0x01, 0x2E, 0x58, 0xFF, 0xFF, 0x53, 0xFB, 0x54, 0xFB, - 0x00, 0x60, 0x0C, 0x63, 0x14, 0x60, 0xEC, 0x62, 0x00, 0x64, 0x5A, 0xDB, 0xFE, 0x1F, 0x02, 0x64, - 0x0A, 0x60, 0x78, 0xFB, 0x2E, 0x58, 0xFF, 0xFF, 0x0A, 0x60, 0x7A, 0xF3, 0x00, 0x63, 0xF0, 0xA0, - 0x01, 0xA4, 0x03, 0x03, 0xA2, 0xDB, 0x2E, 0x58, 0xFF, 0xFF, 0xA2, 0xDD, 0x0A, 0x60, 0x7B, 0xF1, - 0xA2, 0xDD, 0x5A, 0xD3, 0xA2, 0xDD, 0xC0, 0x81, 0x61, 0x44, 0x02, 0x24, 0xFF, 0xFF, 0xE9, 0x81, - 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0x5A, 0xD3, 0xE9, 0x81, 0xE8, 0x83, 0xEB, 0x83, 0xEB, 0x83, - 0xEB, 0x83, 0xEB, 0x85, 0xD4, 0x85, 0xC5, 0x83, 0xA2, 0xDD, 0x63, 0x47, 0x00, 0x7F, 0x0A, 0x60, - 0x77, 0xFB, 0x2E, 0x58, 0xFF, 0xFF, 0x7F, 0x67, 0x01, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0xB1, 0xFE, - 0x05, 0x05, 0xB0, 0xFE, 0x06, 0x05, 0xB2, 0xFE, 0xB3, 0xFE, 0x21, 0x00, 0xF7, 0x60, 0x38, 0x78, - 0xFF, 0xFF, 0x28, 0xF3, 0x29, 0xF1, 0x40, 0x44, 0x44, 0x45, 0x2A, 0xF1, 0x2B, 0xF1, 0x44, 0x46, - 0x44, 0x47, 0x3F, 0xB4, 0xE0, 0x85, 0x19, 0x60, 0x06, 0x64, 0x44, 0xD7, 0x58, 0x43, 0xFF, 0xFF, - 0x60, 0x45, 0x0A, 0x60, 0x7E, 0xF3, 0x61, 0x43, 0x04, 0xB4, 0x24, 0x44, 0x02, 0x03, 0x13, 0xFF, - 0x06, 0x00, 0x3F, 0xB4, 0xB4, 0x84, 0xFF, 0x27, 0x05, 0xFD, 0x04, 0xFB, 0x10, 0x75, 0xA1, 0xFF, - 0xFF, 0xFF, 0x86, 0x3E, 0xB4, 0xFE, 0x09, 0x05, 0xB5, 0xFE, 0x02, 0x24, 0x7F, 0xF7, 0xFF, 0xFF, - 0xFF, 0xFF, 0xB7, 0xFE, 0x05, 0x05, 0xB6, 0xFE, 0xF2, 0x01, 0xF7, 0x60, 0x73, 0x78, 0xFF, 0xFF, - 0x36, 0x44, 0x00, 0x7F, 0xEE, 0xA0, 0x60, 0x45, 0x05, 0x05, 0x19, 0x60, 0x98, 0x64, 0x44, 0xD7, - 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x01, 0xE3, 0x01, 0x7F, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, - 0x7F, 0x67, 0x02, 0x61, 0x10, 0x02, 0x10, 0x64, 0x40, 0x40, 0x02, 0x64, 0x40, 0x50, 0x61, 0xFF, - 0x3F, 0x40, 0x40, 0x26, 0x04, 0x00, 0x10, 0xE0, 0x46, 0x60, 0x09, 0xE0, 0x00, 0x00, 0x27, 0xF1, - 0x00, 0x66, 0x20, 0x78, 0x42, 0xFE, 0x23, 0x58, 0xFF, 0xFF, 0x7F, 0x60, 0xC0, 0x64, 0x24, 0x45, - 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x19, 0x02, 0x0A, 0x60, 0x7E, 0xF3, 0x07, 0x7C, 0x20, 0xB5, - 0x0C, 0xB5, 0x04, 0x03, 0x03, 0x02, 0xBC, 0xF9, 0x00, 0x67, 0x0F, 0x00, 0x00, 0x61, 0x41, 0x56, - 0xC7, 0xFE, 0xB5, 0x01, 0x36, 0x47, 0xFF, 0x23, 0x04, 0x00, 0x00, 0x7F, 0x60, 0x41, 0x7F, 0x67, - 0x04, 0x00, 0x20, 0x44, 0x80, 0xBC, 0x40, 0x40, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x7F, 0x60, - 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x31, 0x02, 0x0A, 0x60, 0x7E, 0xF3, - 0x01, 0x7C, 0x20, 0xB5, 0x0C, 0xB5, 0x03, 0x03, 0x02, 0x02, 0xBC, 0xF9, 0xFF, 0xFF, 0x02, 0x61, - 0x41, 0x56, 0xC7, 0xFE, 0xF0, 0x60, 0xC7, 0x78, 0xFF, 0xFF, 0x7D, 0xF1, 0x20, 0x44, 0x64, 0x40, - 0xFF, 0x26, 0x1C, 0x00, 0x7F, 0xB4, 0x40, 0x40, 0x5C, 0x5E, 0x82, 0xFF, 0x26, 0x44, 0xFD, 0xB4, - 0x40, 0x46, 0x5C, 0x41, 0x87, 0xFF, 0x62, 0xFF, 0x0F, 0x60, 0x85, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, - 0x60, 0x46, 0x04, 0x03, 0x09, 0xF2, 0x8F, 0xFC, 0xAC, 0x86, 0xFB, 0x01, 0xD3, 0xF3, 0xFF, 0xFF, - 0xFE, 0xB4, 0xD3, 0xFB, 0x06, 0x64, 0x0F, 0x60, 0x9F, 0xFB, 0x2D, 0xFF, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x25, 0x46, 0x01, 0xF2, 0x08, 0xF0, 0x60, 0x47, 0x03, 0xB4, 0x03, 0xAC, 0x7F, 0x67, - 0x03, 0x61, 0x08, 0x02, 0x1F, 0x60, 0x26, 0x64, 0x40, 0x4B, 0xF6, 0x60, 0x58, 0x4D, 0xB3, 0x78, - 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x24, 0x40, 0x01, 0x2B, 0x49, 0x00, 0x25, 0x44, - 0x1F, 0xB4, 0xE0, 0x85, 0xF1, 0x60, 0x76, 0x64, 0xC4, 0x98, 0xFF, 0xFF, 0xC0, 0xFE, 0x3D, 0x00, - 0xC1, 0xFE, 0x3B, 0x00, 0xC2, 0xFE, 0x39, 0x00, 0xC3, 0xFE, 0x37, 0x00, 0xC4, 0xFE, 0x35, 0x00, - 0xC5, 0xFE, 0x33, 0x00, 0xC6, 0xFE, 0x31, 0x00, 0xC7, 0xFE, 0x2F, 0x00, 0xC8, 0xFE, 0x2D, 0x00, - 0xC9, 0xFE, 0x2B, 0x00, 0xCA, 0xFE, 0x29, 0x00, 0xCB, 0xFE, 0x27, 0x00, 0xCC, 0xFE, 0x25, 0x00, - 0xCD, 0xFE, 0x23, 0x00, 0xCE, 0xFE, 0x21, 0x00, 0xCF, 0xFE, 0x1F, 0x00, 0xD0, 0xFE, 0x1D, 0x00, - 0xD1, 0xFE, 0x1B, 0x00, 0xD2, 0xFE, 0x19, 0x00, 0xD3, 0xFE, 0x17, 0x00, 0xD4, 0xFE, 0x15, 0x00, - 0xD5, 0xFE, 0x13, 0x00, 0xD6, 0xFE, 0x11, 0x00, 0xD7, 0xFE, 0x0F, 0x00, 0xD8, 0xFE, 0x0D, 0x00, - 0xD9, 0xFE, 0x0B, 0x00, 0xDA, 0xFE, 0x09, 0x00, 0xDB, 0xFE, 0x07, 0x00, 0xDC, 0xFE, 0x05, 0x00, - 0xDD, 0xFE, 0x03, 0x00, 0xDE, 0xFE, 0x01, 0x00, 0xDF, 0xFE, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x00, 0x64, 0x9F, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x9E, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x9D, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x9C, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x9B, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x9A, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x99, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x98, 0xFE, 0xF0, 0x84, - 0xFF, 0xFF, 0x97, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x96, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x95, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x94, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x93, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x92, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x91, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x90, 0xFE, 0xF0, 0x84, - 0x06, 0xFB, 0x8F, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x8E, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x8D, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x8C, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x8B, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x8A, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x89, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x88, 0xFE, 0xF0, 0x84, - 0xFF, 0xFF, 0x87, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x86, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x85, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x84, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x83, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x82, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x81, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x80, 0xFE, 0xF0, 0x84, - 0x05, 0xFB, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x5C, 0x5C, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x24, 0x40, 0x01, 0x27, 0x55, 0x00, 0x05, 0x60, 0x00, 0x63, 0x05, 0xFD, 0x30, 0x44, 0xBD, 0xDB, - 0x31, 0x44, 0xBD, 0xDB, 0x32, 0x44, 0xBD, 0xDB, 0x33, 0x44, 0xBD, 0xDB, 0x34, 0x44, 0xBD, 0xDB, - 0x35, 0x44, 0xBD, 0xDB, 0x36, 0x44, 0xBD, 0xDB, 0x37, 0x44, 0xBD, 0xDB, 0x38, 0x44, 0xBD, 0xDB, - 0x39, 0x44, 0xBD, 0xDB, 0x3A, 0x44, 0xBD, 0xDB, 0x3B, 0x44, 0xBD, 0xDB, 0x3C, 0x44, 0xBD, 0xDB, - 0x3D, 0x44, 0xBD, 0xDB, 0x3E, 0x44, 0xBD, 0xDB, 0x3F, 0x44, 0xBD, 0xDB, 0x02, 0x61, 0x61, 0x44, - 0x02, 0x36, 0x82, 0xFF, 0x03, 0x36, 0x83, 0xFF, 0x04, 0x36, 0x84, 0xFF, 0x05, 0x36, 0x85, 0xFF, - 0x06, 0x36, 0x86, 0xFF, 0x07, 0x36, 0x87, 0xFF, 0x20, 0x44, 0xBD, 0xDB, 0x21, 0x44, 0xBD, 0xDB, - 0x22, 0x44, 0xBD, 0xDB, 0x23, 0x44, 0xBD, 0xDB, 0x24, 0x44, 0xBD, 0xDB, 0x25, 0x44, 0xBD, 0xDB, - 0x26, 0x44, 0xBD, 0xDB, 0x27, 0x44, 0xBD, 0xDB, 0x28, 0x44, 0xBD, 0xDB, 0x29, 0x44, 0xBD, 0xDB, - 0x2A, 0x44, 0xBD, 0xDB, 0x2B, 0x44, 0xBD, 0xDB, 0x2C, 0x44, 0xBD, 0xDB, 0x2D, 0x44, 0xBD, 0xDB, - 0x2E, 0x44, 0xBD, 0xDB, 0x2F, 0x44, 0xBD, 0xDB, 0xDD, 0x81, 0x08, 0x3A, 0xD0, 0x01, 0x54, 0x00, - 0x27, 0x40, 0x10, 0x26, 0x30, 0x00, 0x26, 0x44, 0x01, 0x36, 0x2D, 0x00, 0x02, 0x36, 0x82, 0xFF, - 0x03, 0x36, 0x83, 0xFF, 0x04, 0x36, 0x84, 0xFF, 0x05, 0x36, 0x85, 0xFF, 0x06, 0x36, 0x86, 0xFF, - 0x25, 0x44, 0x00, 0x36, 0x44, 0x40, 0x01, 0x36, 0x44, 0x41, 0x02, 0x36, 0x44, 0x42, 0x03, 0x36, - 0x44, 0x43, 0x04, 0x36, 0x44, 0x44, 0x05, 0x36, 0x44, 0x45, 0x06, 0x36, 0x44, 0x46, 0x07, 0x36, - 0x44, 0x47, 0x08, 0x36, 0x44, 0x48, 0x09, 0x36, 0x44, 0x49, 0x0A, 0x36, 0x44, 0x4A, 0x0B, 0x36, - 0x44, 0x4B, 0x0C, 0x36, 0x44, 0x4C, 0x0D, 0x36, 0x44, 0x4D, 0x0E, 0x36, 0x44, 0x4E, 0x0F, 0x36, - 0x44, 0x4F, 0x87, 0xFF, 0x21, 0x00, 0x25, 0x44, 0x10, 0x36, 0x44, 0x50, 0x11, 0x36, 0x44, 0x51, - 0x12, 0x36, 0x44, 0x52, 0x13, 0x36, 0x44, 0x53, 0x14, 0x36, 0x44, 0x54, 0x15, 0x36, 0x44, 0x55, - 0x16, 0x36, 0x44, 0x56, 0x17, 0x36, 0x44, 0x57, 0x18, 0x36, 0x44, 0x58, 0x19, 0x36, 0x44, 0x59, - 0x1A, 0x36, 0x44, 0x5A, 0x1B, 0x36, 0x44, 0x5B, 0x1C, 0x36, 0x44, 0x5C, 0x1D, 0x36, 0x44, 0x5D, - 0x1E, 0x36, 0x44, 0x5E, 0x1F, 0x36, 0x44, 0x5F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0x46, - 0xB5, 0x60, 0x58, 0x4F, 0x4B, 0x78, 0xFF, 0xFF, 0x03, 0x61, 0x7F, 0x67, 0x0A, 0x02, 0x00, 0xF0, - 0x04, 0x64, 0x0F, 0x60, 0x93, 0xFB, 0x5A, 0xD9, 0x0A, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x40, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, - 0x02, 0x61, 0x12, 0x02, 0x14, 0x64, 0x0F, 0x60, 0x9F, 0xFB, 0x00, 0x60, 0x50, 0x63, 0x5A, 0xDD, - 0xF2, 0x60, 0xF7, 0x64, 0x7F, 0xFB, 0x2D, 0xFF, 0xF0, 0x60, 0xC7, 0x78, 0xFF, 0xFF, 0x2A, 0xF3, - 0x05, 0xFB, 0x2B, 0xF3, 0x06, 0xFB, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x40, 0x60, 0xC0, 0x64, - 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x0E, 0x02, 0x16, 0x64, 0x0F, 0x60, 0x9F, 0xFB, - 0x00, 0x60, 0x50, 0x63, 0x5A, 0xDD, 0xF3, 0x60, 0x12, 0x64, 0x7F, 0xFB, 0x2D, 0xFF, 0xF0, 0x60, - 0xC7, 0x78, 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x7F, 0x60, 0xC0, 0x64, 0x24, 0x45, - 0xA4, 0x80, 0x02, 0x61, 0x35, 0x02, 0x25, 0x45, 0xF1, 0x60, 0x02, 0x64, 0xD4, 0x80, 0xFF, 0xFF, - 0x34, 0x03, 0xF1, 0x60, 0x00, 0x64, 0xD4, 0x80, 0xFF, 0xFF, 0x01, 0x03, 0x28, 0x00, 0x15, 0x60, - 0xC3, 0xF1, 0x99, 0xF3, 0x19, 0x60, 0x00, 0x61, 0xA0, 0x84, 0xA1, 0xDB, 0x25, 0x45, 0x1E, 0x60, - 0x96, 0x63, 0x01, 0x61, 0xBD, 0xD3, 0xBD, 0xD1, 0xD4, 0x80, 0xBD, 0xD3, 0xBD, 0xD5, 0xCD, 0x81, - 0x02, 0x03, 0x15, 0x03, 0xF7, 0x01, 0xA2, 0xFF, 0xA6, 0xD3, 0x40, 0x4C, 0x00, 0xA8, 0x67, 0x43, - 0x0C, 0x02, 0xA2, 0xDD, 0x42, 0x48, 0x64, 0x41, 0xB5, 0x60, 0x58, 0x4D, 0xA2, 0x78, 0xFF, 0xFF, - 0x66, 0x44, 0x28, 0xDB, 0x02, 0x03, 0x2C, 0x58, 0xA3, 0xFF, 0x0C, 0x61, 0x03, 0x00, 0x04, 0x61, - 0x7F, 0x67, 0x01, 0x00, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xF1, 0x60, 0x02, 0x64, 0xD4, 0x80, - 0x7F, 0x67, 0x06, 0x63, 0xF8, 0x02, 0x31, 0x40, 0x21, 0x2A, 0xF5, 0x01, 0x01, 0x64, 0x0C, 0x60, - 0x82, 0xFB, 0xFF, 0xFF, 0xC4, 0xFE, 0xEE, 0x01, 0xC6, 0xFE, 0xEC, 0x01, 0x7E, 0x60, 0xC0, 0x64, - 0x24, 0x45, 0xA4, 0x80, 0x02, 0x61, 0x3F, 0x02, 0x25, 0x45, 0xF8, 0x2B, 0x3B, 0x00, 0x2E, 0xF5, - 0x67, 0x44, 0xD4, 0x80, 0x19, 0x60, 0xAA, 0x63, 0x39, 0x03, 0x7E, 0x61, 0x24, 0x44, 0x01, 0x27, - 0x29, 0x00, 0xA3, 0xFC, 0xA4, 0xF8, 0xBD, 0xD3, 0xA3, 0xD1, 0xD4, 0x80, 0xCD, 0x81, 0x08, 0x24, - 0x64, 0x58, 0x08, 0xA3, 0xF8, 0x02, 0x08, 0x60, 0x00, 0x63, 0xBD, 0xD3, 0xA3, 0xD1, 0xFE, 0xA0, - 0xFA, 0x60, 0x00, 0x64, 0xD0, 0x80, 0x14, 0x02, 0x13, 0x02, 0x04, 0xA3, 0xBE, 0xD3, 0xBD, 0xD1, - 0x0F, 0x18, 0xD4, 0x80, 0x0D, 0x18, 0x03, 0x03, 0xC3, 0x83, 0xC3, 0x83, 0xF7, 0x01, 0x64, 0x41, - 0xDD, 0x81, 0xE1, 0x81, 0xCB, 0x83, 0x46, 0x65, 0xF8, 0x60, 0x58, 0x4F, 0x7A, 0x78, 0xFF, 0xFF, - 0x00, 0x67, 0x0A, 0x00, 0xBD, 0xD3, 0xBE, 0xD1, 0xD4, 0x80, 0xCD, 0x81, 0x08, 0x24, 0x64, 0x58, - 0x08, 0xA3, 0xF8, 0x02, 0x04, 0x61, 0x7F, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x0F, 0x64, 0x23, 0xFA, - 0x67, 0x44, 0x24, 0xFA, 0x62, 0x41, 0x3E, 0x60, 0x00, 0x65, 0x1A, 0x63, 0xF7, 0x60, 0x8C, 0x64, - 0x65, 0x46, 0x58, 0xD0, 0x2E, 0xF5, 0x59, 0xD8, 0xFB, 0x1F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x4B, 0xD3, 0xFF, 0xFF, 0x60, 0x41, 0xE8, 0x84, 0xDC, 0x84, 0x23, 0xFA, 0xBF, 0xD1, 0x4A, 0x65, - 0x64, 0x43, 0xF8, 0x60, 0x58, 0x4F, 0x7A, 0x78, 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x25, 0xF2, 0xFF, 0xFF, 0xE0, 0xA0, 0x20, 0x64, 0x01, 0x06, 0x25, 0xFA, 0x23, 0xF2, 0xDF, 0xD1, - 0xCC, 0x84, 0xE0, 0x85, 0x0B, 0x06, 0xBF, 0xD1, 0x64, 0x41, 0xD5, 0x80, 0x64, 0x43, 0x01, 0x06, - 0x65, 0x41, 0x4A, 0x65, 0xF4, 0x60, 0x58, 0x4F, 0xBD, 0x78, 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0xBC, 0xF3, 0x02, 0x63, 0x23, 0xFC, 0x07, 0xB4, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x4B, 0xD3, 0xBF, 0xD3, 0x60, 0x41, 0xC9, 0x83, 0xE9, 0x81, 0xDD, 0x81, 0xA3, 0xFA, - 0xE0, 0x81, 0x3C, 0x60, 0x00, 0x67, 0x02, 0x24, 0x02, 0xA4, 0x60, 0x47, 0x40, 0x4B, 0xC9, 0x81, - 0x4A, 0x65, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0xA5, 0xD8, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, - 0x00, 0xF4, 0x04, 0x65, 0xF6, 0x1F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xFC, 0xA3, 0xA3, 0xD1, - 0x4C, 0x65, 0xA4, 0xD3, 0xDA, 0x83, 0x60, 0x47, 0x25, 0xFA, 0x00, 0x7E, 0x60, 0x47, 0x01, 0x26, - 0xDC, 0x84, 0x60, 0x41, 0xE8, 0x84, 0xD8, 0x84, 0x23, 0xFA, 0xAB, 0x01, 0xFC, 0xA3, 0xA3, 0xD1, - 0x4C, 0x65, 0xA4, 0xD3, 0xDA, 0x83, 0x00, 0x7F, 0x25, 0xFA, 0x60, 0x41, 0x01, 0x26, 0xDD, 0x81, - 0xE9, 0x84, 0xD8, 0x84, 0x23, 0xFA, 0x9D, 0x01, 0x23, 0xF2, 0x25, 0xF2, 0x02, 0xA8, 0xF8, 0xA0, - 0x0F, 0x02, 0xEC, 0xA0, 0x0D, 0x04, 0x0C, 0x07, 0x15, 0x60, 0xD2, 0xF1, 0xFF, 0xFF, 0xD0, 0x80, - 0xFF, 0xFF, 0x04, 0x07, 0x15, 0x60, 0xD2, 0xFB, 0x15, 0x60, 0xD6, 0xFB, 0x13, 0x60, 0x5B, 0xFB, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x14, 0x60, 0xEE, 0x65, 0x60, 0x41, 0x14, 0x60, - 0x8A, 0x63, 0xA3, 0xDB, 0xFF, 0xA1, 0x48, 0x64, 0x58, 0xD0, 0x7E, 0xA8, 0x5B, 0xD9, 0x02, 0x02, - 0x00, 0xF4, 0x02, 0x64, 0xFF, 0xA1, 0xD7, 0x80, 0x02, 0x03, 0x01, 0x03, 0xF5, 0x01, 0x2E, 0xF5, - 0x00, 0x60, 0x2F, 0x65, 0x25, 0xF2, 0x00, 0x63, 0xCC, 0x84, 0x03, 0xA3, 0xFD, 0x05, 0x4A, 0x64, - 0xD7, 0x80, 0x14, 0x60, 0x26, 0x61, 0x18, 0x05, 0xA1, 0xDD, 0xE3, 0x83, 0xFE, 0xA3, 0x58, 0xD0, - 0x7E, 0xA8, 0x59, 0xD9, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x64, 0xF9, 0x1F, 0x00, 0x63, 0x59, 0xDD, - 0x2E, 0xF5, 0x25, 0xF0, 0x0A, 0x60, 0x13, 0xF3, 0xD3, 0x80, 0x01, 0xB0, 0x04, 0x03, 0x01, 0xA4, - 0x03, 0x03, 0xA2, 0xDB, 0x01, 0x00, 0xA2, 0xDD, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x14, 0x60, - 0x8A, 0x61, 0xA1, 0xD3, 0x23, 0xFA, 0xE0, 0x83, 0x4A, 0x65, 0x04, 0x02, 0x02, 0x63, 0x23, 0xFC, - 0xA5, 0xFC, 0x09, 0x00, 0xDB, 0x83, 0x59, 0xD1, 0xA5, 0xD8, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, - 0x00, 0xF4, 0x04, 0x65, 0xF8, 0x1F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x0A, 0x60, 0x13, 0xF3, - 0x00, 0x61, 0x02, 0xA4, 0xFE, 0xA0, 0x23, 0xFA, 0x1B, 0x03, 0xFA, 0xA4, 0xFD, 0xA4, 0x01, 0xA1, - 0xFD, 0x07, 0x61, 0x43, 0x23, 0xF2, 0x25, 0xFC, 0xE0, 0x83, 0x02, 0xA3, 0x14, 0x60, 0x26, 0x61, - 0x00, 0x60, 0x4A, 0x64, 0x59, 0xD1, 0x58, 0xD8, 0x7E, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x02, 0x64, - 0xF9, 0x1F, 0x25, 0xF2, 0x23, 0xF2, 0x01, 0xB0, 0xCC, 0x84, 0x04, 0x02, 0x23, 0xFA, 0x02, 0x00, - 0x00, 0x64, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x41, 0x4B, 0x65, 0x42, 0x80, 0x64, - 0xD4, 0x85, 0x2B, 0x41, 0x00, 0xA1, 0x55, 0x8B, 0x0D, 0x03, 0x02, 0x04, 0x65, 0x41, 0x02, 0x00, - 0x00, 0x64, 0x40, 0x4B, 0xCA, 0x84, 0x58, 0xD0, 0xC9, 0x81, 0xBD, 0xD9, 0xFC, 0x02, 0x00, 0xF4, - 0x04, 0x65, 0xEC, 0x01, 0x2F, 0x58, 0xFF, 0xFF, 0xFC, 0xA3, 0xA3, 0xD3, 0x02, 0x7C, 0xA0, 0xD3, - 0x23, 0xF8, 0xDC, 0x84, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x02, 0x64, 0x23, 0xFA, - 0x01, 0x64, 0x9D, 0xFE, 0x02, 0x28, 0x02, 0x64, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x02, 0x7C, 0x23, 0xF8, 0x01, 0x64, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xFC, 0xA3, - 0xA3, 0xD1, 0x02, 0x64, 0x23, 0xFA, 0x64, 0x44, 0x7C, 0x5F, 0x60, 0x45, 0x64, 0x47, 0x7C, 0x5F, - 0x88, 0xF1, 0x66, 0x41, 0xC0, 0x86, 0xA5, 0xD2, 0x61, 0x46, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x02, 0x64, 0x23, 0xFA, 0x88, 0xFF, 0x75, 0x44, 0x8D, 0xFF, 0xE8, 0x87, 0xE8, 0x84, - 0xE8, 0x84, 0x03, 0xB4, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x05, 0x64, 0x23, 0xFA, - 0x52, 0x63, 0x96, 0xF3, 0x4B, 0xDA, 0x95, 0xF3, 0x4B, 0xDA, 0x94, 0xF3, 0x4B, 0xDA, 0x60, 0x41, - 0x88, 0xFF, 0x72, 0x5C, 0x89, 0xFF, 0x4A, 0xD8, 0xA2, 0x48, 0x20, 0x23, 0x0E, 0x00, 0x64, 0x40, - 0x80, 0x27, 0x15, 0x00, 0xDC, 0x84, 0xBD, 0xDA, 0xBD, 0xD2, 0x11, 0x04, 0xDC, 0x84, 0xA2, 0xDA, - 0xA3, 0xD2, 0x0D, 0x04, 0xDC, 0x84, 0xA3, 0xDA, 0x0A, 0x00, 0x52, 0x63, 0x96, 0xF3, 0x4B, 0xDA, - 0x95, 0xF3, 0x4B, 0xDA, 0x94, 0xF3, 0x4B, 0xDA, 0x54, 0x90, 0x4C, 0x63, 0xE0, 0x02, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x25, 0xF0, 0x23, 0xF2, 0x15, 0x60, 0xC9, 0xF9, 0x02, 0xA8, 0x64, 0x44, - 0x1F, 0x02, 0x3F, 0x40, 0x02, 0x2B, 0x16, 0x00, 0x00, 0x37, 0x14, 0x00, 0x01, 0x3B, 0x18, 0x00, - 0x11, 0x60, 0xF9, 0x65, 0x11, 0x60, 0x19, 0x63, 0xFF, 0xB7, 0x60, 0x5C, 0xA3, 0xD3, 0x08, 0xA3, - 0x00, 0x7E, 0xD0, 0x80, 0xD7, 0x80, 0x03, 0x03, 0xF9, 0x02, 0x7F, 0x67, 0x0A, 0x00, 0xF4, 0xA3, - 0xA3, 0xD1, 0x04, 0x00, 0x00, 0xBC, 0xF2, 0xA4, 0x03, 0x03, 0x02, 0x07, 0x13, 0x60, 0x52, 0xF9, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x20, 0x63, 0x27, 0x60, 0x06, 0x61, 0x48, 0x64, 0x58, 0xD0, - 0x59, 0xD9, 0xFD, 0x1F, 0x25, 0xF0, 0x20, 0x64, 0xD0, 0x81, 0xFF, 0xFF, 0x02, 0x07, 0x25, 0xFA, - 0x0F, 0x00, 0x27, 0x60, 0x0A, 0x63, 0xC3, 0x83, 0x01, 0x2A, 0x06, 0x00, 0xCF, 0x83, 0xA3, 0xD3, - 0xCD, 0x81, 0x00, 0x7F, 0xBD, 0xDB, 0x04, 0x03, 0x00, 0x64, 0xC9, 0x81, 0xBD, 0xDB, 0xFD, 0x02, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF0, 0x01, 0x60, 0x6E, 0x63, 0x7F, 0x67, - 0x3A, 0x18, 0xA3, 0xD9, 0x26, 0xF0, 0x7F, 0x67, 0x36, 0x18, 0x5B, 0xD9, 0x13, 0x60, 0x0A, 0xF3, - 0x25, 0xF0, 0x60, 0x40, 0x03, 0x3A, 0x2E, 0x00, 0x86, 0xF3, 0x87, 0xF3, 0x60, 0x43, 0xE3, 0x83, - 0x60, 0x46, 0x0F, 0xF8, 0x30, 0x61, 0x94, 0xFA, 0x01, 0x61, 0x91, 0xFA, 0x16, 0x64, 0x12, 0xFA, - 0x60, 0x40, 0x10, 0x36, 0x05, 0x00, 0x12, 0x36, 0x08, 0x00, 0x0C, 0x36, 0x0B, 0x00, 0x0F, 0x00, - 0x40, 0x61, 0xA1, 0x80, 0x0A, 0x64, 0x11, 0x02, 0xF3, 0x01, 0x10, 0x61, 0xA1, 0x80, 0x0E, 0x64, - 0x0C, 0x02, 0xEE, 0x01, 0x08, 0x61, 0xA1, 0x80, 0x10, 0x64, 0x07, 0x02, 0xE9, 0x01, 0xE1, 0x81, - 0xA1, 0x80, 0x05, 0x05, 0xC8, 0x84, 0x01, 0x02, 0xE3, 0x01, 0x12, 0xFA, 0x91, 0xFA, 0x66, 0x44, - 0x02, 0xA6, 0xD7, 0x1F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xFC, 0xA3, 0xA5, 0xF0, 0xA3, 0xD1, - 0xFF, 0xFF, 0x64, 0x5E, 0x00, 0x7F, 0x60, 0x41, 0x64, 0x47, 0x7C, 0x5F, 0x88, 0xF1, 0x66, 0x43, - 0xC0, 0x86, 0x65, 0x44, 0xA1, 0xDA, 0x63, 0x46, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xFC, 0xA3, - 0xA3, 0xD1, 0xFF, 0xFF, 0x64, 0x5E, 0x00, 0x7F, 0x60, 0x45, 0x64, 0x47, 0x7C, 0x5F, 0x88, 0xF1, - 0x66, 0x41, 0xC0, 0x86, 0x65, 0x44, 0xA0, 0xD2, 0x61, 0x46, 0x25, 0xFA, 0x02, 0x64, 0x23, 0xFA, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0xF2, 0x15, 0x60, 0xC8, 0xFB, 0xFF, 0xFF, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF0, 0x02, 0xA8, 0x00, 0x67, 0x02, 0x02, 0x2D, 0xF9, - 0x2C, 0xF9, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF2, 0x02, 0xA8, 0x00, 0xA8, 0x0A, 0x02, - 0x07, 0x03, 0xD0, 0xA0, 0x30, 0x65, 0x03, 0x04, 0xA7, 0xA0, 0x59, 0x65, 0x01, 0x06, 0x65, 0x44, - 0x13, 0x60, 0x51, 0xFB, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0xF2, 0x15, 0x60, 0xCF, 0xFB, - 0xFF, 0xFF, 0x08, 0x2A, 0x25, 0x00, 0x15, 0x60, 0xDD, 0xF3, 0xFF, 0xFF, 0xE9, 0xB4, 0x60, 0x44, - 0x15, 0x60, 0xCF, 0xF1, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x26, 0x02, 0xBC, 0x64, 0x40, 0x02, 0x2A, - 0x04, 0xBC, 0x64, 0x40, 0x04, 0x26, 0x08, 0x00, 0x15, 0x60, 0xDD, 0xFB, 0x13, 0x64, 0xAD, 0xFB, - 0x01, 0x60, 0x67, 0x64, 0x37, 0xFB, 0x0C, 0x00, 0x10, 0xBC, 0x15, 0x60, 0xDD, 0xFB, 0x08, 0x64, - 0xAD, 0xFB, 0x82, 0xF3, 0x01, 0x60, 0x67, 0x7C, 0x60, 0x40, 0x01, 0x27, 0x5B, 0x7C, 0x37, 0xF9, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0xF2, 0x15, 0x60, 0xD0, 0xFB, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x25, 0xF2, 0x15, 0x60, 0xD1, 0xFB, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0xF2, - 0x15, 0x60, 0xEB, 0xFB, 0xFF, 0xFF, 0x0F, 0x22, 0x41, 0x75, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x04, 0x61, 0x06, 0x00, 0x01, 0x64, 0x01, 0x00, 0x00, 0x64, 0x18, 0x60, 0x13, 0xFB, 0x06, 0x61, - 0x41, 0x56, 0xC7, 0xFE, 0xF0, 0x60, 0xC7, 0x78, 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x78, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x10, 0x02, 0x08, 0x61, - 0x41, 0x56, 0xC7, 0xFE, 0xF0, 0x60, 0xC7, 0x78, 0xFF, 0xFF, 0x36, 0x47, 0xFF, 0x23, 0x04, 0x00, - 0x00, 0x7F, 0x60, 0x41, 0x7F, 0x67, 0x03, 0x00, 0x04, 0x7C, 0xBC, 0xF9, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x78, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x10, 0x02, - 0x0A, 0x61, 0x41, 0x56, 0xC7, 0xFE, 0xF0, 0x60, 0xC7, 0x78, 0xFF, 0xFF, 0x36, 0x47, 0xFF, 0x23, - 0x04, 0x00, 0x00, 0x7F, 0x60, 0x41, 0x7F, 0x67, 0x03, 0x00, 0x01, 0x7C, 0xBC, 0xF9, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x02, 0x63, 0x64, 0xF3, 0x23, 0xFC, 0x60, 0x40, 0x01, 0x23, 0x17, 0x00, - 0x01, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0x11, 0x60, 0x14, 0x61, 0x11, 0x60, 0xF4, 0x65, 0xA1, 0xD1, - 0xD5, 0x80, 0xD0, 0x80, 0x0B, 0x03, 0x02, 0x03, 0x08, 0xA1, 0xF9, 0x01, 0x04, 0xA1, 0xA1, 0xD3, - 0x01, 0x60, 0x00, 0x65, 0x60, 0x47, 0xFF, 0xB4, 0xB4, 0x84, 0x01, 0x00, 0xFF, 0x64, 0x25, 0xFA, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xA2, 0xFF, 0x46, 0x45, 0x02, 0xF0, 0x09, 0x60, 0x08, 0x64, - 0xD0, 0x80, 0x00, 0xF4, 0x01, 0xF2, 0x66, 0x5C, 0x25, 0x46, 0x56, 0x02, 0x70, 0x27, 0x54, 0x00, - 0x12, 0x64, 0x03, 0xFA, 0x04, 0xF8, 0x0E, 0xF2, 0x87, 0xFC, 0x8D, 0xFC, 0x8E, 0xFC, 0xDA, 0x82, - 0x16, 0x61, 0x00, 0x63, 0xC9, 0x81, 0x5A, 0xDC, 0xFD, 0x02, 0x60, 0x40, 0xF0, 0x3B, 0x16, 0x00, - 0x32, 0x44, 0x8E, 0xF3, 0x01, 0xB0, 0xF6, 0xA0, 0x08, 0x24, 0x2C, 0x05, 0xDC, 0x83, 0xF0, 0x67, - 0x0E, 0xFA, 0x1F, 0x60, 0x0A, 0x64, 0x2B, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0x8E, 0xFD, 0x2B, 0xFF, 0xFE, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x4F, 0x00, 0x8F, 0xF3, 0x09, 0x65, - 0xD4, 0x80, 0xDC, 0x83, 0x17, 0x05, 0x8F, 0xFD, 0x98, 0xFE, 0x04, 0x04, 0x00, 0x7F, 0x08, 0x7E, - 0x0E, 0xFA, 0x3B, 0xFF, 0x1E, 0x60, 0xFE, 0x64, 0x2B, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0x0E, 0xF2, 0x2B, 0xFF, 0x60, 0x40, 0x08, 0x26, 0xF7, 0xFE, 0xFD, 0x64, 0x3B, 0x42, - 0x4A, 0xDB, 0x32, 0x00, 0x8B, 0xF3, 0xFF, 0xFF, 0xD8, 0xA0, 0xFF, 0xFF, 0x0D, 0x04, 0x1F, 0x60, - 0x16, 0x64, 0x2B, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xFC, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x21, 0x00, 0x46, 0x45, 0x00, 0x64, 0x2B, 0xDB, 0x25, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xA2, 0xFF, 0x00, 0xF4, 0x01, 0xF0, - 0x0A, 0x18, 0x70, 0x67, 0xA0, 0x80, 0xF0, 0x67, 0x06, 0x03, 0xC0, 0x84, 0x01, 0xFA, 0x25, 0x46, - 0x25, 0x44, 0x80, 0xFC, 0x05, 0xFA, 0xB6, 0x60, 0x58, 0x4E, 0x72, 0x78, 0xFF, 0xFF, 0xD4, 0xFE, - 0xA3, 0xFF, 0xFF, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0xD4, 0xFE, 0xA3, 0xFF, 0x2D, 0x58, 0xFF, 0xFF, - 0x1F, 0x60, 0x04, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x0D, 0x00, 0x1E, 0x60, 0xF8, 0x64, 0x40, 0x47, - 0x58, 0x4F, 0x18, 0x00, 0x1F, 0x60, 0x10, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x03, 0x00, 0xF0, 0x60, - 0xC7, 0x78, 0xFF, 0xFF, 0x27, 0xD5, 0x0E, 0xF2, 0x0B, 0x18, 0x60, 0x40, 0x01, 0x2A, 0x08, 0x00, - 0x1F, 0x60, 0x26, 0x64, 0x40, 0x4B, 0xF6, 0x60, 0x58, 0x4D, 0xB3, 0x78, 0xFF, 0xFF, 0xF2, 0x01, - 0x2F, 0x58, 0xFF, 0xFF, 0x27, 0xD5, 0x0E, 0xF2, 0x14, 0x18, 0x60, 0x40, 0x01, 0x2A, 0x11, 0x00, - 0x02, 0xF0, 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, 0xA2, 0xFF, 0x8F, 0xF3, 0x02, 0x02, 0xCC, 0x84, - 0x8F, 0xFB, 0x1F, 0x60, 0x26, 0x64, 0x40, 0x4B, 0xF6, 0x60, 0x58, 0x4D, 0xB3, 0x78, 0xFF, 0xFF, - 0xE9, 0x01, 0x2F, 0x58, 0xFF, 0xFF, 0xFB, 0x64, 0x3A, 0x42, 0x4A, 0xDB, 0xA2, 0xFF, 0x92, 0xF3, - 0x8E, 0xF3, 0xCC, 0x80, 0xFA, 0xA0, 0x01, 0x14, 0x1D, 0x05, 0xB5, 0x60, 0x58, 0x4D, 0x77, 0x78, - 0xFF, 0xFF, 0xA2, 0xFF, 0x17, 0x03, 0xF0, 0x67, 0x0E, 0xFA, 0x1F, 0x60, 0x0A, 0x64, 0x0F, 0x60, - 0x93, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF6, 0x64, - 0x3A, 0x42, 0x4A, 0xDB, 0x92, 0xF3, 0x8E, 0xF3, 0xCC, 0x83, 0xDC, 0x84, 0x01, 0x15, 0x92, 0xFD, - 0x8E, 0xFB, 0xD4, 0xFE, 0x91, 0xF3, 0x8F, 0xF3, 0x00, 0xA8, 0x90, 0xF1, 0x03, 0x02, 0xD0, 0x80, - 0xFF, 0xFF, 0x26, 0x05, 0xB5, 0x60, 0x58, 0x4D, 0x77, 0x78, 0xFF, 0xFF, 0xA2, 0xFF, 0x20, 0x03, - 0x00, 0x63, 0x91, 0xF3, 0x0E, 0xFC, 0xCC, 0x84, 0xFF, 0x3A, 0x91, 0xFB, 0x98, 0xFE, 0x03, 0x04, - 0x08, 0xBB, 0x0E, 0xFC, 0x3B, 0xFF, 0x1E, 0x60, 0xFE, 0x64, 0x0F, 0x60, 0x93, 0xFB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF7, 0x64, 0x3A, 0x42, 0x4A, 0xDB, - 0x8F, 0xF3, 0x0E, 0xF2, 0xDC, 0x83, 0x08, 0xB0, 0x8F, 0xFD, 0x08, 0x28, 0xF7, 0xFE, 0xD4, 0xFE, - 0xA3, 0xFF, 0xF0, 0x60, 0xC7, 0x78, 0xFF, 0xFF, 0xB9, 0xFE, 0x13, 0xFF, 0x24, 0x40, 0x80, 0x2B, - 0x0B, 0x00, 0xA2, 0xFF, 0x25, 0x46, 0x09, 0xF4, 0x0E, 0xF2, 0x05, 0x18, 0x08, 0xBC, 0x0E, 0xFA, - 0xFF, 0xFF, 0xF7, 0xFE, 0x01, 0x00, 0xD8, 0xFE, 0xA3, 0xFF, 0x25, 0x46, 0x3E, 0xF2, 0x00, 0xF4, - 0x08, 0xF0, 0x25, 0x46, 0x06, 0xB4, 0xFF, 0x7F, 0x10, 0xBC, 0x06, 0x26, 0xFD, 0x7F, 0x0E, 0xFA, - 0x3E, 0xF2, 0x3F, 0xF2, 0x60, 0x41, 0x08, 0x2A, 0x64, 0x47, 0x3F, 0xFA, 0x60, 0x45, 0x13, 0x60, - 0x2D, 0xF3, 0xA3, 0xFC, 0xAB, 0xFC, 0x91, 0xFC, 0xD4, 0x80, 0x38, 0x60, 0xC1, 0x65, 0xA5, 0x80, - 0x01, 0x04, 0x07, 0x03, 0x23, 0xF0, 0x08, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0xF8, 0x60, 0x57, 0x78, - 0xFF, 0xFF, 0xFB, 0x60, 0x58, 0x4F, 0x75, 0x78, 0xFF, 0xFF, 0x0B, 0x04, 0x23, 0xF0, 0x04, 0x64, - 0xB0, 0x84, 0xA2, 0xDA, 0x25, 0x60, 0xF4, 0x64, 0xE5, 0x60, 0x78, 0x41, 0xC7, 0x78, 0x97, 0xF1, - 0x46, 0x00, 0x3E, 0xF0, 0x88, 0xF1, 0x64, 0x47, 0x07, 0xB4, 0x07, 0x36, 0x3B, 0x00, 0x04, 0x03, - 0xCC, 0x84, 0xE0, 0x84, 0xC0, 0x83, 0x2D, 0x00, 0x2C, 0xF2, 0x87, 0xF1, 0x01, 0xB0, 0x64, 0x43, - 0x35, 0x02, 0x2E, 0xF2, 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, - 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x2E, 0xF0, 0x63, 0x46, - 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x2D, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, - 0x06, 0x02, 0x61, 0x46, 0x2C, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, - 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0x87, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x01, 0x03, - 0x09, 0x00, 0x66, 0x45, 0x63, 0x46, 0x06, 0xF0, 0x65, 0x46, 0x64, 0x44, 0x0C, 0x26, 0x02, 0x00, - 0x02, 0x26, 0x04, 0x00, 0x23, 0xF0, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0x07, 0xFC, 0x23, 0xF2, - 0xFF, 0xFF, 0x0F, 0x1B, 0x1E, 0x60, 0xE0, 0x64, 0x0F, 0x60, 0x93, 0xFB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x0E, 0xF2, 0xC8, 0xFE, 0x10, 0xAC, 0x0E, 0xFA, - 0x0E, 0x00, 0x1E, 0x60, 0xF2, 0x64, 0x0F, 0x60, 0x93, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x0E, 0xF2, 0xCE, 0xFE, 0x10, 0xAC, 0x0E, 0xFA, 0xF0, 0x60, - 0xC7, 0x78, 0xFF, 0xFF, 0xCB, 0x84, 0xC9, 0x83, 0xFF, 0xFF, 0x08, 0x04, 0x58, 0xD1, 0xA5, 0xD8, - 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF8, 0x1F, 0x2F, 0x58, 0xFF, 0xFF, - 0x25, 0xF0, 0x14, 0x60, 0x15, 0xF9, 0x11, 0x00, 0x0D, 0x60, 0x00, 0x62, 0x40, 0x63, 0x5A, 0xDF, - 0xFE, 0x1F, 0x04, 0x65, 0x0D, 0x60, 0x00, 0x61, 0x48, 0x64, 0x3E, 0x63, 0x7C, 0xA8, 0x58, 0xD0, - 0x59, 0xD9, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x64, 0xF9, 0x1F, 0x14, 0x60, 0x15, 0xF1, 0x0C, 0x60, - 0xDC, 0x65, 0x02, 0xFE, 0x64, 0x44, 0xF8, 0x84, 0xF8, 0x84, 0xF8, 0x87, 0x60, 0x41, 0x64, 0x44, - 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x84, 0x3E, 0xFB, 0x60, 0x42, 0x61, 0x44, 0x03, 0xA2, 0x60, 0xFE, - 0xA2, 0xDB, 0x20, 0xFE, 0x64, 0x44, 0x0D, 0x60, 0x02, 0x65, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0xC4, 0x84, 0x40, 0xFB, 0xFF, 0xFF, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, 0xFF, 0xFF, - 0x5C, 0x41, 0x25, 0xF2, 0xFF, 0xFF, 0x40, 0x42, 0x80, 0x2B, 0x04, 0x00, 0xFF, 0xB4, 0x40, 0x42, - 0x01, 0x64, 0x40, 0x41, 0x87, 0xF3, 0x46, 0x4B, 0x86, 0xF3, 0x60, 0x46, 0xE0, 0x83, 0xAB, 0x46, - 0x26, 0xF0, 0xAB, 0x46, 0x59, 0xF8, 0xAB, 0x46, 0x27, 0xF0, 0xAB, 0x46, 0x5A, 0xF8, 0xAB, 0x46, - 0x28, 0xF0, 0xAB, 0x46, 0x5B, 0xF8, 0x66, 0x44, 0x02, 0xA6, 0xF1, 0x1F, 0x87, 0xF3, 0xFF, 0xFF, - 0x60, 0x46, 0xAB, 0x46, 0x0C, 0x60, 0x3A, 0x65, 0x22, 0x44, 0xFF, 0xB4, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x81, 0xC9, 0x81, 0x52, 0x64, 0x0E, 0x63, 0x58, 0xD0, 0x59, 0xD9, - 0xFD, 0x1F, 0x21, 0x44, 0x01, 0x2A, 0x08, 0x00, 0xAB, 0x46, 0xF0, 0xA1, 0x76, 0x64, 0x0E, 0x63, - 0x59, 0xD1, 0x58, 0xD8, 0xFD, 0x1F, 0xAB, 0x46, 0x22, 0x44, 0xFF, 0xB4, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0x0C, 0x60, 0x9C, 0x65, 0xC4, 0x81, 0x60, 0x45, 0xC9, 0x81, 0x62, 0x64, 0x06, 0x63, - 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x21, 0x44, 0x01, 0x2A, 0x08, 0x00, 0xAB, 0x46, 0xF8, 0xA1, - 0xB6, 0x64, 0x06, 0x63, 0x59, 0xD1, 0x58, 0xD8, 0xFD, 0x1F, 0xAB, 0x46, 0x65, 0x44, 0x0C, 0x60, - 0xBC, 0x65, 0xC4, 0x81, 0xC9, 0x81, 0x6A, 0x64, 0x06, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, - 0x22, 0x44, 0xFF, 0xB4, 0xE0, 0x84, 0xE0, 0x85, 0xC4, 0x84, 0x0C, 0x60, 0x82, 0x65, 0xC4, 0x81, - 0x72, 0x64, 0x04, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0xAB, 0x46, 0x21, 0x44, 0x01, 0x2A, - 0x06, 0x00, 0xFA, 0xA1, 0x90, 0x64, 0x04, 0x63, 0x59, 0xD1, 0x58, 0xD8, 0xFD, 0x1F, 0x3B, 0xF0, - 0x21, 0x44, 0x01, 0x2A, 0x13, 0x00, 0x22, 0x44, 0x3D, 0xFB, 0x60, 0x41, 0x02, 0xFE, 0xF8, 0x84, - 0xF8, 0x84, 0xF8, 0x84, 0x3C, 0xFB, 0x0C, 0x60, 0x7E, 0x63, 0x88, 0xFF, 0xCD, 0x81, 0x06, 0xA3, - 0xFD, 0x0D, 0x8D, 0xFF, 0x3B, 0xFD, 0x64, 0x47, 0x80, 0xBF, 0x60, 0x5C, 0x22, 0x43, 0x80, 0x61, - 0x88, 0xFF, 0xCF, 0x83, 0xE1, 0x81, 0xFD, 0x0D, 0x8D, 0xFF, 0x61, 0x47, 0x31, 0x91, 0xB1, 0x84, - 0x3B, 0xFA, 0x86, 0xF3, 0xFF, 0xFF, 0xCC, 0x83, 0xE3, 0x83, 0x66, 0x44, 0x02, 0xA6, 0x3B, 0xF0, - 0x66, 0x44, 0xB1, 0x9C, 0x3B, 0xF8, 0x02, 0xA6, 0xFA, 0x1F, 0xAB, 0x46, 0x00, 0x67, 0x00, 0x61, - 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF0, 0x02, 0xA8, 0x00, 0x67, 0x24, 0x02, 0x3D, 0xF1, - 0x64, 0x44, 0x03, 0xB4, 0x40, 0x42, 0xD0, 0x80, 0x87, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0xBB, 0xF4, - 0x80, 0x61, 0x02, 0x02, 0xE3, 0x83, 0xEB, 0x83, 0x22, 0x44, 0x88, 0xFF, 0xCC, 0x84, 0xE1, 0x81, - 0xFD, 0x0D, 0x8D, 0xFF, 0x61, 0x47, 0x31, 0x91, 0x9D, 0x85, 0xA7, 0x83, 0x3B, 0xFC, 0x86, 0xF3, - 0xFF, 0xFF, 0xCC, 0x83, 0xE3, 0x83, 0x66, 0x44, 0x02, 0xA6, 0xBB, 0xF2, 0x66, 0x44, 0xA5, 0x81, - 0xBB, 0xFA, 0x02, 0xA6, 0xFA, 0x1F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x11, 0x64, 0x23, 0xFA, - 0x25, 0x44, 0x24, 0xFA, 0x04, 0x64, 0x40, 0x4B, 0x62, 0x41, 0x0C, 0x60, 0x82, 0x64, 0x04, 0x63, - 0x58, 0xD1, 0x59, 0xD8, 0xFD, 0x1F, 0x2B, 0x43, 0x00, 0x7C, 0x59, 0xD8, 0x4F, 0x8B, 0x06, 0xA4, - 0xF6, 0x02, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x27, 0xF2, 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, - 0x61, 0x46, 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x26, 0xF0, - 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x25, 0xF0, 0x63, 0x46, 0xD0, 0x80, - 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0x87, 0xF3, 0x08, 0xFE, - 0x60, 0x43, 0x61, 0x46, 0x01, 0x03, 0x2A, 0x00, 0x43, 0x4B, 0xAB, 0x46, 0x3B, 0xF2, 0x80, 0x60, - 0x30, 0x7C, 0xB0, 0x84, 0xA2, 0xDA, 0x4E, 0x61, 0x76, 0x64, 0x0E, 0x63, 0xAB, 0x46, 0x59, 0xD0, - 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, 0x90, 0x64, 0x04, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, - 0x58, 0xD8, 0xFB, 0x1F, 0xD9, 0x81, 0xA0, 0x64, 0x04, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, - 0x58, 0xD8, 0xFB, 0x1F, 0xD9, 0x81, 0xB6, 0x64, 0x0E, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, - 0x58, 0xD8, 0xFB, 0x1F, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x01, 0x67, 0x20, 0x61, - 0x23, 0x58, 0xFF, 0xFF, 0x27, 0xF2, 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x27, 0xF0, - 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x26, 0xF0, 0x63, 0x46, 0xD0, 0x80, - 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x25, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, - 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0x87, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, - 0x01, 0x03, 0x0D, 0x00, 0x43, 0x4B, 0xAB, 0x46, 0x3B, 0xF2, 0x80, 0x60, 0x30, 0x61, 0x9D, 0x85, - 0xA4, 0x84, 0xA2, 0xDA, 0xAB, 0x46, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x01, 0x67, - 0x20, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x40, 0x41, 0x4A, 0x64, 0xA0, 0xD2, 0xFF, 0xFF, - 0x40, 0x42, 0x80, 0x2B, 0x04, 0x00, 0xFF, 0xB4, 0x40, 0x42, 0x01, 0x64, 0x40, 0x41, 0x87, 0xF3, - 0x46, 0x4B, 0x86, 0xF3, 0x60, 0x46, 0xE0, 0x83, 0xAB, 0x46, 0x32, 0xF0, 0xAB, 0x46, 0x59, 0xF8, - 0xAB, 0x46, 0x33, 0xF0, 0xAB, 0x46, 0x5A, 0xF8, 0xAB, 0x46, 0x34, 0xF0, 0xAB, 0x46, 0x5B, 0xF8, - 0x66, 0x44, 0x02, 0xA6, 0xF1, 0x1F, 0x87, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0xAB, 0x46, 0x0C, 0x60, - 0x3A, 0x65, 0x22, 0x44, 0xFF, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x81, - 0xC9, 0x81, 0x4A, 0x64, 0x0E, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x21, 0x44, 0x01, 0x2A, - 0x08, 0x00, 0xAB, 0x46, 0xF0, 0xA1, 0x76, 0x64, 0x0E, 0x63, 0x59, 0xD1, 0x58, 0xD8, 0xFD, 0x1F, - 0xAB, 0x46, 0x22, 0x44, 0xFF, 0xB4, 0xE0, 0x84, 0xE0, 0x85, 0xC4, 0x84, 0x0C, 0x60, 0x82, 0x65, - 0xC4, 0x81, 0x5A, 0x64, 0x04, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0xAB, 0x46, 0x21, 0x44, - 0x01, 0x2A, 0x06, 0x00, 0xFA, 0xA1, 0x90, 0x64, 0x04, 0x63, 0x59, 0xD1, 0x58, 0xD8, 0xFD, 0x1F, - 0x3B, 0xF0, 0x21, 0x44, 0x01, 0x2A, 0x13, 0x00, 0x22, 0x44, 0x3D, 0xFB, 0x60, 0x41, 0x02, 0xFE, - 0xF8, 0x84, 0xF8, 0x84, 0xF8, 0x84, 0x3C, 0xFB, 0x0C, 0x60, 0x7E, 0x63, 0x88, 0xFF, 0xCD, 0x81, - 0x06, 0xA3, 0xFD, 0x0D, 0x8D, 0xFF, 0x3B, 0xFD, 0x64, 0x47, 0x80, 0xBF, 0x60, 0x5C, 0x22, 0x43, - 0x80, 0x61, 0x88, 0xFF, 0xCF, 0x83, 0xE1, 0x81, 0xFD, 0x0D, 0x8D, 0xFF, 0x61, 0x47, 0x31, 0x91, - 0xB1, 0x84, 0x3B, 0xFA, 0x86, 0xF3, 0xFF, 0xFF, 0xCC, 0x83, 0xE3, 0x83, 0x66, 0x44, 0x02, 0xA6, - 0x3B, 0xF0, 0x66, 0x44, 0xB1, 0x9C, 0x3B, 0xF8, 0x02, 0xA6, 0xFA, 0x1F, 0xAB, 0x46, 0x00, 0x67, - 0x00, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF0, 0x02, 0xA8, 0x00, 0x67, 0x24, 0x02, - 0x3D, 0xF1, 0x64, 0x44, 0x03, 0xB4, 0x40, 0x42, 0xD0, 0x80, 0x87, 0xF3, 0xFF, 0xFF, 0x60, 0x46, - 0xBB, 0xF4, 0x80, 0x61, 0x02, 0x02, 0xE3, 0x83, 0xEB, 0x83, 0x22, 0x44, 0x88, 0xFF, 0xCC, 0x84, - 0xE1, 0x81, 0xFD, 0x0D, 0x8D, 0xFF, 0x61, 0x47, 0x31, 0x91, 0x9D, 0x85, 0xA7, 0x83, 0x3B, 0xFC, - 0x86, 0xF3, 0xFF, 0xFF, 0xCC, 0x83, 0xE3, 0x83, 0x66, 0x44, 0x02, 0xA6, 0xBB, 0xF2, 0x66, 0x44, - 0xA5, 0x81, 0xBB, 0xFA, 0x02, 0xA6, 0xFA, 0x1F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x27, 0xF2, - 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, - 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, - 0x0C, 0x02, 0x61, 0x46, 0x26, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, - 0x25, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, - 0xE8, 0x1B, 0x87, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x01, 0x03, 0x21, 0x00, 0x43, 0x4B, - 0xAB, 0x46, 0x3B, 0xF2, 0x80, 0x60, 0x30, 0x7C, 0xB0, 0x84, 0xA2, 0xDA, 0x4E, 0x61, 0x76, 0x64, - 0x0E, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, 0x90, 0x64, 0x04, 0x63, - 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, 0xA0, 0x64, 0x04, 0x63, 0xAB, 0x46, - 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, 0xFF, 0xFF, - 0x01, 0x67, 0x20, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x27, 0xF2, 0x15, 0x60, 0x02, 0x65, 0x60, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, - 0x61, 0x46, 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x26, 0xF0, - 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x25, 0xF0, 0x63, 0x46, 0xD0, 0x80, - 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0x87, 0xF3, 0x08, 0xFE, - 0x60, 0x43, 0x61, 0x46, 0x01, 0x03, 0x0D, 0x00, 0x43, 0x4B, 0xAB, 0x46, 0x3B, 0xF2, 0x80, 0x60, - 0x30, 0x61, 0x9D, 0x85, 0xA4, 0x84, 0xA2, 0xDA, 0xAB, 0x46, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, - 0xFF, 0xFF, 0x01, 0x67, 0x20, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x3E, 0xF2, 0xAB, 0xF1, 0x08, 0xB0, - 0x19, 0xF8, 0x4A, 0x02, 0x07, 0x23, 0x2B, 0x00, 0x60, 0x47, 0x07, 0xB4, 0x88, 0xF1, 0xCC, 0x84, - 0xE0, 0x84, 0x40, 0x8A, 0xAA, 0x46, 0x03, 0xF2, 0x04, 0xF0, 0x05, 0xF2, 0x60, 0x43, 0xAA, 0x46, - 0x2C, 0xFC, 0x2D, 0xF8, 0x2E, 0xFA, 0xCB, 0xF1, 0x2F, 0xF8, 0xCC, 0xF1, 0x30, 0xF8, 0xCD, 0xF1, - 0x31, 0xF8, 0x46, 0x4A, 0x00, 0xF4, 0x02, 0xF2, 0x03, 0xF0, 0x04, 0xF2, 0x60, 0x43, 0xAA, 0x46, - 0x32, 0xFC, 0x33, 0xF8, 0x34, 0xFA, 0xAA, 0x46, 0x05, 0xF2, 0x06, 0xF0, 0x07, 0xF2, 0x60, 0x43, - 0xAA, 0x46, 0x36, 0xFC, 0x37, 0xF8, 0x38, 0xFA, 0x03, 0x60, 0x08, 0x64, 0x1C, 0x00, 0x66, 0xF1, - 0x2F, 0xF8, 0x67, 0xF1, 0x30, 0xF8, 0x68, 0xF1, 0x31, 0xF8, 0x46, 0x4A, 0x00, 0xF4, 0x02, 0xF2, - 0x03, 0xF0, 0x04, 0xF2, 0x60, 0x43, 0xAA, 0x46, 0x2C, 0xFC, 0x2D, 0xF8, 0x2E, 0xFA, 0xAA, 0x46, - 0x05, 0xF2, 0x06, 0xF0, 0x07, 0xF2, 0x60, 0x43, 0xAA, 0x46, 0x32, 0xFC, 0x33, 0xF8, 0x34, 0xFA, - 0x02, 0x60, 0x08, 0x64, 0x00, 0x00, 0x2A, 0xFA, 0x02, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x42, 0x6F, - 0x6F, 0x74, 0x63, 0x6F, 0x64, 0x65, 0x20, 0x21, 0x21, 0x20, 0x20, 0x00, 0x53, 0x54, 0x41, 0x2F, - 0x41, 0x50, 0x20, 0x46, 0x75, 0x6E, 0x63, 0x27, 0x73, 0x00, 0x20, 0x00, 0x03, 0x00, 0x01, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x04, 0x00, 0x06, 0x00, 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, - 0x07, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x02, 0x00, 0x00, 0x00, - -}; /* fw_image_4_data */ - -static const CFG_IDENTITY_STRCT fw_image_infoidentity[] = { - { - sizeof(CFG_IDENTITY_STRCT) / sizeof(hcf_16) - 1, - CFG_FW_IDENTITY, - COMP_ID_FW_AP, - 3, /* Variant */ - 1, /* Major */ - 24 /* Minor */ - }, - { 0000, 0000, 0000, 0000, 0000, 0000 } /* endsentinel */ -}; - -static const CFG_PROG_STRCT fw_image_code[] = { - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, /* mode */ - 0x0148, /* sizeof(fw_image_1_data), */ - 0x00000060, /* Target address in NIC Memory */ - 0x0000, /* CRC: yes/no TYPE: primary/station/tertiary */ - (hcf_8 *)fw_image_1_data - }, - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, /* mode */ - 0x2432, /* sizeof(fw_image_2_data), */ - 0x00000C16, /* Target address in NIC Memory */ - 0x0000, /* CRC: yes/no TYPE: primary/station/tertiary */ - (hcf_8 *)fw_image_2_data - }, - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, /* mode */ - 0x194c, /* sizeof(fw_image_3_data), */ - 0x001E3048, /* Target address in NIC Memory */ - 0x0000, /* CRC: yes/no TYPE: primary/station/tertiary */ - (hcf_8 *)fw_image_3_data - }, - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, /* mode*/ - 0xb7e4, /* sizeof(fw_image_4_data),*/ - 0x001F4000, /* Target address in NIC Memory*/ - 0x0000, /* CRC: yes/no TYPE: primary/station/tertiary*/ - (hcf_8 *)fw_image_4_data - }, - { - 5, - CFG_PROG, - CFG_PROG_STOP, /* mode*/ - 0000, - 0x000F2101, /* Start execution address*/ - }, - { 0000, 0000, 0000, 0000, 00000000, 0000, 00000000} -}; - -static const CFG_RANGE20_STRCT fw_image_infocompat[] = { - { 3 + ((20 * sizeof(CFG_RANGE_SPEC_STRCT)) / sizeof(hcf_16)), - CFG_FW_SUP_RANGE, - COMP_ROLE_SUPL, - COMP_ID_APF, - { - { 4, 1, 1 } /* variant, bottom, top*/ - } - }, - { 3 + ((20 * sizeof(CFG_RANGE_SPEC_STRCT)) / sizeof(hcf_16)), - CFG_MFI_ACT_RANGES_STA, - COMP_ROLE_ACT, - COMP_ID_MFI, - { - { 7, 3, 3 }, /* variant, bottom, top */ - { 8, 1, 1 } /* variant, bottom, top */ - } - }, - { 3 + ((20 * sizeof(CFG_RANGE_SPEC_STRCT)) / sizeof(hcf_16)), - CFG_CFI_ACT_RANGES_STA, - COMP_ROLE_ACT, - COMP_ID_CFI, - { - { 4, 1, 2 } /* variant, bottom, top */ - } - }, - { 0000, 0000, 0000, 0000, { { 0000, 0000, 0000 } } } /* endsentinel */ -}; - -memimage fw_image = { - "FUPU7D37dhfwci\001C", /* signature, , C/Bin type */ - (CFG_PROG_STRCT *) fw_image_code, - 0x000F2101, - 00000000, /* (dummy) pdaplug */ - 00000000, /* (dummy) priplug */ - (CFG_RANGE20_STRCT *) fw_image_infocompat, - (CFG_IDENTITY_STRCT *) fw_image_infoidentity, -}; - diff --git a/drivers/staging/wlags49_h2/debug.h b/drivers/staging/wlags49_h2/debug.h deleted file mode 100644 index 40f6a3ee7408..000000000000 --- a/drivers/staging/wlags49_h2/debug.h +++ /dev/null @@ -1,199 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * This file contains definitions and macros for debugging. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright (c) 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -#ifndef _DEBUG_H -#define _DEBUG_H - - - - -/* Turn on debugging here if not done with a preprocessor define */ -#ifndef DBG -#define DBG 0 -#else -#undef DBG -#define DBG 1 -#endif /* DBG */ - - - - -#if DBG -/****************************************************************************/ - -/* Set the level of debugging if not done with a preprocessor define. See - wl_main.c, init_module() for how the debug level translates into the - the types of messages displayed */ -#ifndef DBG_LVL -#define DBG_LVL 5 /* yields nothing via init_module, - original value of 5 yields - DBG_TRACE_ON and DBG_VERBOSE_ON */ -#endif /* DBG_LVL*/ - - -#define DBG_ERROR_ON 0x00000001L -#define DBG_WARNING_ON 0x00000002L -#define DBG_NOTICE_ON 0x00000004L -#define DBG_TRACE_ON 0x00000008L -#define DBG_VERBOSE_ON 0x00000010L -#define DBG_PARAM_ON 0x00000020L -#define DBG_BREAK_ON 0x00000040L -#define DBG_RX_ON 0x00000100L -#define DBG_TX_ON 0x00000200L -#define DBG_DS_ON 0x00000400L - -#define DBG_DEFAULTS (DBG_ERROR_ON | DBG_WARNING_ON | DBG_BREAK_ON) - -#define DBG_FLAGS(A) ((A)->DebugFlag) -#define DBG_NAME(A) ((A)->dbgName) -#define DBG_LEVEL(A) ((A)->dbgLevel) - - -#ifndef DBG_PRINT -# define DBG_PRINT(S...) printk(KERN_DEBUG S) -#endif /* DBG_PRINT */ - - -#ifndef DBG_PRINTC -# define DBG_PRINTC(S...) printk(S) -#endif /* DBG_PRINTC */ - - -#define DBG_PARAM(A, N, F, S...) {if (DBG_FLAGS(A) & DBG_PARAM_ON) \ - DBG_PRINT(" %s -- "F"\n", N, S); } - - -#define DBG_ERROR(A, S...) do { \ - if (DBG_FLAGS(A) & DBG_ERROR_ON) { \ - DBG_PRINT("%s:ERROR:%s ", DBG_NAME(A), __func__); \ - DBG_PRINTC(S); \ - } } while (0) - - -#define DBG_WARNING(A, S...) do { \ - if (DBG_FLAGS(A) & DBG_WARNING_ON) { \ - DBG_PRINT("%s:WARNING:%s ", DBG_NAME(A), __func__); \ - DBG_PRINTC(S); \ - } } while (0) - - -#define DBG_NOTICE(A, S...) do { \ - if (DBG_FLAGS(A) & DBG_NOTICE_ON) { \ - DBG_PRINT("%s:NOTICE:%s ", DBG_NAME(A), __func__); \ - DBG_PRINTC(S); \ - } } while (0) - - -#define DBG_TRACE(A, S...) do { \ - if (DBG_FLAGS(A) & DBG_TRACE_ON) { \ - DBG_PRINT("%s:%s ", DBG_NAME(A), __func__); \ - DBG_PRINTC(S); \ - } } while (0) - - -#define DBG_RX(A, S...) {if (DBG_FLAGS(A) & DBG_RX_ON) {\ - DBG_PRINT(S); } } - - -#define DBG_TX(A, S...) {if (DBG_FLAGS(A) & DBG_TX_ON) {\ - DBG_PRINT(S); } } - -#define DBG_DS(A, S...) {if (DBG_FLAGS(A) & DBG_DS_ON) {\ - DBG_PRINT(S); } } - - -#define DBG_ASSERT(C) do { \ - if (!(C)) { \ - DBG_PRINT("ASSERT(%s) -- %s#%d (%s)\n", \ - #C, __FILE__, __LINE__, __func__); \ - } } while (0) - -struct dbg_info { - char *dbgName; - int dbgLevel; - unsigned long DebugFlag; -}; - -extern struct dbg_info *DbgInfo; - - -/****************************************************************************/ -#else /* DBG */ -/****************************************************************************/ - -#define DBG_PRINT(S...) -#define DBG_PARAM(A, N, F, S...) -#define DBG_ERROR(A, S...) -#define DBG_WARNING(A, S...) -#define DBG_NOTICE(A, S...) -#define DBG_TRACE(A, S...) -#define DBG_RX(A, S...) -#define DBG_TX(A, S...) -#define DBG_DS(A, S...) -#define DBG_ASSERT(C) - -#endif /* DBG */ -/****************************************************************************/ - - - - -#endif /* _DEBUG_H */ - diff --git a/drivers/staging/wlags49_h2/dhf.c b/drivers/staging/wlags49_h2/dhf.c deleted file mode 100644 index 4877464f04b0..000000000000 --- a/drivers/staging/wlags49_h2/dhf.c +++ /dev/null @@ -1,380 +0,0 @@ - -/************************************************************************************************************** -* -* FILE : DHF.C -* -* DATE : $Date: 2004/07/19 08:16:14 $ $Revision: 1.2 $ -* Original : 2004/05/28 14:05:34 Revision: 1.36 Tag: hcf7_t20040602_01 -* Original : 2004/05/11 06:22:57 Revision: 1.32 Tag: hcf7_t7_20040513_01 -* Original : 2004/04/15 09:24:42 Revision: 1.28 Tag: hcf7_t7_20040415_01 -* Original : 2004/04/08 15:18:16 Revision: 1.27 Tag: t7_20040413_01 -* Original : 2004/04/01 15:32:55 Revision: 1.25 Tag: t7_20040401_01 -* Original : 2004/03/10 15:39:28 Revision: 1.21 Tag: t20040310_01 -* Original : 2004/03/04 11:03:37 Revision: 1.19 Tag: t20040304_01 -* Original : 2004/03/02 09:27:11 Revision: 1.17 Tag: t20040302_03 -* Original : 2004/02/24 13:00:28 Revision: 1.15 Tag: t20040224_01 -* Original : 2004/02/19 10:57:28 Revision: 1.14 Tag: t20040219_01 -* Original : 2003/11/27 09:00:09 Revision: 1.3 Tag: t20021216_01 -* -* AUTHOR : John Meertens -* Nico Valster -* -* SPECIFICATION: ........ -* -* DESC : generic functions to handle the download of NIC firmware -* Local Support Routines for above procedures -* -* Customizable via HCFCFG.H, which is included by HCF.H -* -* -* DHF is (intended to be) platform-independent. -* DHF is a module that provides a number of routines to download firmware -* images (the names primary, station, access point, secondary and tertiary -* are used or have been used) to volatile or nonvolatile memory -* in WaveLAN/IEEE NICs. To achieve this DHF makes use of the WaveLAN/IEEE -* WCI as implemented by the HCF-module. -* -* Download to non-volatile memory is used to update a WaveLAN/IEEE NIC to new -* firmware. Normally this will be an upgrade to newer firmware, although -* downgrading to older firmware is possible too. -* -* Note: relative to Asserts, the following can be observed: -* Since the IFB is not known inside the routine, the macro HCFASSERT is replaced with MMDASSERT. -* Also the line number reported in the assert is raised by FILE_NAME_OFFSET (10000) to discriminate the -* DHF Asserts from HCF and MMD asserts. -* -*************************************************************************************************************** -* -* -* SOFTWARE LICENSE -* -* This software is provided subject to the following terms and conditions, -* which you should read carefully before using the software. Using this -* software indicates your acceptance of these terms and conditions. If you do -* not agree with these terms and conditions, do not use the software. -* -* COPYRIGHT (C) 1999 - 2000 by Lucent Technologies. All Rights Reserved -* COPYRIGHT (C) 2001 - 2004 by Agere Systems Inc. All Rights Reserved -* All rights reserved. -* -* Redistribution and use in source or binary forms, with or without -* modifications, are permitted provided that the following conditions are met: -* -* . Redistributions of source code must retain the above copyright notice, this -* list of conditions and the following Disclaimer as comments in the code as -* well as in the documentation and/or other materials provided with the -* distribution. -* -* . Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following Disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* . Neither the name of Agere Systems Inc. nor the names of the contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. -* -* Disclaimer -* -* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -* INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF -* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY -* USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN -* RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGE. -* -* -**************************************************************************************************************/ - -#include "hcf.h" -#include "hcfdef.h" -#include "dhf.h" -#include "mmd.h" - -/* to distinguish MMD from HCF asserts by means of line number */ -#undef FILE_NAME_OFFSET -#define FILE_NAME_OFFSET MMD_FILE_NAME_OFFSET -/*----------------------------------------------------------------------------- - * - * Defines, data structures, and global variables - * - *---------------------------------------------------------------------------*/ - -/* 12345678901234 */ -static char signature[14] = "FUPU7D37dhfwci"; - -/*----------------------------------------------------------------------------- - * - * LTV-records retrieved from the NIC to: - * - determine compatibility between NIC and image - * - ((setup the buffer size dynamically for non-volatile download (see note below) )) - * - supply plugging information contained in the PDA (H-I only) - * - *---------------------------------------------------------------------------*/ - -/* for USB/H1 we needed a smaller value than the CFG_DL_BUF_STRCT reported 8192 - for the time being it seems simpler to always use 2000 for USB/H1 as well as all other cases rather than - using the "fixed anyway" CFG_DL_BUF_STRCT. */ -#define DL_SIZE 2000 - -/* CFG_IDENTITY_STRCT pri_identity = { LOF(CFG_IDENTITY_STRCT), CFG_PRI_IDENTITY }; */ -static CFG_SUP_RANGE_STRCT mfi_sup = { LOF(CFG_SUP_RANGE_STRCT), CFG_NIC_MFI_SUP_RANGE }; -static CFG_SUP_RANGE_STRCT cfi_sup = { LOF(CFG_SUP_RANGE_STRCT), CFG_NIC_CFI_SUP_RANGE }; -/* Note: could be used rather than the above explained and defined DL_SIZE if need arises - * CFG_DL_BUF_STRCT dl_buf = { LOF(CFG_DL_BUF_STRCT), CFG_DL_BUF }; -*/ - -/*----------------------------------------------------------------------------- - * Array ltv_info stores NIC information (in the form of LTV-records) - * needed for download. A NULL record indicates the end of the array. - *---------------------------------------------------------------------------*/ - -/* The LTV_INFO_STRUCT is needed to save the sizes of the structs, because after a GET_INFO() - * the len field is changed to the real len of the RID by the called routine. - * This is only relevant if the DHF used without reloading the driver/utility. - */ - -static LTV_INFO_STRUCT ltv_info[] = { - { (LTVP)&mfi_sup, LOF(CFG_SUP_RANGE_STRCT) } , - { (LTVP)&cfi_sup, LOF(CFG_SUP_RANGE_STRCT) } , - { (LTVP) NULL, 0 } -}; - - -/***********************************************************************************************************/ -/*************************************** PROTOTYPES ******************************************************/ -/***********************************************************************************************************/ -static int check_comp_fw(memimage *fw); - - -/************************************************************************************************************ -*.SUBMODULE int check_comp_fw( memimage *fw ) -*.PURPOSE Checks compatibility of CFI and MFI, NIC as supplier, station/AP firmware image as supplier. -* -*.ARGUMENTS -* fw F/W image to be downloaded -* -*.RETURNS -* HFC_SUCCESS - firmware OK -* DHF_ERR_INCOMP_FW -* -*.DESCRIPTION -* This function uses compatibility and identity information that has been -* retrieved from the card which is currently inserted to check whether the -* station firmware image to be downloaded is compatible. -*.ENDDOC END DOCUMENTATION -*************************************************************************************************************/ -static int -check_comp_fw(memimage *fw) -{ -CFG_RANGE20_STRCT *p; -int rc = HCF_SUCCESS; -CFG_RANGE_SPEC_STRCT *i; - - switch (fw->identity->typ) { - case CFG_FW_IDENTITY: /* Station F/W */ - case COMP_ID_FW_AP_FAKE: /* ;?is this useful (used to be: CFG_AP_IDENTITY) */ - break; - default: - MMDASSERT(DO_ASSERT, fw->identity->typ) /* unknown/unsupported firmware_type: */ - rc = DHF_ERR_INCOMP_FW; - return rc; /* ;? how useful is this anyway, - * till that is sorted out might as well violate my own single exit principle - */ - } - p = fw->compat; - i = NULL; - while (p->len && i == NULL) { /* check the MFI ranges */ - if (p->typ == CFG_MFI_ACT_RANGES_STA) { - i = mmd_check_comp((void *)p, &mfi_sup); - } - p++; - } - MMDASSERT(i, 0) /* MFI: NIC Supplier not compatible with F/W image Actor */ - if (i) { - p = fw->compat; - i = NULL; - while (p->len && i == NULL) { /* check the CFI ranges */ - if (p->typ == CFG_CFI_ACT_RANGES_STA) { - i = mmd_check_comp((void *)p, &cfi_sup); - } - p++; - } - MMDASSERT(i, 0) /* CFI: NIC Supplier not compatible with F/W image Actor */ - } - if (i == NULL) { - rc = DHF_ERR_INCOMP_FW; - } - return rc; -} /* check_comp_fw */ - - - - - -/*----------------------------------------------------------------------------- - * - * Exported functions - * - *---------------------------------------------------------------------------*/ - - - -/************************************************************************************************************* -* -*.MODULE int dhf_download_binary( void *ifbp, memimage *fw ) -*.PURPOSE Downloads a complete (primary, station, or access point) firmware image to the NIC. -* -*.ARGUMENTS -* ifbp address of the Interface Block -* fw F/W image to be downloaded -* -*.RETURNS -* HCF_SUCCESS - download completed successfully. -* DHF_ERR_INCOMP_FW - firmware not compatible -* -*.DESCRIPTION -* Initialize global variables -* Connect to the DHF -* Check the compatibility of the image (For primary firmware images it is checked first -* whether download is necessary). -* If everything's download the firmware. -* Disconnect from the DHF. -* -* -*.DIAGRAM -* -*.NOTICE: - MMDASSERT is unacceptable because some drivers call dhf_download_binary before hcf_connect - -* The old comment was: -*.ENDDOC END DOCUMENTATION -*************************************************************************************************************/ -int -dhf_download_binary(memimage *fw) -{ -int rc = HCF_SUCCESS; -CFG_PROG_STRCT *p; -int i; - - /* validate the image */ - for (i = 0; i < sizeof(signature) && fw->signature[i] == signature[i]; i++) - ; /* NOP */ - if (i != sizeof(signature) || - fw->signature[i] != 0x01 || - /* test for Little/Big Endian Binary flag */ - fw->signature[i+1] != (/* HCF_BIG_ENDIAN ? 'B' : */ 'L')) - rc = DHF_ERR_INCOMP_FW; - else { /* Little Endian Binary format */ - fw->codep = (CFG_PROG_STRCT FAR*)((char *)fw->codep + (hcf_32)fw); - fw->identity = (CFG_IDENTITY_STRCT FAR*)((char *)fw->identity + (hcf_32)fw); - fw->compat = (CFG_RANGE20_STRCT FAR*)((char *)fw->compat + (hcf_32)fw); - for (i = 0; fw->p[i]; i++) - fw->p[i] = ((char *)fw->p[i] + (hcf_32)fw); - p = fw->codep; - while (p->len) { - p->host_addr = (char *)p->host_addr + (hcf_32)fw; - p++; - } - } - return rc; -} /* dhf_download_binary */ - - -/************************************************************************************************************* -* -*.MODULE int dhf_download_fw( void *ifbp, memimage *fw ) -*.PURPOSE Downloads a complete (primary or tertiary) firmware image to the NIC. -* -*.ARGUMENTS -* ifbp address of the Interface Block -* fw F/W image to be downloaded -* -*.RETURNS -* HCF_SUCCESS - download completed successfully. -* HCF_ERR_NO_NIC - no NIC present -* DHF_ERR_INCOMP_FW - firmware not compatible -* -*.DESCRIPTION -* - check the signature of the image -* - get the compatibility information from the components on the NIC -* - Primary Firmware Identity -* - Modem - Firmware I/F -* - Controller - Firmware I/F -*!! - if necessary ( i.e. H-I) get the PDA contents from the NIC -* - check the compatibility of the MFI and CFI of the NIC with the F/W image -* Note: the Primary F/W compatibility is only relevant for the "running" HCF and is already verified in -* hcf_connect -*!! - if necessary ( i.e. H-I) -*!! - verify the sumcheck of the PDA -*!! - plug the image (based on the PDA and the default plug records) -* - loop over all the download LTVs in the image which consists of a sequence of -* - CFG_PROG_VOLATILE/CFG_PROG_NON_VOLATILE -* - 1 or more sequences of CFG_PROG_ADDR, CFG_PROG_DATA,....,CFG_PROG_DATA -* - CFG_PROG_STOP -* -*.DIAGRAM -* -*.NOTICE -* The old comment was: -* // Download primary firmware if necessary and allowed. This is done silently (without telling -* // the user) and only if the firmware in the download image is newer than the firmware in the -* // card. In Major version 4 of the primary firmware functions of Hermes and Shark were -* // combined. Prior to that two separate versions existed. We only have to download primary -* // firmware if major version of primary firmware in the NIC < 4. -* // download = pri_identity.version_major < 4; -* // if ( download ) { -* // rc = check_comp_primary( fw ); -* // } -* It is my understanding that Pri Variant 1 must be updated by Pri Variant 2. The test on -* major version < 4 should amount to the same result but be "principally" less correct -* In deliberation with the Architecture team, it was decided that this upgrade for old H-I -* NICs, is an aspect which belongs on the WSU level not on the DHF level -* -*.ENDDOC END DOCUMENTATION -*************************************************************************************************************/ -int -dhf_download_fw(void *ifbp, memimage *fw) -{ -int rc = HCF_SUCCESS; -LTV_INFO_STRUCT_PTR pp = ltv_info; -CFG_PROG_STRCT *p = fw->codep; -LTVP ltvp; -int i; - - MMDASSERT(fw != NULL, 0) - /* validate the image */ - for (i = 0; i < sizeof(signature) && fw->signature[i] == signature[i]; i++) - ; /* NOP */ - if (i != sizeof(signature) || - fw->signature[i] != 0x01 || - /* check for binary image */ - (fw->signature[i+1] != 'C' && fw->signature[i+1] != (/*HCF_BIG_ENDIAN ? 'B' : */ 'L'))) - rc = DHF_ERR_INCOMP_FW; - -/* Retrieve all information needed for download from the NIC */ - while ((rc == HCF_SUCCESS) && ((ltvp = pp->ltvp) != NULL)) { - ltvp->len = pp++->len; /* Set len to original len. This len is changed to real len by GET_INFO() */ - rc = GET_INFO(ltvp); - MMDASSERT(rc == HCF_SUCCESS, rc) - MMDASSERT(rc == HCF_SUCCESS, ltvp->typ) - MMDASSERT(rc == HCF_SUCCESS, ltvp->len) - } - if (rc == HCF_SUCCESS) - rc = check_comp_fw(fw); - if (rc == HCF_SUCCESS) { - while (rc == HCF_SUCCESS && p->len) { - rc = PUT_INFO(p); - p++; - } - } - MMDASSERT(rc == HCF_SUCCESS, rc) - return rc; -} /* dhf_download_fw */ - - diff --git a/drivers/staging/wlags49_h2/dhf.h b/drivers/staging/wlags49_h2/dhf.h deleted file mode 100644 index 1299b8256468..000000000000 --- a/drivers/staging/wlags49_h2/dhf.h +++ /dev/null @@ -1,225 +0,0 @@ - -#ifndef DHF_H -#define DHF_H - -/************************************************************************************************************** -* -* FILE : DHF.H -* -* DATE : $Date: 2004/07/19 08:16:14 $ $Revision: 1.2 $ -* Original : 2004/05/17 07:33:13 Revision: 1.25 Tag: hcf7_t20040602_01 -* Original : 2004/05/11 06:03:14 Revision: 1.24 Tag: hcf7_t7_20040513_01 -* Original : 2004/04/15 09:24:42 Revision: 1.22 Tag: hcf7_t7_20040415_01 -* Original : 2004/04/09 14:35:52 Revision: 1.21 Tag: t7_20040413_01 -* Original : 2004/04/01 15:32:55 Revision: 1.18 Tag: t7_20040401_01 -* Original : 2004/03/10 15:39:28 Revision: 1.15 Tag: t20040310_01 -* Original : 2004/03/04 11:03:38 Revision: 1.13 Tag: t20040304_01 -* Original : 2004/02/25 14:14:37 Revision: 1.11 Tag: t20040302_03 -* Original : 2004/02/24 13:00:28 Revision: 1.10 Tag: t20040224_01 -* Original : 2004/02/19 10:57:28 Revision: 1.8 Tag: t20040219_01 -* -* AUTHOR : John Meertens -* Nico Valster -* -* SPECIFICATION: ......... -* -* DESC : structure definitions and function prototypes for unit DHF. -* -* Customizable via HCFCFG.H, which is included indirectly via HCF.H -* -*************************************************************************************************************** -* -* -* SOFTWARE LICENSE -* -* This software is provided subject to the following terms and conditions, -* which you should read carefully before using the software. Using this -* software indicates your acceptance of these terms and conditions. If you do -* not agree with these terms and conditions, do not use the software. -* -* COPYRIGHT (C) 1994 - 1995 by AT&T. All Rights Reserved -* COPYRIGHT (C) 1999 - 2000 by Lucent Technologies. All Rights Reserved -* COPYRIGHT (C) 2001 - 2004 by Agere Systems Inc. All Rights Reserved -* All rights reserved. -* -* Redistribution and use in source or binary forms, with or without -* modifications, are permitted provided that the following conditions are met: -* -* . Redistributions of source code must retain the above copyright notice, this -* list of conditions and the following Disclaimer as comments in the code as -* well as in the documentation and/or other materials provided with the -* distribution. -* -* . Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following Disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* . Neither the name of Agere Systems Inc. nor the names of the contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. -* -* Disclaimer -* -* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -* INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF -* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY -* USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN -* RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGE. -* -* -**************************************************************************************************************/ - - -#ifdef _WIN32_WCE -#include -#endif - -#include "hcf.h" /* includes HCFCFG.H too */ - -#ifdef DHF_UIL -#define GET_INFO(pp) uil_get_info((LTVP)pp) -#define PUT_INFO(pp) uil_put_info((LTVP)pp) -#else -#define GET_INFO(pp) hcf_get_info(ifbp, (LTVP)pp) -#define PUT_INFO(pp) hcf_put_info(ifbp, (LTVP)pp) -#endif - - -/*---- Defines --------------------------------------------------------------*/ -#define CODEMASK 0x0000FFFFL /* Codemask for plug records */ - -/*---- Error numbers --------------------------------------------------------*/ - -#define DHF_ERR_INCOMP_FW 0x40 /* Image not compatible with NIC */ - -/*---- Type definitions -----------------------------------------------------*/ -/* needed by dhf_wrap.c */ - -typedef struct { - LTVP ltvp; - hcf_16 len; -} LTV_INFO_STRUCT , *LTV_INFO_STRUCT_PTR; - - -/* - * Type: plugrecord - * - * Abstract: This structure represents a Plug Data Record. - * - * Description: - * This structure is used to overlay the plug records in the firmware memory image. - */ - -typedef struct { - hcf_32 code; /* Code to plug */ - hcf_32 addr; /* Address within the memory image to plug it in */ - hcf_32 len; /* The # of bytes which are available to store it */ -} plugrecord; - -/* - * Type: stringrecord - * - * Abstract: This structure represents a Firmware debug/assert string - * - * Description: - * This structure is used to get assert and debug outputs in the driver and/or utility to be - * able to get more visability of the FW. - */ - -#define MAX_DEBUGSTRINGS 1024 -#define MAX_DEBUGSTRING_LEN 82 - -typedef struct { - hcf_32 id; - char str[MAX_DEBUGSTRING_LEN]; -} stringrecord; - -/* - * Type: exportrecord - * - * Abstract: This structure represents a Firmware export of a variable - * - * Description: - * This structure is used to get the address and name of a FW variable. - */ - -#define MAX_DEBUGEXPORTS 2048 -#define MAX_DEBUGEXPORT_LEN 12 - -typedef struct { - hcf_32 id; - char str[MAX_DEBUGEXPORT_LEN]; -} exportrecord; - -/* Offsets in memimage array p[] */ -#define FWSTRINGS_FUNCTION 0 -#define FWEXPORTS_FUNCTION 1 - -/* - * Type: memimage - * - * Abstract: The "root" description of a complete memory image - * - * Description: - * This type represents an entire memory image. The image is built up of several - * segments. These segments need not be contiguous areas in memory, in other words - * the image may contain 'holes'. - * - * The 'codep' field points to an array of segment_descriptor structures. - * The end of the array is indicated by a segment_descriptor of which all fields are zero. - * The 'execution' field is a 32-bit address representing the execution address - * of the firmware within the memory image. This address is zero in case of non-volatile - * memory download. - * The 'compat' field points to an array of TODO - * The end of the array is indicated by a plug record of which all fields are zero. - * The 'identity' field points to an array of TODO - * The end of the array is indicated by a plug record of which all fields are zero. - * The Hermes-I specific 'pdaplug' field points to an array of Production Data Plug record structures. - * The end of the array is indicated by a plug record of which all fields are zero. - * The Hermes-I specific 'priplug' field points to an array of Primary Information Plug record structures. - * The end of the array is indicated by a plug record of which all fields are zero. - */ -typedef struct { - char signature[14+1+1]; /* signature (see DHF.C) + C/LE-Bin/BE-Bin-flag + format version */ - CFG_PROG_STRCT FAR *codep; /* */ - hcf_32 execution; /* Execution address of the firmware */ - void FAR *place_holder_1; - void FAR *place_holder_2; - CFG_RANGE20_STRCT FAR *compat; /* Pointer to the compatibility info records */ - CFG_IDENTITY_STRCT FAR *identity; /* Pointer to the identity info records */ - void FAR *p[2]; /* (Up to 9) pointers for (future) expansion - * currently in use: - * - F/W printf information - */ -} memimage; - - - -/*----------------------------------------------------------------------------- - * - * DHF function prototypes - * - *---------------------------------------------------------------------------*/ - -EXTERN_C int dhf_download_fw(void *ifbp, memimage *fw); /* ifbp, ignored when using the UIL */ -EXTERN_C int dhf_download_binary(memimage *fw); - - -/*----------------------------------------------------------------------------- - * - * Functions to be provided by the user of the DHF module. - * - *---------------------------------------------------------------------------*/ - -/* defined in DHF.C; see there for comments */ -EXTERN_C hcf_16 *find_record_in_pda(hcf_16 *pdap, hcf_16 code); - -#endif /* DHF_H */ - diff --git a/drivers/staging/wlags49_h2/dhfcfg.h b/drivers/staging/wlags49_h2/dhfcfg.h deleted file mode 100644 index 147f4c83c00c..000000000000 --- a/drivers/staging/wlags49_h2/dhfcfg.h +++ /dev/null @@ -1,158 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * This file contains DHF configuration info. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright (c) 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -#ifndef DHFCFG_H -#define DHFCFG_H -/*----------------------------------------------------------------------------- - * File DHFCFG.H - * - * Contents: #defines for the DHF module - * - * Comments: - * Some combinations of the #defines in this file are illegal (as noted below). - * If an illegal combinations of #defines is specified a compile error is - * generated. See document DHFUG.DOC for more information. - * - * Author: John Meertens - * Date: 11-01-2000 - * - * Change history: - *---------------------------------------------------------------------------*/ - - -/* Define DHF_WCI if you want to use the WCI to access the ORiNOCO card. - Define DHF_UIL if you want to use the UIL to access the ORiNOCO card. - You must define either DHF_WCI or DHF_UIL. If neither of the two is defined - or both a compile error is generated. */ -#define DHF_WCI -/* !!!#define DHF_UIL */ - -/* Define DHF_BIG_ENDIAN if you are working on a big endian platform. - Define DHF_LITTLE_ENDIAN if you are working on a little endian platform. - You must define either DHF_BIG_ENDIAN or DHF_LITTLE_ENDIAN. If neither of - the two is defined or both a compile error is generated. */ -#ifdef USE_BIG_ENDIAN -#define DHF_BIG_ENDIAN -#else -#define DHF_LITTLE_ENDIAN -#endif /* USE_BIG_ENDIAN */ - -/* Define DHF_WIN if you are working on Windows platform. - Define DHF_DOS if you are working on DOS. - You must define either DHF_WIN or DHF_DOS. If neither of - the two is defined or both a compile error is generated. - !!!#define DHF_WIN - !!!#define DHF_DOS */ - -/* Define if you want the DHF to users. Not defining DHF_GET_RES_MSG - leads to a decrease in code size as message strings are not included. - !!!#define DHF_GET_RES_MSG */ - -/* Linux driver specific - Prevent inclusion of stdlib.h and string.h */ -#define _INC_STDLIB -#define _INC_STRING - -/*----------------------------------------------------------------------------- - Define one or more of the following DSF #defines if you want to implement - the related DSF-function. Function dsf_callback must allways be implemented. - See file DHF.H for prototypes of the functions. */ - -/* Define DSF_ALLOC if you want to manage memory allocation and de-allocation - for the DHF. If DSF_ALLOC is defined you must implement dsf_alloc and dsf_free. - !!!#define DSF_ALLOC */ - -/* Define DSF_CONFIRM if you want the DHF to ask the user for confirmation in a - number of situations. If DSF_CONFIRM is defined you must implement dsf_confirm. - Not defining DSF_CONFIRM leads to a decrease in code size as confirmation - strings are not included. - !!!#define DSF_CONFIRM */ - -/* Define DSF_DEBUG_MESSAGE if you want debug messages added to your output. - If you define DSF_DEBUG_MESSAGE then you must implement function - dsf_debug_message. - #define DSF_DEBUG_MESSAGE */ - -/* Define DSF_ASSERT if you want asserts to be activated. - If you define DSF_ASSERT then you must implement function dsf_assert. - #define DBG 1 - #define DSF_ASSERT */ - -/* Define DSF_DBWIN if you want asserts and debug messages to be send to a debug - window like SOFTICE or DebugView from SysInternals. - !!!#define DSF_DBWIN - !!! Not implemented yet! */ - -/* Define DSF_VOLATILE_ONLY if you only wants to use valatile functions - This is a typical setting for a AP and a driver. */ -#define DSF_VOLATILE_ONLY - -/* Define DSF_HERMESII if you want to use the DHF for the Hermes-II */ -#ifdef HERMES2 -#define DSF_HERMESII -#else -#undef DSF_HERMESII -#endif /* HERMES2 */ - -/* Define DSF_BINARY_FILE if you want to use the DHF in combination with - reading the Firmware from a separate binary file. - !!!#define DSF_BINARY_FILE */ - -#endif /* DHFCFG_H */ diff --git a/drivers/staging/wlags49_h2/hcf.c b/drivers/staging/wlags49_h2/hcf.c deleted file mode 100644 index f44d888ecd6e..000000000000 --- a/drivers/staging/wlags49_h2/hcf.c +++ /dev/null @@ -1,4748 +0,0 @@ -/************************************************************************************************************ - * - * FILE : HCF.C - * - * DATE : $Date: 2004/08/05 11:47:10 $ $Revision: 1.10 $ - * Original: 2004/06/02 10:22:22 Revision: 1.85 Tag: hcf7_t20040602_01 - * Original: 2004/04/15 09:24:41 Revision: 1.63 Tag: hcf7_t7_20040415_01 - * Original: 2004/04/13 14:22:44 Revision: 1.62 Tag: t7_20040413_01 - * Original: 2004/04/01 15:32:55 Revision: 1.59 Tag: t7_20040401_01 - * Original: 2004/03/10 15:39:27 Revision: 1.55 Tag: t20040310_01 - * Original: 2004/03/04 11:03:37 Revision: 1.53 Tag: t20040304_01 - * Original: 2004/03/02 14:51:21 Revision: 1.50 Tag: t20040302_03 - * Original: 2004/02/24 13:00:27 Revision: 1.43 Tag: t20040224_01 - * Original: 2004/02/19 10:57:25 Revision: 1.39 Tag: t20040219_01 - * - * AUTHOR : Nico Valster - * - * SPECIFICATION: ........ - * - * DESCRIPTION : HCF Routines for Hermes-II (callable via the Wireless Connection I/F or WCI) - * Local Support Routines for above procedures - * - * Customizable via HCFCFG.H, which is included by HCF.H - * - ************************************************************************************************************* - * - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * COPYRIGHT © 1994 - 1995 by AT&T. All Rights Reserved - * COPYRIGHT © 1996 - 2000 by Lucent Technologies. All Rights Reserved - * COPYRIGHT © 2001 - 2004 by Agere Systems Inc. All Rights Reserved - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * - ************************************************************************************************************/ - - -/************************************************************************************************************ - ** - ** Implementation Notes - ** - * - a leading marker of //! is used. The purpose of such a sequence is to help to understand the flow - * An example is: //!rc = HCF_SUCCESS; - * if this is superfluous because rc is already guaranteed to be 0 but it shows to the (maintenance) - * programmer it is an intentional omission at the place where someone could consider it most appropriate at - * first glance - * - using near pointers in a model where ss!=ds is an invitation for disaster, so be aware of how you specify - * your model and how you define variables which are used at interrupt time - * - remember that sign extension on 32 bit platforms may cause problems unless code is carefully constructed, - * e.g. use "(hcf_16)~foo" rather than "~foo" - * - ************************************************************************************************************/ - -#include "hcf.h" // HCF and MSF common include file -#include "hcfdef.h" // HCF specific include file -#include "mmd.h" // MoreModularDriver common include file -#include -#include - -#if ! defined offsetof -#define offsetof(s,m) ((unsigned int)&(((s *)0)->m)) -#endif // offsetof - - -/***********************************************************************************************************/ -/*************************************** PROTOTYPES ******************************************************/ -/***********************************************************************************************************/ -HCF_STATIC int cmd_exe( IFBP ifbp, hcf_16 cmd_code, hcf_16 par_0 ); -HCF_STATIC int init( IFBP ifbp ); -HCF_STATIC int put_info( IFBP ifbp, LTVP ltvp ); -HCF_STATIC int put_info_mb( IFBP ifbp, CFG_MB_INFO_STRCT FAR * ltvp ); -#if (HCF_TYPE) & HCF_TYPE_WPA -HCF_STATIC void calc_mic( hcf_32* p, hcf_32 M ); -void calc_mic_rx_frag( IFBP ifbp, wci_bufp p, int len ); -void calc_mic_tx_frag( IFBP ifbp, wci_bufp p, int len ); -HCF_STATIC int check_mic( IFBP ifbp ); -#endif // HCF_TYPE_WPA - -HCF_STATIC void calibrate( IFBP ifbp ); -HCF_STATIC int cmd_cmpl( IFBP ifbp ); -HCF_STATIC hcf_16 get_fid( IFBP ifbp ); -HCF_STATIC void isr_info( IFBP ifbp ); -#if HCF_DMA -HCF_STATIC DESC_STRCT* get_frame_lst(IFBP ifbp, int tx_rx_flag); -#endif // HCF_DMA -HCF_STATIC void get_frag( IFBP ifbp, wci_bufp bufp, int len BE_PAR( int word_len ) ); //char*, byte count (usually even) -#if HCF_DMA -HCF_STATIC void put_frame_lst( IFBP ifbp, DESC_STRCT *descp, int tx_rx_flag ); -#endif // HCF_DMA -HCF_STATIC void put_frag( IFBP ifbp, wci_bufp bufp, int len BE_PAR( int word_len ) ); -HCF_STATIC void put_frag_finalize( IFBP ifbp ); -HCF_STATIC int setup_bap( IFBP ifbp, hcf_16 fid, int offset, int type ); -#if (HCF_ASSERT) & HCF_ASSERT_PRINTF -static int fw_printf(IFBP ifbp, CFG_FW_PRINTF_STRCT FAR *ltvp); -#endif // HCF_ASSERT_PRINTF - -HCF_STATIC int download( IFBP ifbp, CFG_PROG_STRCT FAR *ltvp ); -HCF_STATIC hcf_8 hcf_encap( wci_bufp type ); -HCF_STATIC hcf_8 null_addr[4] = { 0, 0, 0, 0 }; -#if ! defined IN_PORT_WORD //replace I/O Macros with logging facility -extern FILE *log_file; - -#define IN_PORT_WORD(port) in_port_word( (hcf_io)(port) ) - -static hcf_16 in_port_word( hcf_io port ) { - hcf_16 i = (hcf_16)_inpw( port ); - if ( log_file ) { - fprintf( log_file, "\nR %2.2x %4.4x", (port)&0xFF, i); - } - return i; -} // in_port_word - -#define OUT_PORT_WORD(port, value) out_port_word( (hcf_io)(port), (hcf_16)(value) ) - -static void out_port_word( hcf_io port, hcf_16 value ) { - _outpw( port, value ); - if ( log_file ) { - fprintf( log_file, "\nW %2.02x %4.04x", (port)&0xFF, value ); - } -} - -void IN_PORT_STRING_32( hcf_io prt, hcf_32 FAR * dst, int n) { - int i = 0; - hcf_16 FAR * p; - if ( log_file ) { - fprintf( log_file, "\nread string_32 length %04x (%04d) at port %02.2x to addr %lp", - (hcf_16)n, (hcf_16)n, (hcf_16)(prt)&0xFF, dst); - } - while ( n-- ) { - p = (hcf_16 FAR *)dst; - *p++ = (hcf_16)_inpw( prt ); - *p = (hcf_16)_inpw( prt ); - if ( log_file ) { - fprintf( log_file, "%s%08lx ", i++ % 0x08 ? " " : "\n", *dst); - } - dst++; - } -} // IN_PORT_STRING_32 - -void IN_PORT_STRING_8_16( hcf_io prt, hcf_8 FAR * dst, int n) { //also handles byte alignment problems - hcf_16 FAR * p = (hcf_16 FAR *)dst; //this needs more elaborate code in non-x86 platforms - int i = 0; - if ( log_file ) { - fprintf( log_file, "\nread string_16 length %04x (%04d) at port %02.2x to addr %lp", - (hcf_16)n, (hcf_16)n, (hcf_16)(prt)&0xFF, dst ); - } - while ( n-- ) { - *p =(hcf_16)_inpw( prt); - if ( log_file ) { - if ( i++ % 0x10 ) { - fprintf( log_file, "%04x ", *p); - } else { - fprintf( log_file, "\n%04x ", *p); - } - } - p++; - } -} // IN_PORT_STRING_8_16 - -void OUT_PORT_STRING_32( hcf_io prt, hcf_32 FAR * src, int n) { - int i = 0; - hcf_16 FAR * p; - if ( log_file ) { - fprintf( log_file, "\nwrite string_32 length %04x (%04d) at port %02.2x", - (hcf_16)n, (hcf_16)n, (hcf_16)(prt)&0xFF); - } - while ( n-- ) { - p = (hcf_16 FAR *)src; - _outpw( prt, *p++ ); - _outpw( prt, *p ); - if ( log_file ) { - fprintf( log_file, "%s%08lx ", i++ % 0x08 ? " " : "\n", *src); - } - src++; - } -} // OUT_PORT_STRING_32 - -void OUT_PORT_STRING_8_16( hcf_io prt, hcf_8 FAR * src, int n) { //also handles byte alignment problems - hcf_16 FAR * p = (hcf_16 FAR *)src; //this needs more elaborate code in non-x86 platforms - int i = 0; - if ( log_file ) { - fprintf( log_file, "\nwrite string_16 length %04x (%04d) at port %04x", n, n, (hcf_16)prt); - } - while ( n-- ) { - (void)_outpw( prt, *p); - if ( log_file ) { - if ( i++ % 0x10 ) { - fprintf( log_file, "%04x ", *p); - } else { - fprintf( log_file, "\n%04x ", *p); - } - } - p++; - } -} // OUT_PORT_STRING_8_16 - -#endif // IN_PORT_WORD - -/************************************************************************************************************ - ******************************* D A T A D E F I N I T I O N S ******************************************** - ************************************************************************************************************/ - -#if HCF_ASSERT -IFBP BASED assert_ifbp = NULL; //to make asserts easily work under MMD and DHF -#endif // HCF_ASSERT - -/* SNAP header to be inserted in Ethernet-II frames */ -HCF_STATIC hcf_8 BASED snap_header[] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, //5 bytes signature + - 0 }; //1 byte protocol identifier - -#if (HCF_TYPE) & HCF_TYPE_WPA -HCF_STATIC hcf_8 BASED mic_pad[8] = { 0x5A, 0, 0, 0, 0, 0, 0, 0 }; //MIC padding of message -#endif // HCF_TYPE_WPA - -#if defined MSF_COMPONENT_ID -static CFG_IDENTITY_STRCT BASED cfg_drv_identity = { - sizeof(cfg_drv_identity)/sizeof(hcf_16) - 1, //length of RID - CFG_DRV_IDENTITY, // (0x0826) - MSF_COMPONENT_ID, - MSF_COMPONENT_VAR, - MSF_COMPONENT_MAJOR_VER, - MSF_COMPONENT_MINOR_VER -} ; - -static CFG_RANGES_STRCT BASED cfg_drv_sup_range = { - sizeof(cfg_drv_sup_range)/sizeof(hcf_16) - 1, //length of RID - CFG_DRV_SUP_RANGE, // (0x0827) - - COMP_ROLE_SUPL, - COMP_ID_DUI, - {{ DUI_COMPAT_VAR, - DUI_COMPAT_BOT, - DUI_COMPAT_TOP - }} -} ; - -static struct CFG_RANGE3_STRCT BASED cfg_drv_act_ranges_pri = { - sizeof(cfg_drv_act_ranges_pri)/sizeof(hcf_16) - 1, //length of RID - CFG_DRV_ACT_RANGES_PRI, // (0x0828) - - COMP_ROLE_ACT, - COMP_ID_PRI, - { - { 0, 0, 0 }, // HCF_PRI_VAR_1 not supported by HCF 7 - { 0, 0, 0 }, // HCF_PRI_VAR_2 not supported by HCF 7 - { 3, //var_rec[2] - Variant number - CFG_DRV_ACT_RANGES_PRI_3_BOTTOM, // - Bottom Compatibility - CFG_DRV_ACT_RANGES_PRI_3_TOP // - Top Compatibility - } - } -} ; - - -static struct CFG_RANGE4_STRCT BASED cfg_drv_act_ranges_sta = { - sizeof(cfg_drv_act_ranges_sta)/sizeof(hcf_16) - 1, //length of RID - CFG_DRV_ACT_RANGES_STA, // (0x0829) - - COMP_ROLE_ACT, - COMP_ID_STA, - { -#if defined HCF_STA_VAR_1 - { 1, //var_rec[1] - Variant number - CFG_DRV_ACT_RANGES_STA_1_BOTTOM, // - Bottom Compatibility - CFG_DRV_ACT_RANGES_STA_1_TOP // - Top Compatibility - }, -#else - { 0, 0, 0 }, -#endif // HCF_STA_VAR_1 -#if defined HCF_STA_VAR_2 - { 2, //var_rec[1] - Variant number - CFG_DRV_ACT_RANGES_STA_2_BOTTOM, // - Bottom Compatibility - CFG_DRV_ACT_RANGES_STA_2_TOP // - Top Compatibility - }, -#else - { 0, 0, 0 }, -#endif // HCF_STA_VAR_2 -// For Native_USB (Not used!) -#if defined HCF_STA_VAR_3 - { 3, //var_rec[1] - Variant number - CFG_DRV_ACT_RANGES_STA_3_BOTTOM, // - Bottom Compatibility - CFG_DRV_ACT_RANGES_STA_3_TOP // - Top Compatibility - }, -#else - { 0, 0, 0 }, -#endif // HCF_STA_VAR_3 -// Warp -#if defined HCF_STA_VAR_4 - { 4, //var_rec[1] - Variant number - CFG_DRV_ACT_RANGES_STA_4_BOTTOM, // - Bottom Compatibility - CFG_DRV_ACT_RANGES_STA_4_TOP // - Top Compatibility - } -#else - { 0, 0, 0 } -#endif // HCF_STA_VAR_4 - } -} ; - - -static struct CFG_RANGE6_STRCT BASED cfg_drv_act_ranges_hsi = { - sizeof(cfg_drv_act_ranges_hsi)/sizeof(hcf_16) - 1, //length of RID - CFG_DRV_ACT_RANGES_HSI, // (0x082A) - COMP_ROLE_ACT, - COMP_ID_HSI, - { -#if defined HCF_HSI_VAR_0 // Controlled deployment - { 0, // var_rec[1] - Variant number - CFG_DRV_ACT_RANGES_HSI_0_BOTTOM, // - Bottom Compatibility - CFG_DRV_ACT_RANGES_HSI_0_TOP // - Top Compatibility - }, -#else - { 0, 0, 0 }, -#endif // HCF_HSI_VAR_0 - { 0, 0, 0 }, // HCF_HSI_VAR_1 not supported by HCF 7 - { 0, 0, 0 }, // HCF_HSI_VAR_2 not supported by HCF 7 - { 0, 0, 0 }, // HCF_HSI_VAR_3 not supported by HCF 7 -#if defined HCF_HSI_VAR_4 // Hermes-II all types - { 4, // var_rec[1] - Variant number - CFG_DRV_ACT_RANGES_HSI_4_BOTTOM, // - Bottom Compatibility - CFG_DRV_ACT_RANGES_HSI_4_TOP // - Top Compatibility - }, -#else - { 0, 0, 0 }, -#endif // HCF_HSI_VAR_4 -#if defined HCF_HSI_VAR_5 // WARP Hermes-2.5 - { 5, // var_rec[1] - Variant number - CFG_DRV_ACT_RANGES_HSI_5_BOTTOM, // - Bottom Compatibility - CFG_DRV_ACT_RANGES_HSI_5_TOP // - Top Compatibility - } -#else - { 0, 0, 0 } -#endif // HCF_HSI_VAR_5 - } -} ; - - -static CFG_RANGE4_STRCT BASED cfg_drv_act_ranges_apf = { - sizeof(cfg_drv_act_ranges_apf)/sizeof(hcf_16) - 1, //length of RID - CFG_DRV_ACT_RANGES_APF, // (0x082B) - - COMP_ROLE_ACT, - COMP_ID_APF, - { -#if defined HCF_APF_VAR_1 //(Fake) Hermes-I - { 1, //var_rec[1] - Variant number - CFG_DRV_ACT_RANGES_APF_1_BOTTOM, // - Bottom Compatibility - CFG_DRV_ACT_RANGES_APF_1_TOP // - Top Compatibility - }, -#else - { 0, 0, 0 }, -#endif // HCF_APF_VAR_1 -#if defined HCF_APF_VAR_2 //Hermes-II - { 2, // var_rec[1] - Variant number - CFG_DRV_ACT_RANGES_APF_2_BOTTOM, // - Bottom Compatibility - CFG_DRV_ACT_RANGES_APF_2_TOP // - Top Compatibility - }, -#else - { 0, 0, 0 }, -#endif // HCF_APF_VAR_2 -#if defined HCF_APF_VAR_3 // Native_USB - { 3, // var_rec[1] - Variant number - CFG_DRV_ACT_RANGES_APF_3_BOTTOM, // - Bottom Compatibility !!!!!see note below!!!!!!! - CFG_DRV_ACT_RANGES_APF_3_TOP // - Top Compatibility - }, -#else - { 0, 0, 0 }, -#endif // HCF_APF_VAR_3 -#if defined HCF_APF_VAR_4 // WARP Hermes 2.5 - { 4, // var_rec[1] - Variant number - CFG_DRV_ACT_RANGES_APF_4_BOTTOM, // - Bottom Compatibility !!!!!see note below!!!!!!! - CFG_DRV_ACT_RANGES_APF_4_TOP // - Top Compatibility - } -#else - { 0, 0, 0 } -#endif // HCF_APF_VAR_4 - } -} ; -#define HCF_VERSION TEXT( "HCF$Revision: 1.10 $" ) - -static struct /*CFG_HCF_OPT_STRCT*/ { - hcf_16 len; //length of cfg_hcf_opt struct - hcf_16 typ; //type 0x082C - hcf_16 v0; //offset HCF_VERSION - hcf_16 v1; // MSF_COMPONENT_ID - hcf_16 v2; // HCF_ALIGN - hcf_16 v3; // HCF_ASSERT - hcf_16 v4; // HCF_BIG_ENDIAN - hcf_16 v5; // /* HCF_DLV | HCF_DLNV */ - hcf_16 v6; // HCF_DMA - hcf_16 v7; // HCF_ENCAP - hcf_16 v8; // HCF_EXT - hcf_16 v9; // HCF_INT_ON - hcf_16 v10; // HCF_IO - hcf_16 v11; // HCF_LEGACY - hcf_16 v12; // HCF_MAX_LTV - hcf_16 v13; // HCF_PROT_TIME - hcf_16 v14; // HCF_SLEEP - hcf_16 v15; // HCF_TALLIES - hcf_16 v16; // HCF_TYPE - hcf_16 v17; // HCF_NIC_TAL_CNT - hcf_16 v18; // HCF_HCF_TAL_CNT - hcf_16 v19; // offset tallies - char val[sizeof(HCF_VERSION)]; -} BASED cfg_hcf_opt = { - sizeof(cfg_hcf_opt)/sizeof(hcf_16) -1, - CFG_HCF_OPT, // (0x082C) - ( sizeof(cfg_hcf_opt) - sizeof(HCF_VERSION) - 4 )/sizeof(hcf_16), -#if defined MSF_COMPONENT_ID - MSF_COMPONENT_ID, -#else - 0, -#endif // MSF_COMPONENT_ID - HCF_ALIGN, - HCF_ASSERT, - HCF_BIG_ENDIAN, - 0, // /* HCF_DLV | HCF_DLNV*/, - HCF_DMA, - HCF_ENCAP, - HCF_EXT, - HCF_INT_ON, - HCF_IO, - HCF_LEGACY, - HCF_MAX_LTV, - HCF_PROT_TIME, - HCF_SLEEP, - HCF_TALLIES, - HCF_TYPE, -#if (HCF_TALLIES) & ( HCF_TALLIES_NIC | HCF_TALLIES_HCF ) - HCF_NIC_TAL_CNT, - HCF_HCF_TAL_CNT, - offsetof(IFB_STRCT, IFB_TallyLen ), -#else - 0, 0, 0, -#endif // HCF_TALLIES_NIC / HCF_TALLIES_HCF - HCF_VERSION -}; // cfg_hcf_opt -#endif // MSF_COMPONENT_ID - -HCF_STATIC LTV_STRCT BASED cfg_null = { 1, CFG_NULL, {0} }; - -HCF_STATIC hcf_16* BASED xxxx[ ] = { - &cfg_null.len, //CFG_NULL 0x0820 -#if defined MSF_COMPONENT_ID - &cfg_drv_identity.len, //CFG_DRV_IDENTITY 0x0826 - &cfg_drv_sup_range.len, //CFG_DRV_SUP_RANGE 0x0827 - &cfg_drv_act_ranges_pri.len, //CFG_DRV_ACT_RANGES_PRI 0x0828 - &cfg_drv_act_ranges_sta.len, //CFG_DRV_ACT_RANGES_STA 0x0829 - &cfg_drv_act_ranges_hsi.len, //CFG_DRV_ACT_RANGES_HSI 0x082A - &cfg_drv_act_ranges_apf.len, //CFG_DRV_ACT_RANGES_APF 0x082B - &cfg_hcf_opt.len, //CFG_HCF_OPT 0x082C - NULL, //IFB_PRIIdentity placeholder 0xFD02 - NULL, //IFB_PRISup placeholder 0xFD03 -#endif // MSF_COMPONENT_ID - NULL //endsentinel -}; -#define xxxx_PRI_IDENTITY_OFFSET (ARRAY_SIZE(xxxx) - 3) - - -/************************************************************************************************************ - ************************** T O P L E V E L H C F R O U T I N E S ************************************** - ************************************************************************************************************/ - -/************************************************************************************************************ - * - *.MODULE int hcf_action( IFBP ifbp, hcf_16 action ) - *.PURPOSE Changes the run-time Card behavior. - * Performs Miscellanuous actions. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * action number identifying the type of change - * - HCF_ACT_INT_FORCE_ON enable interrupt generation by WaveLAN NIC - * - HCF_ACT_INT_OFF disable interrupt generation by WaveLAN NIC - * - HCF_ACT_INT_ON compensate 1 HCF_ACT_INT_OFF, enable interrupt generation if balance reached - * - HCF_ACT_PRS_SCAN Hermes Probe Response Scan (F102) command - * - HCF_ACT_RX_ACK acknowledge non-DMA receiver to Hermes - * - HCF_ACT_SCAN Hermes Inquire Scan (F101) command (non-WARP only) - * - HCF_ACT_SLEEP DDS Sleep request - * - HCF_ACT_TALLIES Hermes Inquire Tallies (F100) command - * - *.RETURNS - * HCF_SUCCESS all (including invalid) - * HCF_INT_PENDING HCF_ACT_INT_OFF, interrupt pending - * HCF_ERR_NO_NIC HCF_ACT_INT_OFF, NIC presence check fails - * - *.CONDITIONS - * Except for hcf_action with HCF_ACT_INT_FORCE_ON or HCF_ACT_INT_OFF as parameter or hcf_connect with an I/O - * address (i.e. not HCF_DISCONNECT), all hcf-function calls MUST be preceded by a call of hcf_action with - * HCF_ACT_INT_OFF as parameter. - * Note that hcf_connect defaults to NIC interrupt disabled mode, i.e. as if hcf_action( HCF_ACT_INT_OFF ) - * was called. - * - *.DESCRIPTION - * hcf_action supports the following mode changing action-code pairs that are antonyms - * - HCF_ACT_INT_[FORCE_]ON / HCF_ACT_INT_OFF - * - * Additionally hcf_action can start the following actions in the NIC: - * - HCF_ACT_PRS_SCAN - * - HCF_ACT_RX_ACK - * - HCF_ACT_SCAN - * - HCF_ACT_SLEEP - * - HCF_ACT_TALLIES - * - * o HCF_ACT_INT_OFF: Sets NIC Interrupts mode Disabled. - * This command, and the associated [Force] Enable NIC interrupts command, are only available if the HCF_INT_ON - * compile time option is not set at 0x0000. - * - * o HCF_ACT_INT_ON: Sets NIC Interrupts mode Enabled. - * Enable NIC Interrupts, depending on the number of preceding Disable NIC Interrupt calls. - * - * o HCF_ACT_INT_FORCE_ON: Force NIC Interrupts mode Enabled. - * Sets NIC Interrupts mode Enabled, regardless off the number of preceding Disable NIC Interrupt calls. - * - * The disabling and enabling of interrupts are antonyms. - * These actions must be balanced. - * For each "disable interrupts" there must be a matching "enable interrupts". - * The disable interrupts may be executed multiple times in a row without intervening enable interrupts, in - * other words, the disable interrupts may be nested. - * The interrupt generation mechanism is disabled at the first call with HCF_ACT_INT_OFF. - * The interrupt generation mechanism is re-enabled when the number of calls with HCF_ACT_INT_ON matches the - * number of calls with INT_OFF. - * - * It is not allowed to have more Enable NIC Interrupts calls than Disable NIC Interrupts calls. - * The interrupt generation mechanism is initially (i.e. after hcf_connect) disabled. - * An MSF based on a interrupt strategy must call hcf_action with INT_ON in its initialization logic. - * - *! The INT_OFF/INT_ON housekeeping is initialized at 0x0000 by hcf_connect, causing the interrupt generation - * mechanism to be disabled at first. This suits MSF implementation based on a polling strategy. - * - * o HCF_ACT_SLEEP: Initiates the Disconnected DeepSleep process - * This command is only available if the HCF_DDS compile time option is set. It triggers the F/W to start the - * sleep handshaking. Regardless whether the Host initiates a Disconnected DeepSleep (DDS) or the F/W initiates - * a Connected DeepSleep (CDS), the Host-F/W sleep handshaking is completed when the NIC Interrupts mode is - * enabled (by means of the balancing HCF_ACT_INT_ON), i.e. at that moment the F/W really goes into sleep mode. - * The F/W is wokenup by the HCF when the NIC Interrupts mode are disabled, i.e. at the first HCF_ACT_INT_OFF - * after going into sleep. - * - * The following Miscellaneous actions are defined: - * - * o HCF_ACT_RX_ACK: Receiver Acknowledgement (non-DMA, non-USB mode only) - * Acking the receiver, frees the NIC memory used to hold the Rx frame and allows the F/W to - * report the existence of the next Rx frame. - * If the MSF does not need access (any longer) to the current frame, e.g. because it is rejected based on the - * look ahead or copied to another buffer, the receiver may be acked. Acking earlier is assumed to have the - * potential of improving the performance. - * If the MSF does not explicitly ack the receiver, the acking is done implicitly if: - * - the received frame fits in the look ahead buffer, by the hcf_service_nic call that reported the Rx frame - * - if not in the above step, by hcf_rcv_msg (assuming hcf_rcv_msg is called) - * - if neither of the above implicit acks nor an explicit ack by the MSF, by the first hcf_service_nic after - * the hcf_service_nic that reported the Rx frame. - * Note: If an Rx frame is already acked, an explicit ACK by the MSF acts as a NoOperation. - * - * o HCF_ACT_TALLIES: Inquire Tallies command - * This command is only operational if the F/W is enabled. - * The Inquire Tallies command requests the F/W to provide its current set of tallies. - * See also hcf_get_info with CFG_TALLIES as parameter. - * - * o HCF_ACT_PRS_SCAN: Inquire Probe Response Scan command - * This command is only operational if the F/W is enabled. - * The Probe Response Scan command starts a scan sequence. - * The HCF puts the result of this action in an MSF defined buffer (see CFG_RID_LOG_STRCT). - * - * o HCF_ACT_SCAN: Inquire Scan command - * This command is only supported for HII F/W (i.e. pre-WARP) and it is operational if the F/W is enabled. - * The Inquire Scan command starts a scan sequence. - * The HCF puts the result of this action in an MSF defined buffer (see CFG_RID_LOG_STRCT). - * - * Assert fails if - * - ifbp has a recognizable out-of-range value. - * - NIC interrupts are not disabled while required by parameter action. - * - an invalid code is specified in parameter action. - * - HCF_ACT_INT_ON commands outnumber the HCF_ACT_INT_OFF commands. - * - reentrancy, may be caused by calling hcf_functions without adequate protection against NIC interrupts or - * multi-threading - * - * - Since the HCF does not maintain status information relative to the F/W enabled state, it is not asserted - * whether HCF_ACT_SCAN, HCF_ACT_PRS_SCAN or HCF_ACT_TALLIES are only used while F/W is enabled. - * - *.DIAGRAM - * 0: The assert embedded in HCFLOGENTRY checks against re-entrancy. Re-entrancy could be caused by a MSF logic - * at task-level calling hcf_functions without shielding with HCF_ACT_ON/_OFF. However the HCF_ACT_INT_OFF - * action itself can per definition not be protected this way. Based on code inspection, it can be concluded, - * that there is no re-entrancy PROBLEM in this particular flow. It does not seem worth the trouble to - * explicitly check for this condition (although there was a report of an MSF which ran into this assert. - * 2:IFB_IntOffCnt is used to balance the INT_OFF and INT_ON calls. Disabling of the interrupts is achieved by - * writing a zero to the Hermes IntEn register. In a shared interrupt environment (e.g. the mini-PCI NDIS - * driver) it is considered more correct to return the status HCF_INT_PENDING if and only if, the current - * invocation of hcf_service_nic is (apparently) called in the ISR when the ISR was activated as result of a - * change in HREG_EV_STAT matching a bit in HREG_INT_EN, i.e. not if invoked as result of another device - * generating an interrupt on the shared interrupt line. - * Note 1: it has been observed that under certain adverse conditions on certain platforms the writing of - * HREG_INT_EN can apparently fail, therefore it is paramount that HREG_INT_EN is written again with 0 for - * each and every call to HCF_ACT_INT_OFF. - * Note 2: it has been observed that under certain H/W & S/W architectures this logic is called when there is - * no NIC at all. To cater for this, the value of HREG_INT_EN is validated. If the unused bit 0x0100 is set, - * it is assumed there is no NIC. - * Note 3: During the download process, some versions of the F/W reset HREG_SW_0, hence checking this - * register for HCF_MAGIC (the classical NIC presence test) when HCF_ACT_INT_OFF is called due to another - * card interrupting via a shared IRQ during a download, fails. - *4: The construction "if ( ifbp->IFB_IntOffCnt-- == 0 )" is optimal (in the sense of shortest/quickest - * path in error free flows) but NOT fail safe in case of too many INT_ON invocations compared to INT_OFF). - * Enabling of the interrupts is achieved by writing the Hermes IntEn register. - * - If the HCF is in Defunct mode, the interrupts stay disabled. - * - Under "normal" conditions, the HCF is only interested in Info Events, Rx Events and Notify Events. - * - When the HCF is out of Tx/Notify resources, the HCF is also interested in Alloc Events. - * - via HCF_EXT, the MSF programmer can also request HREG_EV_TICK and/or HREG_EV_TX_EXC interrupts. - * For DMA operation, the DMA hardware handles the alloc events. The DMA engine will generate a 'TxDmaDone' - * event as soon as it has pumped a frame from host ram into NIC-RAM (note that the frame does not have to be - * transmitted then), and a 'RxDmaDone' event as soon as a received frame has been pumped from NIC-RAM into - * host ram. Note that the 'alloc' event has been removed from the event-mask, because the DMA engine will - * react to and acknowledge this event. - *6: ack the "old" Rx-event. See "Rx Buffer free strategy" in hcf_service_nic above for more explanation. - * IFB_RxFID and IFB_RxLen must be cleared to bring both the internal HCF house keeping and the information - * supplied to the MSF in the state "no frame received". - *8: The HCF_ACT_SCAN, HCF_ACT_PRS_SCAN and HCF_ACT_TALLIES activity are merged by "clever" algebraic - * manipulations of the RID-values and action codes, so foregoing robustness against migration problems for - * ease of implementation. The assumptions about numerical relationships between CFG_TALLIES etc and - * HCF_ACT_TALLIES etc are checked by the "#if" statements just prior to the body of this routine, resulting - * in: err "maintenance" during compilation if the assumptions are no longer met. The writing of HREG_PARAM_1 - * with 0x3FFF in case of an PRS scan, is a kludge to get around lack of specification, hence different - * implementation in F/W and Host. - * When there is no NIC RAM available, some versions of the Hermes F/W do report 0x7F00 as error in the - * Result field of the Status register and some F/W versions don't. To mask this difference to the MSF all - * return codes of the Hermes are ignored ("best" and "most simple" solution to these types of analomies with - * an acceptable loss due to ignoring all error situations as well). - * The "No inquire space" is reported via the Hermes tallies. - *30: do not HCFASSERT( rc, rc ) since rc == HCF_INT_PENDING is no error - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -#if ( (HCF_TYPE) & HCF_TYPE_HII5 ) == 0 -#if CFG_SCAN != CFG_TALLIES - HCF_ACT_TALLIES + HCF_ACT_SCAN -err: "maintenance" apparently inviolated the underlying assumption about the numerical values of these macros -#endif -#endif // HCF_TYPE_HII5 -#if CFG_PRS_SCAN != CFG_TALLIES - HCF_ACT_TALLIES + HCF_ACT_PRS_SCAN -err: "maintenance" apparently inviolated the underlying assumption about the numerical values of these macros -#endif -int -hcf_action( IFBP ifbp, hcf_16 action ) -{ - int rc = HCF_SUCCESS; - - HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic ); -#if HCF_INT_ON - HCFLOGENTRY( action == HCF_ACT_INT_FORCE_ON ? HCF_TRACE_ACTION_KLUDGE : HCF_TRACE_ACTION, action ); /* 0 */ -#if (HCF_SLEEP) - HCFASSERT( ifbp->IFB_IntOffCnt != 0xFFFE || action == HCF_ACT_INT_OFF, - MERGE_2( action, ifbp->IFB_IntOffCnt ) ); -#else - HCFASSERT( ifbp->IFB_IntOffCnt != 0xFFFE, action ); -#endif // HCF_SLEEP - HCFASSERT( ifbp->IFB_IntOffCnt != 0xFFFF || - action == HCF_ACT_INT_OFF || action == HCF_ACT_INT_FORCE_ON, action ); - HCFASSERT( ifbp->IFB_IntOffCnt <= 16 || ifbp->IFB_IntOffCnt >= 0xFFFE, - MERGE_2( action, ifbp->IFB_IntOffCnt ) ); //nesting more than 16 deep seems unreasonable -#endif // HCF_INT_ON - - switch (action) { -#if HCF_INT_ON - hcf_16 i; - case HCF_ACT_INT_OFF: // Disable Interrupt generation -#if HCF_SLEEP - if ( ifbp->IFB_IntOffCnt == 0xFFFE ) { // WakeUp test ;?tie this to the "new" super-LinkStat - ifbp->IFB_IntOffCnt++; // restore conventional I/F - OPW(HREG_IO, HREG_IO_WAKEUP_ASYNC ); // set wakeup bit - OPW(HREG_IO, HREG_IO_WAKEUP_ASYNC ); // set wakeup bit to counteract the clearing by F/W - // 800 us latency before FW switches to high power - MSF_WAIT(800); // MSF-defined function to wait n microseconds. -//OOR if ( ifbp->IFB_DSLinkStat & CFG_LINK_STAT_DS_OOR ) { // OutOfRange -// printk(KERN_NOTICE "ACT_INT_OFF: Deepsleep phase terminated, enable and go to AwaitConnection\n" ); //;?remove me 1 day -// hcf_cntl( ifbp, HCF_CNTL_ENABLE ); -// } -// ifbp->IFB_DSLinkStat &= ~( CFG_LINK_STAT_DS_IR | CFG_LINK_STAT_DS_OOR); //clear IR/OOR state - } -#endif // HCF_SLEEP - /*2*/ ifbp->IFB_IntOffCnt++; -//! rc = 0; - i = IPW( HREG_INT_EN ); - OPW( HREG_INT_EN, 0 ); - if ( i & 0x1000 ) { - rc = HCF_ERR_NO_NIC; - } else { - if ( i & IPW( HREG_EV_STAT ) ) { - rc = HCF_INT_PENDING; - } - } - break; - - case HCF_ACT_INT_FORCE_ON: // Enforce Enable Interrupt generation - ifbp->IFB_IntOffCnt = 0; - //Fall through in HCF_ACT_INT_ON - - case HCF_ACT_INT_ON: // Enable Interrupt generation - /*4*/ if ( ifbp->IFB_IntOffCnt-- == 0 && ifbp->IFB_CardStat == 0 ) { - //determine Interrupt Event mask -#if HCF_DMA - if ( ifbp->IFB_CntlOpt & USE_DMA ) { - i = HREG_EV_INFO | HREG_EV_RDMAD | HREG_EV_TDMAD | HREG_EV_TX_EXT; //mask when DMA active - } else -#endif // HCF_DMA - { - i = HREG_EV_INFO | HREG_EV_RX | HREG_EV_TX_EXT; //mask when DMA not active - if ( ifbp->IFB_RscInd == 0 ) { - i |= HREG_EV_ALLOC; //mask when no TxFID available - } - } -#if HCF_SLEEP - if ( ( IPW(HREG_EV_STAT) & ( i | HREG_EV_SLEEP_REQ ) ) == HREG_EV_SLEEP_REQ ) { - // firmware indicates it would like to go into sleep modus - // only acknowledge this request if no other events that can cause an interrupt are pending - ifbp->IFB_IntOffCnt--; //becomes 0xFFFE - OPW( HREG_INT_EN, i | HREG_EV_TICK ); - OPW( HREG_EV_ACK, HREG_EV_SLEEP_REQ | HREG_EV_TICK | HREG_EV_ACK_REG_READY ); - } else -#endif // HCF_SLEEP - { - OPW( HREG_INT_EN, i | HREG_EV_SLEEP_REQ ); - } - } - break; -#endif // HCF_INT_ON - -#if (HCF_SLEEP) & HCF_DDS - case HCF_ACT_SLEEP: // DDS Sleep request - hcf_cntl( ifbp, HCF_CNTL_DISABLE ); - cmd_exe( ifbp, HCMD_SLEEP, 0 ); - break; -// case HCF_ACT_WAKEUP: // DDS Wakeup request -// HCFASSERT( ifbp->IFB_IntOffCnt == 0xFFFE, ifbp->IFB_IntOffCnt ); -// ifbp->IFB_IntOffCnt++; // restore conventional I/F -// OPW( HREG_IO, HREG_IO_WAKEUP_ASYNC ); -// MSF_WAIT(800); // MSF-defined function to wait n microseconds. -// rc = hcf_action( ifbp, HCF_ACT_INT_OFF ); /*bogus, IFB_IntOffCnt == 0xFFFF, so if you carefully look -// *at the #if HCF_DDS statements, HCF_ACT_INT_OFF is empty -// *for DDS. "Much" better would be to merge the flows for -// *DDS and DEEP_SLEEP -// */ -// break; -#endif // HCF_DDS - - case HCF_ACT_RX_ACK: //Receiver ACK - /*6*/ if ( ifbp->IFB_RxFID ) { - DAWA_ACK( HREG_EV_RX ); - } - ifbp->IFB_RxFID = ifbp->IFB_RxLen = 0; - break; - - /*8*/ case HCF_ACT_PRS_SCAN: // Hermes PRS Scan (F102) - OPW( HREG_PARAM_1, 0x3FFF ); - //Fall through in HCF_ACT_TALLIES - case HCF_ACT_TALLIES: // Hermes Inquire Tallies (F100) -#if ( (HCF_TYPE) & HCF_TYPE_HII5 ) == 0 - case HCF_ACT_SCAN: // Hermes Inquire Scan (F101) -#endif // HCF_TYPE_HII5 - /*!! the assumptions about numerical relationships between CFG_TALLIES etc and HCF_ACT_TALLIES etc - * are checked by #if statements just prior to this routine resulting in: err "maintenance" */ - cmd_exe( ifbp, HCMD_INQUIRE, action - HCF_ACT_TALLIES + CFG_TALLIES ); - break; - - default: - HCFASSERT( DO_ASSERT, action ); - break; - } - //! do not HCFASSERT( rc == HCF_SUCCESS, rc ) /* 30*/ - HCFLOGEXIT( HCF_TRACE_ACTION ); - return rc; -} // hcf_action - - -/************************************************************************************************************ - * - *.MODULE int hcf_cntl( IFBP ifbp, hcf_16 cmd ) - *.PURPOSE Connect or disconnect a specific port to a specific network. - *!! ;???????????????? continue needs more explanation - * recovers by means of "continue" when the connect process in CCX mode fails - * Enables or disables data transmission and reception for the NIC. - * Activates static NIC configuration for a specific port at connect. - * Activates static configuration for all ports at enable. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * cmd 0x001F: Hermes command (disable, enable, connect, disconnect, continue) - * HCF_CNTL_ENABLE Enable - * HCF_CNTL_DISABLE Disable - * HCF_CNTL_CONTINUE Continue - * HCF_CNTL_CONNECT Connect - * HCF_CNTL_DISCONNECT Disconnect - * 0x0100: command qualifier (continue) - * HCMD_RETRY retry flag - * 0x0700: port number (connect/disconnect) - * HCF_PORT_0 MAC Port 0 - * HCF_PORT_1 MAC Port 1 - * HCF_PORT_2 MAC Port 2 - * HCF_PORT_3 MAC Port 3 - * HCF_PORT_4 MAC Port 4 - * HCF_PORT_5 MAC Port 5 - * HCF_PORT_6 MAC Port 6 - * - *.RETURNS - * HCF_SUCCESS - *!! via cmd_exe - * HCF_ERR_NO_NIC - * HCF_ERR_DEFUNCT_... - * HCF_ERR_TIME_OUT - * - *.DESCRIPTION - * The parameter cmd contains a number of subfields. - * The actual value for cmd is created by logical or-ing the appropriate mnemonics for the subfields. - * The field 0x001F contains the command code - * - HCF_CNTL_ENABLE - * - HCF_CNTL_DISABLE - * - HCF_CNTL_CONNECT - * - HCF_CNTL_DISCONNECT - * - HCF_CNTL_CONTINUE - * - * For HCF_CNTL_CONTINUE, the field 0x0100 contains the retry flag HCMD_RETRY. - * For HCF_CNTL_CONNECT and HCF_CNTL_DISCONNECT, the field 0x0700 contains the port number as HCF_PORT_#. - * For Station as well as AccessPoint F/W, MAC Port 0 is the "normal" communication channel. - * For AccessPoint F/W, MAC Port 1 through 6 control the WDS links. - * - * Note that despite the names HCF_CNTL_DISABLE and HCF_CNTL_ENABLE, hcf_cntl does not influence the NIC - * Interrupts mode. - * - * The Connect is used by the MSF to bring a particular port in an inactive state as far as data transmission - * and reception are concerned. - * When a particular port is disconnected: - * - the F/W disables the receiver for that port. - * - the F/W ignores send commands for that port. - * - all frames (Receive as well as pending Transmit) for that port on the NIC are discarded. - * - * When the NIC is disabled, above list applies to all ports, i.e. the result is like all ports are - * disconnected. - * - * When a particular port is connected: - * - the F/W effectuates the static configuration for that port. - * - enables the receiver for that port. - * - accepts send commands for that port. - * - * Enabling has the following effects: - * - the F/W effectuates the static configuration for all ports. - * The F/W only updates its static configuration at a transition from disabled to enabled or from - * disconnected to connected. - * In order to enforce the static configuration, the MSF must assure that such a transition takes place. - * Due to such a disable/enable or disconnect/connect sequence, Rx/Tx frames may be lost, in other words, - * configuration may impact communication. - * - The DMA Engine (if applicable) is enabled. - * Note that the Enable Function by itself only enables data transmission and reception, it - * does not enable the Interrupt Generation mechanism. This is done by hcf_action. - * - * Disabling has the following effects: - *!! ;?????is the following statement really true - * - it acts as a disconnect on all ports. - * - The DMA Engine (if applicable) is disabled. - * - * For impact of the disable command on the behavior of hcf_dma_tx/rx_get see the appropriate sections. - * - * Although the Enable/Disable and Connect/Disconnect are antonyms, there is no restriction on their sequencing, - * in other words, they may be called multiple times in arbitrary sequence without being paired or balanced. - * Each time one of these functions is called, the effects of the preceding calls cease. - * - * Assert fails if - * - ifbp has a recognizable out-of-range value. - * - NIC interrupts are not disabled. - * - A command other than Continue, Enable, Disable, Connect or Disconnect is given. - * - An invalid combination of the subfields is given or a bit outside the subfields is given. - * - any return code besides HCF_SUCCESS. - * - reentrancy, may be caused by calling a hcf_function without adequate protection against NIC interrupts or - * multi-threading - * - *.DIAGRAM - * hcf_cntl takes successively the following actions: - *2: If the HCF is in Defunct mode or incompatible with the Primary or Station Supplier in the Hermes, - * hcf_cntl() returns immediately with HCF_ERR_NO_NIC;? as status. - *8: when the port is disabled, the DMA engine needs to be de-activated, so the host can safely reclaim tx - * packets from the tx descriptor chain. - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -int -hcf_cntl( IFBP ifbp, hcf_16 cmd ) -{ - int rc = HCF_ERR_INCOMP_FW; -#if HCF_ASSERT - { int x = cmd & HCMD_CMD_CODE; - if ( x == HCF_CNTL_CONTINUE ) x &= ~HCMD_RETRY; - else if ( (x == HCMD_DISABLE || x == HCMD_ENABLE) && ifbp->IFB_FWIdentity.comp_id == COMP_ID_FW_AP ) { - x &= ~HFS_TX_CNTL_PORT; - } - HCFASSERT( x==HCF_CNTL_ENABLE || x==HCF_CNTL_DISABLE || HCF_CNTL_CONTINUE || - x==HCF_CNTL_CONNECT || x==HCF_CNTL_DISCONNECT, cmd ); - } -#endif // HCF_ASSERT -// #if (HCF_SLEEP) & HCF_DDS -// HCFASSERT( ifbp->IFB_IntOffCnt != 0xFFFE, cmd ); -// #endif // HCF_DDS - HCFLOGENTRY( HCF_TRACE_CNTL, cmd ); - if ( ifbp->IFB_CardStat == 0 ) { /*2*/ - /*6*/ rc = cmd_exe( ifbp, cmd, 0 ); -#if (HCF_SLEEP) & HCF_DDS - ifbp->IFB_TickCnt = 0; //start 2 second period (with 1 tick uncertanty) -#endif // HCF_DDS - } -#if HCF_DMA - //!rlav : note that this piece of code is always executed, regardless of the DEFUNCT bit in IFB_CardStat. - // The reason behind this is that the MSF should be able to get all its DMA resources back from the HCF, - // even if the hardware is disfunctional. Practical example under Windows : surprise removal. - if ( ifbp->IFB_CntlOpt & USE_DMA ) { - hcf_io io_port = ifbp->IFB_IOBase; - DESC_STRCT *p; - if ( cmd == HCF_CNTL_DISABLE || cmd == HCF_CNTL_ENABLE ) { - OUT_PORT_DWORD( (io_port + HREG_DMA_CTRL), DMA_CTRLSTAT_RESET); /*8*/ - ifbp->IFB_CntlOpt &= ~DMA_ENABLED; - } - if ( cmd == HCF_CNTL_ENABLE ) { - OUT_PORT_DWORD( (io_port + HREG_DMA_CTRL), DMA_CTRLSTAT_GO); - /* ;? by rewriting hcf_dma_rx_put you can probably just call hcf_dma_rx_put( ifbp->IFB_FirstDesc[DMA_RX] ) - * as additional beneficiary side effect, the SOP and EOP bits will also be cleared - */ - ifbp->IFB_CntlOpt |= DMA_ENABLED; - HCFASSERT( NT_ASSERT, NEVER_TESTED ); - // make the entire rx descriptor chain DMA-owned, so the DMA engine can (re-)use it. - p = ifbp->IFB_FirstDesc[DMA_RX]; - if (p != NULL) { //;? Think this over again in the light of the new chaining strategy - if ( 1 ) { //begin alternative - HCFASSERT( NT_ASSERT, NEVER_TESTED ); - put_frame_lst( ifbp, ifbp->IFB_FirstDesc[DMA_RX], DMA_RX ); - if ( ifbp->IFB_FirstDesc[DMA_RX] ) { - put_frame_lst( ifbp, ifbp->IFB_FirstDesc[DMA_RX]->next_desc_addr, DMA_RX ); - } - } else { - while ( p ) { - //p->buf_cntl.cntl_stat |= DESC_DMA_OWNED; - p->BUF_CNT |= DESC_DMA_OWNED; - p = p->next_desc_addr; - } - // a rx chain is available so hand it over to the DMA engine - p = ifbp->IFB_FirstDesc[DMA_RX]; - OUT_PORT_DWORD( (io_port + HREG_RXDMA_PTR32), p->desc_phys_addr); - } //end alternative - } - } - } -#endif // HCF_DMA - HCFASSERT( rc == HCF_SUCCESS, rc ); - HCFLOGEXIT( HCF_TRACE_CNTL ); - return rc; -} // hcf_cntl - - -/************************************************************************************************************ - * - *.MODULE int hcf_connect( IFBP ifbp, hcf_io io_base ) - *.PURPOSE Grants access right for the HCF to the IFB. - * Initializes Card and HCF housekeeping. - * - *.ARGUMENTS - * ifbp (near) address of the Interface Block - * io_base non-USB: I/O Base address of the NIC (connect) - * non-USB: HCF_DISCONNECT - * USB: HCF_CONNECT, HCF_DISCONNECT - * - *.RETURNS - * HCF_SUCCESS - * HCF_ERR_INCOMP_PRI - * HCF_ERR_INCOMP_FW - * HCF_ERR_DEFUNCT_CMD_SEQ - *!! HCF_ERR_NO_NIC really returned ;? - * HCF_ERR_NO_NIC - * HCF_ERR_TIME_OUT - * - * MSF-accessible fields of Result Block: - * IFB_IOBase entry parameter io_base - * IFB_IORange HREG_IO_RANGE (0x40/0x80) - * IFB_Version version of the IFB layout - * IFB_FWIdentity CFG_FW_IDENTITY_STRCT, specifies the identity of the - * "running" F/W, i.e. tertiary F/W under normal conditions - * IFB_FWSup CFG_SUP_RANGE_STRCT, specifies the supplier range of - * the "running" F/W, i.e. tertiary F/W under normal conditions - * IFB_HSISup CFG_SUP_RANGE_STRCT, specifies the HW/SW I/F range of the NIC - * IFB_PRIIdentity CFG_PRI_IDENTITY_STRCT, specifies the Identity of the Primary F/W - * IFB_PRISup CFG_SUP_RANGE_STRCT, specifies the supplier range of the Primary F/W - * all other all MSF accessible fields, which are not specified above, are zero-filled - * - *.CONDITIONS - * It is the responsibility of the MSF to assure the correctness of the I/O Base address. - * - * Note: hcf_connect defaults to NIC interrupt disabled mode, i.e. as if hcf_action( HCF_ACT_INT_OFF ) - * was called. - * - *.DESCRIPTION - * hcf_connect passes the MSF-defined location of the IFB to the HCF and grants or revokes access right for the - * HCF to the IFB. Revoking is done by specifying HCF_DISCONNECT rather than an I/O address for the parameter - * io_base. Every call of hcf_connect in "connect" mode, must eventually be followed by a call of hcf_connect - * in "disconnect" mode. Calling hcf_connect in "connect"/"disconnect" mode can not be nested. - * The IFB address must be used as a handle with all subsequent HCF-function calls and the HCF uses the IFB - * address as a handle when it performs a call(back) of an MSF-function (i.e. msf_assert). - * - * Note that not only the MSF accessible fields are cleared, but also all internal housekeeping - * information is re-initialized. - * This implies that all settings which are done via hcf_action and hcf_put_info (e.g. CFG_MB_ASSERT, CFG_REG_MB, - * CFG_REG_INFO_LOG) must be done again. The only field which is not cleared, is IFB_MSFSup. - * - * If HCF_INT_ON is selected as compile option, NIC interrupts are disabled. - * - * Assert fails if - * - ifbp is not properly aligned ( ref chapter HCF_ALIGN in 4.1.1) - * - I/O Base Address is not a multiple of 0x40 (note: 0x0000 is explicitly allowed). - * - *.DIAGRAM - * - *0: Throughout hcf_connect you need to distinguish the connect from the disconnect case, which requires - * some attention about what to use as "I/O" address when for which purpose. - *2: - *2a: Reset H-II by toggling reset bit in IO-register on and off. - * The HCF_TYPE_PRELOADED caters for the DOS environment where H-II is loaded by a separate program to - * overcome the 64k size limit posed on DOS drivers. - * The macro OPW is not yet useable because the IFB_IOBase field is not set. - * Note 1: hopefully the clearing and initializing of the IFB (see below) acts as a delay which meets the - * specification for S/W reset - * Note 2: it turns out that on some H/W constellations, the clock to access the EEProm is not lowered - * to an appropriate frequency by HREG_IO_SRESET. By giving an HCMD_INI first, this problem is worked around. - *2b: Experimentally it is determined over a wide range of F/W versions that are waiting for the for Cmd bit in - * Ev register gives a workable strategy. The available documentation does not give much clues. - *4: clear and initialize the IFB - * The HCF house keeping info is designed such that zero is the appropriate initial value for as much as - * feasible IFB-items. - * The readable fields mentioned in the description section and some HCF specific fields are given their - * actual value. - * IFB_TickIni is initialized at best guess before calibration - * Hcf_connect defaults to "no interrupt generation" (implicitly achieved by the zero-filling). - *6: Register compile-time linked MSF Routine and set default filter level - * cast needed to get around the "near" problem in DOS COM model - * er C2446: no conversion from void (__near __cdecl *)(unsigned char __far *,unsigned int,unsigned short,int) - * to void (__far __cdecl *)(unsigned char __far *,unsigned int,unsigned short,int) - *8: If a command is apparently still active (as indicated by the Busy bit in Cmd register) this may indicate a - * blocked cmd pipe line. To unblock the following actions are done: - * - Ack everything - * - Wait for Busy bit drop in Cmd register - * - Wait for Cmd bit raise in Ev register - * The two waits are combined in a single HCF_WAIT_WHILE to optimize memory size. If either of these waits - * fail (prot_cnt becomes 0), then something is serious wrong. Rather than PANICK, the assumption is that the - * next cmd_exe will fail, causing the HCF to go into DEFUNCT mode - *10: Ack everything to unblock a (possibly blocked) cmd pipe line - * Note 1: it is very likely that an Alloc event is pending and very well possible that a (Send) Cmd event is - * pending on non-initial calls - * Note 2: it is assumed that this strategy takes away the need to ack every conceivable event after an - * Hermes Initialize - *12: Only H-II NEEDS the Hermes Initialize command. Due to the different semantics for H-I and H-II - * Initialize command, init() does not (and can not, since it is called e.g. after a download) execute the - * Hermes Initialize command. Executing the Hermes Initialize command for H-I would not harm but not do - * anything useful either, so it is skipped. - * The return status of cmd_exe is ignored. It is assumed that if cmd_exe fails, init fails too - *14: use io_base as a flag to merge hcf_connect and hcf_disconnect into 1 routine - * the call to init and its subsequent call of cmd_exe will return HCF_ERR_NO_NIC if appropriate. This status - * is (badly) needed by some legacy combination of NT4 and card services which do not yield an I/O address in - * time. - * - *.NOTICE - * On platforms where the NULL-pointer is not a bit-pattern of all zeros, the zero-filling of the IFB results - * in an incorrect initialization of pointers. - * The implementation of the MailBox manipulation in put_mb_info protects against the absence of a MailBox - * based on IFB_MBSize, IFB_MBWp and ifbp->IFB_MBRp. This has ramifications on the initialization of the - * MailBox via hcf_put_info with the CFG_REG_MB type, but it prevents dependency on the "NULL-"ness of - * IFB_MBp. - * - *.NOTICE - * There are a number of problems when asserting and logging hcf_connect, e.g. - * - Asserting on re-entrancy of hcf_connect by means of - * "HCFASSERT( (ifbp->IFB_AssertTrace & HCF_ASSERT_CONNECT) == 0, 0 )" is not useful because IFB contents - * are undefined - * - Asserting before the IFB is cleared will cause mdd_assert() to interpret the garbage in IFB_AssertRtn - * as a routine address - * Therefore HCFTRACE nor HCFLOGENTRY is called by hcf_connect. - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -int -hcf_connect( IFBP ifbp, hcf_io io_base ) -{ - int rc = HCF_SUCCESS; - hcf_io io_addr; - hcf_32 prot_cnt; - hcf_8 *q; - LTV_STRCT x; -#if HCF_ASSERT - hcf_16 xa = ifbp->IFB_FWIdentity.typ; - /* is assumed to cause an assert later on if hcf_connect is called without intervening hcf_disconnect. - * xa == CFG_FW_IDENTITY in subsequent calls without preceding hcf_disconnect, - * xa == 0 in subsequent calls with preceding hcf_disconnect, - * xa == "garbage" (any value except CFG_FW_IDENTITY is acceptable) in the initial call - */ -#endif // HCF_ASSERT - - if ( io_base == HCF_DISCONNECT ) { //disconnect - io_addr = ifbp->IFB_IOBase; - OPW( HREG_INT_EN, 0 ); //;?workaround against dying F/W on subsequent hcf_connect calls - } else { //connect /* 0 */ - io_addr = io_base; - } - -#if 0 //;? if a subsequent hcf_connect is preceded by an hcf_disconnect the wakeup is not needed !! -#if HCF_SLEEP - OUT_PORT_WORD( .....+HREG_IO, HREG_IO_WAKEUP_ASYNC ); //OPW not yet useable - MSF_WAIT(800); // MSF-defined function to wait n microseconds. - note that MSF_WAIT uses not yet defined!!!! IFB_IOBase and IFB_TickIni (via PROT_CNT_INI) - so be careful if this code is restored -#endif // HCF_SLEEP -#endif // 0 - -#if ( (HCF_TYPE) & HCF_TYPE_PRELOADED ) == 0 //switch clock back for SEEPROM access !!! - OUT_PORT_WORD( io_addr + HREG_CMD, HCMD_INI ); //OPW not yet useable - prot_cnt = INI_TICK_INI; - HCF_WAIT_WHILE( (IN_PORT_WORD( io_addr + HREG_EV_STAT) & HREG_EV_CMD) == 0 ); - OUT_PORT_WORD( (io_addr + HREG_IO), HREG_IO_SRESET ); //OPW not yet useable /* 2a*/ -#endif // HCF_TYPE_PRELOADED - for ( q = (hcf_8*)(&ifbp->IFB_Magic); q > (hcf_8*)ifbp; *--q = 0 ) /*NOP*/; /* 4 */ - ifbp->IFB_Magic = HCF_MAGIC; - ifbp->IFB_Version = IFB_VERSION; -#if defined MSF_COMPONENT_ID //a new IFB demonstrates how dirty the solution is - xxxx[xxxx_PRI_IDENTITY_OFFSET] = NULL; //IFB_PRIIdentity placeholder 0xFD02 - xxxx[xxxx_PRI_IDENTITY_OFFSET+1] = NULL; //IFB_PRISup placeholder 0xFD03 -#endif // MSF_COMPONENT_ID -#if (HCF_TALLIES) & ( HCF_TALLIES_NIC | HCF_TALLIES_HCF ) - ifbp->IFB_TallyLen = 1 + 2 * (HCF_NIC_TAL_CNT + HCF_HCF_TAL_CNT); //convert # of Tallies to L value for LTV - ifbp->IFB_TallyTyp = CFG_TALLIES; //IFB_TallyTyp: set T value -#endif // HCF_TALLIES_NIC / HCF_TALLIES_HCF - ifbp->IFB_IOBase = io_addr; //set IO_Base asap, so asserts via HREG_SW_2 don't harm - ifbp->IFB_IORange = HREG_IO_RANGE; - ifbp->IFB_CntlOpt = USE_16BIT; -#if HCF_ASSERT - assert_ifbp = ifbp; - ifbp->IFB_AssertLvl = 1; -#if (HCF_ASSERT) & HCF_ASSERT_LNK_MSF_RTN - if ( io_base != HCF_DISCONNECT ) { - ifbp->IFB_AssertRtn = (MSF_ASSERT_RTNP)msf_assert; /* 6 */ - } -#endif // HCF_ASSERT_LNK_MSF_RTN -#if (HCF_ASSERT) & HCF_ASSERT_MB //build the structure to pass the assert info to hcf_put_info - ifbp->IFB_AssertStrct.len = sizeof(ifbp->IFB_AssertStrct)/sizeof(hcf_16) - 1; - ifbp->IFB_AssertStrct.typ = CFG_MB_INFO; - ifbp->IFB_AssertStrct.base_typ = CFG_MB_ASSERT; - ifbp->IFB_AssertStrct.frag_cnt = 1; - ifbp->IFB_AssertStrct.frag_buf[0].frag_len = - ( offsetof(IFB_STRCT, IFB_AssertLvl) - offsetof(IFB_STRCT, IFB_AssertLine) ) / sizeof(hcf_16); - ifbp->IFB_AssertStrct.frag_buf[0].frag_addr = &ifbp->IFB_AssertLine; -#endif // HCF_ASSERT_MB -#endif // HCF_ASSERT - IF_PROT_TIME( prot_cnt = ifbp->IFB_TickIni = INI_TICK_INI ); -#if ( (HCF_TYPE) & HCF_TYPE_PRELOADED ) == 0 - //!! No asserts before Reset-bit in HREG_IO is cleared - OPW( HREG_IO, 0x0000 ); //OPW useable /* 2b*/ - HCF_WAIT_WHILE( (IPW( HREG_EV_STAT) & HREG_EV_CMD) == 0 ); - IF_PROT_TIME( HCFASSERT( prot_cnt, IPW( HREG_EV_STAT) ) ); - IF_PROT_TIME( if ( prot_cnt ) prot_cnt = ifbp->IFB_TickIni ); -#endif // HCF_TYPE_PRELOADED - //!! No asserts before Reset-bit in HREG_IO is cleared - HCFASSERT( DO_ASSERT, MERGE_2( HCF_ASSERT, 0xCAF0 ) ); //just to proof that the complete assert machinery is working - HCFASSERT( xa != CFG_FW_IDENTITY, 0 ); // assert if hcf_connect is called without intervening hcf_disconnect. - HCFASSERT( ((hcf_32)(void*)ifbp & (HCF_ALIGN-1) ) == 0, (hcf_32)(void*)ifbp ); - HCFASSERT( (io_addr & 0x003F) == 0, io_addr ); - //if Busy bit in Cmd register - if (IPW( HREG_CMD ) & HCMD_BUSY ) { /* 8 */ - //. Ack all to unblock a (possibly) blocked cmd pipe line - OPW( HREG_EV_ACK, ~HREG_EV_SLEEP_REQ ); - //. Wait for Busy bit drop in Cmd register - //. Wait for Cmd bit raise in Ev register - HCF_WAIT_WHILE( ( IPW( HREG_CMD ) & HCMD_BUSY ) && (IPW( HREG_EV_STAT) & HREG_EV_CMD) == 0 ); - IF_PROT_TIME( HCFASSERT( prot_cnt, IPW( HREG_EV_STAT) ) ); /* if prot_cnt == 0, cmd_exe will fail, causing DEFUNCT */ - } - OPW( HREG_EV_ACK, ~HREG_EV_SLEEP_REQ ); -#if ( (HCF_TYPE) & HCF_TYPE_PRELOADED ) == 0 /*12*/ - (void)cmd_exe( ifbp, HCMD_INI, 0 ); -#endif // HCF_TYPE_PRELOADED - if ( io_base != HCF_DISCONNECT ) { - rc = init( ifbp ); /*14*/ - if ( rc == HCF_SUCCESS ) { - x.len = 2; - x.typ = CFG_NIC_BUS_TYPE; - (void)hcf_get_info( ifbp, &x ); - ifbp->IFB_BusType = x.val[0]; - //CFG_NIC_BUS_TYPE not supported -> default 32 bits/DMA, MSF has to overrule via CFG_CNTL_OPT - if ( x.len == 0 || x.val[0] == 0x0002 || x.val[0] == 0x0003 ) { -#if (HCF_IO) & HCF_IO_32BITS - ifbp->IFB_CntlOpt &= ~USE_16BIT; //reset USE_16BIT -#endif // HCF_IO_32BITS -#if HCF_DMA - ifbp->IFB_CntlOpt |= USE_DMA; //SET DMA -#else - ifbp->IFB_IORange = 0x40 /*i.s.o. HREG_IO_RANGE*/; -#endif // HCF_DMA - } - } - } else HCFASSERT( ( ifbp->IFB_Magic ^= HCF_MAGIC ) == 0, ifbp->IFB_Magic ) /*NOP*/; - /* of above HCFASSERT only the side effect is needed, NOP in case HCFASSERT is dummy */ - ifbp->IFB_IOBase = io_base; /* 0*/ - return rc; -} // hcf_connect - -#if HCF_DMA -/************************************************************************************************************ - * Function get_frame_lst - * - resolve the "last host-owned descriptor" problems when a descriptor list is reclaimed by the MSF. - * - * The FrameList to be reclaimed as well as the DescriptorList always start in IFB_FirstDesc[tx_rx_flag] - * and this is always the "current" DELWA Descriptor. - * - * If a FrameList is available, the last descriptor of the FrameList to turned into a new DELWA Descriptor: - * - a copy is made from the information in the last descriptor of the FrameList into the current - * DELWA Descriptor - * - the remainder of the DescriptorList is detached from the copy by setting the next_desc_addr at NULL - * - the DMA control bits of the copy are cleared to do not confuse the MSF - * - the copy of the last descriptor (i.e. the "old" DELWA Descriptor) is chained to the prev Descriptor - * of the FrameList, thus replacing the original last Descriptor of the FrameList. - * - IFB_FirstDesc is changed to the address of that replaced (original) last descriptor of the FrameList, - * i.e. the "new" DELWA Descriptor. - * - * This function makes a copy of that last host-owned descriptor, so the MSF will get a copy of the descriptor. - * On top of that, it adjusts DMA related fields in the IFB structure. - // perform a copying-scheme to circumvent the 'last host owned descriptor cannot be reclaimed' limitation imposed by H2.5's DMA hardware design - // a 'reclaim descriptor' should be available in the HCF: - * - * Returns: address of the first descriptor of the FrameList - * - 8: Be careful once you start re-ordering the steps in the copy process, that it still works for cases - * of FrameLists of 1, 2 and more than 2 descriptors - * - * Input parameters: - * tx_rx_flag : specifies 'transmit' or 'receive' descriptor. - * - ************************************************************************************************************/ -HCF_STATIC DESC_STRCT* -get_frame_lst( IFBP ifbp, int tx_rx_flag ) -{ - - DESC_STRCT *head = ifbp->IFB_FirstDesc[tx_rx_flag]; - DESC_STRCT *copy, *p, *prev; - - HCFASSERT( tx_rx_flag == DMA_RX || tx_rx_flag == DMA_TX, tx_rx_flag ); - //if FrameList - if ( head ) { - //. search for last descriptor of first FrameList - p = prev = head; - while ( ( p->BUF_SIZE & DESC_EOP ) == 0 && p->next_desc_addr ) { - if ( ( ifbp->IFB_CntlOpt & DMA_ENABLED ) == 0 ) { //clear control bits when disabled - p->BUF_CNT &= DESC_CNT_MASK; - } - prev = p; - p = p->next_desc_addr; - } - //. if DMA enabled - if ( ifbp->IFB_CntlOpt & DMA_ENABLED ) { - //. . if last descriptor of FrameList is DMA owned - //. . or if FrameList is single (DELWA) Descriptor - if ( p->BUF_CNT & DESC_DMA_OWNED || head->next_desc_addr == NULL ) { - //. . . refuse to return FrameList to caller - head = NULL; - } - } - } - //if returnable FrameList found - if ( head ) { - //. if FrameList is single (DELWA) Descriptor (implies DMA disabled) - if ( head->next_desc_addr == NULL ) { - //. . clear DescriptorList - /*;?ifbp->IFB_LastDesc[tx_rx_flag] =*/ ifbp->IFB_FirstDesc[tx_rx_flag] = NULL; - //. else - } else { - //. . strip hardware-related bits from last descriptor - //. . remove DELWA Descriptor from head of DescriptorList - copy = head; - head = head->next_desc_addr; - //. . exchange first (Confined) and last (possibly imprisoned) Descriptor - copy->buf_phys_addr = p->buf_phys_addr; - copy->buf_addr = p->buf_addr; - copy->BUF_SIZE = p->BUF_SIZE &= DESC_CNT_MASK; //get rid of DESC_EOP and possibly DESC_SOP - copy->BUF_CNT = p->BUF_CNT &= DESC_CNT_MASK; //get rid of DESC_DMA_OWNED -#if (HCF_EXT) & HCF_DESC_STRCT_EXT - copy->DESC_MSFSup = p->DESC_MSFSup; -#endif // HCF_DESC_STRCT_EXT - //. . turn into a DELWA Descriptor - p->buf_addr = NULL; - //. . chain copy to prev /* 8*/ - prev->next_desc_addr = copy; - //. . detach remainder of the DescriptorList from FrameList - copy->next_desc_addr = NULL; - copy->next_desc_phys_addr = 0xDEAD0000; //! just to be nice, not really needed - //. . save the new start (i.e. DELWA Descriptor) in IFB_FirstDesc - ifbp->IFB_FirstDesc[tx_rx_flag] = p; - } - //. strip DESC_SOP from first descriptor - head->BUF_SIZE &= DESC_CNT_MASK; - //head->BUF_CNT &= DESC_CNT_MASK; get rid of DESC_DMA_OWNED - head->next_desc_phys_addr = 0xDEAD0000; //! just to be nice, not really needed - } - //return the just detached FrameList (if any) - return head; -} // get_frame_lst - - -/************************************************************************************************************ - * Function put_frame_lst - * - * This function - * - * Returns: address of the first descriptor of the FrameList - * - * Input parameters: - * tx_rx_flag : specifies 'transmit' or 'receive' descriptor. - * - * The following list should be kept in sync with hcf_dma_tx/rx_put, in order to get them in the WCI-spec !!!! - * Assert fails if - * - DMA is not enabled - * - descriptor list is NULL - * - a descriptor in the descriptor list is not double word aligned - * - a count of size field of a descriptor contains control bits, i.e. bits in the high order nibble. - * - the DELWA descriptor is not a "singleton" DescriptorList. - * - the DELWA descriptor is not the first Descriptor supplied - * - a non_DMA descriptor is supplied before the DELWA Descriptor is supplied - * - Possibly more checks could be added !!!!!!!!!!!!! - - *.NOTICE - * The asserts marked with *sc* are really sanity checks for the HCF, they can (supposedly) not be influenced - * by incorrect MSF behavior - - // The MSF is required to supply the HCF with a single descriptor for MSF tx reclaim purposes. - // This 'reclaim descriptor' can be recognized by the fact that its buf_addr field is zero. - ********************************************************************************************* - * Although not required from a hardware perspective: - * - make each descriptor in this rx-chain DMA-owned. - * - Also set the count to zero. EOP and SOP bits are also cleared. - *********************************************************************************************/ -HCF_STATIC void -put_frame_lst( IFBP ifbp, DESC_STRCT *descp, int tx_rx_flag ) -{ - DESC_STRCT *p = descp; - hcf_16 port; - - HCFASSERT( ifbp->IFB_CntlOpt & USE_DMA, ifbp->IFB_CntlOpt); //only hcf_dma_tx_put must also be DMA_ENABLED - HCFASSERT( tx_rx_flag == DMA_RX || tx_rx_flag == DMA_TX, tx_rx_flag ); - HCFASSERT( p , 0 ); - - while ( p ) { - HCFASSERT( ((hcf_32)p & 3 ) == 0, (hcf_32)p ); - HCFASSERT( (p->BUF_CNT & ~DESC_CNT_MASK) == 0, p->BUF_CNT ); - HCFASSERT( (p->BUF_SIZE & ~DESC_CNT_MASK) == 0, p->BUF_SIZE ); - p->BUF_SIZE &= DESC_CNT_MASK; //!!this SHOULD be superfluous in case of correct MSF - p->BUF_CNT &= tx_rx_flag == DMA_RX ? 0 : DESC_CNT_MASK; //!!this SHOULD be superfluous in case of correct MSF - p->BUF_CNT |= DESC_DMA_OWNED; - if ( p->next_desc_addr ) { -// HCFASSERT( p->buf_addr && p->buf_phys_addr && p->BUF_SIZE && +/- p->BUF_SIZE, ... ); - HCFASSERT( p->next_desc_addr->desc_phys_addr, (hcf_32)p->next_desc_addr ); - p->next_desc_phys_addr = p->next_desc_addr->desc_phys_addr; - } else { // - p->next_desc_phys_addr = 0; - if ( p->buf_addr == NULL ) { // DELWA Descriptor - HCFASSERT( descp == p, (hcf_32)descp ); //singleton DescriptorList - HCFASSERT( ifbp->IFB_FirstDesc[tx_rx_flag] == NULL, (hcf_32)ifbp->IFB_FirstDesc[tx_rx_flag]); - HCFASSERT( ifbp->IFB_LastDesc[tx_rx_flag] == NULL, (hcf_32)ifbp->IFB_LastDesc[tx_rx_flag]); - descp->BUF_CNT = 0; //&= ~DESC_DMA_OWNED; - ifbp->IFB_FirstDesc[tx_rx_flag] = descp; -// part of alternative ifbp->IFB_LastDesc[tx_rx_flag] = ifbp->IFB_FirstDesc[tx_rx_flag] = descp; - // if "recycling" a FrameList - // (e.g. called from hcf_cntl( HCF_CNTL_ENABLE ) - // . prepare for activation DMA controller -// part of alternative descp = descp->next_desc_addr; - } else { //a "real" FrameList, hand it over to the DMA engine - HCFASSERT( ifbp->IFB_FirstDesc[tx_rx_flag], (hcf_32)descp ); - HCFASSERT( ifbp->IFB_LastDesc[tx_rx_flag], (hcf_32)descp ); - HCFASSERT( ifbp->IFB_LastDesc[tx_rx_flag]->next_desc_addr == NULL, - (hcf_32)ifbp->IFB_LastDesc[tx_rx_flag]->next_desc_addr); -// p->buf_cntl.cntl_stat |= DESC_DMA_OWNED; - ifbp->IFB_LastDesc[tx_rx_flag]->next_desc_addr = descp; - ifbp->IFB_LastDesc[tx_rx_flag]->next_desc_phys_addr = descp->desc_phys_addr; - port = HREG_RXDMA_PTR32; - if ( tx_rx_flag ) { - p->BUF_SIZE |= DESC_EOP; // p points at the last descriptor in the caller-supplied descriptor chain - descp->BUF_SIZE |= DESC_SOP; - port = HREG_TXDMA_PTR32; - } - OUT_PORT_DWORD( (ifbp->IFB_IOBase + port), descp->desc_phys_addr ); - } - ifbp->IFB_LastDesc[tx_rx_flag] = p; - } - p = p->next_desc_addr; - } -} // put_frame_lst - - -/************************************************************************************************************ - * - *.MODULE DESC_STRCT* hcf_dma_rx_get( IFBP ifbp ) - *.PURPOSE decapsulate a message and provides that message to the MSF. - * reclaim all descriptors in the rx descriptor chain. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * - *.RETURNS - * pointer to a FrameList - * - *.DESCRIPTION - * hcf_dma_rx_get is intended to return a received frame when such a frame is deposited in Host memory by the - * DMA engine. In addition hcf_dma_rx_get can be used to reclaim all descriptors in the rx descriptor chain - * when the DMA Engine is disabled, e.g. as part of a driver unloading strategy. - * hcf_dma_rx_get must be called repeatedly by the MSF when hcf_service_nic signals availability of a rx frame - * through the HREG_EV_RDMAD flag of IFB_DmaPackets. The calling must stop when a NULL pointer is returned, at - * which time the HREG_EV_RDMAD flag is also cleared by the HCF to arm the mechanism for the next frame - * reception. - * Regardless whether the DMA Engine is currently enabled (as controlled via hcf_cntl), if the DMA controller - * deposited an Rx-frame in the Rx-DescriptorList, this frame is detached from the Rx-DescriptorList, - * transformed into a FrameList (i.e. updating the housekeeping fields in the descriptors) and returned to the - * caller. - * If no such Rx-frame is available in the Rx-DescriptorList, the behavior of hcf_dma_rx_get depends on the - * status of the DMA Engine. - * If the DMA Engine is enabled, a NULL pointer is returned. - * If the DMA Engine is disabled, the following strategy is used: - * - the complete Rx-DescriptorList is returned. The DELWA Descriptor is not part of the Rx-DescriptorList. - * - If there is no Rx-DescriptorList, the DELWA Descriptor is returned. - * - If there is no DELWA Descriptor, a NULL pointer is returned. - * - * If the MSF performs an disable/enable sequence without exhausting the Rx-DescriptorList as described above, - * the enable command will reset all house keeping information, i.e. already received but not yet by the MSF - * retrieved frames are lost and the next frame will be received starting with the oldest descriptor. - * - * The HCF can be used in 2 fashions: with and without decapsulation for data transfer. - * This is controlled at compile time by the HCF_ENC bit of the HCF_ENCAP system constant. - * If appropriate, decapsulation is done by moving some data inside the buffers and updating the descriptors - * accordingly. - *!! ;?????where did I describe why a simple manipulation with the count values does not suffice? - * - *.DIAGRAM - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ - -DESC_STRCT* -hcf_dma_rx_get (IFBP ifbp) -{ - DESC_STRCT *descp; // pointer to start of FrameList - - descp = get_frame_lst( ifbp, DMA_RX ); - if ( descp && descp->buf_addr ) { - - //skip decapsulation at confined descriptor -#if (HCF_ENCAP) == HCF_ENC - int i; - DESC_STRCT *p = descp->next_desc_addr; //pointer to 2nd descriptor of frame - HCFASSERT(p, 0); - // The 2nd descriptor contains (maybe) a SNAP header plus part or whole of the payload. - //determine decapsulation sub-flag in RxFS - i = *(wci_recordp)&descp->buf_addr[HFS_STAT] & ( HFS_STAT_MSG_TYPE | HFS_STAT_ERR ); - if ( i == HFS_STAT_TUNNEL || - ( i == HFS_STAT_1042 && hcf_encap( (wci_bufp)&p->buf_addr[HCF_DASA_SIZE] ) != ENC_TUNNEL )) { - // The 2nd descriptor contains a SNAP header plus part or whole of the payload. - HCFASSERT( p->BUF_CNT == (p->buf_addr[5] + (p->buf_addr[4]<<8) + 2*6 + 2 - 8), p->BUF_CNT ); - // perform decapsulation - HCFASSERT(p->BUF_SIZE >=8, p->BUF_SIZE); - // move SA[2:5] in the second buffer to replace part of the SNAP header - for ( i=3; i >= 0; i--) p->buf_addr[i+8] = p->buf_addr[i]; - // copy DA[0:5], SA[0:1] from first buffer to second buffer - for ( i=0; i<8; i++) p->buf_addr[i] = descp->buf_addr[HFS_ADDR_DEST + i]; - // make first buffer shorter in count - descp->BUF_CNT = HFS_ADDR_DEST; - } - } -#endif // HCF_ENC - if ( descp == NULL ) ifbp->IFB_DmaPackets &= (hcf_16)~HREG_EV_RDMAD; //;?could be integrated into get_frame_lst - HCFLOGEXIT( HCF_TRACE_DMA_RX_GET ); - return descp; -} // hcf_dma_rx_get - - -/************************************************************************************************************ - * - *.MODULE void hcf_dma_rx_put( IFBP ifbp, DESC_STRCT *descp ) - *.PURPOSE supply buffers for receive purposes. - * supply the Rx-DELWA descriptor. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * descp address of a DescriptorList - * - *.RETURNS N.A. - * - *.DESCRIPTION - * This function is called by the MSF to supply the HCF with new/more buffers for receive purposes. - * The HCF can be used in 2 fashions: with and without encapsulation for data transfer. - * This is controlled at compile time by the HCF_ENC bit of the HCF_ENCAP system constant. - * As a consequence, some additional constraints apply to the number of descriptor and the buffers associated - * with the first 2 descriptors. Independent of the encapsulation feature, the COUNT fields are ignored. - * A special case is the supplying of the DELWA descriptor, which must be supplied as the first descriptor. - * - * Assert fails if - * - ifbp has a recognizable out-of-range value. - * - NIC interrupts are not disabled while required by parameter action. - * - in case decapsulation by the HCF is selected: - * - The first databuffer does not have the exact size corresponding with the RxFS up to the 802.3 DestAddr - * field (== 29 words). - * - The FrameList does not consists of at least 2 Descriptors. - * - The second databuffer does not have the minimum size of 8 bytes. - *!! The 2nd part of the list of asserts should be kept in sync with put_frame_lst, in order to get - *!! them in the WCI-spec !!!! - * - DMA is not enabled - * - descriptor list is NULL - * - a descriptor in the descriptor list is not double word aligned - * - a count of size field of a descriptor contains control bits, i.e. bits in the high order nibble. - * - the DELWA descriptor is not a "singleton" DescriptorList. - * - the DELWA descriptor is not the first Descriptor supplied - * - a non_DMA descriptor is supplied before the DELWA Descriptor is supplied - *!! - Possibly more checks could be added !!!!!!!!!!!!! - * - *.DIAGRAM - * - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -void -hcf_dma_rx_put( IFBP ifbp, DESC_STRCT *descp ) -{ - - HCFLOGENTRY( HCF_TRACE_DMA_RX_PUT, 0xDA01 ); - HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic ); - HCFASSERT_INT; - - put_frame_lst( ifbp, descp, DMA_RX ); -#if HCF_ASSERT && (HCF_ENCAP) == HCF_ENC - if ( descp->buf_addr ) { - HCFASSERT( descp->BUF_SIZE == HCF_DMA_RX_BUF1_SIZE, descp->BUF_SIZE ); - HCFASSERT( descp->next_desc_addr, 0 ); // first descriptor should be followed by another descriptor - // The second DB is for SNAP and payload purposes. It should be a minimum of 12 bytes in size. - HCFASSERT( descp->next_desc_addr->BUF_SIZE >= 12, descp->next_desc_addr->BUF_SIZE ); - } -#endif // HCFASSERT / HCF_ENC - HCFLOGEXIT( HCF_TRACE_DMA_RX_PUT ); -} // hcf_dma_rx_put - - -/************************************************************************************************************ - * - *.MODULE DESC_STRCT* hcf_dma_tx_get( IFBP ifbp ) - *.PURPOSE DMA mode: reclaims and decapsulates packets in the tx descriptor chain if: - * - A Tx packet has been copied from host-RAM into NIC-RAM by the DMA engine - * - The Hermes/DMAengine have been disabled - * - *.ARGUMENTS - * ifbp address of the Interface Block - * - *.RETURNS - * pointer to a reclaimed Tx packet. - * - *.DESCRIPTION - * impact of the disable command: - * When a non-empty pool of Tx descriptors exists (created by means of hcf_dma_put_tx), the MSF - * is supposed to empty that pool by means of hcf_dma_tx_get calls after the disable in an - * disable/enable sequence. - * - *.DIAGRAM - * - *.NOTICE - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -DESC_STRCT* -hcf_dma_tx_get( IFBP ifbp ) -{ - DESC_STRCT *descp; // pointer to start of FrameList - - descp = get_frame_lst( ifbp, DMA_TX ); - if ( descp && descp->buf_addr ) { - //skip decapsulation at confined descriptor -#if (HCF_ENCAP) == HCF_ENC - if ( ( descp->BUF_CNT == HFS_TYPE )) { - // perform decapsulation if needed - descp->next_desc_addr->buf_phys_addr -= HCF_DASA_SIZE; - descp->next_desc_addr->BUF_CNT += HCF_DASA_SIZE; - } -#endif // HCF_ENC - } - if ( descp == NULL ) { //;?could be integrated into get_frame_lst - ifbp->IFB_DmaPackets &= (hcf_16)~HREG_EV_TDMAD; - } - HCFLOGEXIT( HCF_TRACE_DMA_TX_GET ); - return descp; -} // hcf_dma_tx_get - - -/************************************************************************************************************ - * - *.MODULE void hcf_dma_tx_put( IFBP ifbp, DESC_STRCT *descp, hcf_16 tx_cntl ) - *.PURPOSE puts a packet in the Tx DMA queue in host ram and kicks off the TxDma engine. - * supply the Tx-DELWA descriptor. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * descp address of Tx Descriptor Chain (i.e. a single Tx frame) - * tx_cntl indicates MAC-port and (Hermes) options - * - *.RETURNS N.A. - * - *.DESCRIPTION - * The HCF can be used in 2 fashions: with and without encapsulation for data transfer. - * This is controlled at compile time by the HCF_ENC bit of the HCF_ENCAP system constant. - * - * Regardless of the HCF_ENCAP system constant, the descriptor list created to describe the frame to be - * transmitted, must supply space to contain the 802.11 header, preceding the actual frame to be transmitted. - * Basically, this only supplies working storage to the HCF which passes this on to the DMA engine. - * As a consequence the contents of this space do not matter. - * Nevertheless BUF_CNT must take in account this storage. - * This working space to contain the 802.11 header may not be fragmented, the first buffer must be - * sufficiently large to contain at least the 802.11 header, i.e. HFS_ADDR_DEST (29 words or 0x3A bytes). - * This way, the HCF can simply, regardless whether or not the HCF encapsulates the frame, write the parameter - * tx_cntl at offset 0x36 (HFS_TX_CNTL) in the first buffer. - * Note that it is allowed to have part or all of the actual frame represented by the first descriptor as long - * as the requirement for storage for the 802.11 header is met, i.e. the 802.3 frame starts at offset - * HFS_ADDR_DEST. - * Except for the Assert on the 1st buffer in case of Encapsualtion, the SIZE fields are ignored. - * - * In case the encapsulation feature is compiled in, there are the following additional requirements. - * o The BUF_CNT of the first buffer changes from a minimum of 0x3A bytes to exactly 0x3A, i.e. the workspace - * to store the 802.11 header - * o The BUF_SIZE of the first buffer is at least the space needed to store the - * - 802.11 header (29 words) - * - 802.3 header, i.e. 12 bytes addressing information and 2 bytes length field - * - 6 bytes SNAP-header - * This results in 39 words or 0x4E bytes or HFS_TYPE. - * Note that if the BUF_SIZE is larger than 0x4E, this surplus is not used. - * o The actual frame begins in the 2nd descriptor (which is already implied by the BUF_CNT == 0x3A requirement) and the associated buffer contains at least the 802.3 header, i.e. the 14 bytes representing addressing information and length/type field - * - * When the HCF does not encapsulates (i.e. length/type field <= 1500), no changes are made to descriptors - * or buffers. - * - * When the HCF actually encapsulates (i.e. length/type field > 1500), it successively writes, starting at - * offset HFS_ADDR_DEST (0x3A) in the first buffer: - * - the 802.3 addressing information, copied from the begin of the second buffer - * - the frame length, derived from the total length of the individual fragments, corrected for the SNAP - * header length and Type field and ignoring the Destination Address, Source Address and Length field - * - the appropriate snap header (Tunnel or 1042, depending on the value of the type field). - * - * The information in the first two descriptors is adjusted accordingly: - * - the first descriptor count is changed from 0x3A to 0x4E (HFS_TYPE), which matches 0x3A + 12 + 2 + 6 - * - the second descriptor count is decreased by 12, being the moved addressing information - * - the second descriptor (physical) buffer address is increased by 12. - * - * When the descriptors are returned by hcf_dma_tx_get, the transformation of the first two descriptors is - * undone. - * - * Under any of the above scenarios, the assert BUF_CNT <= BUF_SIZE must be true for all descriptors - * In case of encapsulation, BUF_SIZE of the 1st descriptor is asserted to be at least HFS_TYPE (0x4E), so it is NOT tested. - * - * Assert fails if - * - ifbp has a recognizable out-of-range value. - * - tx_cntl has a recognizable out-of-range value. - * - NIC interrupts are not disabled while required by parameter action. - * - in case encapsulation by the HCF is selected: - * - The FrameList does not consists of at least 2 Descriptors. - * - The first databuffer does not contain exactly the (space for) the 802.11 header (== 28 words) - * - The first databuffer does not have a size to additionally accommodate the 802.3 header and the - * SNAP header of the frame after encapsulation (== 39 words). - * - The second databuffer does not contain at least DA, SA and 'type/length' (==14 bytes or 7 words) - *!! The 2nd part of the list of asserts should be kept in sync with put_frame_lst, in order to get - *!! them in the WCI-spec !!!! - * - DMA is not enabled - * - descriptor list is NULL - * - a descriptor in the descriptor list is not double word aligned - * - a count of size field of a descriptor contains control bits, i.e. bits in the high order nibble. - * - the DELWA descriptor is not a "singleton" DescriptorList. - * - the DELWA descriptor is not the first Descriptor supplied - * - a non_DMA descriptor is supplied before the DELWA Descriptor is supplied - *!! - Possibly more checks could be added !!!!!!!!!!!!! - *.DIAGRAM - * - *.NOTICE - * - *.ENDDOC END DOCUMENTATION - * - * - *1: Write tx_cntl parameter to HFS_TX_CNTL field into the Hermes-specific header in buffer 1 - *4: determine whether encapsulation is needed and write the type (tunnel or 1042) already at the appropriate - * offset in the 1st buffer - *6: Build the encapsualtion enveloppe in the free space at the end of the 1st buffer - * - Copy DA/SA fields from the 2nd buffer - * - Calculate total length of the message (snap-header + type-field + the length of all buffer fragments - * associated with the 802.3 frame (i.e all descriptors except the first), but not the DestinationAddress, - * SourceAddress and length-field) - * Assert the message length - * Write length. Note that the message is in BE format, hence on LE platforms the length must be converted - * ;? THIS IS NOT WHAT CURRENTLY IS IMPLEMENTED - * - Write snap header. Note that the last byte of the snap header is NOT copied, that byte is already in - * place as result of the call to hcf_encap. - * Note that there are many ways to skin a cat. To express the offsets in the 1st buffer while writing - * the snap header, HFS_TYPE is chosen as a reference point to make it easier to grasp that the snap header - * and encapsualtion type are at least relative in the right. - *8: modify 1st descriptor to reflect moved part of the 802.3 header + Snap-header - * modify 2nd descriptor to skip the moved part of the 802.3 header (DA/SA - *10: set each descriptor to 'DMA owned', clear all other control bits. - * Set SOP bit on first descriptor. Set EOP bit on last descriptor. - *12: Either append the current frame to an existing descriptor list or - *14: create a list beginning with the current frame - *16: remember the new end of the list - *20: hand the frame over to the DMA engine - ************************************************************************************************************/ -void -hcf_dma_tx_put( IFBP ifbp, DESC_STRCT *descp, hcf_16 tx_cntl ) -{ - DESC_STRCT *p = descp->next_desc_addr; - int i; - -#if HCF_ASSERT - int x = ifbp->IFB_FWIdentity.comp_id == COMP_ID_FW_AP ? tx_cntl & ~HFS_TX_CNTL_PORT : tx_cntl; - HCFASSERT( (x & ~HCF_TX_CNTL_MASK ) == 0, tx_cntl ); -#endif // HCF_ASSERT - HCFLOGENTRY( HCF_TRACE_DMA_TX_PUT, 0xDA03 ); - HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic ); - HCFASSERT_INT; - HCFASSERT( ( ifbp->IFB_CntlOpt & (USE_DMA|DMA_ENABLED) ) == (USE_DMA|DMA_ENABLED), ifbp->IFB_CntlOpt); - - if ( descp->buf_addr ) { - *(hcf_16*)(descp->buf_addr + HFS_TX_CNTL) = tx_cntl; /*1*/ -#if (HCF_ENCAP) == HCF_ENC - HCFASSERT( descp->next_desc_addr, 0 ); //at least 2 descripors - HCFASSERT( descp->BUF_CNT == HFS_ADDR_DEST, descp->BUF_CNT ); //exact length required for 1st buffer - HCFASSERT( descp->BUF_SIZE >= HCF_DMA_TX_BUF1_SIZE, descp->BUF_SIZE ); //minimal storage for encapsulation - HCFASSERT( p->BUF_CNT >= 14, p->BUF_CNT ); //at least DA, SA and 'type' in 2nd buffer - - descp->buf_addr[HFS_TYPE-1] = hcf_encap(&descp->next_desc_addr->buf_addr[HCF_DASA_SIZE]); /*4*/ - if ( descp->buf_addr[HFS_TYPE-1] != ENC_NONE ) { - for ( i=0; i < HCF_DASA_SIZE; i++ ) { /*6*/ - descp->buf_addr[i + HFS_ADDR_DEST] = descp->next_desc_addr->buf_addr[i]; - } - i = sizeof(snap_header) + 2 - ( 2*6 + 2 ); - do { i += p->BUF_CNT; } while ( ( p = p->next_desc_addr ) != NULL ); - *(hcf_16*)(&descp->buf_addr[HFS_LEN]) = CNV_END_SHORT(i); //!! this converts on ALL platforms, how does that relate to the CCX code - for ( i=0; i < sizeof(snap_header) - 1; i++) { - descp->buf_addr[HFS_TYPE - sizeof(snap_header) + i] = snap_header[i]; - } - descp->BUF_CNT = HFS_TYPE; /*8*/ - descp->next_desc_addr->buf_phys_addr += HCF_DASA_SIZE; - descp->next_desc_addr->BUF_CNT -= HCF_DASA_SIZE; - } -#endif // HCF_ENC - } - put_frame_lst( ifbp, descp, DMA_TX ); - HCFLOGEXIT( HCF_TRACE_DMA_TX_PUT ); -} // hcf_dma_tx_put - -#endif // HCF_DMA - -/************************************************************************************************************ - * - *.MODULE hcf_8 hcf_encap( wci_bufp type ) - *.PURPOSE test whether RFC1042 or Bridge-Tunnel encapsulation is needed. - * - *.ARGUMENTS - * type (Far) pointer to the (Big Endian) Type/Length field in the message - * - *.RETURNS - * ENC_NONE len/type is "len" ( (BIG_ENDIAN)type <= 1500 ) - * ENC_TUNNEL len/type is "type" and 0x80F3 or 0x8137 - * ENC_1042 len/type is "type" but not 0x80F3 or 0x8137 - * - *.CONDITIONS - * NIC Interrupts d.c - * - *.DESCRIPTION - * Type must point to the Len/Type field of the message, this is the 2-byte field immediately after the 6 byte - * Destination Address and 6 byte Source Address. The 2 successive bytes addressed by type are interpreted as - * a Big Endian value. If that value is less than or equal to 1500, the message is assumed to be in 802.3 - * format. Otherwise the message is assumed to be in Ethernet-II format. Depending on the value of Len/Typ, - * Bridge Tunnel or RFC1042 encapsulation is needed. - * - *.DIAGRAM - * - * 1: presume 802.3, hence preset return value at ENC_NONE - * 2: convert type from "network" Endian format to native Endian - * 4: the litmus test to distinguish type and len. - * The hard code "magic" value of 1500 is intentional and should NOT be replaced by a mnemonic because it is - * not related at all to the maximum frame size supported by the Hermes. - * 6: check type against: - * 0x80F3 //AppleTalk Address Resolution Protocol (AARP) - * 0x8137 //IPX - * to determine the type of encapsulation - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -HCF_STATIC hcf_8 -hcf_encap( wci_bufp type ) -{ - - hcf_8 rc = ENC_NONE; /* 1 */ - hcf_16 t = (hcf_16)(*type<<8) + *(type+1); /* 2 */ - - if ( t > 1500 ) { /* 4 */ - if ( t == 0x8137 || t == 0x80F3 ) { - rc = ENC_TUNNEL; /* 6 */ - } else { - rc = ENC_1042; - } - } - return rc; -} // hcf_encap - - -/************************************************************************************************************ - * - *.MODULE int hcf_get_info( IFBP ifbp, LTVP ltvp ) - *.PURPOSE Obtains transient and persistent configuration information from the Card and from the HCF. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * ltvp address of LengthTypeValue structure specifying the "what" and the "how much" of the - * information to be collected from the HCF or from the Hermes - * - *.RETURNS - * HCF_ERR_LEN The provided buffer was too small - * HCF_SUCCESS Success - *!! via cmd_exe ( type >= CFG_RID_FW_MIN ) - * HCF_ERR_NO_NIC NIC removed during retrieval - * HCF_ERR_TIME_OUT Expected Hermes event did not occur in expected time - *!! via cmd_exe and setup_bap (type >= CFG_RID_FW_MIN ) - * HCF_ERR_DEFUNCT_... HCF is in defunct mode (bits 0x7F reflect cause) - * - *.DESCRIPTION - * The T-field of the LTV-record (provided by the MSF in parameter ltvp) specifies the RID wanted. The RID - * information identified by the T-field is copied into the V-field. - * On entry, the L-field specifies the size of the buffer, also called the "Initial DataLength". The L-value - * includes the size of the T-field, but not the size of the L-field itself. - * On return, the L-field indicates the number of words actually contained by the Type and Value fields. - * As the size of the Type field in the LTV-record is included in the "Initial DataLength" of the record, the - * V-field can contain at most "Initial DataLength" - 1 words of data. - * Copying stops if either the complete Information is copied or if the number of words indicated by the - * "Initial DataLength" were copied. The "Initial DataLength" acts as a safe guard against Configuration - * Information blocks that have different sizes for different F/W versions, e.g. when later versions support - * more tallies than earlier versions. - * If the size of Value field of the RID exceeds the size of the "Initial DataLength" -1, as much data - * as fits is copied, and an error status of HCF_ERR_LEN is returned. - * - * It is the responsibility of the MSF to detect card removal and re-insertion and not call the HCF when the - * NIC is absent. The MSF cannot, however, timely detect a Card removal if the Card is removed while - * hcf_get_info is in progress. Therefore, the HCF performs its own check on Card presence after the read - * operation of the NIC data. If the Card is not present or removed during the execution of hcf_get_info, - * HCF_ERR_NO_NIC is returned and the content of the Data Buffer is unpredictable. This check is not performed - * in case of the "HCF embedded" pseudo RIDs like CFG_TALLIES. - * - * Assert fails if - * - ifbp has a recognizable out-of-range value. - * - reentrancy, may be caused by calling hcf_functions without adequate protection - * against NIC interrupts or multi-threading. - * - ltvp is a NULL pointer. - * - length field of the LTV-record at entry is 0 or 1 or has an excessive value (i.e. exceeds HCF_MAX_LTV). - * - type field of the LTV-record is invalid. - * - *.DIAGRAM - * Hcf_get_mb_info copies the contents of the oldest MailBox Info block in the MailBox to PC RAM. If len is - * less than the size of the MailBox Info block, only as much as fits in the PC RAM buffer is copied. After - * the copying the MailBox Read pointer is updated to point to the next MailBox Info block, hence the - * remainder of an "oversized" MailBox Info block is lost. The truncation of the MailBox Info block is NOT - * reflected in the return status. Note that hcf_get_info guarantees the length of the PC RAM buffer meets - * the minimum requirements of at least 2, so no PC RAM buffer overrun. - * - * Calling hcf_get_mb_info when their is no MailBox Info block available or when there is no MailBox at all, - * results in a "NULL" MailBox Info block. - * - *12: see NOTICE - *17: The return status of cmd_wait and the first hcfio_in_string can be ignored, because when one fails, the - * other fails via the IFB_DefunctStat mechanism - *20: "HCFASSERT( rc == HCF_SUCCESS, rc )" is not suitable because this will always trigger as side effect of - * the HCFASSERT in hcf_put_info which calls hcf_get_info to figure out whether the RID exists at all. - - *.NOTICE - * - * "HCF embedded" pseudo RIDs: - * CFG_MB_INFO, CFG_TALLIES, CFG_DRV_IDENTITY, CFG_DRV_SUP_RANGE, CFG_DRV_ACT_RANGES_PRI, - * CFG_DRV_ACT_RANGES_STA, CFG_DRV_ACT_RANGES_HSI - * Note the HCF_ERR_LEN is NOT adequately set, when L >= 2 but less than needed - * - * Remarks: Transfers operation information and transient and persistent configuration information from the - * Card and from the HCF to the MSF. - * The exact layout of the provided data structure depends on the action code. Copying stops if either the - * complete Configuration Information is copied or if the number of bytes indicated by len is copied. Len - * acts as a safe guard against Configuration Information blocks which have different sizes for different - * Hermes versions, e.g. when later versions support more tallies than earlier versions. It is a conscious - * decision that unused parts of the PC RAM buffer are not cleared. - * - * Remarks: The only error against which is protected is the "Read error" as result of Card removal. Only the - * last hcf_io_string need to be protected because if the first fails the second will fail as well. Checking - * for cmd_exe errors is supposed superfluous because problems in cmd_exe are already caught or will be - * caught by hcf_enable. - * - * CFG_MB_INFO: copy the oldest MailBox Info Block or the "null" block if none available. - * - * The mechanism to HCF_ASSERT on invalid typ-codes in the LTV record is based on the following strategy: - * - during the pseudo-asynchronous Hermes commands (diagnose, download) only CFG_MB_INFO is acceptable - * - some codes (e.g. CFG_TALLIES) are explicitly handled by the HCF which implies that these codes - * are valid - * - all other codes in the range 0xFC00 through 0xFFFF are passed to the Hermes. The Hermes returns an - * LTV record with a zero value in the L-field for all Typ-codes it does not recognize. This is - * defined and intended behavior, so HCF_ASSERT does not catch on this phenomena. - * - all remaining codes are invalid and cause an ASSERT. - * - *.CONDITIONS - * In case of USB, HCF_MAX_MSG ;?USED;? to limit the amount of data that can be retrieved via hcf_get_info. - * - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -int -hcf_get_info( IFBP ifbp, LTVP ltvp ) -{ - - int rc = HCF_SUCCESS; - hcf_16 len = ltvp->len; - hcf_16 type = ltvp->typ; - wci_recordp p = <vp->len; //destination word pointer (in LTV record) - hcf_16 *q = NULL; /* source word pointer Note!! DOS COM can't cope with FAR - * as a consequence MailBox must be near which is usually true anyway - */ - int i; - - HCFLOGENTRY( HCF_TRACE_GET_INFO, ltvp->typ ); - HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic ); - HCFASSERT_INT; - HCFASSERT( ltvp, 0 ); - HCFASSERT( 1 < ltvp->len && ltvp->len <= HCF_MAX_LTV + 1, MERGE_2( ltvp->typ, ltvp->len ) ); - - ltvp->len = 0; //default to: No Info Available - //filter out all specials - for ( i = 0; ( q = xxxx[i] ) != NULL && q[1] != type; i++ ) /*NOP*/; - -#if HCF_TALLIES - if ( type == CFG_TALLIES ) { /*3*/ - (void)hcf_action( ifbp, HCF_ACT_TALLIES ); - q = (hcf_16*)&ifbp->IFB_TallyLen; - } -#endif // HCF_TALLIES - - if ( type == CFG_MB_INFO ) { - if ( ifbp->IFB_MBInfoLen ) { - if ( ifbp->IFB_MBp[ifbp->IFB_MBRp] == 0xFFFF ) { - ifbp->IFB_MBRp = 0; //;?Probably superfluous - } - q = &ifbp->IFB_MBp[ifbp->IFB_MBRp]; - ifbp->IFB_MBRp += *q + 1; //update read pointer - if ( ifbp->IFB_MBp[ifbp->IFB_MBRp] == 0xFFFF ) { - ifbp->IFB_MBRp = 0; - } - ifbp->IFB_MBInfoLen = ifbp->IFB_MBp[ifbp->IFB_MBRp]; - } - } - - if ( q != NULL ) { //a special or CFG_TALLIES or CFG_MB_INFO - i = min( len, *q ) + 1; //total size of destination (including T-field) - while ( i-- ) { - *p++ = *q; -#if (HCF_TALLIES) & HCF_TALLIES_RESET - if ( q > &ifbp->IFB_TallyTyp && type == CFG_TALLIES ) { - *q = 0; - } -#endif // HCF_TALLIES_RESET - q++; - } - } else { // not a special nor CFG_TALLIES nor CFG_MB_INFO - if ( type == CFG_CNTL_OPT ) { //read back effective options - ltvp->len = 2; - ltvp->val[0] = ifbp->IFB_CntlOpt; -#if (HCF_EXT) & HCF_EXT_NIC_ACCESS - } else if ( type == CFG_PROD_DATA ) { //only needed for some test tool on top of H-II NDIS driver - hcf_io io_port; - wci_bufp pt; //pointer with the "right" type, just to help ease writing macros with embedded assembly - OPW( HREG_AUX_PAGE, (hcf_16)(PLUG_DATA_OFFSET >> 7) ); - OPW( HREG_AUX_OFFSET, (hcf_16)(PLUG_DATA_OFFSET & 0x7E) ); - io_port = ifbp->IFB_IOBase + HREG_AUX_DATA; //to prevent side effects of the MSF-defined macro - p = ltvp->val; //destination char pointer (in LTV record) - i = len - 1; - if (i > 0 ) { - pt = (wci_bufp)p; //just to help ease writing macros with embedded assembly - IN_PORT_STRING_8_16( io_port, pt, i ); //space used by T: -1 - } - } else if ( type == CFG_CMD_HCF ) { -#define P ((CFG_CMD_HCF_STRCT FAR *)ltvp) - HCFASSERT( P->cmd == CFG_CMD_HCF_REG_ACCESS, P->cmd ); //only Hermes register access supported - if ( P->cmd == CFG_CMD_HCF_REG_ACCESS ) { - HCFASSERT( P->mode < ifbp->IFB_IOBase, P->mode ); //Check Register space - ltvp->len = min( len, 4 ); //RESTORE ltv length - P->add_info = IPW( P->mode ); - } -#undef P -#endif // HCF_EXT_NIC_ACCESS -#if (HCF_ASSERT) & HCF_ASSERT_PRINTF - } else if (type == CFG_FW_PRINTF) { - rc = fw_printf(ifbp, (CFG_FW_PRINTF_STRCT*)ltvp); -#endif // HCF_ASSERT_PRINTF - } else if ( type >= CFG_RID_FW_MIN ) { -//;? by using HCMD_BUSY option when calling cmd_exe, using a get_frag with length 0 just to set up the -//;? BAP and calling cmd_cmpl, you could merge the 2 Busy waits. Whether this really helps (and what -//;? would be the optimal sequence in cmd_exe and get_frag) would have to be MEASURED - /*17*/ if ( ( rc = cmd_exe( ifbp, HCMD_ACCESS, type ) ) == HCF_SUCCESS && - ( rc = setup_bap( ifbp, type, 0, IO_IN ) ) == HCF_SUCCESS ) { - get_frag( ifbp, (wci_bufp)<vp->len, 2*len+2 BE_PAR(2) ); - if ( IPW( HREG_STAT ) == 0xFFFF ) { //NIC removal test - ltvp->len = 0; - HCFASSERT( DO_ASSERT, type ); - } - } - /*12*/ } else HCFASSERT( DO_ASSERT, type ) /*NOP*/; //NOP in case HCFASSERT is dummy - } - if ( len < ltvp->len ) { - ltvp->len = len; - if ( rc == HCF_SUCCESS ) { - rc = HCF_ERR_LEN; - } - } - HCFASSERT( rc == HCF_SUCCESS || ( rc == HCF_ERR_LEN && ifbp->IFB_AssertTrace & 1<typ ); - HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic ); - HCFASSERT_INT; - HCFASSERT( ltvp, 0 ); - HCFASSERT( 1 < ltvp->len && ltvp->len <= HCF_MAX_LTV + 1, ltvp->len ); - - //all codes between 0xFA00 and 0xFCFF are passed to Hermes -#if (HCF_TYPE) & HCF_TYPE_WPA - { - hcf_16 i; - hcf_32 FAR * key_p; - - if ( ltvp->typ == CFG_ADD_TKIP_DEFAULT_KEY || ltvp->typ == CFG_ADD_TKIP_MAPPED_KEY ) { - key_p = (hcf_32*)((CFG_ADD_TKIP_MAPPED_KEY_STRCT FAR *)ltvp)->tx_mic_key; - i = TX_KEY; //i.e. TxKeyIndicator == 1, KeyID == 0 - if ( ltvp->typ == CFG_ADD_TKIP_DEFAULT_KEY ) { - key_p = (hcf_32*)((CFG_ADD_TKIP_DEFAULT_KEY_STRCT FAR *)ltvp)->tx_mic_key; - i = CNV_LITTLE_TO_SHORT(((CFG_ADD_TKIP_DEFAULT_KEY_STRCT FAR *)ltvp)->tkip_key_id_info); - } - if ( i & TX_KEY ) { /* TxKeyIndicator == 1 - (either really set by MSF in case of DEFAULT or faked by HCF in case of MAPPED ) */ - ifbp->IFB_MICTxCntl = (hcf_16)( HFS_TX_CNTL_MIC | (i & KEY_ID )<<8 ); - ifbp->IFB_MICTxKey[0] = CNV_LONGP_TO_LITTLE( key_p ); - ifbp->IFB_MICTxKey[1] = CNV_LONGP_TO_LITTLE( (key_p+1) ); - } - i = ( i & KEY_ID ) * 2; - ifbp->IFB_MICRxKey[i] = CNV_LONGP_TO_LITTLE( (key_p+2) ); - ifbp->IFB_MICRxKey[i+1] = CNV_LONGP_TO_LITTLE( (key_p+3) ); - } -#define P ((CFG_REMOVE_TKIP_DEFAULT_KEY_STRCT FAR *)ltvp) - if ( ( ltvp->typ == CFG_REMOVE_TKIP_MAPPED_KEY ) || - ( ltvp->typ == CFG_REMOVE_TKIP_DEFAULT_KEY && - ( (ifbp->IFB_MICTxCntl >> 8) & KEY_ID ) == CNV_SHORT_TO_LITTLE(P->tkip_key_id ) - ) - ) { ifbp->IFB_MICTxCntl = 0; } //disable MIC-engine -#undef P - } -#endif // HCF_TYPE_WPA - - if ( ltvp->typ == CFG_PROG ) { - rc = download( ifbp, (CFG_PROG_STRCT FAR *)ltvp ); - } else switch (ltvp->typ) { -#if (HCF_ASSERT) & HCF_ASSERT_RT_MSF_RTN - case CFG_REG_ASSERT_RTNP: //Register MSF Routines -#define P ((CFG_REG_ASSERT_RTNP_STRCT FAR *)ltvp) - ifbp->IFB_AssertRtn = P->rtnp; -// ifbp->IFB_AssertLvl = P->lvl; //TODO not yet supported so default is set in hcf_connect - HCFASSERT( DO_ASSERT, MERGE_2( HCF_ASSERT, 0xCAF1 ) ); //just to proof that the complete assert machinery is working -#undef P - break; -#endif // HCF_ASSERT_RT_MSF_RTN -#if (HCF_EXT) & HCF_EXT_INFO_LOG - case CFG_REG_INFO_LOG: //Register Log filter - ifbp->IFB_RIDLogp = ((CFG_RID_LOG_STRCT FAR*)ltvp)->recordp; - break; -#endif // HCF_EXT_INFO_LOG - case CFG_CNTL_OPT: //overrule option - HCFASSERT( ( ltvp->val[0] & ~(USE_DMA | USE_16BIT) ) == 0, ltvp->val[0] ); - if ( ( ltvp->val[0] & USE_DMA ) == 0 ) ifbp->IFB_CntlOpt &= ~USE_DMA; - ifbp->IFB_CntlOpt |= ltvp->val[0] & USE_16BIT; - break; - - case CFG_REG_MB: //Register MailBox -#define P ((CFG_REG_MB_STRCT FAR *)ltvp) - HCFASSERT( ( (hcf_32)P->mb_addr & 0x0001 ) == 0, (hcf_32)P->mb_addr ); - HCFASSERT( (P)->mb_size >= 60, (P)->mb_size ); - ifbp->IFB_MBp = P->mb_addr; - /* if no MB present, size must be 0 for ;?the old;? put_info_mb to work correctly */ - ifbp->IFB_MBSize = ifbp->IFB_MBp == NULL ? 0 : P->mb_size; - ifbp->IFB_MBWp = ifbp->IFB_MBRp = 0; - ifbp->IFB_MBp[0] = 0; //flag the MailBox as empty - ifbp->IFB_MBInfoLen = 0; - HCFASSERT( ifbp->IFB_MBSize >= 60 || ifbp->IFB_MBp == NULL, ifbp->IFB_MBSize ); -#undef P - break; - case CFG_MB_INFO: //store MailBoxInfoBlock - rc = put_info_mb( ifbp, (CFG_MB_INFO_STRCT FAR *)ltvp ); - break; - -#if (HCF_EXT) & HCF_EXT_NIC_ACCESS - case CFG_CMD_NIC: -#define P ((CFG_CMD_NIC_STRCT FAR *)ltvp) - OPW( HREG_PARAM_2, P->parm2 ); - OPW( HREG_PARAM_1, P->parm1 ); - rc = cmd_exe( ifbp, P->cmd, P->parm0 ); - P->hcf_stat = (hcf_16)rc; - P->stat = IPW( HREG_STAT ); - P->resp0 = IPW( HREG_RESP_0 ); - P->resp1 = IPW( HREG_RESP_1 ); - P->resp2 = IPW( HREG_RESP_2 ); - P->ifb_err_cmd = ifbp->IFB_ErrCmd; - P->ifb_err_qualifier = ifbp->IFB_ErrQualifier; -#undef P - break; - case CFG_CMD_HCF: -#define P ((CFG_CMD_HCF_STRCT FAR *)ltvp) - HCFASSERT( P->cmd == CFG_CMD_HCF_REG_ACCESS, P->cmd ); //only Hermes register access supported - if ( P->cmd == CFG_CMD_HCF_REG_ACCESS ) { - HCFASSERT( P->mode < ifbp->IFB_IOBase, P->mode ); //Check Register space - OPW( P->mode, P->add_info); - } -#undef P - break; -#endif // HCF_EXT_NIC_ACCESS - -#if (HCF_ASSERT) & HCF_ASSERT_PRINTF - case CFG_FW_PRINTF_BUFFER_LOCATION: - ifbp->IFB_FwPfBuff = *(CFG_FW_PRINTF_BUFFER_LOCATION_STRCT*)ltvp; - break; -#endif // HCF_ASSERT_PRINTF - - default: //pass everything unknown above the "FID" range to the Hermes or Dongle - rc = put_info( ifbp, ltvp ); - } - //DO NOT !!! HCFASSERT( rc == HCF_SUCCESS, rc ) /* 20 */ - HCFLOGEXIT( HCF_TRACE_PUT_INFO ); - return rc; -} // hcf_put_info - - -/************************************************************************************************************ - * - *.MODULE int hcf_rcv_msg( IFBP ifbp, DESC_STRCT *descp, unsigned int offset ) - *.PURPOSE All: decapsulate a message. - * pre-HermesII.5: verify MIC. - * non-USB, non-DMA mode: Transfer a message from the NIC to the Host and acknowledge reception. - * USB: Transform a message from proprietary USB format to 802.3 format - * - *.ARGUMENTS - * ifbp address of the Interface Block - * descp Pointer to the Descriptor List location. - * offset USB: not used - * non-USB: specifies the beginning of the data to be obtained (0 corresponds with DestAddr field - * of frame). - * - *.RETURNS - * HCF_SUCCESS No WPA error ( or HCF_ERR_MIC already reported by hcf_service_nic) - * HCF_ERR_MIC message contains an erroneous MIC ( HCF_SUCCESS is reported if HCF_ERR_MIC is already - * reported by hcf_service_nic) - * HCF_ERR_NO_NIC NIC removed during data retrieval - * HCF_ERR_DEFUNCT... - * - *.DESCRIPTION - * The Receive Message Function can be executed by the MSF to obtain the Data Info fields of the message that - * is reported to be available by the Service NIC Function. - * - * The Receive Message Function copies the message data available in the Card memory into a buffer structure - * provided by the MSF. - * Only data of the message indicated by the Service NIC Function can be obtained. - * Execution of the Service NIC function may result in the availability of a new message, but it definitely - * makes the message reported by the preceding Service NIC function, unavailable. - * - * in non-USB/non-DMA mode, hcf_rcv_msg starts the copy process at the (non-negative) offset requested by the - * parameter offset, relative to HFS_ADDR_DEST, e.g offset 0 starts copying from the Destination Address, the - * very begin of the 802.3 frame message. Offset must either lay within the part of the 802.3 frame as stored - * by hcf_service_nic in the lookahead buffer or be just behind it, i.e. the first byte not yet read. - * When offset is within lookahead, data is copied from lookahead. - * When offset is beyond lookahead, data is read directly from RxFS in NIC with disregard of the actual value - * of offset - * - *.NOTICE: - * o at entry: look ahead buffer as passed with hcf_service_nic is still accessible and unchanged - * o at exit: Receive Frame in NIC memory is released - * - * Description: - * Starting at the byte indicated by the Offset value, the bytes are copied from the Data Info - * Part of the current Receive Frame Structure to the Host memory data buffer structure - * identified by descp. - * The maximum value for Offset is the number of characters of the 802.3 frame read into the - * look ahead buffer by hcf_service_nic (i.e. the look ahead buffer size minus - * Control and 802.11 fields) - * If Offset is less than the maximum value, copying starts from the look ahead buffer till the - * end of that buffer is reached - * Then (or if the maximum value is specified for Offset), the - * message is directly copied from NIC memory to Host memory. - * If an invalid (i.e. too large) offset is specified, an assert catches but the buffer contents are - * undefined. - * Copying stops if either: - * o the end of the 802.3 frame is reached - * o the Descriptor with a NULL pointer in the next_desc_addr field is reached - * - * When the copying stops, the receiver is ack'ed, thus freeing the NIC memory where the frame is stored - * As a consequence, hcf_rcv_msg can only be called once for any particular Rx frame. - * - * For the time being (PCI Bus mastering not yet supported), only the following fields of each - * of the descriptors in the descriptor list must be set by the MSF: - * o buf_cntl.buf_dim[1] - * o *next_desc_addr - * o *buf_addr - * At return from hcf_rcv_msg, the field buf_cntl.buf_dim[0] of the used Descriptors reflects - * the number of bytes in the buffer corresponding with the Descriptor. - * On the last used Descriptor, buf_cntl.buf_dim[0] is less or equal to buf_cntl.buf_dim[1]. - * On all preceding Descriptors buf_cntl.buf_dim[0] is equal to buf_cntl.buf_dim[1]. - * On all succeeding (unused) Descriptors, buf_cntl.buf_dim[0] is zero. - * Note: this I/F is based on the assumptions how the I/F needed for PCI Bus mastering will - * be, so it may change. - * - * The most likely handling of HCF_ERR_NO_NIC by the MSF is to drop the already copied - * data as elegantly as possible under the constraints and requirements posed by the (N)OS. - * If no received Frame Structure is pending, "Success" rather than "Read error" is returned. - * This error constitutes a logic flaw in the MSF - * The HCF can only catch a minority of this - * type of errors - * Based on consistency ideas, the HCF catches none of these errors. - * - * Assert fails if - * - ifbp has a recognizable out-of-range value - * - there is no unacknowledged Rx-message available - * - offset is out of range (outside look ahead buffer) - * - descp is a NULL pointer - * - any of the descriptors is not double word aligned - * - reentrancy, may be caused by calling hcf_functions without adequate protection - * against NIC interrupts or multi-threading. - * - Interrupts are enabled. - * - *.DIAGRAM - * - *.NOTICE - * - by using unsigned int as type for offset, no need to worry about negative offsets - * - Asserting on being enabled/present is superfluous, since a non-zero IFB_lal implies that hcf_service_nic - * was called and detected a Rx-message. A zero IFB_lal will set the BUF_CNT field of at least the first - * descriptor to zero. - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -int -hcf_rcv_msg( IFBP ifbp, DESC_STRCT *descp, unsigned int offset ) -{ - int rc = HCF_SUCCESS; - wci_bufp cp; //char oriented working pointer - hcf_16 i; - int tot_len = ifbp->IFB_RxLen - offset; //total length - wci_bufp lap = ifbp->IFB_lap + offset; //start address in LookAhead Buffer - hcf_16 lal = ifbp->IFB_lal - offset; //available data within LookAhead Buffer - hcf_16 j; - - HCFLOGENTRY( HCF_TRACE_RCV_MSG, offset ); - HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic ); - HCFASSERT_INT; - HCFASSERT( descp, HCF_TRACE_RCV_MSG ); - HCFASSERT( ifbp->IFB_RxLen, HCF_TRACE_RCV_MSG ); - HCFASSERT( ifbp->IFB_RxLen >= offset, MERGE_2( offset, ifbp->IFB_RxLen ) ); - HCFASSERT( ifbp->IFB_lal >= offset, offset ); - HCFASSERT( (ifbp->IFB_CntlOpt & USE_DMA) == 0, 0xDADA ); - - if ( tot_len < 0 ) { - lal = 0; tot_len = 0; //suppress all copying activity in the do--while loop - } - do { //loop over all available fragments - // obnoxious hcf.c(1480) : warning C4769: conversion of near pointer to long integer - HCFASSERT( ((hcf_32)descp & 3 ) == 0, (hcf_32)descp ); - cp = descp->buf_addr; - j = min( (hcf_16)tot_len, descp->BUF_SIZE ); //minimum of "what's` available" and fragment size - descp->BUF_CNT = j; - tot_len -= j; //adjust length still to go - if ( lal ) { //if lookahead Buffer not yet completely copied - i = min( lal, j ); //minimum of "what's available" in LookAhead and fragment size - lal -= i; //adjust length still available in LookAhead - j -= i; //adjust length still available in current fragment - /*;? while loop could be improved by moving words but that is complicated on platforms with - * alignment requirements*/ - while ( i-- ) *cp++ = *lap++; - } - if ( j ) { //if LookAhead Buffer exhausted but still space in fragment, copy directly from NIC RAM - get_frag( ifbp, cp, j BE_PAR(0) ); - CALC_RX_MIC( cp, j ); - } - } while ( ( descp = descp->next_desc_addr ) != NULL ); -#if (HCF_TYPE) & HCF_TYPE_WPA - if ( ifbp->IFB_RxFID ) { - rc = check_mic( ifbp ); //prevents MIC error report if hcf_service_nic already consumed all - } -#endif // HCF_TYPE_WPA - (void)hcf_action( ifbp, HCF_ACT_RX_ACK ); //only 1 shot to get the data, so free the resources in the NIC - HCFASSERT( rc == HCF_SUCCESS, rc ); - HCFLOGEXIT( HCF_TRACE_RCV_MSG ); - return rc; -} // hcf_rcv_msg - - -/************************************************************************************************************ - * - *.MODULE int hcf_send_msg( IFBP ifbp, DESC_STRCT *descp, hcf_16 tx_cntl ) - *.PURPOSE Encapsulate a message and append padding and MIC. - * non-USB: Transfers the resulting message from Host to NIC and initiates transmission. - * USB: Transfer resulting message into a flat buffer. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * descp pointer to the DescriptorList or NULL - * tx_cntl indicates MAC-port and (Hermes) options - * HFS_TX_CNTL_SPECTRALINK - * HFS_TX_CNTL_PRIO - * HFS_TX_CNTL_TX_OK - * HFS_TX_CNTL_TX_EX - * HFS_TX_CNTL_TX_DELAY - * HFS_TX_CNTL_TX_CONT - * HCF_PORT_0 MAC Port 0 (default) - * HCF_PORT_1 (AP only) MAC Port 1 - * HCF_PORT_2 (AP only) MAC Port 2 - * HCF_PORT_3 (AP only) MAC Port 3 - * HCF_PORT_4 (AP only) MAC Port 4 - * HCF_PORT_5 (AP only) MAC Port 5 - * HCF_PORT_6 (AP only) MAC Port 6 - * - *.RETURNS - * HCF_SUCCESS - * HCF_ERR_DEFUNCT_.. - * HCF_ERR_TIME_OUT - * - *.DESCRIPTION: - * The Send Message Function embodies 2 functions: - * o transfers a message (including MAC header) from the provided buffer structure in Host memory to the Transmit - * Frame Structure (TxFS) in NIC memory. - * o Issue a send command to the F/W to actually transmit the contents of the TxFS. - * - * Control is based on the Resource Indicator IFB_RscInd. - * The Resource Indicator is maintained by the HCF and should only be interpreted but not changed by the MSF. - * The MSF must check IFB_RscInd to be non-zero before executing the call to the Send Message Function. - * When no resources are available, the MSF must handle the queuing of the Transmit frame and check the - * Resource Indicator periodically after calling hcf_service_nic. - * - * The Send Message Functions transfers a message to NIC memory when it is called with a non-NULL descp. - * Before the Send Message Function is invoked this way, the Resource Indicator (IFB_RscInd) must be checked. - * If the Resource is not available, Send Message Function execution must be postponed until after processing of - * a next hcf_service_nic it appears that the Resource has become available. - * The message is copied from the buffer structure identified by descp to the NIC. - * Copying stops if a NULL pointer in the next_desc_addr field is reached. - * Hcf_send_msg does not check for transmit buffer overflow, because the F/W does this protection. - * In case of a transmit buffer overflow, the surplus which does not fit in the buffer is simply dropped. - * - * The Send Message Function activates the F/W to actually send the message to the medium when the - * HFS_TX_CNTL_TX_DELAY bit of the tx_cntl parameter is not set. - * If the descp parameter of the current call is non-NULL, the message as represented by descp is send. - * If the descp parameter of the current call is NULL, and if the preceding call of the Send Message Function had - * a non-NULL descp and the preceding call had the HFS_TX_CNTL_TX_DELAY bit of tx_cntl set, then the message as - * represented by the descp of the preceding call is send. - * - * Hcf_send_msg supports encapsulation (see HCF_ENCAP) of Ethernet-II frames. - * An Ethernet-II frame is transferred to the Transmit Frame structure as an 802.3 frame. - * Hcf_send_msg distinguishes between an 802.3 and an Ethernet-II frame by looking at the data length/type field - * of the frame. If this field contains a value larger than 1514, the frame is considered to be an Ethernet-II - * frame, otherwise it is treated as an 802.3 frame. - * To ease implementation of the HCF, this type/type field must be located in the first descriptor structure, - * i.e. the 1st fragment must have a size of at least 14 (to contain DestAddr, SrcAddr and Len/Type field). - * An Ethernet-II frame is encapsulated by inserting a SNAP header between the addressing information and the - * type field. This insertion is transparent for the MSF. - * The HCF contains a fixed table that stores a number of types. If the value specified by the type/type field - * occurs in this table, Bridge Tunnel Encapsulation is used, otherwise RFC1042 encapsulation is used. - * Bridge Tunnel uses AA AA 03 00 00 F8 as SNAP header, - * RFC1042 uses AA AA 03 00 00 00 as SNAP header. - * The table currently contains: - * 0 0x80F3 AppleTalk Address Resolution Protocol (AARP) - * 0 0x8137 IPX - * - * The algorithm to distinguish between 802.3 and Ethernet-II frames limits the maximum length for frames of - * 802.3 frames to 1514 bytes. - * Encapsulation can be suppressed by means of the system constant HCF_ENCAP, e.g. to support proprietary - * protocols with 802.3 like frames with a size larger than 1514 bytes. - * - * In case the HCF encapsulates the frame, the number of bytes that is actually transmitted is determined by the - * cumulative value of the buf_cntl.buf_dim[0] fields. - * In case the HCF does not encapsulate the frame, the number of bytes that is actually transmitted is not - * determined by the cumulative value of the buf_cntl.buf_dim[DESC_CNTL_CNT] fields of the desc_strct's but by - * the Length field of the 802.3 frame. - * If there is a conflict between the cumulative value of the buf_cntl.buf_dim[0] fields and the - * 802.3 Length field the 802.3 Length field determines the number of bytes actually transmitted by the NIC while - * the cumulative value of the buf_cntl.buf_dim[0] fields determines the position of the MIC, hence a mismatch - * will result in MIC errors on the Receiving side. - * Currently this problem is flagged on the Transmit side by an Assert. - * The following fields of each of the descriptors in the descriptor list must be set by the MSF: - * o buf_cntl.buf_dim[0] - * o *next_desc_addr - * o *buf_addr - * - * All bits of the tx_cntl parameter except HFS_TX_CNTL_TX_DELAY and the HCF_PORT# bits are passed to the F/W via - * the HFS_TX_CNTL field of the TxFS. - * - * Note that hcf_send_msg does not detect NIC absence. The MSF is supposed to have its own -platform dependent- - * way to recognize card removal/insertion. - * The total system must be robust against card removal and there is no principal difference between card removal - * just after hcf_send_msg returns but before the actual transmission took place or sometime earlier. - * - * Assert fails if - * - ifbp has a recognizable out-of-range value - * - descp is a NULL pointer - * - no resources for PIF available. - * - Interrupts are enabled. - * - reentrancy, may be caused by calling hcf_functions without adequate protection - * against NIC interrupts or multi-threading. - * - *.DIAGRAM - *4: for the normal case (i.e. no HFS_TX_CNTL_TX_DELAY option active), a fid is acquired via the - * routine get_fid. If no FID is acquired, the remainder is skipped without an error notification. After - * all, the MSF is not supposed to call hcf_send_msg when no Resource is available. - *7: The ControlField of the TxFS is written. Since put_frag can only return the fatal Defunct or "No NIC", the - * return status can be ignored because when it fails, cmd_wait will fail as well. (see also the note on the - * need for a return code below). - * Note that HFS_TX_CNTL has different values for H-I, H-I/WPA and H-II and HFS_ADDR_DEST has different - * values for H-I (regardless of WPA) and H-II. - * By writing 17, 1 or 2 ( implying 16, 0 or 1 garbage word after HFS_TX_CNTL) the BAP just gets to - * HFS_ADDR_DEST for H-I, H-I/WPA and H-II respectively. - *10: if neither encapsulation nor MIC calculation is needed, splitting the first fragment in two does not - * really help but it makes the flow easier to follow to do not optimize on this difference - * - * hcf_send_msg checks whether the frame is an Ethernet-II rather than an "official" 802.3 frame. - * The E-II check is based on the length/type field in the MAC header. If this field has a value larger than - * 1500, E-II is assumed. The implementation of this test fails if the length/type field is not in the first - * descriptor. If E-II is recognized, a SNAP header is inserted. This SNAP header represents either RFC1042 - * or Bridge-Tunnel encapsulation, depending on the return status of the support routine hcf_encap. - * - *.NOTICE - * hcf_send_msg leaves the responsibility to only send messages on enabled ports at the MSF level. - * This is considered the strategy which is sufficiently adequate for all "robust" MSFs, have the least - * processor utilization and being still acceptable robust at the WCI !!!!! - * - * hcf_send_msg does not NEED a return value to report NIC absence or removal during the execution of - * hcf_send_msg(), because the MSF and higher layers must be able to cope anyway with the NIC being removed - * after a successful completion of hcf_send_msg() but before the actual transmission took place. - * To accommodate user expectations the current implementation does report NIC absence. - * Defunct blocks all NIC access and will (also) be reported on a number of other calls. - * - * hcf_send_msg does not check for transmit buffer overflow because the Hermes does this protection. - * In case of a transmit buffer overflow, the surplus which does not fit in the buffer is simply dropped. - * Note that this possibly results in the transmission of incomplete frames. - * - * After some deliberation with F/W team, it is decided that - being in the twilight zone of not knowing - * whether the problem at hand is an MSF bug, HCF buf, F/W bug, H/W malfunction or even something else - there - * is no "best thing to do" in case of a failing send, hence the HCF considers the TxFID ownership to be taken - * over by the F/W and hopes for an Allocate event in due time - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -int -hcf_send_msg( IFBP ifbp, DESC_STRCT *descp, hcf_16 tx_cntl ) -{ - int rc = HCF_SUCCESS; - DESC_STRCT *p /* = descp*/; //working pointer - hcf_16 len; // total byte count - hcf_16 i; - - hcf_16 fid = 0; - - HCFASSERT( ifbp->IFB_RscInd || descp == NULL, ifbp->IFB_RscInd ); - HCFASSERT( (ifbp->IFB_CntlOpt & USE_DMA) == 0, 0xDADB ); - - HCFLOGENTRY( HCF_TRACE_SEND_MSG, tx_cntl ); - HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic ); - HCFASSERT_INT; - /* obnoxious c:/hcf/hcf.c(1480) : warning C4769: conversion of near pointer to long integer, - * so skip */ - HCFASSERT( ((hcf_32)descp & 3 ) == 0, (hcf_32)descp ); -#if HCF_ASSERT - { int x = ifbp->IFB_FWIdentity.comp_id == COMP_ID_FW_AP ? tx_cntl & ~HFS_TX_CNTL_PORT : tx_cntl; - HCFASSERT( (x & ~HCF_TX_CNTL_MASK ) == 0, tx_cntl ); - } -#endif // HCF_ASSERT - - if ( descp ) ifbp->IFB_TxFID = 0; //cancel a pre-put message - - /* the following initialization code is redundant for a pre-put message - * but moving it inside the "if fid" logic makes the merging with the - * USB flow awkward - */ -#if (HCF_TYPE) & HCF_TYPE_WPA - tx_cntl |= ifbp->IFB_MICTxCntl; -#endif // HCF_TYPE_WPA - fid = ifbp->IFB_TxFID; - if (fid == 0 && ( fid = get_fid( ifbp ) ) != 0 ) /* 4 */ - /* skip the next compound statement if: - - pre-put message or - - no fid available (which should never occur if the MSF adheres to the WCI) - */ - { // to match the closing curly bracket of above "if" in case of HCF_TYPE_USB - //calculate total length ;? superfluous unless CCX or Encapsulation - len = 0; - p = descp; - do len += p->BUF_CNT; while ( ( p = p->next_desc_addr ) != NULL ); - p = descp; -//;? HCFASSERT( len <= HCF_MAX_MSG, len ); - /*7*/ (void)setup_bap( ifbp, fid, HFS_TX_CNTL, IO_OUT ); -#if (HCF_TYPE) & HCF_TYPE_TX_DELAY - HCFASSERT( ( descp != NULL ) ^ ( tx_cntl & HFS_TX_CNTL_TX_DELAY ), tx_cntl ); - if ( tx_cntl & HFS_TX_CNTL_TX_DELAY ) { - tx_cntl &= ~HFS_TX_CNTL_TX_DELAY; //!!HFS_TX_CNTL_TX_DELAY no longer available - ifbp->IFB_TxFID = fid; - fid = 0; //!!fid no longer available, be careful when modifying code - } -#endif // HCF_TYPE_TX_DELAY - OPW( HREG_DATA_1, tx_cntl ) ; - OPW( HREG_DATA_1, 0 ); - - HCFASSERT( p->BUF_CNT >= 14, p->BUF_CNT ); - /* assume DestAddr/SrcAddr/Len/Type ALWAYS contained in 1st fragment - * otherwise life gets too cumbersome for MIC and Encapsulation !!!!!!!! - if ( p->BUF_CNT >= 14 ) { alternatively: add a safety escape !!!!!!!!!!!! } */ - - CALC_TX_MIC( NULL, -1 ); //initialize MIC - /*10*/ put_frag( ifbp, p->buf_addr, HCF_DASA_SIZE BE_PAR(0) ); //write DA, SA with MIC calculation - CALC_TX_MIC( p->buf_addr, HCF_DASA_SIZE ); //MIC over DA, SA - CALC_TX_MIC( null_addr, 4 ); //MIC over (virtual) priority field - - //if encapsulation needed -#if (HCF_ENCAP) == HCF_ENC - //write length (with SNAP-header,Type, without //DA,SA,Length ) no MIC calc. - if ( ( snap_header[sizeof(snap_header)-1] = hcf_encap( &p->buf_addr[HCF_DASA_SIZE] ) ) != ENC_NONE ) { - OPW( HREG_DATA_1, CNV_END_SHORT( len + (sizeof(snap_header) + 2) - ( 2*6 + 2 ) ) ); - //write splice with MIC calculation - put_frag( ifbp, snap_header, sizeof(snap_header) BE_PAR(0) ); - CALC_TX_MIC( snap_header, sizeof(snap_header) ); //MIC over 6 byte SNAP - i = HCF_DASA_SIZE; - } else -#endif // HCF_ENC - { - OPW( HREG_DATA_1, *(wci_recordp)&p->buf_addr[HCF_DASA_SIZE] ); - i = 14; - } - //complete 1st fragment starting with Type with MIC calculation - put_frag( ifbp, &p->buf_addr[i], p->BUF_CNT - i BE_PAR(0) ); - CALC_TX_MIC( &p->buf_addr[i], p->BUF_CNT - i ); - - //do the remaining fragments with MIC calculation - while ( ( p = p->next_desc_addr ) != NULL ) { - /* obnoxious c:/hcf/hcf.c(1480) : warning C4769: conversion of near pointer to long integer, - * so skip */ - HCFASSERT( ((hcf_32)p & 3 ) == 0, (hcf_32)p ); - put_frag( ifbp, p->buf_addr, p->BUF_CNT BE_PAR(0) ); - CALC_TX_MIC( p->buf_addr, p->BUF_CNT ); - } - //pad message, finalize MIC calculation and write MIC to NIC - put_frag_finalize( ifbp ); - } - if ( fid ) { - /*16*/ rc = cmd_exe( ifbp, HCMD_BUSY | HCMD_TX | HCMD_RECL, fid ); - ifbp->IFB_TxFID = 0; - /* probably this (i.e. no RscInd AND "HREG_EV_ALLOC") at this point in time occurs so infrequent, - * that it might just as well be acceptable to skip this - * "optimization" code and handle that additional interrupt once in a while - */ -// 180 degree error in logic ;? #if ALLOC_15 - /*20*/ if ( ifbp->IFB_RscInd == 0 ) { - ifbp->IFB_RscInd = get_fid( ifbp ); - } -// #endif // ALLOC_15 - } -// HCFASSERT( level::ifbp->IFB_RscInd, ifbp->IFB_RscInd ); - HCFLOGEXIT( HCF_TRACE_SEND_MSG ); - return rc; -} // hcf_send_msg - - -/************************************************************************************************************ - * - *.MODULE int hcf_service_nic( IFBP ifbp, wci_bufp bufp, unsigned int len ) - *.PURPOSE Services (most) NIC events. - * Provides received message - * Provides status information. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * In non-DMA mode: - * bufp address of char buffer, sufficiently large to hold the first part of the RxFS up through HFS_TYPE - * len length in bytes of buffer specified by bufp - * value between HFS_TYPE + 2 and HFS_ADDR_DEST + HCF_MAX_MSG - * - *.RETURNS - * HCF_SUCCESS - * HCF_ERR_MIC message contains an erroneous MIC (only if frame fits completely in bufp) - * - *.DESCRIPTION - * - * MSF-accessible fields of Result Block - * - IFB_RxLen 0 or Frame size. - * - IFB_MBInfoLen 0 or the L-field of the oldest MBIB. - * - IFB_RscInd - * - IFB_HCF_Tallies updated if a corresponding event occurred. - * - IFB_NIC_Tallies updated if a Tally Info frame received from the NIC. - * - IFB_DmaPackets - * - IFB_TxFsStat - * - IFB_TxFsSwSup - * - IFB_LinkStat reflects new link status or 0x0000 if no change relative to previous hcf_service_nic call. -or -* - IFB_LinkStat link status, 0x8000 reflects change relative to previous hcf_service_nic call. -* -* When IFB_MBInfoLen is non-zero, at least one MBIB is available. -* -* IFB_RxLen reflects the number of received bytes in 802.3 view (Including DestAddr, SrcAddr and Length, -* excluding MIC-padding, MIC and sum check) of active Rx Frame Structure. If no Rx Data s available, IFB_RxLen -* equals 0x0000. -* Repeated execution causes the Service NIC Function to provide information about subsequently received -* messages, irrespective whether a hcf_rcv_msg or hcf_action(HCF_ACT_RX) is performed in between. -* -* When IFB_RxLen is non-zero, a Received Frame Structure is available to be routed to the protocol stack. -* When Monitor Mode is not active, this is guaranteed to be an error-free non-WMP frame. -* In case of Monitor Mode, it may also be a frame with an error or a WMP frame. -* Erroneous frames have a non-zero error-sub field in the HFS_STAT field in the look ahead buffer. -* -* If a Receive message is available in NIC RAM, the Receive Frame Structure is (partly) copied from the NIC to -* the buffer identified by bufp. -* Copying stops either after len bytes or when the complete 802.3 frame is copied. -* During the copying the message is decapsulated (if appropriate). -* If the frame is read completely by hcf_service_nic (i.e. the frame fits completely in the lookahead buffer), -* the frame is automatically ACK'ed to the F/W and still available via the look ahead buffer and hcf_rcv_msg. -* Only if the frame is read completely by hcf_service_nic, hcf_service_nic checks the MIC and sets the return -* status accordingly. In this case, hcf_rcv_msg does not check the MIC. -* -* The MIC calculation algorithm works more efficient if the length of the look ahead buffer is -* such that it fits exactly 4 n bytes of the 802.3 frame, i.e. len == HFS_ADDR_DEST + 4*n. -* -* The Service NIC Function supports the NIC event service handling process. -* It performs the appropriate actions to service the NIC, such that the event cause is eliminated and related -* information is saved. -* The Service NIC Function is executed by the MSF ISR or polling routine as first step to determine the event -* cause(s). It is the responsibility of the MSF to perform all not directly NIC related interrupt service -* actions, e.g. in a PC environment this includes servicing the PIC, and managing the Processor Interrupt -* Enabling/Disabling. -* In case of a polled based system, the Service NIC Function must be executed "frequently". -* The Service NIC Function may have side effects related to the Mailbox and Resource Indicator (IFB_RscInd). -* -* hcf_service_nic returns: -* - The length of the data in the available MBIB (IFB_MBInfoLen) -* - Changes in the link status (IFB_LinkStat) -* - The length of the data in the available Receive Frame Structure (IFB_RxLen) -* - updated IFB_RscInd -* - Updated Tallies -* -* hcf_service_nic is presumed to neither interrupt other HCF-tasks nor to be interrupted by other HCF-tasks. -* A way to achieve this is to precede hcf_service_nic as well as all other HCF-tasks with a call to -* hcf_action to disable the card interrupts and, after all work is completed, with a call to hcf_action to -* restore (which is not necessarily the same as enabling) the card interrupts. -* In case of a polled environment, it is assumed that the MSF programmer is sufficiently familiar with the -* specific requirements of that environment to translate the interrupt strategy to a polled strategy. -* -* hcf_service_nic services the following Hermes events: -* - HREG_EV_INFO Asynchronous Information Frame -* - HREG_EV_INFO_DROP WMAC did not have sufficient RAM to build Unsolicited Information Frame -* - HREG_EV_TX_EXC (if applicable, i.e. selected via HCF_EXT_INT_TX_EX bit of HCF_EXT) -* - HREG_EV_SLEEP_REQ (if applicable, i.e. selected via HCF_DDS/HCF_CDS bit of HCF_SLEEP) -* ** in non_DMA mode -* - HREG_EV_ALLOC Asynchronous part of Allocation/Reclaim completed while out of resources at -* completion of hcf_send_msg/notify -* - HREG_EV_RX the detection of the availability of received messages -* including WaveLAN Management Protocol (WMP) message processing -* ** in DMA mode -* - HREG_EV_RDMAD -* - HREG_EV_TDMAD -*!! hcf_service_nic does not service the following Hermes events: -*!! HREG_EV_TX (the "OK" Tx Event) is no longer supported by the WCI, if it occurs it is unclear -*!! what the cause is, so no meaningful strategy is available. Not acking the bit is -*!! probably the best help that can be given to the debugger. -*!! HREG_EV_CMD handled in cmd_wait. -*!! HREG_EV_FW_DMA (i.e. HREG_EV_RXDMA, HREG_EV_TXDMA and_EV_LPESC) are either not used or used -*!! between the F/W and the DMA engine. -*!! HREG_EV_ACK_REG_READY is only applicable for H-II (i.e. not HII.5 and up, see DAWA) -* -* If, in non-DMA mode, a Rx message is available, its length is reflected by the IFB_RxLen field of the IFB. -* This length reflects the data itself and the Destination Address, Source Address and DataLength/Type field -* but not the SNAP-header in case of decapsulation by the HCF. If no message is available, IFB_RxLen is -* zero. Former versions of the HCF handled WMP messages and supported a "monitor" mode in hcf_service_nic, -* which deposited certain or all Rx messages in the MailBox. The responsibility to handle these frames is -* moved to the MSF. The HCF offers as supports hcf_put_info with CFG_MB_INFO as parameter to emulate the old -* implementation under control of the MSF. -* -* **Rx Buffer free strategy -* When hcf_service_nic reports the availability of a non-DMA message, the MSF can access that message by -* means of hcf_rcv_msg. It must be prevented that the LAN Controller writes new data in the NIC buffer -* before the MSF is finished with the current message. The NIC buffer is returned to the LAN Controller -* when: -* - the complete frame fits in the lookahead buffer or -* - hcf_rcv_msg is called or -* - hcf_action with HCF_ACT_RX is called or -* - hcf_service_nic is called again -* It can be reasoned that hcf_action( INT_ON ) should not be given before the MSF has completely processed -* a reported Rx-frame. The reason is that the INT_ON action is guaranteed to cause a (Rx-)interrupt (the -* MSF is processing a Rx-frame, hence the Rx-event bit in the Hermes register must be active). This -* interrupt will cause hcf_service_nic to be called, which will cause the ack-ing of the "last" Rx-event -* to the Hermes, causing the Hermes to discard the associated NIC RAM buffer. -* Assert fails if -* - ifbp is zero or other recognizable out-of-range value. -* - hcf_service_nic is called without a prior call to hcf_connect. -* - interrupts are enabled. -* - reentrancy, may be caused by calling hcf_functions without adequate protection -* against NIC interrupts or multi-threading. -* -* -*.DIAGRAM -*1: IFB_LinkStat is cleared, if a LinkStatus frame is received, IFB_LinkStat will be updated accordingly -* by isr_info. -or -*1: IFB_LinkStat change indication is cleared. If a LinkStatus frame is received, IFB_LinkStat will be updated -* accordingly by isr_info. -*2: IFB_RxLen must be cleared before the NIC presence check otherwise: -* - this value may stay non-zero if the NIC is pulled out at an inconvenient moment. -* - the RxAck on a zero-FID needs a zero-value for IFB_RxLen to work -* Note that as side-effect of the hcf_action call, the remainder of Rx related info is re-initialized as -* well. -*4: In case of Defunct mode, the information supplied by Hermes is unreliable, so the body of -* hcf_service_nic is skipped. Since hcf_cntl turns into a NOP if Primary or Station F/W is incompatible, -* hcf_service_nic is also skipped in those cases. -* To prevent that hcf_service_nic reports bogus information to the MSF with all - possibly difficult to -* debug - undesirable side effects, it is paramount to check the NIC presence. In former days the presence -* test was based on the Hermes register HREG_SW_0. Since in HCF_ACT_INT_OFF is chosen for strategy based on -* HREG_EV_STAT, this is now also used in hcf_service_nic. The motivation to change strategy is partly -* due to inconsistent F/W implementations with respect to HREG_SW_0 manipulation around reset and download. -* Note that in polled environments Card Removal is not detected by INT_OFF which makes the check in -* hcf_service_nic even more important. -*8: The event status register of the Hermes is sampled -* The assert checks for unexpected events ;?????????????????????????????????????. -* - HREG_EV_INFO_DROP is explicitly excluded from the acceptable HREG_EV_STAT bits because it indicates -* a too heavily loaded system. -* - HREG_EV_ACK_REG_READY is 0x0000 for H-I (and hopefully H-II.5) -* -* -* HREG_EV_TX_EXC is accepted (via HREG_EV_TX_EXT) if and only if HCF_EXT_INT_TX_EX set in the HCF_EXT -* definition at compile time. -* The following activities are handled: -* - Alloc events are handled by hcf_send_msg (and notify). Only if there is no "spare" resource, the -* alloc event is superficially serviced by hcf_service_nic to create a pseudo-resource with value -* 0x001. This value is recognized by get_fid (called by hcf_send_msg and notify) where the real -* TxFid is retrieved and the Hermes is acked and - hopefully - the "normal" case with a spare TxFid -* in IFB_RscInd is restored. -* - Info drop events are handled by incrementing a tally -* - LinkEvent (including solicited and unsolicited tallies) are handled by procedure isr_info. -* - TxEx (if selected at compile time) is handled by copying the significant part of the TxFS -* into the IFB for further processing by the MSF. -* Note the complication of the zero-FID protection sub-scheme in DAWA. -* Note, the Ack of all of above events is handled at the end of hcf_service_nic -*16: In case of non-DMA ( either not compiled in or due to a run-time choice): -* If an Rx-frame is available, first the FID of that frame is read, including the complication of the -* zero-FID protection sub-scheme in DAWA. Note that such a zero-FID is acknowledged at the end of -* hcf_service_nic and that this depends on the IFB_RxLen initialization in the begin of hcf_service_nic. -* The Assert validates the HCF assumption about Hermes implementation upon which the range of -* Pseudo-RIDs is based. -* Then the control fields up to the start of the 802.3 frame are read from the NIC into the lookahead buffer. -* The status field is converted to native Endianness. -* The length is, after implicit Endianness conversion if needed, and adjustment for the 14 bytes of the -* 802.3 MAC header, stored in IFB_RxLen. -* In MAC Monitor mode, 802.11 control frames with a TOTAL length of 14 are received, so without this -* length adjustment, IFB_RxLen could not be used to distinguish these frames from "no frame". -* No MIC calculation processes are associated with the reading of these Control fields. -*26: This length test feels like superfluous robustness against malformed frames, but it turned out to be -* needed in the real (hostile) world. -* The decapsulation check needs sufficient data to represent DA, SA, L, SNAP and Type which amounts to -* 22 bytes. In MAC Monitor mode, 802.11 control frames with a smaller length are received. To prevent -* that the implementation goes haywire, a check on the length is needed. -* The actual decapsulation takes place on the fly in the copying process by overwriting the SNAP header. -* Note that in case of decapsulation the SNAP header is not passed to the MSF, hence IFB_RxLen must be -* compensated for the SNAP header length. -* The 22 bytes needed for decapsulation are (more than) sufficient for the exceptional handling of the -* MIC algorithm of the L-field (replacing the 2 byte L-field with 4 0x00 bytes). -*30: The 12 in the no-WPA branch corresponds with the get_frag, the 2 with the IPW of the WPA branch -*32: If Hermes reported MIC-presence, than the MIC engine is initialized with the non-dummy MIC calculation -* routine address and appropriate key. -*34: The 8 bytes after the DA, SA, L are read and it is checked whether decapsulation is needed i.e.: -* - the Hermes reported Tunnel encapsulation or -* - the Hermes reported 1042 Encapsulation and hcf_encap reports that the HCF would not have used -* 1042 as the encapsulation mechanism -* Note that the first field of the RxFS in bufp has Native Endianness due to the conversion done by the -* BE_PAR in get_frag. -*36: The Type field is the only word kept (after moving) of the just read 8 bytes, it is moved to the -* L-field. The original L-field and 6 byte SNAP header are discarded, so IFB_RxLen and buf_addr must -* be adjusted by 8. -*40: Determine how much of the frame (starting with DA) fits in the Lookahead buffer, then read the not-yet -* read data into the lookahead buffer. -* If the lookahead buffer contains the complete message, check the MIC. The majority considered this -* I/F more appropriate then have the MSF call hcf_get_data only to check the MIC. -*44: Since the complete message is copied from NIC RAM to PC RAM, the Rx can be acknowledged to the Hermes -* to optimize the flow ( a better chance to get new Rx data in the next pass through hcf_service_nic ). -* This acknowledgement can not be done via hcf_action( HCF_ACT_RX_ACK ) because this also clears -* IFB_RxLEN thus corrupting the I/F to the MSF. -*;?: In case of DMA (compiled in and activated): - - -*54: Limiting the number of places where the F/W is acked (e.g. the merging of the Rx-ACK with the other -* ACKs), is supposed to diminish the potential of race conditions in the F/W. -* Note 1: The CMD event is acknowledged in cmd_cmpl -* Note 2: HREG_EV_ACK_REG_READY is 0x0000 for H-I (and hopefully H-II.5) -* Note 3: The ALLOC event is acknowledged in get_fid (except for the initialization flow) -* -*.NOTICE -* The Non-DMA HREG_EV_RX is handled different compared with the other F/W events. -* The HREG_EV_RX event is acknowledged by the first hcf_service_nic call after the -* hcf_service_nic call that reported the occurrence of this event. -* This acknowledgment -* makes the next Receive Frame Structure (if any) available. -* An updated IFB_RxLen -* field reflects this availability. -* -*.NOTICE -* The minimum size for Len must supply space for: -* - an F/W dependent number of bytes of Control Info field including the 802.11 Header field -* - Destination Address -* - Source Address -* - Length field -* - [ SNAP Header] -* - [ Ethernet-II Type] -* This results in 68 for Hermes-I and 80 for Hermes-II -* This way the minimum amount of information is available needed by the HCF to determine whether the frame -* must be decapsulated. -*.ENDDOC END DOCUMENTATION -* -************************************************************************************************************/ -int -hcf_service_nic( IFBP ifbp, wci_bufp bufp, unsigned int len ) -{ - - int rc = HCF_SUCCESS; - hcf_16 stat; - wci_bufp buf_addr; - hcf_16 i; - - HCFLOGENTRY( HCF_TRACE_SERVICE_NIC, ifbp->IFB_IntOffCnt ); - HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic ); - HCFASSERT_INT; - - ifbp->IFB_LinkStat = 0; // ;? to be obsoleted ASAP /* 1*/ - ifbp->IFB_DSLinkStat &= ~CFG_LINK_STAT_CHANGE; /* 1*/ - (void)hcf_action( ifbp, HCF_ACT_RX_ACK ); /* 2*/ - if ( ifbp->IFB_CardStat == 0 && ( stat = IPW( HREG_EV_STAT ) ) != 0xFFFF ) { /* 4*/ -/* IF_NOT_DMA( HCFASSERT( !( stat & ~HREG_EV_BASIC_MASK, stat ) ) - * IF_NOT_USE_DMA( HCFASSERT( !( stat & ~HREG_EV_BASIC_MASK, stat ) ) - * IF_USE_DMA( HCFASSERT( !( stat & ~( HREG_EV_BASIC_MASK ^ ( HREG_EV_...DMA.... ), stat ) ) - */ - /* 8*/ - if ( ifbp->IFB_RscInd == 0 && stat & HREG_EV_ALLOC ) { //Note: IFB_RscInd is ALWAYS 1 for DMA - ifbp->IFB_RscInd = 1; - } - IF_TALLY( if ( stat & HREG_EV_INFO_DROP ) { ifbp->IFB_HCF_Tallies.NoBufInfo++; } ); -#if (HCF_EXT) & HCF_EXT_INT_TICK - if ( stat & HREG_EV_TICK ) { - ifbp->IFB_TickCnt++; - } -#if 0 // (HCF_SLEEP) & HCF_DDS - if ( ifbp->IFB_TickCnt == 3 && ( ifbp->IFB_DSLinkStat & CFG_LINK_STAT_CONNECTED ) == 0 ) { - CFG_DDS_TICK_TIME_STRCT ltv; - // 2 second period (with 1 tick uncertanty) in not-connected mode -->go into DS_OOR - hcf_action( ifbp, HCF_ACT_SLEEP ); - ifbp->IFB_DSLinkStat |= CFG_LINK_STAT_DS_OOR; //set OutOfRange - ltv.len = 2; - ltv.typ = CFG_DDS_TICK_TIME; - ltv.tick_time = ( ( ifbp->IFB_DSLinkStat & CFG_LINK_STAT_TIMER ) + 0x10 ) *64; //78 is more right - hcf_put_info( ifbp, (LTVP)<v ); - printk(KERN_NOTICE "Preparing for sleep, link_status: %04X, timer : %d\n", - ifbp->IFB_DSLinkStat, ltv.tick_time );//;?remove me 1 day - ifbp->IFB_TickCnt++; //;?just to make sure we do not keep on printing above message - if ( ltv.tick_time < 300 * 125 ) ifbp->IFB_DSLinkStat += 0x0010; - - } -#endif // HCF_DDS -#endif // HCF_EXT_INT_TICK - if ( stat & HREG_EV_INFO ) { - isr_info( ifbp ); - } -#if (HCF_EXT) & HCF_EXT_INT_TX_EX - if ( stat & HREG_EV_TX_EXT && ( i = IPW( HREG_TX_COMPL_FID ) ) != 0 /*DAWA*/ ) { - DAWA_ZERO_FID( HREG_TX_COMPL_FID ); - (void)setup_bap( ifbp, i, 0, IO_IN ); - get_frag( ifbp, &ifbp->IFB_TxFsStat, HFS_SWSUP BE_PAR(1) ); - } -#endif // HCF_EXT_INT_TX_EX -//!rlav DMA engine will handle the rx event, not the driver -#if HCF_DMA - if ( !( ifbp->IFB_CntlOpt & USE_DMA ) ) //!! be aware of the logical indentations -#endif // HCF_DMA - /*16*/ if ( stat & HREG_EV_RX && ( ifbp->IFB_RxFID = IPW( HREG_RX_FID ) ) != 0 ) { //if 0 then DAWA_ACK - HCFASSERT( bufp, len ); - HCFASSERT( len >= HFS_DAT + 2, len ); - DAWA_ZERO_FID( HREG_RX_FID ); - HCFASSERT( ifbp->IFB_RxFID < CFG_PROD_DATA, ifbp->IFB_RxFID); - (void)setup_bap( ifbp, ifbp->IFB_RxFID, 0, IO_IN ); - get_frag( ifbp, bufp, HFS_ADDR_DEST BE_PAR(1) ); - ifbp->IFB_lap = buf_addr = bufp + HFS_ADDR_DEST; - ifbp->IFB_RxLen = (hcf_16)(bufp[HFS_DAT_LEN] + (bufp[HFS_DAT_LEN+1]<<8) + 2*6 + 2); - /*26*/ if ( ifbp->IFB_RxLen >= 22 ) { // convenient for MIC calculation (5 DWs + 1 "skipped" W) - //. get DA,SA,Len/Type and (SNAP,Type or 8 data bytes) - /*30*/ get_frag( ifbp, buf_addr, 22 BE_PAR(0) ); - /*32*/ CALC_RX_MIC( bufp, -1 ); //. initialize MIC - CALC_RX_MIC( buf_addr, HCF_DASA_SIZE ); //. MIC over DA, SA - CALC_RX_MIC( null_addr, 4 ); //. MIC over (virtual) priority field - CALC_RX_MIC( buf_addr+14, 8 ); //. skip Len, MIC over SNAP,Type or 8 data bytes) - buf_addr += 22; -#if (HCF_ENCAP) == HCF_ENC - HCFASSERT( len >= HFS_DAT + 2 + sizeof(snap_header), len ); - /*34*/ i = *(wci_recordp)&bufp[HFS_STAT] & ( HFS_STAT_MSG_TYPE | HFS_STAT_ERR ); - if ( i == HFS_STAT_TUNNEL || - ( i == HFS_STAT_1042 && hcf_encap( (wci_bufp)&bufp[HFS_TYPE] ) != ENC_TUNNEL ) ) { - //. copy E-II Type to 802.3 LEN field - /*36*/ bufp[HFS_LEN ] = bufp[HFS_TYPE ]; - bufp[HFS_LEN+1] = bufp[HFS_TYPE+1]; - //. discard Snap by overwriting with data - ifbp->IFB_RxLen -= (HFS_TYPE - HFS_LEN); - buf_addr -= ( HFS_TYPE - HFS_LEN ); // this happens to bring us at a DW boundary of 36 - } -#endif // HCF_ENC - } - /*40*/ ifbp->IFB_lal = min( (hcf_16)(len - HFS_ADDR_DEST), ifbp->IFB_RxLen ); - i = ifbp->IFB_lal - ( buf_addr - ( bufp + HFS_ADDR_DEST ) ); - get_frag( ifbp, buf_addr, i BE_PAR(0) ); - CALC_RX_MIC( buf_addr, i ); -#if (HCF_TYPE) & HCF_TYPE_WPA - if ( ifbp->IFB_lal == ifbp->IFB_RxLen ) { - rc = check_mic( ifbp ); - } -#endif // HCF_TYPE_WPA - /*44*/ if ( len - HFS_ADDR_DEST >= ifbp->IFB_RxLen ) { - ifbp->IFB_RxFID = 0; - } else { /* IFB_RxFID is cleared, so you do not get another Rx_Ack at next entry of hcf_service_nic */ - stat &= (hcf_16)~HREG_EV_RX; //don't ack Rx if processing not yet completed - } - } - // in case of DMA: signal availability of rx and/or tx packets to MSF - IF_USE_DMA( ifbp->IFB_DmaPackets |= stat & ( HREG_EV_RDMAD | HREG_EV_TDMAD ) ); - // rlav : pending HREG_EV_RDMAD or HREG_EV_TDMAD events get acknowledged here. - /*54*/ stat &= (hcf_16)~( HREG_EV_SLEEP_REQ | HREG_EV_CMD | HREG_EV_ACK_REG_READY | HREG_EV_ALLOC | HREG_EV_FW_DMA ); -//a positive mask would be easier to understand /*54*/ stat &= (hcf_16)~( HREG_EV_SLEEP_REQ | HREG_EV_CMD | HREG_EV_ACK_REG_READY | HREG_EV_ALLOC | HREG_EV_FW_DMA ); - IF_USE_DMA( stat &= (hcf_16)~HREG_EV_RX ); - if ( stat ) { - DAWA_ACK( stat ); /*DAWA*/ - } - } - HCFLOGEXIT( HCF_TRACE_SERVICE_NIC ); - return rc; -} // hcf_service_nic - - -/************************************************************************************************************ - ************************** H C F S U P P O R T R O U T I N E S ****************************************** - ************************************************************************************************************/ - - -/************************************************************************************************************ - * - *.SUBMODULE void calc_mic( hcf_32* p, hcf_32 m ) - *.PURPOSE calculate MIC on a quad byte. - * - *.ARGUMENTS - * p address of the MIC - * m 32 bit value to be processed by the MIC calculation engine - * - *.RETURNS N.A. - * - *.DESCRIPTION - * calc_mic is the implementation of the MIC algorithm. It is a monkey-see monkey-do copy of - * Michael::appendByte() - * of Appendix C of .......... - * - * - *.DIAGRAM - * - *.NOTICE - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ - -#if (HCF_TYPE) & HCF_TYPE_WPA - -#define ROL32( A, n ) ( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) ) -#define ROR32( A, n ) ROL32( (A), 32-(n) ) - -#define L *p -#define R *(p+1) - -static void -calc_mic( hcf_32* p, hcf_32 m ) -{ -#if HCF_BIG_ENDIAN - m = (m >> 16) | (m << 16); -#endif // HCF_BIG_ENDIAN - L ^= m; - R ^= ROL32( L, 17 ); - L += R; - R ^= ((L & 0xff00ff00) >> 8) | ((L & 0x00ff00ff) << 8); - L += R; - R ^= ROL32( L, 3 ); - L += R; - R ^= ROR32( L, 2 ); - L += R; -} // calc_mic -#undef R -#undef L -#endif // HCF_TYPE_WPA - - - -#if (HCF_TYPE) & HCF_TYPE_WPA -/************************************************************************************************************ - * - *.SUBMODULE void calc_mic_rx_frag( IFBP ifbp, wci_bufp p, int len ) - *.PURPOSE calculate MIC on a single fragment. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * bufp (byte) address of buffer - * len length in bytes of buffer specified by bufp - * - *.RETURNS N.A. - * - *.DESCRIPTION - * calc_mic_rx_frag ........ - * - * The MIC is located in the IFB. - * The MIC is separate for Tx and Rx, thus allowing hcf_send_msg to occur between hcf_service_nic and - * hcf_rcv_msg. - * - * - *.DIAGRAM - * - *.NOTICE - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -void -calc_mic_rx_frag( IFBP ifbp, wci_bufp p, int len ) -{ - static union { hcf_32 x32; hcf_16 x16[2]; hcf_8 x8[4]; } x; //* area to accumulate 4 bytes input for MIC engine - int i; - - if ( len == -1 ) { //initialize MIC housekeeping - i = *(wci_recordp)&p[HFS_STAT]; - /* i = CNV_SHORTP_TO_LITTLE(&p[HFS_STAT]); should not be neede to prevent alignment poroblems - * since len == -1 if and only if p is lookahaead buffer which MUST be word aligned - * to be re-investigated by NvR - */ - - if ( ( i & HFS_STAT_MIC ) == 0 ) { - ifbp->IFB_MICRxCarry = 0xFFFF; //suppress MIC calculation - } else { - ifbp->IFB_MICRxCarry = 0; -//* Note that "coincidentally" the bit positions used in HFS_STAT -//* correspond with the offset of the key in IFB_MICKey - i = ( i & HFS_STAT_MIC_KEY_ID ) >> 10; /* coincidentally no shift needed for i itself */ - ifbp->IFB_MICRx[0] = CNV_LONG_TO_LITTLE(ifbp->IFB_MICRxKey[i ]); - ifbp->IFB_MICRx[1] = CNV_LONG_TO_LITTLE(ifbp->IFB_MICRxKey[i+1]); - } - } else { - if ( ifbp->IFB_MICRxCarry == 0 ) { - x.x32 = CNV_LONGP_TO_LITTLE(p); - p += 4; - if ( len < 4 ) { - ifbp->IFB_MICRxCarry = (hcf_16)len; - } else { - ifbp->IFB_MICRxCarry = 4; - len -= 4; - } - } else while ( ifbp->IFB_MICRxCarry < 4 && len ) { //note for hcf_16 applies: 0xFFFF > 4 - x.x8[ifbp->IFB_MICRxCarry++] = *p++; - len--; - } - while ( ifbp->IFB_MICRxCarry == 4 ) { //contrived so we have only 1 call to calc_mic so we could bring it in-line - calc_mic( ifbp->IFB_MICRx, x.x32 ); - x.x32 = CNV_LONGP_TO_LITTLE(p); - p += 4; - if ( len < 4 ) { - ifbp->IFB_MICRxCarry = (hcf_16)len; - } - len -= 4; - } - } -} // calc_mic_rx_frag -#endif // HCF_TYPE_WPA - - -#if (HCF_TYPE) & HCF_TYPE_WPA -/************************************************************************************************************ - * - *.SUBMODULE void calc_mic_tx_frag( IFBP ifbp, wci_bufp p, int len ) - *.PURPOSE calculate MIC on a single fragment. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * bufp (byte) address of buffer - * len length in bytes of buffer specified by bufp - * - *.RETURNS N.A. - * - *.DESCRIPTION - * calc_mic_tx_frag ........ - * - * The MIC is located in the IFB. - * The MIC is separate for Tx and Rx, thus allowing hcf_send_msg to occur between hcf_service_nic and - * hcf_rcv_msg. - * - * - *.DIAGRAM - * - *.NOTICE - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -void -calc_mic_tx_frag( IFBP ifbp, wci_bufp p, int len ) -{ - static union { hcf_32 x32; hcf_16 x16[2]; hcf_8 x8[4]; } x; //* area to accumulate 4 bytes input for MIC engine - - //if initialization request - if ( len == -1 ) { - //. presume MIC calculation disabled - ifbp->IFB_MICTxCarry = 0xFFFF; - //. if MIC calculation enabled - if ( ifbp->IFB_MICTxCntl ) { - //. . clear MIC carry - ifbp->IFB_MICTxCarry = 0; - //. . initialize MIC-engine - ifbp->IFB_MICTx[0] = CNV_LONG_TO_LITTLE(ifbp->IFB_MICTxKey[0]); /*Tx always uses Key 0 */ - ifbp->IFB_MICTx[1] = CNV_LONG_TO_LITTLE(ifbp->IFB_MICTxKey[1]); - } - //else - } else { - //. if MIC enabled (Tx) / if MIC present (Rx) - //. and no carry from previous calc_mic_frag - if ( ifbp->IFB_MICTxCarry == 0 ) { - //. . preset accu with 4 bytes from buffer - x.x32 = CNV_LONGP_TO_LITTLE(p); - //. . adjust pointer accordingly - p += 4; - //. . if buffer contained less then 4 bytes - if ( len < 4 ) { - //. . . promote valid bytes in accu to carry - //. . . flag accu to contain incomplete double word - ifbp->IFB_MICTxCarry = (hcf_16)len; - //. . else - } else { - //. . . flag accu to contain complete double word - ifbp->IFB_MICTxCarry = 4; - //. . adjust remaining buffer length - len -= 4; - } - //. else if MIC enabled - //. and if carry bytes from previous calc_mic_tx_frag - //. . move (1-3) bytes from carry into accu - } else while ( ifbp->IFB_MICTxCarry < 4 && len ) { /* note for hcf_16 applies: 0xFFFF > 4 */ - x.x8[ifbp->IFB_MICTxCarry++] = *p++; - len--; - } - //. while accu contains complete double word - //. and MIC enabled - while ( ifbp->IFB_MICTxCarry == 4 ) { - //. . pass accu to MIC engine - calc_mic( ifbp->IFB_MICTx, x.x32 ); - //. . copy next 4 bytes from buffer to accu - x.x32 = CNV_LONGP_TO_LITTLE(p); - //. . adjust buffer pointer - p += 4; - //. . if buffer contained less then 4 bytes - //. . . promote valid bytes in accu to carry - //. . . flag accu to contain incomplete double word - if ( len < 4 ) { - ifbp->IFB_MICTxCarry = (hcf_16)len; - } - //. . adjust remaining buffer length - len -= 4; - } - } -} // calc_mic_tx_frag -#endif // HCF_TYPE_WPA - - -#if HCF_PROT_TIME -/************************************************************************************************************ - * - *.SUBMODULE void calibrate( IFBP ifbp ) - *.PURPOSE calibrates the S/W protection counter against the Hermes Timer tick. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * - *.RETURNS N.A. - * - *.DESCRIPTION - * calibrates the S/W protection counter against the Hermes Timer tick - * IFB_TickIni is the value used to initialize the S/W protection counter such that the expiration period - * more or less independent of the processor speed. If IFB_TickIni is not yet calibrated, it is done now. - * This calibration is "reasonably" accurate because the Hermes is in a quiet state as a result of the - * Initialize command. - * - * - *.DIAGRAM - * - *1: IFB_TickIni is initialized at INI_TICK_INI by hcf_connect. If calibrate succeeds, IFB_TickIni is - * guaranteed to be changed. As a consequence there will be only 1 shot at calibration (regardless of the - * number of init calls) under normal circumstances. - *2: Calibration is done HCF_PROT_TIME_CNT times. This diminish the effects of jitter and interference, - * especially in a pre-emptive environment. HCF_PROT_TIME_CNT is in the range of 16 through 32 and derived - * from the HCF_PROT_TIME specified by the MSF programmer. The divisor needed to scale HCF_PROT_TIME into the - * 16-32 range, is used as a multiplicator after the calibration, to scale the found value back to the - * requested range. This way a compromise is achieved between accuracy and duration of the calibration - * process. - *3: Acknowledge the Timer Tick Event. - * Each cycle is limited to at most INI_TICK_INI samples of the TimerTick status of the Hermes. - * Since the start of calibrate is unrelated to the Hermes Internal Timer, the first interval may last from 0 - * to the normal interval, all subsequent intervals should be the full length of the Hermes Tick interval. - * The Hermes Timer Tick is not reprogrammed by the HCF, hence it is running at the default of 10 k - * microseconds. - *4: If the Timer Tick Event is continuously up (prot_cnt still has the value INI_TICK_INI) or no Timer Tick - * Event occurred before the protection counter expired, reset IFB_TickIni to INI_TICK_INI, - * set the defunct bit of IFB_CardStat (thus rendering the Hermes inoperable) and exit the calibrate routine. - *8: ifbp->IFB_TickIni is multiplied to scale the found value back to the requested range as explained under 2. - * - *.NOTICE - * o Although there are a number of viewpoints possible, calibrate() uses as error strategy that a single - * failure of the Hermes TimerTick is considered fatal. - * o There is no hard and concrete time-out value defined for Hermes activities. The default 1 seconds is - * believed to be sufficiently "relaxed" for real life and to be sufficiently short to be still useful in an - * environment with humans. - * o Note that via IFB_DefunctStat time outs in cmd_wait and in hcfio_string block all Hermes access till the - * next init so functions which call a mix of cmd_wait and hcfio_string only need to check the return status - * of the last call - * o The return code is preset at Time out. - * The additional complication that no calibrated value for the protection count can be assumed since - * calibrate() does not yet have determined a calibrated value (a catch 22), is handled by setting the - * initial value at INI_TICK_INI (by hcf_connect). This approach is considered safe, because: - * - the HCF does not use the pipeline mechanism of Hermes commands. - * - the likelihood of failure (the only time when protection count is relevant) is small. - * - the time will be sufficiently large on a fast machine (busy bit drops on good NIC before counter - * expires) - * - the time will be sufficiently small on a slow machine (counter expires on bad NIC before the end user - * switches the power off in despair - * The time needed to wrap a 32 bit counter around is longer than many humans want to wait, hence the more or - * less arbitrary value of 0x40000L is chosen, assuming it does not take too long on an XT and is not too - * short on a scream-machine. - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -HCF_STATIC void -calibrate( IFBP ifbp ) -{ - int cnt = HCF_PROT_TIME_CNT; - hcf_32 prot_cnt; - - HCFTRACE( ifbp, HCF_TRACE_CALIBRATE ); - if ( ifbp->IFB_TickIni == INI_TICK_INI ) { /*1*/ - ifbp->IFB_TickIni = 0; /*2*/ - while ( cnt-- ) { - prot_cnt = INI_TICK_INI; - OPW( HREG_EV_ACK, HREG_EV_TICK ); /*3*/ - while ( (IPW( HREG_EV_STAT ) & HREG_EV_TICK) == 0 && --prot_cnt ) { - ifbp->IFB_TickIni++; - } - if ( prot_cnt == 0 || prot_cnt == INI_TICK_INI ) { /*4*/ - ifbp->IFB_TickIni = INI_TICK_INI; - ifbp->IFB_DefunctStat = HCF_ERR_DEFUNCT_TIMER; - ifbp->IFB_CardStat |= CARD_STAT_DEFUNCT; - HCFASSERT( DO_ASSERT, prot_cnt ); - } - } - ifbp->IFB_TickIni <<= HCF_PROT_TIME_SHFT; /*8*/ - } - HCFTRACE( ifbp, HCF_TRACE_CALIBRATE | HCF_TRACE_EXIT ); -} // calibrate -#endif // HCF_PROT_TIME - - -#if (HCF_TYPE) & HCF_TYPE_WPA -/************************************************************************************************************ - * - *.SUBMODULE int check_mic( IFBP ifbp ) - *.PURPOSE verifies the MIC of a received non-USB frame. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * - *.RETURNS - * HCF_SUCCESS - * HCF_ERR_MIC - * - *.DESCRIPTION - * - * - *.DIAGRAM - * - *4: test whether or not a MIC is reported by the Hermes - *14: the calculated MIC and the received MIC are compared, the return status is set when there is a mismatch - * - *.NOTICE - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -static int -check_mic( IFBP ifbp ) -{ - int rc = HCF_SUCCESS; - hcf_32 x32[2]; //* area to save rcvd 8 bytes MIC - - //if MIC present in RxFS - if ( *(wci_recordp)&ifbp->IFB_lap[-HFS_ADDR_DEST] & HFS_STAT_MIC ) { - //or if ( ifbp->IFB_MICRxCarry != 0xFFFF ) - CALC_RX_MIC( mic_pad, 8 ); //. process up to 3 remaining bytes of data and append 5 to 8 bytes of padding to MIC calculation - get_frag( ifbp, (wci_bufp)x32, 8 BE_PAR(0));//. get 8 byte MIC from NIC - //. if calculated and received MIC do not match - //. . set status at HCF_ERR_MIC - /*14*/ if ( x32[0] != CNV_LITTLE_TO_LONG(ifbp->IFB_MICRx[0]) || - x32[1] != CNV_LITTLE_TO_LONG(ifbp->IFB_MICRx[1]) ) { - rc = HCF_ERR_MIC; - } - } - //return status - return rc; -} // check_mic -#endif // HCF_TYPE_WPA - - -/************************************************************************************************************ - * - *.SUBMODULE int cmd_cmpl( IFBP ifbp ) - *.PURPOSE waits for Hermes Command Completion. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * - *.RETURNS - * IFB_DefunctStat - * HCF_ERR_TIME_OUT - * HCF_ERR_DEFUNCT_CMD_SEQ - * HCF_SUCCESS - * - *.DESCRIPTION - * - * - *.DIAGRAM - * - *2: Once cmd_cmpl is called, the Busy option bit in IFB_Cmd must be cleared - *4: If Status register and command code don't match either: - * - the Hermes and Host are out of sync ( a fatal error) - * - error bits are reported via the Status Register. - * Out of sync is considered fatal and brings the HCF in Defunct mode - * Errors reported via the Status Register should be caused by sequence violations in Hermes command - * sequences and hence these bugs should have been found during engineering testing. Since there is no - * strategy to cope with this problem, it might as well be ignored at run time. Note that for any particular - * situation where a strategy is formulated to handle the consequences of a particular bug causing a - * particular Error situation reported via the Status Register, the bug should be removed rather than adding - * logic to cope with the consequences of the bug. - * There have been HCF versions where an error report via the Status Register even brought the HCF in defunct - * mode (although it was not yet named like that at that time). This is particular undesirable behavior for a - * general library. - * Simply reporting the error (as "interesting") is debatable. There also have been HCF versions with this - * strategy using the "vague" HCF_FAILURE code. - * The error is reported via: - * - MiscErr tally of the HCF Tally set - * - the (informative) fields IFB_ErrCmd and IFB_ErrQualifier - * - the assert mechanism - *8: Here the Defunct case and the Status error are separately treated - * - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -HCF_STATIC int -cmd_cmpl( IFBP ifbp ) -{ - - PROT_CNT_INI; - int rc = HCF_SUCCESS; - hcf_16 stat; - - HCFLOGENTRY( HCF_TRACE_CMD_CPL, ifbp->IFB_Cmd ); - ifbp->IFB_Cmd &= ~HCMD_BUSY; /* 2 */ - HCF_WAIT_WHILE( (IPW( HREG_EV_STAT) & HREG_EV_CMD) == 0 ); /* 4 */ - stat = IPW( HREG_STAT ); -#if HCF_PROT_TIME - if ( prot_cnt == 0 ) { - IF_TALLY( ifbp->IFB_HCF_Tallies.MiscErr++ ); - rc = HCF_ERR_TIME_OUT; - HCFASSERT( DO_ASSERT, ifbp->IFB_Cmd ); - } else -#endif // HCF_PROT_TIME - { - DAWA_ACK( HREG_EV_CMD ); - /*4*/ if ( stat != (ifbp->IFB_Cmd & HCMD_CMD_CODE) ) { - /*8*/ if ( ( (stat ^ ifbp->IFB_Cmd ) & HCMD_CMD_CODE) != 0 ) { - rc = ifbp->IFB_DefunctStat = HCF_ERR_DEFUNCT_CMD_SEQ; - ifbp->IFB_CardStat |= CARD_STAT_DEFUNCT; - } - IF_TALLY( ifbp->IFB_HCF_Tallies.MiscErr++ ); - ifbp->IFB_ErrCmd = stat; - ifbp->IFB_ErrQualifier = IPW( HREG_RESP_0 ); - HCFASSERT( DO_ASSERT, MERGE_2( IPW( HREG_PARAM_0 ), ifbp->IFB_Cmd ) ); - HCFASSERT( DO_ASSERT, MERGE_2( ifbp->IFB_ErrQualifier, ifbp->IFB_ErrCmd ) ); - } - } - HCFASSERT( rc == HCF_SUCCESS, rc); - HCFLOGEXIT( HCF_TRACE_CMD_CPL ); - return rc; -} // cmd_cmpl - - -/************************************************************************************************************ - * - *.SUBMODULE int cmd_exe( IFBP ifbp, int cmd_code, int par_0 ) - *.PURPOSE Executes synchronous part of Hermes Command and - optionally - waits for Command Completion. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * cmd_code - * par_0 - * - *.RETURNS - * IFB_DefunctStat - * HCF_ERR_DEFUNCT_CMD_SEQ - * HCF_SUCCESS - * HCF_ERR_TO_BE_ADDED <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - * - *.DESCRIPTION - * Executes synchronous Hermes Command and waits for Command Completion - * - * The general HCF strategy is to wait for command completion. As a consequence: - * - the read of the busy bit before writing the command register is superfluous - * - the Hermes requirement that no Inquiry command may be executed if there is still an unacknowledged - * Inquiry command outstanding, is automatically met. - * The Tx command uses the "Busy" bit in the cmd_code parameter to deviate from this general HCF strategy. - * The idea is that by not busy-waiting on completion of this frequently used command the processor - * utilization is diminished while using the busy-wait on all other seldom used commands the flow is kept - * simple. - * - * - * - *.DIAGRAM - * - *1: skip the body of cmd_exe when in defunct mode or when - based on the S/W Support register write and - * read back test - there is apparently no NIC. - * Note: we gave up on the "old" strategy to write the S/W Support register at magic only when needed. Due to - * the intricateness of Hermes F/W varieties ( which behave differently as far as corruption of the S/W - * Support register is involved), the increasing number of Hermes commands which do an implicit initialize - * (thus modifying the S/W Support register) and the workarounds of some OS/Support S/W induced aspects (e.g. - * the System Soft library at WinNT which postpones the actual mapping of I/O space up to 30 seconds after - * giving the go-ahead), the "magic" strategy is now reduced to a simple write and read back. This means that - * problems like a bug tramping over the memory mapped Hermes registers will no longer be noticed as side - * effect of the S/W Support register check. - *2: check whether the preceding command skipped the busy wait and if so, check for command completion - * - *.NOTICE - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ - -HCF_STATIC int -cmd_exe( IFBP ifbp, hcf_16 cmd_code, hcf_16 par_0 ) //if HCMD_BUSY of cmd_code set, then do NOT wait for completion -{ - int rc; - - HCFLOGENTRY( HCF_TRACE_CMD_EXE, cmd_code ); - HCFASSERT( (cmd_code & HCMD_CMD_CODE) != HCMD_TX || cmd_code & HCMD_BUSY, cmd_code ); //Tx must have Busy bit set - OPW( HREG_SW_0, HCF_MAGIC ); - if ( IPW( HREG_SW_0 ) == HCF_MAGIC ) { /* 1 */ - rc = ifbp->IFB_DefunctStat; - } - else rc = HCF_ERR_NO_NIC; - if ( rc == HCF_SUCCESS ) { - //;?is this a hot idea, better MEASURE performance impact - /*2*/ if ( ifbp->IFB_Cmd & HCMD_BUSY ) { - rc = cmd_cmpl( ifbp ); - } - OPW( HREG_PARAM_0, par_0 ); - OPW( HREG_CMD, cmd_code &~HCMD_BUSY ); - ifbp->IFB_Cmd = cmd_code; - if ( (cmd_code & HCMD_BUSY) == 0 ) { //;?is this a hot idea, better MEASURE performance impact - rc = cmd_cmpl( ifbp ); - } - } - HCFASSERT( rc == HCF_SUCCESS, MERGE_2( rc, cmd_code ) ); - HCFLOGEXIT( HCF_TRACE_CMD_EXE ); - return rc; -} // cmd_exe - - -/************************************************************************************************************ - * - *.SUBMODULE int download( IFBP ifbp, CFG_PROG_STRCT FAR *ltvp ) - *.PURPOSE downloads F/W image into NIC and initiates execution of the downloaded F/W. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * ltvp specifies the pseudo-RID (as defined by WCI) - * - *.RETURNS - * - *.DESCRIPTION - * - * - *.DIAGRAM - *1: First, Ack everything to unblock a (possibly) blocked cmd pipe line - * Note 1: it is very likely that an Alloc event is pending and very well possible that a (Send) Cmd event is - * pending - * Note 2: it is assumed that this strategy takes away the need to ack every conceivable event after an - * Hermes Initialize - * - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -HCF_STATIC int -download( IFBP ifbp, CFG_PROG_STRCT FAR *ltvp ) //Hermes-II download (volatile only) -{ - hcf_16 i; - int rc = HCF_SUCCESS; - wci_bufp cp; - hcf_io io_port = ifbp->IFB_IOBase + HREG_AUX_DATA; - - HCFLOGENTRY( HCF_TRACE_DL, ltvp->typ ); -#if (HCF_TYPE) & HCF_TYPE_PRELOADED - HCFASSERT( DO_ASSERT, ltvp->mode ); -#else - //if initial "program" LTV - if ( ifbp->IFB_DLMode == CFG_PROG_STOP && ltvp->mode == CFG_PROG_VOLATILE) { - //. switch Hermes to initial mode - /*1*/ OPW( HREG_EV_ACK, ~HREG_EV_SLEEP_REQ ); - rc = cmd_exe( ifbp, HCMD_INI, 0 ); /* HCMD_INI can not be part of init() because that is called on - * other occasions as well */ - rc = init( ifbp ); - } - //if final "program" LTV - if ( ltvp->mode == CFG_PROG_STOP && ifbp->IFB_DLMode == CFG_PROG_VOLATILE) { - //. start tertiary (or secondary) - OPW( HREG_PARAM_1, (hcf_16)(ltvp->nic_addr >> 16) ); - rc = cmd_exe( ifbp, HCMD_EXECUTE, (hcf_16) ltvp->nic_addr ); - if (rc == HCF_SUCCESS) { - rc = init( ifbp ); /*;? do we really want to skip init if cmd_exe failed, i.e. - * IFB_FW_Comp_Id is than possibly incorrect */ - } - //else (non-final) - } else { - //. if mode == Readback SEEPROM -#if 0 //;? as long as the next if contains a hard coded 0, might as well leave it out even more obvious - if ( 0 /*len is definitely not want we want;?*/ && ltvp->mode == CFG_PROG_SEEPROM_READBACK ) { - OPW( HREG_PARAM_1, (hcf_16)(ltvp->nic_addr >> 16) ); - OPW( HREG_PARAM_2, (hcf_16)((ltvp->len - 4) << 1) ); - //. . perform Hermes prog cmd with appropriate mode bits - rc = cmd_exe( ifbp, HCMD_PROGRAM | ltvp->mode, (hcf_16)ltvp->nic_addr ); - //. . set up NIC RAM addressability according Resp0-1 - OPW( HREG_AUX_PAGE, IPW( HREG_RESP_1) ); - OPW( HREG_AUX_OFFSET, IPW( HREG_RESP_0) ); - //. . set up L-field of LTV according Resp2 - i = ( IPW( HREG_RESP_2 ) + 1 ) / 2; // i contains max buffer size in words, a probably not very useful piece of information ;? -/*Nico's code based on i is the "real amount of data available" - if ( ltvp->len - 4 < i ) rc = HCF_ERR_LEN; - else ltvp->len = i + 4; -*/ -/* Rolands code based on the idea that a MSF should not ask for more than is available - // check if number of bytes requested exceeds max buffer size - if ( ltvp->len - 4 > i ) { - rc = HCF_ERR_LEN; - ltvp->len = i + 4; - } -*/ - //. . copy data from NIC via AUX port to LTV - cp = (wci_bufp)ltvp->host_addr; /*IN_PORT_STRING_8_16 macro may modify its parameters*/ - i = ltvp->len - 4; - IN_PORT_STRING_8_16( io_port, cp, i ); //!!!WORD length, cp MUST be a char pointer // $$ char - //. else (non-final programming) - } else -#endif //;? as long as the above if contains a hard coded 0, might as well leave it out even more obvious - { //. . get number of words to program - HCFASSERT( ltvp->segment_size, *ltvp->host_addr ); - i = ltvp->segment_size/2; - //. . copy data (words) from LTV via AUX port to NIC - cp = (wci_bufp)ltvp->host_addr; //OUT_PORT_STRING_8_16 macro may modify its parameters - //. . if mode == volatile programming - if ( ltvp->mode == CFG_PROG_VOLATILE ) { - //. . . set up NIC RAM addressability via AUX port - OPW( HREG_AUX_PAGE, (hcf_16)(ltvp->nic_addr >> 16 << 9 | (ltvp->nic_addr & 0xFFFF) >> 7 ) ); - OPW( HREG_AUX_OFFSET, (hcf_16)(ltvp->nic_addr & 0x007E) ); - OUT_PORT_STRING_8_16( io_port, cp, i ); //!!!WORD length, cp MUST be a char pointer - } - } - } - ifbp->IFB_DLMode = ltvp->mode; //save state in IFB_DLMode -#endif // HCF_TYPE_PRELOADED - HCFASSERT( rc == HCF_SUCCESS, rc ); - HCFLOGEXIT( HCF_TRACE_DL ); - return rc; -} // download - - -#if (HCF_ASSERT) & HCF_ASSERT_PRINTF -/************************************************** - * Certain Hermes-II firmware versions can generate - * debug information. This debug information is - * contained in a buffer in nic-RAM, and can be read - * via the aux port. - **************************************************/ -HCF_STATIC int -fw_printf(IFBP ifbp, CFG_FW_PRINTF_STRCT FAR *ltvp) -{ - int rc = HCF_SUCCESS; - hcf_16 fw_cnt; -// hcf_32 DbMsgBuffer = 0x29D2, DbMsgCount= 0x000029D0; -// hcf_16 DbMsgSize=0x00000080; - hcf_32 DbMsgBuffer; - CFG_FW_PRINTF_BUFFER_LOCATION_STRCT *p = &ifbp->IFB_FwPfBuff; - ltvp->len = 1; - if ( p->DbMsgSize != 0 ) { - // first, check the counter in nic-RAM and compare it to the latest counter value of the HCF - OPW( HREG_AUX_PAGE, (hcf_16)(p->DbMsgCount >> 7) ); - OPW( HREG_AUX_OFFSET, (hcf_16)(p->DbMsgCount & 0x7E) ); - fw_cnt = ((IPW( HREG_AUX_DATA) >>1 ) & ((hcf_16)p->DbMsgSize - 1)); - if ( fw_cnt != ifbp->IFB_DbgPrintF_Cnt ) { -// DbgPrint("fw_cnt=%d IFB_DbgPrintF_Cnt=%d\n", fw_cnt, ifbp->IFB_DbgPrintF_Cnt); - DbMsgBuffer = p->DbMsgBuffer + ifbp->IFB_DbgPrintF_Cnt * 6; // each entry is 3 words - OPW( HREG_AUX_PAGE, (hcf_16)(DbMsgBuffer >> 7) ); - OPW( HREG_AUX_OFFSET, (hcf_16)(DbMsgBuffer & 0x7E) ); - ltvp->msg_id = IPW(HREG_AUX_DATA); - ltvp->msg_par = IPW(HREG_AUX_DATA); - ltvp->msg_tstamp = IPW(HREG_AUX_DATA); - ltvp->len = 4; - ifbp->IFB_DbgPrintF_Cnt++; - ifbp->IFB_DbgPrintF_Cnt &= (p->DbMsgSize - 1); - } - } - return rc; -}; -#endif // HCF_ASSERT_PRINTF - - -/************************************************************************************************************ - * - *.SUBMODULE hcf_16 get_fid( IFBP ifbp ) - *.PURPOSE get allocated FID for either transmit or notify. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * - *.RETURNS - * 0 no FID available - * <>0 FID number - * - *.DESCRIPTION - * - * - *.DIAGRAM - * The preference is to use a "pending" alloc. If no alloc is pending, then - if available - the "spare" FID - * is used. - * If the spare FID is used, IFB_RscInd (representing the spare FID) must be cleared - * If the pending alloc is used, the alloc event must be acknowledged to the Hermes. - * In case the spare FID was depleted and the IFB_RscInd has been "faked" as pseudo resource with a 0x0001 - * value by hcf_service_nic, IFB_RscInd has to be "corrected" again to its 0x0000 value. - * - * Note that due to the Hermes-II H/W problems which are intended to be worked around by DAWA, the Alloc bit - * in the Event register is no longer a reliable indication of the presence/absence of a FID. The "Clear FID" - * part of the DAWA logic, together with the choice of the definition of the return information from get_fid, - * handle this automatically, i.e. without additional code in get_fid. - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -HCF_STATIC hcf_16 -get_fid( IFBP ifbp ) -{ - - hcf_16 fid = 0; -#if ( (HCF_TYPE) & HCF_TYPE_HII5 ) == 0 - PROT_CNT_INI; -#endif // HCF_TYPE_HII5 - - IF_DMA( HCFASSERT(!(ifbp->IFB_CntlOpt & USE_DMA), ifbp->IFB_CntlOpt) ); - - if ( IPW( HREG_EV_STAT) & HREG_EV_ALLOC) { - fid = IPW( HREG_ALLOC_FID ); - HCFASSERT( fid, ifbp->IFB_RscInd ); - DAWA_ZERO_FID( HREG_ALLOC_FID ); -#if ( (HCF_TYPE) & HCF_TYPE_HII5 ) == 0 - HCF_WAIT_WHILE( ( IPW( HREG_EV_STAT ) & HREG_EV_ACK_REG_READY ) == 0 ); - HCFASSERT( prot_cnt, IPW( HREG_EV_STAT ) ); -#endif // HCF_TYPE_HII5 - DAWA_ACK( HREG_EV_ALLOC ); //!!note that HREG_EV_ALLOC is written only once -// 180 degree error in logic ;? #if ALLOC_15 - if ( ifbp->IFB_RscInd == 1 ) { - ifbp->IFB_RscInd = 0; - } -//#endif // ALLOC_15 - } else { -// 180 degree error in logic ;? #if ALLOC_15 - fid = ifbp->IFB_RscInd; -//#endif // ALLOC_15 - ifbp->IFB_RscInd = 0; - } - return fid; -} // get_fid - - -/************************************************************************************************************ - * - *.SUBMODULE void get_frag( IFBP ifbp, wci_bufp bufp, int len BE_PAR( int word_len ) ) - *.PURPOSE reads with 16/32 bit I/O via BAP1 port from NIC RAM to Host memory. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * bufp (byte) address of buffer - * len length in bytes of buffer specified by bufp - * word_len Big Endian only: number of leading bytes to swap in pairs - * - *.RETURNS N.A. - * - *.DESCRIPTION - * process the single byte (if applicable) read by the previous get_frag and copy len (or len-1) bytes from - * NIC to bufp. - * On a Big Endian platform, the parameter word_len controls the number of leading bytes whose endianness is - * converted (i.e. byte swapped) - * - * - *.DIAGRAM - *10: The PCMCIA card can be removed in the middle of the transfer. By depositing a "magic number" in the - * HREG_SW_0 register of the Hermes at initialization time and by verifying this register, it can be - * determined whether the card is still present. The return status is set accordingly. - * Clearing the buffer is a (relative) cheap way to prevent that failing I/O results in run-away behavior - * because the garbage in the buffer is interpreted by the caller irrespective of the return status (e.g. - * hcf_service_nic has this behavior). - * - *.NOTICE - * It turns out DOS ODI uses zero length fragments. The HCF code can cope with it, but as a consequence, no - * Assert on len is possible - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -HCF_STATIC void -get_frag( IFBP ifbp, wci_bufp bufp, int len BE_PAR( int word_len ) ) -{ - hcf_io io_port = ifbp->IFB_IOBase + HREG_DATA_1; //BAP data register - wci_bufp p = bufp; //working pointer - int i; //prevent side effects from macro - int j; - - HCFASSERT( ((hcf_32)bufp & (HCF_ALIGN-1) ) == 0, (hcf_32)bufp ); - -/*1: here recovery logic for intervening BAP access between hcf_service_nic and hcf_rcv_msg COULD be added - * if current access is RxInitial - * . persistent_offset += len - */ - - i = len; - //if buffer length > 0 and carry from previous get_frag - if ( i && ifbp->IFB_CarryIn ) { - //. move carry to buffer - //. adjust buffer length and pointer accordingly - *p++ = (hcf_8)(ifbp->IFB_CarryIn>>8); - i--; - //. clear carry flag - ifbp->IFB_CarryIn = 0; - } -#if (HCF_IO) & HCF_IO_32BITS - //skip zero-length I/O, single byte I/O and I/O not worthwhile (i.e. less than 6 bytes)for DW logic - //if buffer length >= 6 and 32 bits I/O support - if ( !(ifbp->IFB_CntlOpt & USE_16BIT) && i >= 6 ) { - hcf_32 FAR *p4; //prevent side effects from macro - if ( ( (hcf_32)p & 0x1 ) == 0 ) { //. if buffer at least word aligned - if ( (hcf_32)p & 0x2 ) { //. . if buffer not double word aligned - //. . . read single word to get double word aligned - *(wci_recordp)p = IN_PORT_WORD( io_port ); - //. . . adjust buffer length and pointer accordingly - p += 2; - i -= 2; - } - //. . read as many double word as possible - p4 = (hcf_32 FAR *)p; - j = i/4; - IN_PORT_STRING_32( io_port, p4, j ); - //. . adjust buffer length and pointer accordingly - p += i & ~0x0003; - i &= 0x0003; - } - } -#endif // HCF_IO_32BITS - //if no 32-bit support OR byte aligned OR 1-3 bytes left - if ( i ) { - //. read as many word as possible in "alignment safe" way - j = i/2; - IN_PORT_STRING_8_16( io_port, p, j ); - //. if 1 byte left - if ( i & 0x0001 ) { - //. . read 1 word - ifbp->IFB_CarryIn = IN_PORT_WORD( io_port ); - //. . store LSB in last char of buffer - bufp[len-1] = (hcf_8)ifbp->IFB_CarryIn; - //. . save MSB in carry, set carry flag - ifbp->IFB_CarryIn |= 0x1; - } - } -#if HCF_BIG_ENDIAN - HCFASSERT( word_len == 0 || word_len == 2 || word_len == 4, word_len ); - HCFASSERT( word_len == 0 || ((hcf_32)bufp & 1 ) == 0, (hcf_32)bufp ); - HCFASSERT( word_len <= len, MERGE2( word_len, len ) ); - //see put_frag for an alternative implementation, but be careful about what are int's and what are - //hcf_16's - if ( word_len ) { //. if there is anything to convert - hcf_8 c; - c = bufp[1]; //. . convert the 1st hcf_16 - bufp[1] = bufp[0]; - bufp[0] = c; - if ( word_len > 1 ) { //. . if there is to convert more than 1 word ( i.e 2 ) - c = bufp[3]; //. . . convert the 2nd hcf_16 - bufp[3] = bufp[2]; - bufp[2] = c; - } - } -#endif // HCF_BIG_ENDIAN -} // get_frag - -/************************************************************************************************************ - * - *.SUBMODULE int init( IFBP ifbp ) - *.PURPOSE Handles common initialization aspects (H-I init, calibration, config.mngmt, allocation). - * - *.ARGUMENTS - * ifbp address of the Interface Block - * - *.RETURNS - * HCF_ERR_INCOMP_PRI - * HCF_ERR_INCOMP_FW - * HCF_ERR_TIME_OUT - * >>hcf_get_info - * HCF_ERR_NO_NIC - * HCF_ERR_LEN - * - *.DESCRIPTION - * init will successively: - * - in case of a (non-preloaded) H-I, initialize the NIC - * - calibrate the S/W protection timer against the Hermes Timer - * - collect HSI, "active" F/W Configuration Management Information - * - in case active F/W is Primary F/W: collect Primary F/W Configuration Management Information - * - check HSI and Primary F/W compatibility with the HCF - * - in case active F/W is Station or AP F/W: check Station or AP F/W compatibility with the HCF - * - in case active F/W is not Primary F/W: allocate FIDs to be used in transmit/notify process - * - * - *.DIAGRAM - *2: drop all error status bits in IFB_CardStat since they are expected to be re-evaluated. - *4: Ack everything except HREG_EV_SLEEP_REQ. It is very likely that an Alloc event is pending and - * very well possible that a Send Cmd event is pending. Acking HREG_EV_SLEEP_REQ is handled by hcf_action( - * HCF_ACT_INT_ON ) !!! - *10: Calibrate the S/W time-out protection mechanism by calling calibrate(). Note that possible errors - * in the calibration process are nor reported by init but will show up via the defunct mechanism in - * subsequent hcf-calls. - *14: usb_check_comp() is called to have the minimal visual clutter for the legacy H-I USB dongle - * compatibility check. - *16: The following configuration management related information is retrieved from the NIC: - * - HSI supplier - * - F/W Identity - * - F/W supplier - * if appropriate: - * - PRI Identity - * - PRI supplier - * appropriate means on H-I: always - * and on H-II if F/W supplier reflects a primary (i.e. only after an Hermes Reset or Init - * command). - * QUESTION ;? !!!!!! should, For each of the above RIDs the Endianness is converted to native Endianness. - * Only the return code of the first hcf_get_info is used. All hcf_get_info calls are made, regardless of - * the success or failure of the 1st hcf_get_info. The assumptions are: - * - if any call fails, they all fail, so remembering the result of the 1st call is adequate - * - a failing call will overwrite the L-field with a 0x0000 value, which services both as an - * error indication for the values cached in the IFB as making mmd_check_comp fail. - * In case of H-I, when getting the F/W identity fails, the F/W is assumed to be H-I AP F/W pre-dating - * version 9.0 and the F/W Identity and Supplier are faked accordingly. - * In case of H-II, the Primary, Station and AP Identity are merged into a single F/W Identity. - * The same applies to the Supplier information. As a consequence the PRI information can no longer be - * retrieved when a Tertiary runs. To accommodate MSFs and Utilities who depend on PRI information being - * available at any time, this information is cached in the IFB. In this cache the generic "F/W" value of - * the typ-fields is overwritten with the specific (legacy) "PRI" values. To actually re-route the (legacy) - * PRI request via hcf_get_info, the xxxx-table must be set. In case of H-I, this caching, modifying and - * re-routing is not needed because PRI information is always available directly from the NIC. For - * consistency the caching fields in the IFB are filled with the PRI information anyway. - *18: mdd_check_comp() is called to check the Supplier Variant and Range of the Host-S/W I/F (HSI) and the - * Primary Firmware Variant and Range against the Top and Bottom level supported by this HCF. If either of - * these tests fails, the CARD_STAT_INCOMP_PRI bit of IFB_CardStat is set - * Note: There should always be a primary except during production, so this makes the HCF in its current form - * unsuitable for manufacturing test systems like the FTS. This can be remedied by an adding a test like - * ifbp->IFB_PRISup.id == COMP_ID_PRI - *20: In case there is Tertiary F/W and this F/W is Station F/W, the Supplier Variant and Range of the Station - * Firmware function as retrieved from the Hermes is checked against the Top and Bottom level supported by - * this HCF. - * Note: ;? the tertiary F/W compatibility checks could be moved to the DHF, which already has checked the - * CFI and MFI compatibility of the image with the NIC before the image was downloaded. - *28: In case of non-Primary F/W: allocates and acknowledge a (TX or Notify) FID and allocates without - * acknowledge another (TX or Notify) FID (the so-called 1.5 alloc scheme) with the following steps: - * - execute the allocate command by calling cmd_exe - * - wait till either the alloc event or a time-out occurs - * - regardless whether the alloc event occurs, call get_fid to - * - read the FID and save it in IFB_RscInd to be used as "spare FID" - * - acknowledge the alloc event - * - do another "half" allocate to complete the "1.5 Alloc scheme" - * Note that above 3 steps do not harm and thus give the "cheapest" acceptable strategy. - * If a time-out occurred, then report time out status (after all) - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -HCF_STATIC int -init( IFBP ifbp ) -{ - - int rc = HCF_SUCCESS; - - HCFLOGENTRY( HCF_TRACE_INIT, 0 ); - - ifbp->IFB_CardStat = 0; /* 2*/ - OPW( HREG_EV_ACK, ~HREG_EV_SLEEP_REQ ); /* 4*/ - IF_PROT_TIME( calibrate( ifbp ) ); /*10*/ -#if 0 // OOR - ifbp->IFB_FWIdentity.len = 2; //misuse the IFB space for a put - ifbp->IFB_FWIdentity.typ = CFG_TICK_TIME; - ifbp->IFB_FWIdentity.comp_id = (1000*1000)/1024 + 1; //roughly 1 second - hcf_put_info( ifbp, (LTVP)&ifbp->IFB_FWIdentity.len ); -#endif // OOR - ifbp->IFB_FWIdentity.len = sizeof(CFG_FW_IDENTITY_STRCT)/sizeof(hcf_16) - 1; - ifbp->IFB_FWIdentity.typ = CFG_FW_IDENTITY; - rc = hcf_get_info( ifbp, (LTVP)&ifbp->IFB_FWIdentity.len ); -/* ;? conversion should not be needed for mmd_check_comp */ -#if HCF_BIG_ENDIAN - ifbp->IFB_FWIdentity.comp_id = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWIdentity.comp_id ); - ifbp->IFB_FWIdentity.variant = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWIdentity.variant ); - ifbp->IFB_FWIdentity.version_major = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWIdentity.version_major ); - ifbp->IFB_FWIdentity.version_minor = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWIdentity.version_minor ); -#endif // HCF_BIG_ENDIAN -#if defined MSF_COMPONENT_ID /*14*/ - if ( rc == HCF_SUCCESS ) { /*16*/ - ifbp->IFB_HSISup.len = sizeof(CFG_SUP_RANGE_STRCT)/sizeof(hcf_16) - 1; - ifbp->IFB_HSISup.typ = CFG_NIC_HSI_SUP_RANGE; - rc = hcf_get_info( ifbp, (LTVP)&ifbp->IFB_HSISup.len ); -/* ;? conversion should not be needed for mmd_check_comp , BUT according to a report of a BE-user it is - * should be resolved in the WARP release - * since some compilers make ugly but unnecessary code of these instructions even for LE, - * it is conditionally compiled */ -#if HCF_BIG_ENDIAN - ifbp->IFB_HSISup.role = CNV_LITTLE_TO_SHORT( ifbp->IFB_HSISup.role ); - ifbp->IFB_HSISup.id = CNV_LITTLE_TO_SHORT( ifbp->IFB_HSISup.id ); - ifbp->IFB_HSISup.variant = CNV_LITTLE_TO_SHORT( ifbp->IFB_HSISup.variant ); - ifbp->IFB_HSISup.bottom = CNV_LITTLE_TO_SHORT( ifbp->IFB_HSISup.bottom ); - ifbp->IFB_HSISup.top = CNV_LITTLE_TO_SHORT( ifbp->IFB_HSISup.top ); -#endif // HCF_BIG_ENDIAN - ifbp->IFB_FWSup.len = sizeof(CFG_SUP_RANGE_STRCT)/sizeof(hcf_16) - 1; - ifbp->IFB_FWSup.typ = CFG_FW_SUP_RANGE; - (void)hcf_get_info( ifbp, (LTVP)&ifbp->IFB_FWSup.len ); -/* ;? conversion should not be needed for mmd_check_comp */ -#if HCF_BIG_ENDIAN - ifbp->IFB_FWSup.role = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWSup.role ); - ifbp->IFB_FWSup.id = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWSup.id ); - ifbp->IFB_FWSup.variant = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWSup.variant ); - ifbp->IFB_FWSup.bottom = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWSup.bottom ); - ifbp->IFB_FWSup.top = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWSup.top ); -#endif // HCF_BIG_ENDIAN - - if ( ifbp->IFB_FWSup.id == COMP_ID_PRI ) { /* 20*/ - int i = sizeof( CFG_FW_IDENTITY_STRCT) + sizeof(CFG_SUP_RANGE_STRCT ); - while ( i-- ) ((hcf_8*)(&ifbp->IFB_PRIIdentity))[i] = ((hcf_8*)(&ifbp->IFB_FWIdentity))[i]; - ifbp->IFB_PRIIdentity.typ = CFG_PRI_IDENTITY; - ifbp->IFB_PRISup.typ = CFG_PRI_SUP_RANGE; - xxxx[xxxx_PRI_IDENTITY_OFFSET] = &ifbp->IFB_PRIIdentity.len; - xxxx[xxxx_PRI_IDENTITY_OFFSET+1] = &ifbp->IFB_PRISup.len; - } - if ( !mmd_check_comp( (void*)&cfg_drv_act_ranges_hsi, &ifbp->IFB_HSISup) /* 22*/ -#if ( (HCF_TYPE) & HCF_TYPE_PRELOADED ) == 0 -//;? the PRI compatibility check is only relevant for DHF - || !mmd_check_comp( (void*)&cfg_drv_act_ranges_pri, &ifbp->IFB_PRISup) -#endif // HCF_TYPE_PRELOADED - ) { - ifbp->IFB_CardStat = CARD_STAT_INCOMP_PRI; - rc = HCF_ERR_INCOMP_PRI; - } - if ( ( ifbp->IFB_FWSup.id == COMP_ID_STA && !mmd_check_comp( (void*)&cfg_drv_act_ranges_sta, &ifbp->IFB_FWSup) ) || - ( ifbp->IFB_FWSup.id == COMP_ID_APF && !mmd_check_comp( (void*)&cfg_drv_act_ranges_apf, &ifbp->IFB_FWSup) ) - ) { /* 24 */ - ifbp->IFB_CardStat |= CARD_STAT_INCOMP_FW; - rc = HCF_ERR_INCOMP_FW; - } - } -#endif // MSF_COMPONENT_ID - - if ( rc == HCF_SUCCESS && ifbp->IFB_FWIdentity.comp_id >= COMP_ID_FW_STA ) { - PROT_CNT_INI; - /************************************************************************************** - * rlav: the DMA engine needs the host to cause a 'hanging alloc event' for it to consume. - * not sure if this is the right spot in the HCF, thinking about hcf_enable... - **************************************************************************************/ - rc = cmd_exe( ifbp, HCMD_ALLOC, 0 ); -// 180 degree error in logic ;? #if ALLOC_15 -// ifbp->IFB_RscInd = 1; //let's hope that by the time hcf_send_msg isa called, there will be a FID -//#else - if ( rc == HCF_SUCCESS ) { - HCF_WAIT_WHILE( (IPW( HREG_EV_STAT ) & HREG_EV_ALLOC) == 0 ); - IF_PROT_TIME( HCFASSERT(prot_cnt, IPW( HREG_EV_STAT )) ); -#if HCF_DMA - if ( ! ( ifbp->IFB_CntlOpt & USE_DMA ) ) -#endif // HCF_DMA - { - ifbp->IFB_RscInd = get_fid( ifbp ); - HCFASSERT( ifbp->IFB_RscInd, 0 ); - cmd_exe( ifbp, HCMD_ALLOC, 0 ); - IF_PROT_TIME( if ( prot_cnt == 0 ) rc = HCF_ERR_TIME_OUT ); - } - } -//#endif // ALLOC_15 - } - - HCFASSERT( rc == HCF_SUCCESS, rc ); - HCFLOGEXIT( HCF_TRACE_INIT ); - return rc; -} // init - -/************************************************************************************************************ - * - *.SUBMODULE void isr_info( IFBP ifbp ) - *.PURPOSE handles link events. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * - *.RETURNS N.A. - * - *.DESCRIPTION - * - * - *.DIAGRAM - *1: First the FID number corresponding with the InfoEvent is determined. - * Note the complication of the zero-FID protection sub-scheme in DAWA. - * Next the L-field and the T-field are fetched into scratch buffer info. - *2: In case of tallies, the 16 bits Hermes values are accumulated in the IFB into 32 bits values. Info[0] - * is (expected to be) HCF_NIC_TAL_CNT + 1. The contraption "while ( info[0]-- >1 )" rather than - * "while ( --info[0] )" is used because it is dangerous to determine the length of the Value field by - * decrementing info[0]. As a result of a bug in some version of the F/W, info[0] may be 0, resulting - * in a very long loop in the pre-decrement logic. - *4: In case of a link status frame, the information is copied to the IFB field IFB_linkStat - *6: All other than Tallies (including "unknown" ones) are checked against the selection set by the MSF - * via CFG_RID_LOG. If a match is found or the selection set has the wild-card type (i.e non-NULL buffer - * pointer at the terminating zero-type), the frame is copied to the (type-specific) log buffer. - * Note that to accumulate tallies into IFB AND to log them or to log a frame when a specific match occures - * AND based on the wild-card selection, you have to call setup_bap again after the 1st copy. - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -HCF_STATIC void -isr_info( IFBP ifbp ) -{ - hcf_16 info[2], fid; -#if (HCF_EXT) & HCF_EXT_INFO_LOG - RID_LOGP ridp = ifbp->IFB_RIDLogp; //NULL or pointer to array of RID_LOG structures (terminated by zero typ) -#endif // HCF_EXT_INFO_LOG - - HCFTRACE( ifbp, HCF_TRACE_ISR_INFO ); /* 1 */ - fid = IPW( HREG_INFO_FID ); - DAWA_ZERO_FID( HREG_INFO_FID ); - if ( fid ) { - (void)setup_bap( ifbp, fid, 0, IO_IN ); - get_frag( ifbp, (wci_bufp)info, 4 BE_PAR(2) ); - HCFASSERT( info[0] <= HCF_MAX_LTV + 1, MERGE_2( info[1], info[0] ) ); //;? a smaller value makes more sense -#if (HCF_TALLIES) & HCF_TALLIES_NIC //Hermes tally support - if ( info[1] == CFG_TALLIES ) { - hcf_32 *p; - /*2*/ if ( info[0] > HCF_NIC_TAL_CNT ) { - info[0] = HCF_NIC_TAL_CNT + 1; - } - p = (hcf_32*)&ifbp->IFB_NIC_Tallies; - while ( info[0]-- >1 ) *p++ += IPW( HREG_DATA_1 ); //request may return zero length - } - else -#endif // HCF_TALLIES_NIC - { - /*4*/ if ( info[1] == CFG_LINK_STAT ) { - ifbp->IFB_LinkStat = IPW( HREG_DATA_1 ); - } -#if (HCF_EXT) & HCF_EXT_INFO_LOG - /*6*/ while ( 1 ) { - if ( ridp->typ == 0 || ridp->typ == info[1] ) { - if ( ridp->bufp ) { - HCFASSERT( ridp->len >= 2, ridp->typ ); - ridp->bufp[0] = min((hcf_16)(ridp->len - 1), info[0] ); //save L - ridp->bufp[1] = info[1]; //save T - get_frag( ifbp, (wci_bufp)&ridp->bufp[2], (ridp->bufp[0] - 1)*2 BE_PAR(0) ); - } - break; - } - ridp++; - } -#endif // HCF_EXT_INFO_LOG - } - HCFTRACE( ifbp, HCF_TRACE_ISR_INFO | HCF_TRACE_EXIT ); - } - return; -} // isr_info - -// -// -// #endif // HCF_TALLIES_NIC -// /*4*/ if ( info[1] == CFG_LINK_STAT ) { -// ifbp->IFB_DSLinkStat = IPW( HREG_DATA_1 ) | CFG_LINK_STAT_CHANGE; //corrupts BAP !! ;? -// ifbp->IFB_LinkStat = ifbp->IFB_DSLinkStat & CFG_LINK_STAT_FW; //;? to be obsoleted -// printk(KERN_ERR "linkstatus: %04x\n", ifbp->IFB_DSLinkStat ); //;?remove me 1 day -// #if (HCF_SLEEP) & HCF_DDS -// if ( ( ifbp->IFB_DSLinkStat & CFG_LINK_STAT_CONNECTED ) == 0 ) { //even values are disconnected etc. -// ifbp->IFB_TickCnt = 0; //start 2 second period (with 1 tick uncertanty) -// printk(KERN_NOTICE "isr_info: AwaitConnection phase started, IFB_TickCnt = 0\n" ); //;?remove me 1 day -// } -// #endif // HCF_DDS -// } -// #if (HCF_EXT) & HCF_EXT_INFO_LOG -// /*6*/ while ( 1 ) { -// if ( ridp->typ == 0 || ridp->typ == info[1] ) { -// if ( ridp->bufp ) { -// HCFASSERT( ridp->len >= 2, ridp->typ ); -// (void)setup_bap( ifbp, fid, 2, IO_IN ); //restore BAP for tallies, linkstat and specific type followed by wild card -// ridp->bufp[0] = min( ridp->len - 1, info[0] ); //save L -// get_frag( ifbp, (wci_bufp)&ridp->bufp[1], ridp->bufp[0]*2 BE_PAR(0) ); -// } -// break; //;?this break is no longer needed due to setup_bap but lets concentrate on DDS first -// } -// ridp++; -// } -// #endif // HCF_EXT_INFO_LOG -// } -// HCFTRACE( ifbp, HCF_TRACE_ISR_INFO | HCF_TRACE_EXIT ); -// -// -// -// -// return; -//} // isr_info - - -/************************************************************************************************************ - * - *.SUBMODULE void mdd_assert( IFBP ifbp, unsigned int line_number, hcf_32 q ) - *.PURPOSE filters assert on level and interfaces to the MSF supplied msf_assert routine. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * line_number line number of the line which caused the assert - * q qualifier, additional information which may give a clue about the problem - * - *.RETURNS N.A. - * - *.DESCRIPTION - * - * - *.DIAGRAM - * - *.NOTICE - * mdd_assert has been through a turmoil, renaming hcf_assert to assert and hcf_assert again and supporting off - * and on being called from the MSF level and other ( immature ) ModularDriverDevelopment modules like DHF and - * MMD. - * !!!! The assert routine is not an hcf_..... routine in the sense that it may be called by the MSF, - * however it is called from mmd.c and dhf.c, so it must be external. - * To prevent namespace pollution it needs a prefix, to prevent that MSF programmers think that - * they are allowed to call the assert logic, the prefix HCF can't be used, so MDD is selected!!!! - * - * When called from the DHF module the line number is incremented by DHF_FILE_NAME_OFFSET and when called from - * the MMD module by MMD_FILE_NAME_OFFSET. - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -#if HCF_ASSERT -void -mdd_assert( IFBP ifbp, unsigned int line_number, hcf_32 q ) -{ - hcf_16 run_time_flag = ifbp->IFB_AssertLvl; - - if ( run_time_flag /* > ;?????? */ ) { //prevent recursive behavior, later to be extended to level filtering - ifbp->IFB_AssertQualifier = q; - ifbp->IFB_AssertLine = (hcf_16)line_number; -#if (HCF_ASSERT) & ( HCF_ASSERT_LNK_MSF_RTN | HCF_ASSERT_RT_MSF_RTN ) - if ( ifbp->IFB_AssertRtn ) { - ifbp->IFB_AssertRtn( line_number, ifbp->IFB_AssertTrace, q ); - } -#endif // HCF_ASSERT_LNK_MSF_RTN / HCF_ASSERT_RT_MSF_RTN -#if (HCF_ASSERT) & HCF_ASSERT_SW_SUP - OPW( HREG_SW_2, line_number ); - OPW( HREG_SW_2, ifbp->IFB_AssertTrace ); - OPW( HREG_SW_2, (hcf_16)q ); - OPW( HREG_SW_2, (hcf_16)(q >> 16 ) ); -#endif // HCF_ASSERT_SW_SUP - -#if (HCF_ASSERT) & HCF_ASSERT_MB - ifbp->IFB_AssertLvl = 0; // prevent recursive behavior - hcf_put_info( ifbp, (LTVP)&ifbp->IFB_AssertStrct ); - ifbp->IFB_AssertLvl = run_time_flag; // restore appropriate filter level -#endif // HCF_ASSERT_MB - } -} // mdd_assert -#endif // HCF_ASSERT - - -/************************************************************************************************************ - * - *.SUBMODULE void put_frag( IFBP ifbp, wci_bufp bufp, int len BE_PAR( int word_len ) ) - *.PURPOSE writes with 16/32 bit I/O via BAP1 port from Host memory to NIC RAM. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * bufp (byte) address of buffer - * len length in bytes of buffer specified by bufp - * word_len Big Endian only: number of leading bytes to swap in pairs - * - *.RETURNS N.A. - * - *.DESCRIPTION - * process the single byte (if applicable) not yet written by the previous put_frag and copy len - * (or len-1) bytes from bufp to NIC. - * - * - *.DIAGRAM - * - *.NOTICE - * It turns out DOS ODI uses zero length fragments. The HCF code can cope with it, but as a consequence, no - * Assert on len is possible - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -HCF_STATIC void -put_frag( IFBP ifbp, wci_bufp bufp, int len BE_PAR( int word_len ) ) -{ - hcf_io io_port = ifbp->IFB_IOBase + HREG_DATA_1; //BAP data register - int i; //prevent side effects from macro - hcf_16 j; - HCFASSERT( ((hcf_32)bufp & (HCF_ALIGN-1) ) == 0, (hcf_32)bufp ); -#if HCF_BIG_ENDIAN - HCFASSERT( word_len == 0 || word_len == 2 || word_len == 4, word_len ); - HCFASSERT( word_len == 0 || ((hcf_32)bufp & 1 ) == 0, (hcf_32)bufp ); - HCFASSERT( word_len <= len, MERGE_2( word_len, len ) ); - - if ( word_len ) { //if there is anything to convert - //. convert and write the 1st hcf_16 - j = bufp[1] | bufp[0]<<8; - OUT_PORT_WORD( io_port, j ); - //. update pointer and counter accordingly - len -= 2; - bufp += 2; - if ( word_len > 1 ) { //. if there is to convert more than 1 word ( i.e 2 ) - //. . convert and write the 2nd hcf_16 - j = bufp[1] | bufp[0]<<8; /*bufp is already incremented by 2*/ - OUT_PORT_WORD( io_port, j ); - //. . update pointer and counter accordingly - len -= 2; - bufp += 2; - } - } -#endif // HCF_BIG_ENDIAN - i = len; - if ( i && ifbp->IFB_CarryOut ) { //skip zero-length - j = ((*bufp)<<8) + ( ifbp->IFB_CarryOut & 0xFF ); - OUT_PORT_WORD( io_port, j ); - bufp++; i--; - ifbp->IFB_CarryOut = 0; - } -#if (HCF_IO) & HCF_IO_32BITS - //skip zero-length I/O, single byte I/O and I/O not worthwhile (i.e. less than 6 bytes)for DW logic - //if buffer length >= 6 and 32 bits I/O support - if ( !(ifbp->IFB_CntlOpt & USE_16BIT) && i >= 6 ) { - hcf_32 FAR *p4; //prevent side effects from macro - if ( ( (hcf_32)bufp & 0x1 ) == 0 ) { //. if buffer at least word aligned - if ( (hcf_32)bufp & 0x2 ) { //. . if buffer not double word aligned - //. . . write a single word to get double word aligned - j = *(wci_recordp)bufp; //just to help ease writing macros with embedded assembly - OUT_PORT_WORD( io_port, j ); - //. . . adjust buffer length and pointer accordingly - bufp += 2; i -= 2; - } - //. . write as many double word as possible - p4 = (hcf_32 FAR *)bufp; - j = (hcf_16)i/4; - OUT_PORT_STRING_32( io_port, p4, j ); - //. . adjust buffer length and pointer accordingly - bufp += i & ~0x0003; - i &= 0x0003; - } - } -#endif // HCF_IO_32BITS - //if no 32-bit support OR byte aligned OR 1 word left - if ( i ) { - //. if odd number of bytes left - if ( i & 0x0001 ) { - //. . save left over byte (before bufp is corrupted) in carry, set carry flag - ifbp->IFB_CarryOut = (hcf_16)bufp[i-1] | 0x0100; //note that i and bufp are always simultaneously modified, &bufp[i-1] is invariant - } - //. write as many word as possible in "alignment safe" way - j = (hcf_16)i/2; - OUT_PORT_STRING_8_16( io_port, bufp, j ); - } -} // put_frag - - -/************************************************************************************************************ - * - *.SUBMODULE void put_frag_finalize( IFBP ifbp ) - *.PURPOSE cleanup after put_frag for trailing odd byte and MIC transfer to NIC. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * - *.RETURNS N.A. - * - *.DESCRIPTION - * finalize the MIC calculation with the padding pattern, output the last byte (if applicable) - * of the message and the MIC to the TxFS - * - * - *.DIAGRAM - *2: 1 byte of the last put_frag may be still in IFB_CarryOut ( the put_frag carry holder ), so ........ - * 1 - 3 bytes of the last put_frag may be still in IFB_tx_32 ( the MIC engine carry holder ), so ........ - * The call to the MIC calculation routine feeds these remaining bytes (if any) of put_frag and the - * just as many bytes of the padding as needed to the MIC calculation engine. Note that the "unneeded" pad - * bytes simply end up in the MIC engine carry holder and are never used. - *8: write the remainder of the MIC and possible some garbage to NIC RAM - * Note: i is always 4 (a loop-invariant of the while in point 2) - * - *.NOTICE - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -HCF_STATIC void -put_frag_finalize( IFBP ifbp ) -{ -#if (HCF_TYPE) & HCF_TYPE_WPA - if ( ifbp->IFB_MICTxCarry != 0xFFFF) { //if MIC calculation active - CALC_TX_MIC( mic_pad, 8); //. feed (up to 8 bytes of) virtual padding to MIC engine - //. write (possibly) trailing byte + (most of) MIC - put_frag( ifbp, (wci_bufp)ifbp->IFB_MICTx, 8 BE_PAR(0) ); - } -#endif // HCF_TYPE_WPA - put_frag( ifbp, null_addr, 1 BE_PAR(0) ); //write (possibly) trailing data or MIC byte -} // put_frag_finalize - - -/************************************************************************************************************ - * - *.SUBMODULE int put_info( IFBP ifbp, LTVP ltvp ) - *.PURPOSE support routine to handle the "basic" task of hcf_put_info to pass RIDs to the NIC. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * ltvp address in NIC RAM where LVT-records are located - * - *.RETURNS - * HCF_SUCCESS - * >>put_frag - * >>cmd_wait - * - *.DESCRIPTION - * - * - *.DIAGRAM - *20: do not write RIDs to NICs which have incompatible Firmware - *24: If the RID does not exist, the L-field is set to zero. - * Note that some RIDs can not be read, e.g. the pseudo RIDs for direct Hermes commands and CFG_DEFAULT_KEYS - *28: If the RID is written successful, pass it to the NIC by means of an Access Write command - * - *.NOTICE - * The mechanism to HCF_ASSERT on invalid typ-codes in the LTV record is based on the following strategy: - * - some codes (e.g. CFG_REG_MB) are explicitly handled by the HCF which implies that these codes - * are valid. These codes are already consumed by hcf_put_info. - * - all other codes are passed to the Hermes. Before the put action is executed, hcf_get_info is called - * with an LTV record with a value of 1 in the L-field and the intended put action type in the Typ-code - * field. If the put action type is valid, it is also valid as a get action type code - except - * for CFG_DEFAULT_KEYS and CFG_ADD_TKIP_DEFAULT_KEY - so the HCF_ASSERT logic of hcf_get_info should - * not catch. - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -HCF_STATIC int -put_info( IFBP ifbp, LTVP ltvp ) -{ - - int rc = HCF_SUCCESS; - - HCFASSERT( ifbp->IFB_CardStat == 0, MERGE_2( ltvp->typ, ifbp->IFB_CardStat ) ); - HCFASSERT( CFG_RID_CFG_MIN <= ltvp->typ && ltvp->typ <= CFG_RID_CFG_MAX, ltvp->typ ); - - if ( ifbp->IFB_CardStat == 0 && /* 20*/ - ( ( CFG_RID_CFG_MIN <= ltvp->typ && ltvp->typ <= CFG_RID_CFG_MAX ) || - ( CFG_RID_ENG_MIN <= ltvp->typ /* && ltvp->typ <= 0xFFFF */ ) ) ) { -#if HCF_ASSERT //FCC8, FCB0, FCB4, FCB6, FCB7, FCB8, FCC0, FCC4, FCBC, FCBD, FCBE, FCBF - { - hcf_16 t = ltvp->typ; - LTV_STRCT x = { 2, t, {0} }; /*24*/ - hcf_get_info( ifbp, (LTVP)&x ); - if ( x.len == 0 && - ( t != CFG_DEFAULT_KEYS && t != CFG_ADD_TKIP_DEFAULT_KEY && t != CFG_REMOVE_TKIP_DEFAULT_KEY && - t != CFG_ADD_TKIP_MAPPED_KEY && t != CFG_REMOVE_TKIP_MAPPED_KEY && - t != CFG_HANDOVER_ADDR && t != CFG_DISASSOCIATE_ADDR && - t != CFG_FCBC && t != CFG_FCBD && t != CFG_FCBE && t != CFG_FCBF && - t != CFG_DEAUTHENTICATE_ADDR - ) - ) { - HCFASSERT( DO_ASSERT, ltvp->typ ); - } - } -#endif // HCF_ASSERT - - rc = setup_bap( ifbp, ltvp->typ, 0, IO_OUT ); - put_frag( ifbp, (wci_bufp)ltvp, 2*ltvp->len + 2 BE_PAR(2) ); - /*28*/ if ( rc == HCF_SUCCESS ) { - rc = cmd_exe( ifbp, HCMD_ACCESS + HCMD_ACCESS_WRITE, ltvp->typ ); - } - } - return rc; -} // put_info - - -/************************************************************************************************************ - * - *.SUBMODULE int put_info_mb( IFBP ifbp, CFG_MB_INFO_STRCT FAR * ltvp ) - *.PURPOSE accumulates a ( series of) buffers into a single Info block into the MailBox. - * - *.ARGUMENTS - * ifbp address of the Interface Block - * ltvp address of structure specifying the "type" and the fragments of the information to be synthesized - * as an LTV into the MailBox - * - *.RETURNS - * - *.DESCRIPTION - * If the data does not fit (including no MailBox is available), the IFB_MBTally is incremented and an - * error status is returned. - * HCF_ASSERT does not catch. - * Calling put_info_mb when their is no MailBox available, is considered a design error in the MSF. - * - * Note that there is always at least 1 word of unused space in the mail box. - * As a consequence: - * - no problem in pointer arithmetic (MB_RP == MB_WP means unambiguously mail box is completely empty - * - There is always free space to write an L field with a value of zero after each MB_Info block. This - * allows for an easy scan mechanism in the "get MB_Info block" logic. - * - * - *.DIAGRAM - *1: Calculate L field of the MBIB, i.e. 1 for the T-field + the cumulative length of the fragments. - *2: The free space in the MailBox is calculated (2a: free part from Write Ptr to Read Ptr, 2b: free part - * turns out to wrap around) . If this space suffices to store the number of words reflected by len (T-field - * + Value-field) plus the additional MailBox Info L-field + a trailing 0 to act as the L-field of a trailing - * dummy or empty LTV record, then a MailBox Info block is build in the MailBox consisting of - * - the value len in the first word - * - type in the second word - * - a copy of the contents of the fragments in the second and higher word - * - *4: Since put_info_mb() can more or less directly be called from the MSF level, the I/F must be robust - * against out-of-range variables. As failsafe coding, the MB update is skipped by changing tlen to 0 if - * len == 0; This will indirectly cause an assert as result of the violation of the next if clause. - *6: Check whether the free space in MailBox suffices (this covers the complete absence of the MailBox). - * Note that len is unsigned, so even MSF I/F violation works out O.K. - * The '2' in the expression "len+2" is used because 1 word is needed for L itself and 1 word is needed - * for the zero-sentinel - *8: update MailBox Info length report to MSF with "oldest" MB Info Block size. Be careful here, if you get - * here before the MailBox is registered, you can't read from the buffer addressed by IFB_MBp (it is the - * Null buffer) so don't move this code till the end of this routine but keep it where there is garuanteed - * a buffer. - * - *.NOTICE - * boundary testing depends on the fact that IFB_MBSize is guaranteed to be zero if no MailBox is present, - * and to a lesser degree, that IFB_MBWp = IFB_MBRp = 0 - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ - -HCF_STATIC int -put_info_mb( IFBP ifbp, CFG_MB_INFO_STRCT FAR * ltvp ) -{ - - int rc = HCF_SUCCESS; - hcf_16 i; //work counter - hcf_16 *dp; //destination pointer (in MailBox) - wci_recordp sp; //source pointer - hcf_16 len; //total length to copy to MailBox - hcf_16 tlen; //free length/working length/offset in WMP frame - - if ( ifbp->IFB_MBp == NULL ) return rc; //;?not sufficient - HCFASSERT( ifbp->IFB_MBp != NULL, 0 ); //!!!be careful, don't get into an endless recursion - HCFASSERT( ifbp->IFB_MBSize, 0 ); - - len = 1; /* 1 */ - for ( i = 0; i < ltvp->frag_cnt; i++ ) { - len += ltvp->frag_buf[i].frag_len; - } - if ( ifbp->IFB_MBRp > ifbp->IFB_MBWp ) { - tlen = ifbp->IFB_MBRp - ifbp->IFB_MBWp; /* 2a*/ - } else { - if ( ifbp->IFB_MBRp == ifbp->IFB_MBWp ) { - ifbp->IFB_MBRp = ifbp->IFB_MBWp = 0; // optimize Wrapping - } - tlen = ifbp->IFB_MBSize - ifbp->IFB_MBWp; /* 2b*/ - if ( ( tlen <= len + 2 ) && ( len + 2 < ifbp->IFB_MBRp ) ) { //if trailing space is too small but - // leading space is sufficiently large - ifbp->IFB_MBp[ifbp->IFB_MBWp] = 0xFFFF; //flag dummy LTV to fill the trailing space - ifbp->IFB_MBWp = 0; //reset WritePointer to begin of MailBox - tlen = ifbp->IFB_MBRp; //get new available space size - } - } - dp = &ifbp->IFB_MBp[ifbp->IFB_MBWp]; - if ( len == 0 ) { - tlen = 0; //;? what is this good for - } - if ( len + 2 >= tlen ){ /* 6 */ - //Do Not ASSERT, this is a normal condition - IF_TALLY( ifbp->IFB_HCF_Tallies.NoBufMB++ ); - rc = HCF_ERR_LEN; - } else { - *dp++ = len; //write Len (= size of T+V in words to MB_Info block - *dp++ = ltvp->base_typ; //write Type to MB_Info block - ifbp->IFB_MBWp += len + 1; //update WritePointer of MailBox - for ( i = 0; i < ltvp->frag_cnt; i++ ) { // process each of the fragments - sp = ltvp->frag_buf[i].frag_addr; - len = ltvp->frag_buf[i].frag_len; - while ( len-- ) *dp++ = *sp++; - } - ifbp->IFB_MBp[ifbp->IFB_MBWp] = 0; //to assure get_info for CFG_MB_INFO stops - ifbp->IFB_MBInfoLen = ifbp->IFB_MBp[ifbp->IFB_MBRp]; /* 8 */ - } - return rc; -} // put_info_mb - - -/************************************************************************************************************ - * - *.SUBMODULE int setup_bap( IFBP ifbp, hcf_16 fid, int offset, int type ) - *.PURPOSE set up data access to NIC RAM via BAP_1. - * - *.ARGUMENTS - * ifbp address of I/F Block - * fid FID/RID - * offset !!even!! offset in FID/RID - * type IO_IN, IO_OUT - * - *.RETURNS - * HCF_SUCCESS O.K - * HCF_ERR_NO_NIC card is removed - * HCF_ERR_DEFUNCT_TIME_OUT Fatal malfunction detected - * HCF_ERR_DEFUNCT_..... if and only if IFB_DefunctStat <> 0 - * - *.DESCRIPTION - * - * A non-zero return status indicates: - * - the NIC is considered nonoperational, e.g. due to a time-out of some Hermes activity in the past - * - BAP_1 could not properly be initialized - * - the card is removed before completion of the data transfer - * In all other cases, a zero is returned. - * BAP Initialization failure indicates an H/W error which is very likely to signal complete H/W failure. - * Once a BAP Initialization failure has occurred all subsequent interactions with the Hermes will return a - * "defunct" status till the Hermes is re-initialized by means of an hcf_connect. - * - * A BAP is a set of registers (Offset, Select and Data) offering read/write access to a particular FID or - * RID. This access is based on a auto-increment feature. - * There are two BAPs but these days the HCF uses only BAP_1 and leaves BAP_0 to the PCI Busmastering H/W. - * - * The BAP-mechanism is based on the Busy bit in the Offset register (see the Hermes definition). The waiting - * for Busy must occur between writing the Offset register and accessing the Data register. The - * implementation to wait for the Busy bit drop after each write to the Offset register, implies that the - * requirement that the Busy bit is low before the Select register is written, is automatically met. - * BAP-setup may be time consuming (e.g. 380 usec for large offsets occurs frequently). The wait for Busy bit - * drop is protected by a loop counter, which is initialized with IFB_TickIni, which is calibrated in init. - * - * The NIC I/F is optimized for word transfer and can only handle word transfer at a word boundary in NIC - * RAM. The intended solution for transfer of a single byte has multiple H/W flaws. There have been different - * S/W Workaround strategies. RID access is hcf_16 based by "nature", so no byte access problems. For Tx/Rx - * FID access, the byte logic became obsolete by absorbing it in the double word oriented nature of the MIC - * feature. - * - * - *.DIAGRAM - * - *2: the test on rc checks whether the HCF went into "defunct" mode ( e.g. BAP initialization or a call to - * cmd_wait did ever fail). - *4: the select register and offset register are set - * the offset register is monitored till a successful condition (no busy bit) is detected or till the - * (calibrated) protection counter expires - * If the counter expires, this is reflected in IFB_DefunctStat, so all subsequent calls to setup_bap fail - * immediately ( see 2) - *6: initialization of the carry as used by pet/get_frag - *8: HREG_OFFSET_ERR is ignored as error because: - * a: the Hermes is robust against it - * b: it is not known what causes it (probably a bug), hence no strategy can be specified which level is - * to handle this error in which way. In the past, it could be induced by the MSF level, e.g. by calling - * hcf_rcv_msg while there was no Rx-FID available. Since this is an MSF-error which is caught by ASSERT, - * there is no run-time action required by the HCF. - * Lumping the Offset error in with the Busy bit error, as has been done in the past turns out to be a - * disaster or a life saver, just depending on what the cause of the error is. Since no prediction can be - * done about the future, it is "felt" to be the best strategy to ignore this error. One day the code was - * accompanied by the following comment: - * // ignore HREG_OFFSET_ERR, someone, supposedly the MSF programmer ;) made a bug. Since we don't know - * // what is going on, we might as well go on - under management pressure - by ignoring it - * - *.ENDDOC END DOCUMENTATION - * - ************************************************************************************************************/ -HCF_STATIC int -setup_bap( IFBP ifbp, hcf_16 fid, int offset, int type ) -{ - PROT_CNT_INI; - int rc; - - HCFTRACE( ifbp, HCF_TRACE_STRIO ); - rc = ifbp->IFB_DefunctStat; - if (rc == HCF_SUCCESS) { /*2*/ - OPW( HREG_SELECT_1, fid ); /*4*/ - OPW( HREG_OFFSET_1, offset ); - if ( type == IO_IN ) { - ifbp->IFB_CarryIn = 0; - } - else ifbp->IFB_CarryOut = 0; - HCF_WAIT_WHILE( IPW( HREG_OFFSET_1) & HCMD_BUSY ); - HCFASSERT( !( IPW( HREG_OFFSET_1) & HREG_OFFSET_ERR ), MERGE_2( fid, offset ) ); /*8*/ - if ( prot_cnt == 0 ) { - HCFASSERT( DO_ASSERT, MERGE_2( fid, offset ) ); - rc = ifbp->IFB_DefunctStat = HCF_ERR_DEFUNCT_TIME_OUT; - ifbp->IFB_CardStat |= CARD_STAT_DEFUNCT; - } - } - HCFTRACE( ifbp, HCF_TRACE_STRIO | HCF_TRACE_EXIT ); - return rc; -} // setup_bap - diff --git a/drivers/staging/wlags49_h2/hcf.h b/drivers/staging/wlags49_h2/hcf.h deleted file mode 100644 index 71b44653690c..000000000000 --- a/drivers/staging/wlags49_h2/hcf.h +++ /dev/null @@ -1,394 +0,0 @@ - -#ifndef HCF_H -#define HCF_H 1 - -/************************************************************************************************************ -* -* FILE : hcf.h -* -* DATE : $Date: 2004/08/05 11:47:10 $ $Revision: 1.7 $ -* Original: 2004/05/19 07:26:01 Revision: 1.56 Tag: hcf7_t20040602_01 -* Original: 2004/05/12 08:47:23 Revision: 1.53 Tag: hcf7_t7_20040513_01 -* Original: 2004/04/15 09:24:42 Revision: 1.46 Tag: hcf7_t7_20040415_01 -* Original: 2004/04/08 15:18:16 Revision: 1.45 Tag: t7_20040413_01 -* Original: 2004/04/01 15:32:55 Revision: 1.43 Tag: t7_20040401_01 -* Original: 2004/03/10 15:39:28 Revision: 1.39 Tag: t20040310_01 -* Original: 2004/03/04 11:03:38 Revision: 1.37 Tag: t20040304_01 -* Original: 2004/03/02 14:51:21 Revision: 1.35 Tag: t20040302_03 -* Original: 2004/02/24 13:00:28 Revision: 1.28 Tag: t20040224_01 -* Original: 2004/02/09 14:50:14 Revision: 1.26 Tag: t20040219_01 -* -* AUTHOR : Nico Valster -* -* SPECIFICATION: .......... -* -* DESC : Definitions and Prototypes for MSF as well as HCF sources -* -* Customizable via HCFCFG.H -* -* -************************************************************************************************************** - -************************************************************************************************************** -* -* -* SOFTWARE LICENSE -* -* This software is provided subject to the following terms and conditions, -* which you should read carefully before using the software. Using this -* software indicates your acceptance of these terms and conditions. If you do -* not agree with these terms and conditions, do not use the software. -* -* COPYRIGHT © 1994 - 1995 by AT&T. All Rights Reserved -* COPYRIGHT © 1996 - 2000 by Lucent Technologies. All Rights Reserved -* COPYRIGHT © 2001 - 2004 by Agere Systems Inc. All Rights Reserved -* All rights reserved. -* -* Redistribution and use in source or binary forms, with or without -* modifications, are permitted provided that the following conditions are met: -* -* . Redistributions of source code must retain the above copyright notice, this -* list of conditions and the following Disclaimer as comments in the code as -* well as in the documentation and/or other materials provided with the -* distribution. -* -* . Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following Disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* . Neither the name of Agere Systems Inc. nor the names of the contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. -* -* Disclaimer -* -* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -* INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF -* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY -* USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN -* RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGE. -* -* -*************************************************************************************************************/ - - -#include "hcfcfg.h" // System Constants to be defined by the MSF-programmer to tailor the HCF -#include "mdd.h" // Include file common for HCF, MSF - - -/************************************************************************************************/ -/************************************** MACROS ************************************************/ -/************************************************************************************************/ - -#define LOF(x) (sizeof(x)/sizeof(hcf_16)-1) - -/* Endianness - * Little Endian (a.k.a. Intel), least significant byte first - * Big Endian (a.k.a. Motorola), most significant byte first - * - * The following macros are supplied - * o CNV_LITTLE_TO_SHORT(w) interprets the 16-bits input value as Little Endian, returns an hcf_16 - * o CNV_BIG_TO_SHORT(w) interprets the 16-bits input value as Big Endian, returns an hcf_16 - * - */ - -/* To increase portability, use unsigned char and unsigned char * when accessing parts of larger - * types to convert their Endianness - */ - -#define CNV_END_SHORT(w) (hcf_16)( ((hcf_16)(w) & 0x00FF) << 8 | ((hcf_16)(w) & 0xFF00) >> 8 ) -#define CNV_END_LONG(dw) (hcf_32)( (dw >> 24) | ((dw >> 8) & 0xff00) | ((dw << 8) & 0xff0000) | (dw << 24) ) - -#if HCF_BIG_ENDIAN -//******************************************** B I G E N D I A N ******************************************* -#define CNV_LITTLE_TO_SHORT(w) CNV_END_SHORT(w) // endianness conversion needed -#define CNV_BIG_TO_SHORT(w) (w) // no endianness conversion needed -#define CNV_LITTLE_TO_LONG(dw) CNV_END_LONG(dw) -#define CNV_LONG_TO_LITTLE(dw) CNV_END_LONG(dw) -#else -//****************************************** L I T T L E E N D I A N **************************************** -#define CNV_LITTLE_TO_SHORT(w) (w) // no endianness conversion needed -#define CNV_BIG_TO_SHORT(w) CNV_END_SHORT(w) // endianness conversion needed -#define CNV_LITTLE_TO_LONG(dw) (dw) -#define CNV_LONG_TO_LITTLE(dw) (dw) - -#if defined HCF_ALIGN && HCF_ALIGN > 1 -#define CNV_SHORTP_TO_LITTLE(pw) ((hcf_16)(*(hcf_8 *)pw)) | ((hcf_16)(*((hcf_8 *)pw+1)) << 8) -#define CNV_LONGP_TO_LITTLE(pdw) ((hcf_32)(*(hcf_8 *)pdw)) | ((hcf_32)(*((hcf_8 *)pdw+1)) << 8) | \ - ((hcf_32)(*((hcf_8 *)pdw+2)) << 16) | ((hcf_32)(*((hcf_8 *)pdw+3)) << 24) -#else -#define CNV_LONGP_TO_LITTLE(pdw) (*(hcf_32 *)pdw) -#define CNV_SHORTP_TO_LITTLE(pw) (*(hcf_16 *)pw) -#endif - -#endif // HCF_BIG_ENDIAN - -// conversion macros which can be expressed in other macros -#define CNV_SHORT_TO_LITTLE(w) CNV_LITTLE_TO_SHORT(w) -#define CNV_SHORT_TO_BIG(w) CNV_BIG_TO_SHORT(w) - -/************************************************************************************************/ -/************************************** END OF MACROS *****************************************/ -/************************************************************************************************/ - -/***********************************************************************************************************/ -/***************** ****************************************/ -/***********************************************************************************************************/ - -// offsets Transmit/Receive Frame Structure -#define HFS_STAT 0x0000 -#define HFS_SWSUP 0x0006 //SW Support -#define HFS_Q_INFO 0x0006 //Signal/Silence level -#define HFS_RATE 0x0008 //RxFlow/Rate -#define HFS_STAT_ERR RX_STAT_ERR //link "natural" HCF name to "natural" MSF name -#define HFS_TX_CNTL 0x0036 - // H-I H-II -#define HFS_DAT_LEN (HFS_ADDR_DEST - 2) // 0x002C 0x0038 -#define HFS_ADDR_DEST 0x003A // 0x002E 0x003A -#define HFS_ADDR_SRC (HFS_ADDR_DEST + 6) // 0x0034 0x0040 -#define HFS_LEN (HFS_ADDR_SRC + 6) // 0x003A 0x0046 -#define HFS_DAT (HFS_LEN + 2) // 0x003C 0x0048 -#define HFS_TYPE (HFS_DAT + 6) // 0x0042 0x004E - - -//============================= D E S C R I P T O R S T R U C T U R E ============================== -//;?MDD.H stuff ;? - -#if HCF_BIG_ENDIAN -#define DESC_STRCT_CNT 0 -#define DESC_STRCT_SIZE 1 -#else -#define DESC_STRCT_CNT 1 -#define DESC_STRCT_SIZE 0 -#endif // HCF_BIG_ENDIAN - -#define BUF_CNT buf_dim[DESC_STRCT_CNT] -#define BUF_SIZE buf_dim[DESC_STRCT_SIZE] - -typedef struct DESC_STRCT { - hcf_16 buf_dim[2]; - hcf_32 buf_phys_addr; - hcf_32 next_desc_phys_addr; // physical address of next descriptor - hcf_32 desc_phys_addr; // physical address of this descriptor - struct DESC_STRCT *next_desc_addr; - hcf_8 FAR *buf_addr; -#if (HCF_EXT) & HCF_EXT_DESC_STRCT - void FAR *DESC_MSFSup; // pointer for arbitrary use by the MSF -#endif // HCF_DESC_STRCT_EXT -} DESC_STRCT; - -#define HCF_DASA_SIZE 12 //size in bytes for DA/SA - -#define DESC_CNT_MASK 0x0FFF - -#define GET_BUF_SIZE(descp) ((descp)->BUF_SIZE) -#define GET_BUF_CNT(descp) ((descp)->BUF_CNT) -#define SET_BUF_SIZE(descp, size) (descp)->BUF_SIZE = size; -#define SET_BUF_CNT(descp, count) (descp)->BUF_CNT = count; - -//========================================= T A L L I E S =================================================== - -typedef struct { //Hermes Tallies (IFB substructure) - hcf_32 TxUnicastFrames; - hcf_32 TxMulticastFrames; - hcf_32 TxFragments; - hcf_32 TxUnicastOctets; - hcf_32 TxMulticastOctets; - hcf_32 TxDeferredTransmissions; - hcf_32 TxSingleRetryFrames; - hcf_32 TxMultipleRetryFrames; - hcf_32 TxRetryLimitExceeded; - hcf_32 TxDiscards; - hcf_32 RxUnicastFrames; - hcf_32 RxMulticastFrames; - hcf_32 RxFragments; - hcf_32 RxUnicastOctets; - hcf_32 RxMulticastOctets; - hcf_32 RxFCSErrors; - hcf_32 RxDiscardsNoBuffer; - hcf_32 TxDiscardsWrongSA; - hcf_32 RxWEPUndecryptable; - hcf_32 RxMsgInMsgFragments; - hcf_32 RxMsgInBadMsgFragments; - hcf_32 RxDiscardsWEPICVError; - hcf_32 RxDiscardsWEPExcluded; -#if (HCF_EXT) & HCF_EXT_TALLIES_FW - hcf_32 TalliesExtra[32]; -#endif // HCF_EXT_TALLIES_FW -} CFG_HERMES_TALLIES_STRCT; - -typedef struct { //HCF Tallies (IFB substructure) - hcf_32 NoBufInfo; //No buffer available for unsolicited Notify frame - hcf_32 NoBufMB; //No space available in MailBox - hcf_32 MiscErr; /* Command errors - * - time out on completion synchronous part Hermes Command - * - completed Hermes Command doesn't match original command - * - status of completed Hermes Command contains error bits - */ -#if (HCF_EXT) & HCF_EXT_TALLIES_FW - hcf_32 EngCnt[8]; -#endif // HCF_EXT_TALLIES_FW -} CFG_HCF_TALLIES_STRCT; - -//Note this way to define ..._TAL_CNT implies that all tallies must keep the same (hcf_32) size -#if (HCF_TALLIES) & ( HCF_TALLIES_NIC | HCF_TALLIES_HCF ) -#if (HCF_TALLIES) & HCF_TALLIES_NIC //Hermes tally support -#define HCF_NIC_TAL_CNT (sizeof(CFG_HERMES_TALLIES_STRCT)/ sizeof(hcf_32)) -#else -#define HCF_NIC_TAL_CNT 0 -#endif // HCF_TALLIES -#if (HCF_TALLIES) & HCF_TALLIES_HCF //HCF tally support -#define HCF_HCF_TAL_CNT (sizeof(CFG_HCF_TALLIES_STRCT) / sizeof(hcf_32)) -#else -#define HCF_HCF_TAL_CNT 0 -#endif // HCF_TALLIES -#define HCF_TOT_TAL_CNT ( HCF_NIC_TAL_CNT + HCF_NIC_TAL_CNT ) -#endif // HCF_TALLIES_NIC / HCF_TALLIES_HCF - - -/***********************************************************************************************************/ -/********************************** I N T E R F A C E B L O C K ******************************************/ -/***********************************************************************************************************/ - -#define IFB_VERSION 0x0E // initially 0, to be incremented by every IFB layout change - -typedef struct { - hcf_io IFB_IOBase; // I/O address of Hermes chip as passed by MSF at hcf_connect call - hcf_16 IFB_IORange; // I/O Range used by Hermes chip - hcf_16 IFB_DLMode; // Download Mode state - hcf_16 IFB_Cmd; // cmd in progress flag, to be ack-ed before next cmd can be issued - hcf_16 IFB_RxFID; // FID of "current" RxFS (non-DMA mode) -//;?#if tx_delay option - hcf_16 IFB_TxFID; // fid storage during "delayed" send -//;?#endif tx_delay option - hcf_16 IFB_RxLen; // - hcf_16 IFB_DefunctStat; // BAP initialization or Cmd Completion failed - hcf_16 IFB_ErrCmd; // contents Status reg when error bits and/or mismatch in cmd_wait - hcf_16 IFB_ErrQualifier; // contents Resp0 reg when error bits and/or mismatch in cmd_wait - hcf_16 IFB_lal; // LookAhead Length - wci_bufp IFB_lap; // LookAhead Buffer pointer - hcf_16 IFB_LinkStat; // Link Status - hcf_16 IFB_DSLinkStat; // Link Status, new strategy introduced for DeepSleep - hcf_16 IFB_CarryIn; // carry and carry-flag to move 1 byte from one get_frag to the next - hcf_16 IFB_CarryOut; // carry and carry-flag to move 1 byte from one put_frag to the next - hcf_16 IFB_Version; // IFB_VERSION, incremented by every SIGNIFICANT IFB layout change - hcf_16 IFB_CardStat; // NIC error / F/W incompatibility status - hcf_16 IFB_RscInd; // non-DMA: TxFID available, DMA: always 1 - hcf_16 IFB_CntlOpt; // flags: 32 bits I/O, DMA available, DMA enabled - hcf_16 IFB_BusType; // BusType, derived via CFG_NIC_BUS_TYPE - CFG_FW_IDENTITY_STRCT IFB_FWIdentity; /* keep FWIdentity/Sup and PRIIdentity/Sup in sequence - * because of the (dumb) copy in init() */ -#if defined MSF_COMPONENT_ID - CFG_SUP_RANGE_STRCT IFB_FWSup; - CFG_PRI_IDENTITY_STRCT IFB_PRIIdentity; - CFG_SUP_RANGE_STRCT IFB_PRISup; - CFG_SUP_RANGE_STRCT IFB_HSISup; -#endif // MSF_COMPONENT_ID -#if (HCF_EXT) & HCF_EXT_INFO_LOG - RID_LOGP IFB_RIDLogp; // pointer to RID_LOG structure -#endif // HCF_EXT_INFO_LOG -#if HCF_PROT_TIME - hcf_32 IFB_TickIni; // initialization of S/W counter based protection loop -#endif // HCF_PROT_TIME -#if (HCF_EXT) & HCF_EXT_INT_TICK - int IFB_TickCnt; // Hermes Timer Tick Counter -#endif // HCF_EXT_INT_TICK - hcf_16 *IFB_MBp; // pointer to the MailBox - hcf_16 IFB_MBSize; // size of the MailBox - hcf_16 IFB_MBWp; // zero-based write index into the MailBox - hcf_16 IFB_MBRp; // zero-based read index into the MailBox - hcf_16 IFB_MBInfoLen; // contents of L-field of the oldest available MailBoxInfoBlock -#if (HCF_TYPE) & HCF_TYPE_WPA - hcf_16 IFB_MICTxCntl; // MIC bit and Key index in TxControl field of TxFS - hcf_32 IFB_MICTxKey[2]; // calculating key - hcf_32 IFB_MICTx[2]; // Tx MIC calculation Engine state - hcf_16 IFB_MICTxCarry; // temp length, carries over from one Tx fragment to another - hcf_16 IFB_MICRxCarry; // temp length, carries over from one Rx fragment to another - hcf_32 IFB_MICRxKey[4*2]; // 4 checking keys - hcf_32 IFB_MICRx[2]; // Rx MIC calculation Engine state -#endif // HCF_TYPE_WPA -#if HCF_ASSERT -#if (HCF_ASSERT) & HCF_ASSERT_MB - CFG_MB_INFO_RANGE1_STRCT IFB_AssertStrct; // Add some complication to the HCF as prize for the new MSF I/F -#endif // HCF_ASSERT_MB - // target of above IFB_AssertStrct - hcf_16 IFB_AssertLine; // - line number ( + encoded module name ) - hcf_16 IFB_AssertTrace; // - bit based trace of all hcf_.... invocations - hcf_32 IFB_AssertQualifier; // - qualifier - hcf_16 IFB_AssertLvl; // Assert Filtering, Not yet implemented - hcf_16 IFB_AssertWhere; // Where parameter of the Assert macro -#if (HCF_ASSERT) & ( HCF_ASSERT_LNK_MSF_RTN | HCF_ASSERT_RT_MSF_RTN ) - MSF_ASSERT_RTNP IFB_AssertRtn; // MSF Assert Call back routine (inspired by GEF, DrDobbs Nov 1998 ) -#endif // HCF_ASSERT_LNK_MSF_RTN -#if (HCF_ASSERT) & HCF_ASSERT_PRINTF // engineering facilty intended as F/W debugging aid - hcf_16 IFB_DbgPrintF_Cnt; - CFG_FW_PRINTF_BUFFER_LOCATION_STRCT IFB_FwPfBuff; -#endif // HCF_ASSERT_PRINTF -#endif // HCF_ASSERT - hcf_16 volatile IFB_IntOffCnt; // 0xFFFF based HCF_ACT_INT_OFF nesting counter, DeepSleep flag -#if (HCF_TALLIES) & ( HCF_TALLIES_NIC | HCF_TALLIES_HCF ) //Hermes and/or HCF tally support - hcf_32 IFB_Silly_you_should_align; //;? - hcf_16 IFB_TallyLen; // Tally length (to build an LTV) - hcf_16 IFB_TallyTyp; // Tally Type (to build an LTV) -#endif // HCF_TALLIES_NIC / HCF_TALLIES_HCF -#if (HCF_TALLIES) & HCF_TALLIES_NIC //Hermes tally support - CFG_HERMES_TALLIES_STRCT IFB_NIC_Tallies; -#endif // HCF_TALLIES_NIC -#if (HCF_TALLIES) & HCF_TALLIES_HCF //HCF tally support - CFG_HCF_TALLIES_STRCT IFB_HCF_Tallies; -#endif // HCF_TALLIES_HCF -#if HCF_DMA - //used for a pool of destination_address descriptor/buffers, used during tx encapsulation points to the - //first/last descriptor in the descriptor chain, so we can easily remove and append a packet. - DESC_STRCT *IFB_FirstDesc[2]; - DESC_STRCT *IFB_LastDesc[2]; - DESC_STRCT *IFB_ConfinedDesc[2]; // pointers to descriptor used for host reclaim purposes. - hcf_16 IFB_DmaPackets; // HREG_EV_[TX/RX]DMA_DONE flags, reports DMA Frame availability to MSF -#endif // HCF_DMA -#if (HCF_EXT) & HCF_EXT_INT_TX_EX - hcf_16 IFB_TxFsStat; // Tx message monitoring - hcf_16 IFB_TxFsGap[2]; //;?make this robust - hcf_16 IFB_TxFsSwSup; -#endif // HCF_EXT_INT_TX_EX - hcf_16 IFB_Magic; /* "Magic" signature, to help the debugger interpret a memory dump - * also the last field cleared at hcf_connect - */ -#if (HCF_EXT) & HCF_EXT_IFB_STRCT // for usage by the MSF - void FAR *IFB_MSFSup; // pointer for arbitrary use by the MSF -#endif // HCF_EXT_IFB_STRCT_EXT -} IFB_STRCT; - -typedef IFB_STRCT* IFBP; - - -/***********************************************************************************************************/ -/********************** W C I F U N C T I O N S P R O T O T Y P E S ******************************/ -/***********************************************************************************************************/ - -EXTERN_C int hcf_action(IFBP ifbp, hcf_16 cmd); -EXTERN_C int hcf_connect(IFBP ifbp, hcf_io io_base); -EXTERN_C int hcf_get_info(IFBP ifbp, LTVP ltvp); -EXTERN_C int hcf_service_nic(IFBP ifbp, wci_bufp bufp, unsigned int len); -EXTERN_C int hcf_cntl(IFBP ifbp, hcf_16 cmd); -EXTERN_C int hcf_put_info(IFBP ifbp, LTVP ltvp); -EXTERN_C int hcf_rcv_msg(IFBP ifbp, DESC_STRCT *descp, unsigned int offset); -EXTERN_C int hcf_send_msg(IFBP ifbp, DESC_STRCT *dp, hcf_16 tx_cntl); -#if HCF_DMA -EXTERN_C void hcf_dma_tx_put(IFBP ifbp, DESC_STRCT *d, hcf_16 tx_cntl); -EXTERN_C DESC_STRCT* hcf_dma_tx_get (IFBP ifbp ); -EXTERN_C DESC_STRCT* hcf_dma_rx_get (IFBP ifbp ); -EXTERN_C void hcf_dma_rx_put(IFBP ifbp, DESC_STRCT *d); -#endif // HCF_DMA -#if (HCF_ASSERT) & HCF_ASSERT_LNK_MSF_RTN -EXTERN_C void msf_assert(unsigned int line_number, hcf_16 trace, hcf_32 qual); -#endif // HCF_ASSERT_LNK_MSF_RTN - -#endif // HCF_H - diff --git a/drivers/staging/wlags49_h2/hcfcfg.h b/drivers/staging/wlags49_h2/hcfcfg.h deleted file mode 100644 index 869b5c343a86..000000000000 --- a/drivers/staging/wlags49_h2/hcfcfg.h +++ /dev/null @@ -1,785 +0,0 @@ - -#ifndef HCFCFG_H -#define HCFCFG_H 1 - -/************************************************************************************************************* -* -* FILE : hcfcfg.tpl // hcfcfg.h -* -* DATE : $Date: 2004/08/05 11:47:10 $ $Revision: 1.6 $ -* Original: 2004/04/08 15:18:16 Revision: 1.40 Tag: t20040408_01 -* Original: 2004/04/01 15:32:55 Revision: 1.38 Tag: t7_20040401_01 -* Original: 2004/03/10 15:39:28 Revision: 1.34 Tag: t20040310_01 -* Original: 2004/03/03 14:10:12 Revision: 1.32 Tag: t20040304_01 -* Original: 2004/03/02 09:27:12 Revision: 1.30 Tag: t20040302_03 -* Original: 2004/02/24 13:00:28 Revision: 1.25 Tag: t20040224_01 -* Original: 2004/02/18 17:13:57 Revision: 1.23 Tag: t20040219_01 -* -* AUTHOR : Nico Valster -* -* DESC : HCF Customization Macros -* hcfcfg.tpl list all #defines which must be specified to: -* adjust the HCF functions defined in HCF.C to the characteristics of a specific environment -* o maximum sizes for messages -* o Endianness -* Compiler specific macros -* o port I/O macros -* o type definitions -* -* By copying HCFCFG.TPL to HCFCFG.H and -if needed- modifying the #defines the WCI functionality can be -* tailored -* -* Supported environments: -* WVLAN_41 Miniport NDIS 3.1 -* WVLAN_42 Packet Microsoft Visual C 1.5 -* WVLAN_43 16 bits DOS ODI Microsoft Visual C 1.5 -* WVLAN_44 32 bits ODI (__NETWARE_386__) WATCOM -* WVLAN_45 MAC_OS MPW?, Symantec? -* WVLAN_46 Windows CE (_WIN32_WCE) Microsoft ? -* WVLAN_47 LINUX (__LINUX__) GCC, discarded, based on GPL'ed HCF-light -* WVLAN_48 Miniport NDIS 5 -* WVLAN_49 LINUX (__LINUX__) GCC, originally based on pre-compiled HCF_library -* migrated to use the HCF sources when Lucent Technologies -* brought the HCF module under GPL -* WVLAN_51 Miniport USB NDIS 5 -* WVLAN_52 Miniport NDIS 4 -* WVLAN_53 VxWorks END Station driver -* WVLAN_54 VxWorks END Access Point driver -* WVLAN_81 WavePoint BORLAND C -* WCITST Inhouse test tool Microsoft Visual C 1.5 -* WSU WaveLAN Station Update Microsoft Visual C ?? -* SCO UNIX not yet actually used ? ? -* __ppc OEM supplied ? -* _AM29K OEM supplied ? -* ? OEM supplied Microtec Research 80X86 Compiler -* -************************************************************************************************************** -* -* -* SOFTWARE LICENSE -* -* This software is provided subject to the following terms and conditions, -* which you should read carefully before using the software. Using this -* software indicates your acceptance of these terms and conditions. If you do -* not agree with these terms and conditions, do not use the software. -* -* COPYRIGHT © 1994 - 1995 by AT&T. All Rights Reserved -* COPYRIGHT © 1996 - 2000 by Lucent Technologies. All Rights Reserved -* COPYRIGHT © 2001 - 2004 by Agere Systems Inc. All Rights Reserved -* All rights reserved. -* -* Redistribution and use in source or binary forms, with or without -* modifications, are permitted provided that the following conditions are met: -* -* . Redistributions of source code must retain the above copyright notice, this -* list of conditions and the following Disclaimer as comments in the code as -* well as in the documentation and/or other materials provided with the -* distribution. -* -* . Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following Disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* . Neither the name of Agere Systems Inc. nor the names of the contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. -* -* Disclaimer -* -* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -* INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF -* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY -* USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN -* RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGE. -* -* -*************************************************************************************************************/ - -/* Alignment -* Some platforms can access words on odd boundaries (with possibly an performance impact), at other -* platforms such an access may result in a memory access violation. -* It is assumed that everywhere where the HCF casts a char pointer into a word pointer, the alignment -* criteria are met. This put some restrictions on the MSF, which are assumed to be "automatically" fulfilled -* at the applicable platforms -* To assert this assumption, the macro HCF_ALIGN can be defined. The default value is 1, meaning byte -* alignment (or no alignment), a value of 2 means word alignment, a value of 4 means double word alignment -*/ - -/***************************** IN_PORT_STRING_8_16 S a m p l e s ***************************************** - - // C implementation which let the processor handle the word-at-byte-boundary problem -#define IN_PORT_STRING_8_16( port, addr, n) while ( n-- ) \ - { *(hcf_16 FAR*)addr = IN_PORT_WORD( port ); ((hcf_8 FAR*)addr)+=2; } - - // C implementation which handles the word-at-byte-boundary problem -#define IN_PORT_STRING_8_16( port, addr, n) while ( n-- ) \ - { hcf_16 i = IN_PORT_WORD(port); *((hcf_8 FAR*)addr)++ = (hcf_8)i; *((hcf_8 FAR*)addr)++ = (hcf_8)(i>>8);} - - // Assembler implementation -#define IN_PORT_STRING_8_16( port, addr, len) __asm \ -{ \ - __asm push di \ - __asm push es \ - __asm mov cx,len \ - __asm les di,addr \ - __asm mov dx,port \ - __asm rep insw \ - __asm pop es \ - __asm pop di \ -} - - -***************************** OUT_PORT_STRING_8_16 S a m p l e s ****************************************** - - // C implementation which let the processor handle the word-at-byte-boundary problem -#define OUT_PORT_STRING_8_16( port, addr, n) while ( n-- ) \ - { OUT_PORT_WORD( port, *(hcf_16 FAR*)addr ) ; ((hcf_8 FAR*)addr)+=2; } - - // C implementation which handles the word-at-byte-boundary problem -#define OUT_PORT_STRING_8_16( port, addr, n) while ( n-- ) \ - { OUT_PORT_WORD( port, *((hcf_8 FAR*)addr) | *(((hcf_8 FAR*)addr)+1)<<8 ); (hcf_8 FAR*)addr+=2; } - - // Assembler implementation -#define OUT_PORT_STRING_8_16( port, addr, len) __asm \ -{ \ - __asm push si \ - __asm push ds \ - __asm mov cx,len \ - __asm lds si,addr \ - __asm mov dx,port \ - __asm rep outsw \ - __asm pop ds \ - __asm pop si \ -} - -*************************************************************************************************************/ - - -/************************************************************************************************/ -/****************** C O M P I L E R S P E C I F I C M A C R O S ***************************/ -/************************************************************************************************/ -/************************************************************************************************* -* -* !!!!!!!!!!!!!!!!!!!!!!!!! Note to the HCF-implementor !!!!!!!!!!!!!!!!!!!!!!!!! -* !!!! Do not call these macros with parameters which introduce side effects !!!! -* !!!!!!!!!!!!!!!!!!!!!!!!! Note to the HCF-implementor !!!!!!!!!!!!!!!!!!!!!!!!! -* -* -* By selecting the appropriate Macro definitions by means of modifying the "#ifdef 0/1" lines, the HCF can be -* adjusted for the I/O characteristics of a specific compiler -* -* If needed the macros can be modified or replaced with definitions appropriate for your personal platform. -* If you need to make such changes it is appreciated if you inform Agere Systems -* That way the changes can become part of the next release of the WCI -* -* For convenience of the MSF-programmer, all macros are allowed to modify their parameters (although some -* might argue that this would constitute bad coding practice). This has its implications on the HCF, e.g. as a -* consequence these macros should not be called with parameters which have side effects, e.g auto-increment. -* -* in the Microsoft implementation of inline assembly it is O.K. to corrupt all flags except the direction flag -* and to corrupt all registers except the segment registers and EDI, ESI, ESP and EBP (or their 16 bits -* equivalents). Other environments may have other constraints -* -* in the Intel environment it is O.K to have a word (as a 16 bits quantity) at a byte boundary, hence -* IN_/OUT_PORT_STRING_8_16 can move words between PC-memory and NIC-memory with as only constraint that the -* words are on a word boundary in NIC-memory. This does not hold true for all conceivable environments, e.g. -* an Motorola 68xxx does not allow this. Probably/hopefully the boundary conditions imposed by these type of -* platforms prevent this case from materializing. If this is not the case, OUT_PORT_STRING_8_16 must be coded -* by combining two Host memory hcf_8 values at a time to a single hcf_16 value to be passed to the NIC and -* IN_PORT_STRING_8_16 the single hcf_16 retrieved from the NIC must be split in two hcf_8 values to be stored -* in Host memory (see the sample code above) -* -* The prototypes and functional description of the macros are: -* -* hcf_16 IN_PORT_WORD( hcf_16 port ) -* Reads a word (16 bits) from the specified port -* -* void OUT_PORT_WORD( hcf_16 port, hcf_16 value) -* Writes a word (16 bits) to the specified port -* -* hcf_16 IN_PORT_DWORD( hcf_16 port ) -* Reads a dword (32 bits) from the specified port -* -* void OUT_PORT_DWORD( hcf_16 port, hcf_32 value) -* Writes a dword (32 bits) to the specified port -* -* void IN_PORT_STRING_8_16( port, addr, len) -* Reads len number of words (16 bits) from NIC memory via the specified port to the (FAR) -* byte-pointer addr in PC-RAM -* Note that len specifies the number of words, NOT the number of bytes -* !!!NOTE, although len specifies the number of words, addr MUST be a char pointer NOTE!!! -* See also the common notes for IN_PORT_STRING_8_16 and OUT_PORT_STRING_8_16 -* -* void OUT_PORT_STRING_8_16( port, addr, len) -* Writes len number of words (16 bits) from the (FAR) byte-pointer addr in PC-RAM via the specified -* port to NIC memory -* Note that len specifies the number of words, NOT the number of bytes. -* !!!NOTE, although len specifies the number of words, addr MUST be a char pointer NOTE!!! -* -* The peculiar combination of word-length and char pointers for IN_PORT_STRING_8_16 as well as -* OUT_PORT_STRING_8_16 is justified by the assumption that it offers a more optimal algorithm -* -* void IN_PORT_STRING_32( port, addr, len) -* Reads len number of double-words (32 bits) from NIC memory via the specified port to the (FAR) -* double-word address addr in PC-RAM -* -* void OUT_PORT_STRING_32( port, addr, len) -* Writes len number of double-words (32 bits) from the (FAR) double-word address addr in PC-RAM via -* the specified port to NIC memory -* -* !!!!!!!!!!!!!!!!!!!!!!!!! Note to the HCF-implementor !!!!!!!!!!!!!!!!!!!!!!!!! -* !!!! Do not call these macros with parameters which introduce side effects !!!! -* !!!!!!!!!!!!!!!!!!!!!!!!! Note to the HCF-implementor !!!!!!!!!!!!!!!!!!!!!!!!! -* -*************************************************************************************************/ - -/**************************** define INT Types ******************************/ -typedef unsigned char hcf_8; -typedef unsigned short hcf_16; -typedef unsigned long hcf_32; - -/**************************** define I/O Types ******************************/ -#define HCF_IO_MEM 0x0001 // memory mapped I/O ( 0: Port I/O ) -#define HCF_IO_32BITS 0x0002 // 32Bits support ( 0: only 16 Bits I/O) - -/****************************** #define HCF_TYPE ********************************/ -#define HCF_TYPE_NONE 0x0000 // No type -#define HCF_TYPE_WPA 0x0001 // WPA support -#define HCF_TYPE_USB 0x0002 // reserved (USB Dongle driver support) -//#define HCF_TYPE_HII 0x0004 // Hermes-II, to discriminate H-I and H-II CFG_HCF_OPT_STRCT -#define HCF_TYPE_WARP 0x0008 // WARP F/W -#define HCF_TYPE_PRELOADED 0x0040 // pre-loaded F/W -#define HCF_TYPE_HII5 0x0080 // Hermes-2.5 H/W -#define HCF_TYPE_CCX 0x0100 // CKIP -#define HCF_TYPE_BEAGLE_HII5 0x0200 // Beagle Hermes-2.5 H/W -#define HCF_TYPE_TX_DELAY 0x4000 // Delayed transmission ( non-DMA only) - -/****************************** #define HCF_ASSERT ******************************/ -#define HCF_ASSERT_NONE 0x0000 // No assert support -#define HCF_ASSERT_PRINTF 0x0001 // Hermes generated debug info -#define HCF_ASSERT_SW_SUP 0x0002 // logging via Hermes support register -#define HCF_ASSERT_MB 0x0004 // logging via Mailbox -#define HCF_ASSERT_RT_MSF_RTN 0x4000 // dynamically binding of msf_assert routine -#define HCF_ASSERT_LNK_MSF_RTN 0x8000 // statically binding of msf_assert routine - -/****************************** #define HCF_ENCAP *******************************/ -#define HCF_ENC_NONE 0x0000 // No encapsulation support -#define HCF_ENC 0x0001 // HCF handles En-/Decapsulation -#define HCF_ENC_SUP 0x0002 // HCF supports MSF to handle En-/Decapsulation - -/****************************** #define HCF_EXT *********************************/ -#define HCF_EXT_NONE 0x0000 // No expanded features -#define HCF_EXT_INFO_LOG 0x0001 // logging of Hermes Info frames -//#define HCF_EXT_INT_TX_OK 0x0002 // RESERVED!!! monitoring successful Tx message -#define HCF_EXT_INT_TX_EX 0x0004 // monitoring unsuccessful Tx message -//#define HCF_EXT_MON_MODE 0x0008 // LEGACY -#define HCF_EXT_TALLIES_FW 0x0010 // support for up to 32 Hermes Engineering tallies -#define HCF_EXT_TALLIES_HCF 0x0020 // support for up to 8 HCF Engineering tallies -#define HCF_EXT_NIC_ACCESS 0x0040 // direct access via Aux-ports and to Hermes registers and commands -#define HCF_EXT_MB 0x0080 // MailBox code expanded -#define HCF_EXT_IFB_STRCT 0x0100 // MSF custom pointer in IFB -#define HCF_EXT_DESC_STRCT 0x0200 // MSF custom pointer in Descriptor -#define HCF_EXT_TX_CONT 0x4000 // Continuous transmit test -#define HCF_EXT_INT_TICK 0x8000 // enables TimerTick interrupt generation - -/****************************** #define HCF_SLEEP *******************************/ -#define HCF_DDS 0x0001 // Disconnected Deep Sleep -#define HCF_CDS 0x0002 // Connected Deep Sleep - -/****************************** #define HCF_TALLIES ******************************/ -#define HCF_TALLIES_NONE 0x0000 // No tally support -#define HCF_TALLIES_NIC 0x0001 // Hermes Tallies accumulated in IFB -#define HCF_TALLIES_HCF 0x0002 // HCF Tallies accumulated in IFB -#define HCF_TALLIES_RESET 0x8000 // Tallies in IFB are reset when reported via hcf_get_info - -/************************************************************************************************/ -/****************************************** L I N U X *****************************************/ -/************************************************************************************************/ - -#ifdef WVLAN_49 -#include -//#include -#include - -/* The following macro ensures that no symbols are exported, minimizing the chance of a symbol - collision in the kernel */ -//EXPORT_NO_SYMBOLS; //;?this place seems not appropriately to me - -//#define HCF_SLEEP (HCF_CDS | HCF_DDS ) -#define HCF_SLEEP (HCF_CDS) - -/* Note: Non-WARP firmware all support WPA. However the original Agere - * linux driver does not enable WPA. Enabling WPA here causes whatever - * preliminary WPA logic to be included, some of which may be specific - * to HERMESI. - * - * Various comment are clear that WARP and WPA are not compatible - * (which may just mean WARP does WPA in a different fashion). - */ - -/* #define HCF_TYPE (HCF_TYPE_HII5|HCF_TYPE_STA|HCF_TYPE_AP) */ -#ifdef HERMES25 -#ifdef WARP -#define HCF_TYPE ( HCF_TYPE_WARP | HCF_TYPE_HII5 ) -#else -#define HCF_TYPE (HCF_TYPE_HII5 | HCF_TYPE_WPA) -#endif /* WARP */ -#else -#define HCF_TYPE HCF_TYPE_WPA -#endif /* HERMES25 */ - -#ifdef ENABLE_DMA -#define HCF_DMA 1 -#endif // ENABLE_DMA - -/* We now need a switch to include support for the Mailbox and other necessary extensions */ -#define HCF_EXT ( HCF_EXT_MB | HCF_EXT_INFO_LOG | HCF_EXT_INT_TICK )//get deepsleep exercise going - -/* ;? The Linux MSF still uses these definitions; define it here until it's removed */ -#ifndef HCF_TYPE_HII -#define HCF_TYPE_HII 0x0004 -#endif - -#ifndef HCF_TYPE_AP -#define HCF_TYPE_AP 0x0010 -#endif - -#ifndef HCF_TYPE_STA -#define HCF_TYPE_STA 0x0020 -#endif // HCF_TYPE_STA - -/* Guarantees word alignment */ -#define HCF_ALIGN 2 - -/* Endian macros CNV_INT_TO_LITTLE() and CNV_LITTLE_TO_INT() were renamed to - CNV_SHORT_TO_LITTLE() and CNV_LITTLE_TO_SHORT() */ -#ifndef CNV_INT_TO_LITTLE -#define CNV_INT_TO_LITTLE CNV_SHORT_TO_LITTLE -#endif - -#ifndef CNV_LITTLE_TO_INT -#define CNV_LITTLE_TO_INT CNV_LITTLE_TO_SHORT -#endif - -#define HCF_ERR_BUSY 0x06 - -/* UIL defines were removed from the HCF */ -#define UIL_SUCCESS HCF_SUCCESS -#define UIL_ERR_TIME_OUT HCF_ERR_TIME_OUT -#define UIL_ERR_NO_NIC HCF_ERR_NO_NIC -#define UIL_ERR_LEN HCF_ERR_LEN -#define UIL_ERR_MIN HCF_ERR_MAX /*end of HCF errors which are passed through to UIL - *** ** *** ****** ***** *** ****** ******* ** *** */ -#define UIL_ERR_IN_USE 0x44 -#define UIL_ERR_WRONG_IFB 0x46 -#define UIL_ERR_MAX 0x7F /*upper boundary of UIL errors without HCF-pendant - ***** ******** ** *** ****** ******* *** ******* */ -#define UIL_ERR_BUSY HCF_ERR_BUSY -#define UIL_ERR_DIAG_1 HCF_ERR_DIAG_1 -#define UIL_FAILURE 0xFF /* 20010705 nv this relick should be eridicated */ -#define UIL_ERR_PIF_CONFLICT 0x40 //obsolete -#define UIL_ERR_INCOMP_DRV 0x41 //obsolete -#define UIL_ERR_DOS_CALL 0x43 //obsolete -#define UIL_ERR_NO_DRV 0x42 //obsolete -#define UIL_ERR_NSTL 0x45 //obsolete - - - -#if 0 //;? #ifdef get this going LATER HERMES25 -#define HCF_IO HCF_IO_32BITS -#define HCF_DMA 1 -#define HCF_DESC_STRCT_EXT 4 - -/* Switch for BusMaster DMA support. Note that the above define includes the DMA-specific HCF - code in the build. This define sets the MSF to use DMA; if ENABLE_DMA is not defined, then - port I/O will be used in the build */ -#ifndef BUS_PCMCIA -#define ENABLE_DMA -#endif // USE_PCMCIA - -#endif // HERMES25 - - -/* Overrule standard WaveLAN Packet Size when in DMA mode */ -#ifdef ENABLE_DMA -#define HCF_MAX_PACKET_SIZE 2304 -#else -#define HCF_MAX_PACKET_SIZE 1514 -#endif // ENABLE_DMA - -/* The following sets the component ID, as well as the versioning. See also wl_version.h */ -#define MSF_COMPONENT_ID COMP_ID_LINUX - -#define MSF_COMPONENT_VAR DRV_VARIANT -#define MSF_COMPONENT_MAJOR_VER DRV_MAJOR_VERSION -#define MSF_COMPONENT_MINOR_VER DRV_MINOR_VERSION - -/* Define the following to turn on assertions in the HCF */ -//#define HCF_ASSERT 0x8000 -#define HCF_ASSERT HCF_ASSERT_LNK_MSF_RTN // statically binding of msf_assert routine - -#ifdef USE_BIG_ENDIAN -#define HCF_BIG_ENDIAN 1 -#else -#define HCF_BIG_ENDIAN 0 -#endif /* USE_BIG_ENDIAN */ - -/* Define the following if your system uses memory-mapped IO */ -//#define HCF_MEM_IO - -/* The following defines the standard macros required by the HCF to move data to/from the card */ -#define IN_PORT_BYTE(port) ((hcf_8)inb( (hcf_io)(port) )) -#define IN_PORT_WORD(port) ((hcf_16)inw( (hcf_io)(port) )) -#define OUT_PORT_BYTE(port, value) (outb( (hcf_8) (value), (hcf_io)(port) )) -#define OUT_PORT_WORD(port, value) (outw((hcf_16) (value), (hcf_io)(port) )) - -#define IN_PORT_STRING_16(port, dst, n) insw((hcf_io)(port), dst, n) -#define OUT_PORT_STRING_16(port, src, n) outsw((hcf_io)(port), src, n) -//#define IN_PORT_STRINGL(port, dst, n) insl((port), (dst), (n)) -//#define OUT_PORT_STRINGL(port, src, n) outsl((port), (src), (n)) -#define IN_PORT_STRING_32(port, dst, n) insl((port), (dst), (n)) -#define OUT_PORT_STRING_32(port, src, n) outsl((port), (src), (n)) -#define IN_PORT_HCF32(port) inl( (hcf_io)(port) ) -#define OUT_PORT_HCF32(port, value) outl((hcf_32)(value), (hcf_io)(port) ) - -#define IN_PORT_DWORD(port) IN_PORT_HCF32(port) -#define OUT_PORT_DWORD(port, value) OUT_PORT_HCF32(port, value) - -#define IN_PORT_STRING_8_16(port, addr, len) IN_PORT_STRING_16(port, addr, len) -#define OUT_PORT_STRING_8_16(port, addr, len) OUT_PORT_STRING_16(port, addr, len) - -#ifndef CFG_SCAN_CHANNELS_2GHZ -#define CFG_SCAN_CHANNELS_2GHZ 0xFCC2 -#endif /* CFG_SCAN_CHANNELS_2GHZ */ - -#define HCF_MAX_MSG 1600 //get going ;? -#endif // WVLAN_49 - -/************************************************************************************************************/ -/*********************************** **************************************/ -/************************************************************************************************************/ -#if ! defined HCF_ALIGN -#define HCF_ALIGN 1 //default to no alignment -#endif // HCF_ALIGN - -#if ! defined HCF_ASSERT -#define HCF_ASSERT 0 -#endif // HCF_ASSERT - -#if ! defined HCF_BIG_ENDIAN -#define HCF_BIG_ENDIAN 0 -#endif // HCF_BIG_ENDIAN - -#if ! defined HCF_DMA -#define HCF_DMA 0 -#endif // HCF_DMA - -#if ! defined HCF_ENCAP -#define HCF_ENCAP HCF_ENC -#endif // HCF_ENCAP - -#if ! defined HCF_EXT -#define HCF_EXT 0 -#endif // HCF_EXT - -#if ! defined HCF_INT_ON -#define HCF_INT_ON 1 -#endif // HCF_INT_ON - -#if ! defined HCF_IO -#define HCF_IO 0 //default 16 bits support only, port I/O -#endif // HCF_IO - -#if ! defined HCF_LEGACY -#define HCF_LEGACY 0 -#endif // HCF_LEGACY - -#if ! defined HCF_MAX_LTV -#define HCF_MAX_LTV 1200 // sufficient for all known purposes -#endif // HCF_MAX_LTV - -#if ! defined HCF_PROT_TIME -#define HCF_PROT_TIME 100 // number of 10K microsec protection timer against H/W malfunction -#endif // HCF_PROT_TIME - -#if ! defined HCF_SLEEP -#define HCF_SLEEP 0 -#endif // HCF_SLEEP - -#if ! defined HCF_TALLIES -#define HCF_TALLIES ( HCF_TALLIES_NIC | HCF_TALLIES_HCF ) -#endif // HCF_TALLIES - -#if ! defined HCF_TYPE -#define HCF_TYPE 0 -#endif // HCF_TYPE - -#if HCF_BIG_ENDIAN -#undef HCF_BIG_ENDIAN -#define HCF_BIG_ENDIAN 1 //just for convenience of generating cfg_hcf_opt -#endif // HCF_BIG_ENDIAN - -#if HCF_DMA -#undef HCF_DMA -#define HCF_DMA 1 //just for convenience of generating cfg_hcf_opt -#endif // HCF_DMA - -#if HCF_INT_ON -#undef HCF_INT_ON -#define HCF_INT_ON 1 //just for convenience of generating cfg_hcf_opt -#endif // HCF_INT_ON - - -#if ! defined IN_PORT_STRING_8_16 -#define IN_PORT_STRING_8_16(port, addr, len) IN_PORT_STRING_16(port, addr, len) -#define OUT_PORT_STRING_8_16(port, addr, len) OUT_PORT_STRING_16(port, addr, len) -#endif // IN_PORT_STRING_8_16 - -/************************************************************************************************/ -/********** *************/ -/************************************************************************************************/ - -#if ! defined FAR -#define FAR // default to flat 32-bits code -#endif // FAR - -typedef hcf_8 FAR *wci_bufp; // segmented 16-bits or flat 32-bits pointer to 8 bits unit -typedef hcf_16 FAR *wci_recordp; // segmented 16-bits or flat 32-bits pointer to 16 bits unit - -/* I/O Address size -* Platforms which use port mapped I/O will (in general) have a 64k I/O space, conveniently expressed in a -* 16-bits quantity -* Platforms which use memory mapped I/O will (in general) have an I/O space much larger than 64k, and need a -* 32-bits quantity to express the I/O base -*/ - -#if HCF_IO & HCF_IO_MEM -typedef hcf_32 hcf_io; -#else -typedef hcf_16 hcf_io; -#endif //HCF_IO - -#if HCF_PROT_TIME > 128 -#define HCF_PROT_TIME_SHFT 3 -#define HCF_PROT_TIME_DIV 8 -#elif HCF_PROT_TIME > 64 -#define HCF_PROT_TIME_SHFT 2 -#define HCF_PROT_TIME_DIV 4 -#elif HCF_PROT_TIME > 32 -#define HCF_PROT_TIME_SHFT 1 -#define HCF_PROT_TIME_DIV 2 -#else //HCF_PROT_TIME >= 19 -#define HCF_PROT_TIME_SHFT 0 -#define HCF_PROT_TIME_DIV 1 -#endif - -#define HCF_PROT_TIME_CNT (HCF_PROT_TIME / HCF_PROT_TIME_DIV) - - -/************************************************************************************************************/ -/******************************************* . . . . . . . . . *********************************************/ -/************************************************************************************************************/ - -/* MSF_COMPONENT_ID is used to define the CFG_IDENTITY_STRCT in HCF.C -* CFG_IDENTITY_STRCT is defined in HCF.C purely based on convenience arguments. -* The HCF can not have the knowledge to determine the ComponentId field of the Identity record (aka as -* Version Record), therefore the MSF part of the Drivers must supply this value via the System Constant -* MSF_COMPONENT_ID. -* There is a set of values predefined in MDD.H (format COMP_ID_.....) -* -* Note that taking MSF_COMPONENT_ID as a default value for DUI_COMPAT_VAR is purely an implementation -* convenience, the numerical values of these two quantities have none functional relationship whatsoever. -*/ - -#if defined MSF_COMPONENT_ID - -#if ! defined DUI_COMPAT_VAR -#define DUI_COMPAT_VAR MSF_COMPONENT_ID -#endif // DUI_COMPAT_VAR - -#if ! defined DUI_COMPAT_BOT //;?this way utilities can lower as well raise the bottom -#define DUI_COMPAT_BOT 8 -#endif // DUI_COMPAT_BOT - -#if ! defined DUI_COMPAT_TOP //;?this way utilities can lower as well raise the top -#define DUI_COMPAT_TOP 8 -#endif // DUI_COMPAT_TOP - -#endif // MSF_COMPONENT_ID - -#if (HCF_TYPE) & HCF_TYPE_HII5 - -#if ! defined HCF_HSI_VAR_5 -#define HCF_HSI_VAR_5 -#endif // HCF_HSI_VAR_5 - -#if ! defined HCF_APF_VAR_4 -#define HCF_APF_VAR_4 -#endif // HCF_APF_VAR_4 - -#if (HCF_TYPE) & HCF_TYPE_WARP -#if ! defined HCF_STA_VAR_4 -#define HCF_STA_VAR_4 -#endif // HCF_STA_VAR_4 -#else -#if ! defined HCF_STA_VAR_2 -#define HCF_STA_VAR_2 -#endif // HCF_STA_VAR_2 -#endif - -#if defined HCF_HSI_VAR_4 -err: HSI variants 4 correspond with HII; -#endif // HCF_HSI_VAR_4 - -#else - -#if ! defined HCF_HSI_VAR_4 -#define HCF_HSI_VAR_4 //Hermes-II all types (for the time being!) -#endif // HCF_HSI_VAR_4 - -#if ! defined HCF_APF_VAR_2 -#define HCF_APF_VAR_2 -#endif // HCF_APF_VAR_2 - -#if ! defined HCF_STA_VAR_2 -#define HCF_STA_VAR_2 -#endif // HCF_STA_VAR_2 - -#endif // HCF_TYPE_HII5 - -#if ! defined HCF_PRI_VAR_3 -#define HCF_PRI_VAR_3 -#endif // HCF_PRI_VAR_3 - -#if defined HCF_HSI_VAR_1 || defined HCF_HSI_VAR_2 || defined HCF_HSI_VAR_3 -err: HSI variants 1, 2 and 3 correspond with H-I only; -#endif // HCF_HSI_VAR_1, HCF_HSI_VAR_2, HCF_HSI_VAR_3 - -#if defined HCF_PRI_VAR_1 || defined HCF_PRI_VAR_2 -err: primary variants 1 and 2 correspond with H-I only; -#endif // HCF_PRI_VAR_1 / HCF_PRI_VAR_2 - - -/************************************************************************************************************/ -/******************************************* . . . . . . . . . *********************************************/ -/************************************************************************************************************/ - - -/* The BASED customization macro is used to resolves the SS!=DS conflict for the Interrupt Service logic in - * DOS Drivers. Due to the cumbersomeness of mixing C and assembler local BASED variables still end up in the - * wrong segment. The workaround is that the HCF uses only global BASED variables or IFB-based variables. - * The "BASED" construction (supposedly) only amounts to something in the small memory model. - * - * Note that the whole BASED rigmarole is needlessly complicated because both the Microsoft Compiler and - * Linker are unnecessary restrictive in what far pointer manipulation they allow - */ - -#if ! defined BASED -#define BASED -#endif // BASED - -#if ! defined EXTERN_C -#ifdef __cplusplus -#define EXTERN_C extern "C" -#else -#define EXTERN_C -#endif // __cplusplus -#endif // EXTERN_C - -#if ! defined NULL -#define NULL ((void *) 0) -#endif // NULL - -#if ! defined TEXT -#define TEXT(x) x -#endif // TEXT - -/************************************************************************************************************/ -/*********************** C O N F L I C T D E T E C T I O N & R E S O L U T I O N ************************/ -/************************************************************************************************************/ -#if HCF_ALIGN != 1 && HCF_ALIGN != 2 && HCF_ALIGN != 4 && HCF_ALIGN != 8 -err: invalid value for HCF_ALIGN; -#endif // HCF_ALIGN - -#if (HCF_ASSERT) & ~( HCF_ASSERT_PRINTF | HCF_ASSERT_SW_SUP | HCF_ASSERT_MB | HCF_ASSERT_RT_MSF_RTN | \ - HCF_ASSERT_LNK_MSF_RTN ) -err: invalid value for HCF_ASSERT; -#endif // HCF_ASSERT - -#if (HCF_ASSERT) & HCF_ASSERT_MB && ! ( (HCF_EXT) & HCF_EXT_MB ) //detect potential conflict -err: these macros are not used consistently; -#endif // HCF_ASSERT_MB / HCF_EXT_MB - -#if HCF_BIG_ENDIAN != 0 && HCF_BIG_ENDIAN != 1 -err: invalid value for HCF_BIG_ENDIAN; -#endif // HCF_BIG_ENDIAN - -#if HCF_DMA != 0 && HCF_DMA != 1 -err: invalid value for HCF_DMA; -#endif // HCF_DMA - -#if (HCF_ENCAP) & ~( HCF_ENC | HCF_ENC_SUP ) -err: invalid value for HCF_ENCAP; -#endif // HCF_ENCAP - -#if (HCF_EXT) & ~( HCF_EXT_INFO_LOG | HCF_EXT_INT_TX_EX | HCF_EXT_TALLIES_FW | HCF_EXT_TALLIES_HCF | \ - HCF_EXT_NIC_ACCESS | HCF_EXT_MB | HCF_EXT_INT_TICK | \ - HCF_EXT_IFB_STRCT | HCF_EXT_DESC_STRCT | HCF_EXT_TX_CONT ) -err: invalid value for HCF_EXT; -#endif // HCF_EXT - -#if HCF_INT_ON != 0 && HCF_INT_ON != 1 -err: invalid value for HCF_INT_ON; -#endif // HCF_INT_ON - -#if (HCF_IO) & ~( HCF_IO_MEM | HCF_IO_32BITS ) -err: invalid value for HCF_IO; -#endif // HCF_IO - -#if HCF_LEGACY != 0 && HCF_LEGACY != 1 -err: invalid value for HCF_LEGACY; -#endif // HCF_LEGACY - -#if HCF_MAX_LTV < 16 || HCF_MAX_LTV > 2304 -err: invalid value for HCF_MAX_LTV; -#endif // HCF_MAX_LTV - -#if HCF_PROT_TIME != 0 && ( HCF_PROT_TIME < 19 || 256 < HCF_PROT_TIME ) -err: below minimum .08 second required by Hermes or possibly above hcf_32 capacity; -#endif // HCF_PROT_TIME - -#if (HCF_SLEEP) & ~( HCF_CDS | HCF_DDS ) -err: invalid value for HCF_SLEEP; -#endif // HCF_SLEEP - -#if (HCF_SLEEP) && ! (HCF_INT_ON) -err: these macros are not used consistently; -#endif // HCF_SLEEP / HCF_INT_ON - -#if (HCF_SLEEP) && ! ( (HCF_EXT) & HCF_EXT_INT_TICK ) -//;? err: these macros are not used consistently; -#endif // HCF_SLEEP / HCF_EXT_INT_TICK - -#if (HCF_TALLIES) & ~( HCF_TALLIES_HCF | HCF_TALLIES_NIC | HCF_TALLIES_RESET ) || \ - (HCF_TALLIES) == HCF_TALLIES_RESET -err: invalid value for HCF_TALLIES; -#endif // HCF_TALLIES - -#if (HCF_TYPE) & ~(HCF_TYPE_WPA | HCF_TYPE_USB | HCF_TYPE_PRELOADED | HCF_TYPE_HII5 | HCF_TYPE_WARP | \ - HCF_TYPE_CCX /* | HCF_TYPE_TX_DELAY */ ) -err: invalid value for HCF_TYPE; -#endif //HCF_TYPE - -#if (HCF_TYPE) & HCF_TYPE_WARP && (HCF_TYPE) & HCF_TYPE_WPA -err: at most 1 of these macros should be defined; -#endif //HCF_TYPE_WARP / HCF_TYPE_WPA - -#endif //HCFCFG_H - diff --git a/drivers/staging/wlags49_h2/hcfdef.h b/drivers/staging/wlags49_h2/hcfdef.h deleted file mode 100644 index 74c0f713c57e..000000000000 --- a/drivers/staging/wlags49_h2/hcfdef.h +++ /dev/null @@ -1,752 +0,0 @@ -#ifndef HCFDEFC_H -#define HCFDEFC_H 1 - -/************************************************************************************************* - * - * FILE : HCFDEF.H - * - * DATE : $Date: 2004/08/05 11:47:10 $ $Revision: 1.8 $ - * Original: 2004/05/28 14:05:35 Revision: 1.59 Tag: hcf7_t20040602_01 - * Original: 2004/05/13 15:31:45 Revision: 1.53 Tag: hcf7_t7_20040513_01 - * Original: 2004/04/15 09:24:42 Revision: 1.44 Tag: hcf7_t7_20040415_01 - * Original: 2004/04/13 14:22:45 Revision: 1.43 Tag: t7_20040413_01 - * Original: 2004/04/01 15:32:55 Revision: 1.40 Tag: t7_20040401_01 - * Original: 2004/03/10 15:39:28 Revision: 1.36 Tag: t20040310_01 - * Original: 2004/03/03 14:10:12 Revision: 1.34 Tag: t20040304_01 - * Original: 2004/03/02 09:27:12 Revision: 1.32 Tag: t20040302_03 - * Original: 2004/02/24 13:00:29 Revision: 1.29 Tag: t20040224_01 - * Original: 2004/02/18 17:13:57 Revision: 1.26 Tag: t20040219_01 - * - * AUTHOR : Nico Valster - * - * SPECIFICATION: ........... - * - * DESC : Definitions and Prototypes for HCF only - * - ************************************************************************************************** - * - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * COPYRIGHT © 1994 - 1995 by AT&T. All Rights Reserved - * COPYRIGHT © 1996 - 2000 by Lucent Technologies. All Rights Reserved - * COPYRIGHT © 2001 - 2004 by Agere Systems Inc. All Rights Reserved - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * - *************************************************************************************************/ - - -/************************************************************************************************/ -/********************************* P R E F I X E S ********************************************/ -/************************************************************************************************/ -//IFB_ Interface Block -//HCMD_ Hermes Command -//HFS_ Hermes (Transmit/Receive) Frame Structure -//HREG_ Hermes Register - -/*************************************************************************************************/ - -/************************************************************************************************/ -/********************************* GENERAL EQUATES **********************************************/ -/************************************************************************************************/ - - -#define HCF_MAGIC 0x7D37 // "}7" Handle validation - -#define PLUG_DATA_OFFSET 0x00000800 //needed by some test tool on top of H-II NDIS driver - -#define INI_TICK_INI 0x00040000L - -#define IO_IN 0 //hcfio_in_string -#define IO_OUT 1 //hcfio_out_string - -//DO_ASSERT, create an artificial FALSE to force an ASSERT without the nasty compiler warning -#define DO_ASSERT ( assert_ifbp->IFB_Magic != HCF_MAGIC && assert_ifbp->IFB_Magic == HCF_MAGIC ) -#define NT_ASSERT 0x0000 //, NEVER_TESTED -#define NEVER_TESTED MERGE_2( 0xEFFE, 0xFEEF ) -#define SE_ASSERT 0x5EFF /* Side Effect, HCFASSERT invokation which are only called for the - * side effect and which should never trigger */ -#define DHF_FILE_NAME_OFFSET 10000 //to distinguish DHF from HCF asserts by means of line number -#define MMD_FILE_NAME_OFFSET 20000 //to distinguish MMD from HCF asserts by means of line number - -// trace codes used to -// 1: profile execution times via HCF_TRACE and HCF_TRACE_VALUE -// 2: hierarchical flow information via HCFLOGENTRY / HCFLOGEXIT - -//#define HCF_TRACE_CONNECT useless -//#define HCF_TRACE_DISCONNECT useless -#define HCF_TRACE_ACTION 0x0000 // 0x0001 -#define HCF_TRACE_CNTL 0x0001 // 0x0002 -#define HCF_TRACE_DMA_RX_GET 0x0002 // 0x0004 -#define HCF_TRACE_DMA_RX_PUT 0x0003 // 0x0008 -#define HCF_TRACE_DMA_TX_GET 0x0004 // 0x0010 -#define HCF_TRACE_DMA_TX_PUT 0x0005 // 0x0020 -#define HCF_TRACE_GET_INFO 0x0006 // 0x0040 -#define HCF_TRACE_PUT_INFO 0x0007 // 0x0080 -#define HCF_TRACE_RCV_MSG 0x0008 // 0x0100 -#define HCF_TRACE_SEND_MSG 0x0009 // 0x0200 -#define HCF_TRACE_SERVICE_NIC 0x000A // 0x0400 -// #define HCF_TRACE_ 0x000C // 0x1000 -// #define HCF_TRACE_ 0x000D // 0x2000 -// #define HCF_TRACE_ 0x000E // 0x4000 -// #define HCF_TRACE_ 0x000F // 0x8000 -// ============================================ HCF_TRACE_... codes below 0x0010 are asserted on re-entry -#define HCF_TRACE_ACTION_KLUDGE 0x0010 /* once you start introducing kludges there is no end to it - * this is an escape to do not assert on re-entrancy problem caused - * by HCF_ACT_INT_FORCE_ON used to get Microsofts NDIS drivers going - */ -#define HCF_TRACE_STRIO 0x0020 -#define HCF_TRACE_ALLOC 0X0021 -#define HCF_TRACE_DL 0X0023 -#define HCF_TRACE_ISR_INFO 0X0024 -#define HCF_TRACE_CALIBRATE 0x0026 - -#define HCF_TRACE_CMD_CPL 0x0040 -#define HCF_TRACE_CMD_EXE 0x0041 -#define HCF_TRACE_GET_FID 0x0042 -#define HCF_TRACE_GET_FRAG 0x0043 -#define HCF_TRACE_INIT 0x0044 -#define HCF_TRACE_PUT_FRAG 0x0045 -#define HCF_TRACE_SETUP_BAP 0x0046 - -#define HCF_TRACE_EXIT 0x8000 // Keil C warns "long constant truncated to int" - -//#define BAP_0 HREG_DATA_0 //Used by DMA controller to access NIC RAM -#define BAP_1 HREG_DATA_1 //Used by HCF to access NIC RAM - - -//************************* Hermes Receive/Transmit Frame Structures -//HFS_STAT -//see MMD.H for HFS_STAT_ERR -#define HFS_STAT_MSG_TYPE 0xE000 //Hermes reported Message Type -#define HFS_STAT_MIC_KEY_ID 0x1800 //MIC key used (if any) -#define HFS_STAT_1042 0x2000 //RFC1042 Encoded -#define HFS_STAT_TUNNEL 0x4000 //Bridge-Tunnel Encoded -#define HFS_STAT_WMP_MSG 0x6000 //WaveLAN-II Management Protocol Frame -#if (HCF_TYPE) & HCF_TYPE_WPA -#define HFS_STAT_MIC 0x0010 //Frame contains MIC //;? re-instate when F/W ready -#endif - -//************************* Hermes Register Offsets and Command bits -#define HREG_IO_RANGE 0x80 //I/O Range used by Hermes - - -//************************* Command/Status -#define HREG_CMD 0x00 // -#define HCMD_CMD_CODE 0x3F -#define HREG_PARAM_0 0x02 // -#define HREG_PARAM_1 0x04 // -#define HREG_PARAM_2 0x06 // -#define HREG_STAT 0x08 // -#define HREG_STAT_CMD_CODE 0x003F // -#define HREG_STAT_DIAG_ERR 0x0100 -#define HREG_STAT_INQUIRE_ERR 0x0500 -#define HREG_STAT_CMD_RESULT 0x7F00 // -#define HREG_RESP_0 0x0A // -#define HREG_RESP_1 0x0C // -#define HREG_RESP_2 0x0E // - - -//************************* FID Management -#define HREG_INFO_FID 0x10 // -#define HREG_RX_FID 0x20 // -#define HREG_ALLOC_FID 0x22 // -#define HREG_TX_COMPL_FID 0x24 // - - -//************************* BAP -//20031030 HWi Inserted this again because the dongle code uses this (GPIF.C) -//#define HREG_SELECT_0 0x18 // -//#define HREG_OFFSET_0 0x1C // -//#define HREG_DATA_0 0x36 // - -//#define HREG_OFFSET_BUSY 0x8000 // use HCMD_BUSY -#define HREG_OFFSET_ERR 0x4000 // -//rsrvd #define HREG_OFFSET_DATA_OFFSET 0x0FFF // - -#define HREG_SELECT_1 0x1A // -#define HREG_OFFSET_1 0x1E // -#define HREG_DATA_1 0x38 // - - -//************************* Event -#define HREG_EV_STAT 0x30 // -#define HREG_INT_EN 0x32 // -#define HREG_EV_ACK 0x34 // - -#define HREG_EV_TICK 0x8000 //Auxiliary Timer Tick -//#define HREG_EV_RES 0x4000 //H-I only: H/W error (Wait Time-out) -#define HREG_EV_INFO_DROP 0x2000 //WMAC did not have sufficient RAM to build Unsollicited Frame -#if (HCF_TYPE) & HCF_TYPE_HII5 -#define HREG_EV_ACK_REG_READY 0x0000 -#else -#define HREG_EV_ACK_REG_READY 0x1000 //Workaround Kludge bit for H-II (not H-II.5) -#endif // HCF_TYPE_HII5 -#if (HCF_SLEEP) & ( HCF_CDS | HCF_DDS ) -#define HREG_EV_SLEEP_REQ 0x0800 -#else -#define HREG_EV_SLEEP_REQ 0x0000 -#endif // HCF_CDS / HCF_DDS -#if HCF_DMA -//#define HREG_EV_LPESC 0x0400 // firmware sets this bit and clears it, not for host usage. -#define HREG_EV_RDMAD 0x0200 // rx frame in host memory -#define HREG_EV_TDMAD 0x0100 // tx frame in host memory processed -//#define HREG_EV_RXDMA 0x0040 // firmware kicks off DMA engine (bit is not for host usage) -//#define HREG_EV_TXDMA 0x0020 // firmware kicks off DMA engine (bit is not for host usage) -#define HREG_EV_FW_DMA 0x0460 // firmware / DMA engine I/F (bits are not for host usage) -#else -#define HREG_EV_FW_DMA 0x0000 -#endif // HCF_DMA -#define HREG_EV_INFO 0x0080 // Asynchronous Information Frame -#define HREG_EV_CMD 0x0010 // Command completed, Status and Response available -#define HREG_EV_ALLOC 0x0008 // Asynchronous part of Allocation/Reclaim completed -#define HREG_EV_TX_EXC 0x0004 // Asynchronous Transmission unsuccessful completed -#define HREG_EV_TX 0x0002 // Asynchronous Transmission successful completed -#define HREG_EV_RX 0x0001 // Asynchronous Receive Frame - -#define HREG_EV_TX_EXT ( (HCF_EXT) & (HCF_EXT_INT_TX_EX | HCF_EXT_INT_TICK ) ) -/* HREG_EV_TX_EXT := 0x0000 or HREG_EV_TX_EXC and/or HREG_EV_TICK - * could be extended with HREG_EV_TX */ -#if HCF_EXT_INT_TX_EX != HREG_EV_TX_EXC -err: these values should match; -#endif // HCF_EXT_INT_TX_EX / HREG_EV_TX_EXC - -#if HCF_EXT_INT_TICK != HREG_EV_TICK -err: these values should match; -#endif // HCF_EXT_INT_TICK / HREG_EV_TICK - -//************************* Host Software -#define HREG_SW_0 0x28 // -#define HREG_SW_1 0x2A // -#define HREG_SW_2 0x2C // -//rsrvd #define HREG_SW_3 0x2E // -//************************* Control and Auxiliary Port - -#define HREG_IO 0x12 -#define HREG_IO_SRESET 0x0001 -#define HREG_IO_WAKEUP_ASYNC 0x0002 -#define HREG_IO_WOKEN_UP 0x0004 -#define HREG_CNTL 0x14 // -//#define HREG_CNTL_WAKEUP_SYNC 0x0001 -#define HREG_CNTL_AUX_ENA_STAT 0xC000 -#define HREG_CNTL_AUX_DIS_STAT 0x0000 -#define HREG_CNTL_AUX_ENA_CNTL 0x8000 -#define HREG_CNTL_AUX_DIS_CNTL 0x4000 -#define HREG_CNTL_AUX_DSD 0x2000 -#define HREG_CNTL_AUX_ENA (HREG_CNTL_AUX_ENA_CNTL | HREG_CNTL_AUX_DIS_CNTL ) -#define HREG_SPARE 0x16 // -#define HREG_AUX_PAGE 0x3A // -#define HREG_AUX_OFFSET 0x3C // -#define HREG_AUX_DATA 0x3E // - -#if HCF_DMA -//************************* DMA (bus mastering) -// Be careful to use these registers only at a genuine 32 bits NIC -// On 16 bits NICs, these addresses are mapped into the range 0x00 through 0x3F with all consequences -// thereof, e.g. HREG_DMA_CTRL register maps to HREG_CMD. -#define HREG_DMA_CTRL 0x0040 -#define HREG_TXDMA_PTR32 0x0044 -#define HREG_TXDMA_PRIO_PTR32 0x0048 -#define HREG_TXDMA_HIPRIO_PTR32 0x004C -#define HREG_RXDMA_PTR32 0x0050 -#define HREG_CARDDETECT_1 0x007C // contains 7D37 -#define HREG_CARDDETECT_2 0x007E // contains 7DE7 -#define HREG_FREETIMER 0x0058 -#define HREG_DMA_RX_CNT 0x0026 - -/****************************************************************************** - * Defines for the bits in the DmaControl register (@40h) - ******************************************************************************/ -#define HREG_DMA_CTRL_RXHWEN 0x80000000 // high word enable bit -#define HREG_DMA_CTRL_RXRESET 0x40000000 // tx dma init bit -#define HREG_DMA_CTRL_RXBAP1 BIT29 -#define HREG_DMA_CTRL_RX_STALLED BIT28 -#define HREG_DMA_CTRL_RXAUTOACK_DMADONE BIT27 // no host involvement req. for TDMADONE event -#define HREG_DMA_CTRL_RXAUTOACK_INFO BIT26 // no host involvement req. for alloc event -#define HREG_DMA_CTRL_RXAUTOACK_DMAEN 0x02000000 // no host involvement req. for TxDMAen event -#define HREG_DMA_CTRL_RXAUTOACK_RX 0x01000000 // no host involvement req. for tx event -#define HREG_DMA_CTRL_RX_BUSY BIT23 // read only bit -//#define HREG_DMA_CTRL_RX_RBUFCONT_PLAIN 0 // bits 21..20 -//#define HREG_DMA_CTRL_RX_MODE_PLAIN_DMA 0 // mode 0 -#define HREG_DMA_CTRL_RX_MODE_SINGLE_PACKET 0x00010000 // mode 1 -#define HREG_DMA_CTRL_RX_MODE_MULTI_PACKET 0x00020000 // mode 2 -//#define HREG_DMA_CTRL_RX_MODE_DISABLE (0x00020000|0x00010000) // disable tx dma engine -#define HREG_DMA_CTRL_TXHWEN 0x8000 // low word enable bit -#define HREG_DMA_CTRL_TXRESET 0x4000 // rx dma init bit -#define HREG_DMA_CTRL_TXBAP1 BIT13 -#define HREG_DMA_CTRL_TXAUTOACK_DMADONE BIT11 // no host involvement req. for RxDMADONE event -#define HREG_DMA_CTRL_TXAUTOACK_DMAEN 0x00000400 // no host involvement req. for RxDMAen event -#define HREG_DMA_CTRL_TXAUTOACK_DMAALLOC 0x00000200 // no host involvement req. for info event -#define HREG_DMA_CTRL_TXAUTOACK_TX 0x00000100 // no host involvement req. for rx event -#define HREG_DMA_CTRL_TX_BUSY BIT7 // read only bit -//#define HREG_DMA_CTRL_TX_TBUFCONT_PLAIN 0 // bits 6..5 -//#define HREG_DMA_CTRL_TX_MODE_PLAIN_DMA 0 // mode 0 -#define HREG_DMA_CTRL_TX_MODE_SINGLE_PACKET BIT0 // mode 1 -#define HREG_DMA_CTRL_TX_MODE_MULTI_PACKET 0x00000002 // mode 2 -//#define HREG_DMA_CTRL_TX_MODE_DISABLE (0x00000001|0x00000002) // disable tx dma engine - -//configuration DWORD to configure DMA for mode2 operation, using BAP0 as the DMA BAP. -#define DMA_CTRLSTAT_GO (HREG_DMA_CTRL_RXHWEN | HREG_DMA_CTRL_RX_MODE_MULTI_PACKET | \ - HREG_DMA_CTRL_RXAUTOACK_DMAEN | HREG_DMA_CTRL_RXAUTOACK_RX | \ - HREG_DMA_CTRL_TXHWEN | /*;?HREG_DMA_CTRL_TX_TBUFCONT_PLAIN |*/ \ - HREG_DMA_CTRL_TX_MODE_MULTI_PACKET | HREG_DMA_CTRL_TXAUTOACK_DMAEN | \ - HREG_DMA_CTRL_TXAUTOACK_DMAALLOC) - -//configuration DWORD to reset both the Tx and Rx DMA engines -#define DMA_CTRLSTAT_RESET (HREG_DMA_CTRL_RXHWEN | HREG_DMA_CTRL_RXRESET | HREG_DMA_CTRL_TXHWEN | HREG_DMA_CTRL_TXRESET) - -//#define DESC_DMA_OWNED 0x80000000 // BIT31 -#define DESC_DMA_OWNED 0x8000 // BIT31 -#define DESC_SOP 0x8000 // BIT15 -#define DESC_EOP 0x4000 // BIT14 - -#define DMA_RX 0 -#define DMA_TX 1 - -// #define IFB_RxFirstDesc IFB_FirstDesc[DMA_RX] -// #define IFB_TxFirstDesc IFB_FirstDesc[DMA_TX] -// #define IFB_RxLastDesc IFB_LastDesc[DMA_RX] -// #define IFB_TxLastDesc IFB_LastDesc[DMA_TX] - -#endif // HCF_DMA -// -/************************************************************************************************/ -/********************************** EQUATES ***************************************************/ -/************************************************************************************************/ - - -// Hermes Command Codes and Qualifier bits -#define HCMD_BUSY 0x8000 // Busy bit, applicable for all commands -#define HCMD_INI 0x0000 // -#define HCMD_ENABLE HCF_CNTL_ENABLE // 0x0001 -#define HCMD_DISABLE HCF_CNTL_DISABLE // 0x0002 -#define HCMD_CONNECT HCF_CNTL_CONNECT // 0x0003 -#define HCMD_EXECUTE 0x0004 // -#define HCMD_DISCONNECT HCF_CNTL_DISCONNECT // 0x0005 -#define HCMD_SLEEP 0x0006 // -#define HCMD_CONTINUE HCF_CNTL_CONTINUE // 0x0007 -#define HCMD_RETRY 0x0100 // Retry bit -#define HCMD_ALLOC 0x000A // -#define HCMD_TX 0x000B // -#define HCMD_RECL 0x0100 // Reclaim bit, applicable for Tx and Inquire -#define HCMD_INQUIRE 0x0011 // -#define HCMD_ACCESS 0x0021 // -#define HCMD_ACCESS_WRITE 0x0100 // Write bit -#define HCMD_PROGRAM 0x0022 // -#define HCMD_READ_MIF 0x0030 -#define HCMD_WRITE_MIF 0x0031 -#define HCMD_THESEUS 0x0038 -#define HCMD_STARTPREAMBLE 0x0E00 // Start continuous preamble Tx -#define HCMD_STOP 0x0F00 // Stop Theseus test mode - - -//Configuration Management -// - -#define CFG_DRV_ACT_RANGES_PRI_3_BOTTOM 1 // Default Bottom Compatibility for Primary Firmware - driver I/F -#define CFG_DRV_ACT_RANGES_PRI_3_TOP 1 // Default Top Compatibility for Primary Firmware - driver I/F - -#define CFG_DRV_ACT_RANGES_HSI_4_BOTTOM 1 // Default Bottom Compatibility for H/W - driver I/F -#define CFG_DRV_ACT_RANGES_HSI_4_TOP 1 // Default Top Compatibility for H/W - driver I/F - -#define CFG_DRV_ACT_RANGES_HSI_5_BOTTOM 1 // Default Bottom Compatibility for H/W - driver I/F -#define CFG_DRV_ACT_RANGES_HSI_5_TOP 1 // Default Top Compatibility for H/W - driver I/F - -#if (HCF_TYPE) & HCF_TYPE_WPA -#define CFG_DRV_ACT_RANGES_APF_1_BOTTOM 16 // Default Bottom Compatibility for AP Firmware - driver I/F -#define CFG_DRV_ACT_RANGES_APF_1_TOP 16 // Default Top Compatibility for AP Firmware - driver I/F -#else //;? is this REALLY O.K. -#define CFG_DRV_ACT_RANGES_APF_1_BOTTOM 1 // Default Bottom Compatibility for AP Firmware - driver I/F -#define CFG_DRV_ACT_RANGES_APF_1_TOP 1 // Default Top Compatibility for AP Firmware - driver I/F -#endif // HCF_TYPE_WPA - -#define CFG_DRV_ACT_RANGES_APF_2_BOTTOM 2 // Default Bottom Compatibility for AP Firmware - driver I/F -#define CFG_DRV_ACT_RANGES_APF_2_TOP 2 // Default Top Compatibility for AP Firmware - driver I/F - -#define CFG_DRV_ACT_RANGES_APF_3_BOTTOM 1 // Default Bottom Compatibility for AP Firmware - driver I/F -#define CFG_DRV_ACT_RANGES_APF_3_TOP 1 // Default Top Compatibility for AP Firmware - driver I/F - -#define CFG_DRV_ACT_RANGES_APF_4_BOTTOM 1 // Default Bottom Compatibility for AP Firmware - driver I/F -#define CFG_DRV_ACT_RANGES_APF_4_TOP 1 // Default Top Compatibility for AP Firmware - driver I/F - -#if (HCF_TYPE) & HCF_TYPE_HII5 -#define CFG_DRV_ACT_RANGES_STA_2_BOTTOM 6 // Default Bottom Compatibility for Station Firmware - driver I/F -#define CFG_DRV_ACT_RANGES_STA_2_TOP 6 // Default Top Compatibility for Station Firmware - driver I/F -#else // (HCF_TYPE) & HCF_TYPE_HII5 -#define CFG_DRV_ACT_RANGES_STA_2_BOTTOM 1 // Default Bottom Compatibility for Station Firmware - driver I/F -#define CFG_DRV_ACT_RANGES_STA_2_TOP 2 // Default Top Compatibility for Station Firmware - driver I/F -#endif // (HCF_TYPE) & HCF_TYPE_HII5 - -#define CFG_DRV_ACT_RANGES_STA_3_BOTTOM 1 // Default Bottom Compatibility for Station Firmware - driver I/F -#define CFG_DRV_ACT_RANGES_STA_3_TOP 1 // Default Top Compatibility for Station Firmware - driver I/F - -#define CFG_DRV_ACT_RANGES_STA_4_BOTTOM 1 // Default Bottom Compatibility for Station Firmware - driver I/F -#define CFG_DRV_ACT_RANGES_STA_4_TOP 1 // Default Top Compatibility for Station Firmware - driver I/F - -//--------------------------------------------------------------------------------------------------------------------- -#if defined HCF_CFG_PRI_1_TOP || defined HCF_CFG_PRI_1_BOTTOM -err: PRI_1 not supported for H-I; // Compatibility for Primary Firmware - driver I/F -#endif // HCF_CFG_PRI_1_TOP / HCF_CFG_PRI_1_BOTTOM - -#if defined HCF_CFG_PRI_2_TOP || defined HCF_CFG_PRI_2_BOTTOM -err: PRI_2 not supported for H-I; // Compatibility for Primary Firmware - driver I/F -#endif // HCF_CFG_PRI_2_TOP / HCF_CFG_PRI_2_BOTTOM - -#ifdef HCF_CFG_PRI_3_TOP // Top Compatibility for Primary Firmware - driver I/F -#if HCF_CFG_PRI_3_TOP == 0 || \ - CFG_DRV_ACT_RANGES_PRI_3_BOTTOM <= HCF_CFG_PRI_3_TOP && HCF_CFG_PRI_3_TOP <= CFG_DRV_ACT_RANGES_PRI_3_TOP -#undef CFG_DRV_ACT_RANGES_PRI_3_TOP -#define CFG_DRV_ACT_RANGES_PRI_3_TOP HCF_CFG_PRI_3_TOP -#else -err: ; -#endif -#endif // HCF_CFG_PRI_3_TOP - -#ifdef HCF_CFG_PRI_3_BOTTOM // Bottom Compatibility for Primary Firmware - driver I/F -#if CFG_DRV_ACT_RANGES_PRI_3_BOTTOM <= HCF_CFG_PRI_3_BOTTOM && HCF_CFG_PRI_3_BOTTOM <= CFG_DRV_ACT_RANGES_PRI_3_TOP -#undef CFG_DRV_ACT_RANGES_PRI_3_BOTTOM -#define CFG_DRV_ACT_RANGES_PRI_3_BOTTOM HCF_CFG_PRI_3_BOTTOM -#else -err: ; -#endif -#endif // HCF_CFG_PRI_3_BOTTOM - - -//--------------------------------------------------------------------------------------------------------------------- -#if defined HCF_CFG_HSI_0_TOP || defined HCF_CFG_HSI_0_BOTTOM -err: HSI_0 not supported for H-I; // Compatibility for HSI I/F -#endif // HCF_CFG_HSI_0_TOP / HCF_CFG_HSI_0_BOTTOM - -#if defined HCF_CFG_HSI_1_TOP || defined HCF_CFG_HSI_1_BOTTOM -err: HSI_1 not supported for H-I; // Compatibility for HSI I/F -#endif // HCF_CFG_HSI_1_TOP / HCF_CFG_HSI_1_BOTTOM - -#if defined HCF_CFG_HSI_2_TOP || defined HCF_CFG_HSI_2_BOTTOM -err: HSI_2 not supported for H-I; // Compatibility for HSI I/F -#endif // HCF_CFG_HSI_2_TOP / HCF_CFG_HSI_2_BOTTOM - -#if defined HCF_CFG_HSI_3_TOP || defined HCF_CFG_HSI_3_BOTTOM -err: HSI_3 not supported for H-I; // Compatibility for HSI I/F -#endif // HCF_CFG_HSI_3_TOP / HCF_CFG_HSI_3_BOTTOM - -#ifdef HCF_CFG_HSI_4_TOP // Top Compatibility for HSI I/F -#if HCF_CFG_HSI_4_TOP == 0 || \ - CFG_DRV_ACT_RANGES_HSI_4_BOTTOM <= CF_CFG_HSI_4_TOP && HCF_CFG_HSI_4_TOP <= CFG_DRV_ACT_RANGES_HSI_4_TOP -#undef CFG_DRV_ACT_RANGES_HSI_4_TOP -#define CFG_DRV_ACT_RANGES_HSI_4_TOP HCF_CFG_HSI_4_TOP -#else -err: ; -#endif -#endif // HCF_CFG_HSI_4_TOP - -#ifdef HCF_CFG_HSI_4_BOTTOM // Bottom Compatibility for HSI I/F -#if CFG_DRV_ACT_RANGES_HSI_4_BOTTOM <= HCF_CFG_HSI_4_BOTTOM && HCF_CFG_HSI_4_BOTTOM <= CFG_DRV_ACT_RANGES_HSI_4_TOP -#undef CFG_DRV_ACT_RANGES_HSI_4_BOTTOM -#define CFG_DRV_ACT_RANGES_HSI_4_BOTTOM HCF_CFG_HSI_4_BOTTOM -#else -err: ; -#endif -#endif // HCF_CFG_HSI_4_BOTTOM - -#ifdef HCF_CFG_HSI_5_TOP // Top Compatibility for HSI I/F -#if HCF_CFG_HSI_5_TOP == 0 || \ - CFG_DRV_ACT_RANGES_HSI_5_BOTTOM <= CF_CFG_HSI_5_TOP && HCF_CFG_HSI_5_TOP <= CFG_DRV_ACT_RANGES_HSI_5_TOP -#undef CFG_DRV_ACT_RANGES_HSI_5_TOP -#define CFG_DRV_ACT_RANGES_HSI_5_TOP HCF_CFG_HSI_5_TOP -#else -err: ; -#endif -#endif // HCF_CFG_HSI_5_TOP - -#ifdef HCF_CFG_HSI_5_BOTTOM // Bottom Compatibility for HSI I/F -#if CFG_DRV_ACT_RANGES_HSI_5_BOTTOM <= HCF_CFG_HSI_5_BOTTOM && HCF_CFG_HSI_5_BOTTOM <= CFG_DRV_ACT_RANGES_HSI_5_TOP -#undef CFG_DRV_ACT_RANGES_HSI_5_BOTTOM -#define CFG_DRV_ACT_RANGES_HSI_5_BOTTOM HCF_CFG_HSI_5_BOTTOM -#else -err: ; -#endif -#endif // HCF_CFG_HSI_5_BOTTOM -//--------------------------------------------------------------------------------------------------------------------- -#if defined HCF_CFG_APF_1_TOP || defined HCF_CFG_APF_1_BOTTOM -err: APF_1 not supported for H-I; // Compatibility for AP Firmware - driver I/F -#endif // HCF_CFG_APF_1_TOP / HCF_CFG_APF_1_BOTTOM - -#ifdef HCF_CFG_APF_2_TOP // Top Compatibility for AP Firmware - driver I/F -#if HCF_CFG_APF_2_TOP == 0 || \ - CFG_DRV_ACT_RANGES_APF_2_BOTTOM <= HCF_CFG_APF_2_TOP && HCF_CFG_APF_2_TOP <= CFG_DRV_ACT_RANGES_APF_2_TOP -#undef CFG_DRV_ACT_RANGES_APF_2_TOP -#define CFG_DRV_ACT_RANGES_APF_2_TOP HCF_CFG_APF_2_TOP -#else -err: ; -#endif -#endif // HCF_CFG_APF_TOP - -#ifdef HCF_CFG_APF_2_BOTTOM // Bottom Compatibility for AP Firmware - driver I/F -#if CFG_DRV_ACT_RANGES_APF_2_BOTTOM <= HCF_CFG_APF_2_BOTTOM && HCF_CFG_APF_2_BOTTOM <= CFG_DRV_ACT_RANGES_APF_2_TOP -#undef CFG_DRV_ACT_RANGES_APF_2_BOTTOM -#define CFG_DRV_ACT_RANGES_APF_2_BOTTOM HCF_CFG_APF_2_BOTTOM -#else -err: ; -#endif -#endif // HCF_CFG_APF_BOTTOM - -//--------------------------------------------------------------------------------------------------------------------- -#if defined HCF_CFG_STA_1_TOP || defined HCF_CFG_STA_1_BOTTOM -err: STA_1 not supported for H-I; // Compatibility for Station Firmware - driver I/F -#endif // HCF_CFG_STA_1_TOP / HCF_CFG_STA_1_BOTTOM - -#ifdef HCF_CFG_STA_2_TOP // Top Compatibility for Station Firmware - driver I/F -#if HCF_CFG_STA_2_TOP == 0 || \ - CFG_DRV_ACT_RANGES_STA_2_BOTTOM <= HCF_CFG_STA_2_TOP && HCF_CFG_STA_2_TOP <= CFG_DRV_ACT_RANGES_STA_2_TOP -#undef CFG_DRV_ACT_RANGES_STA_2_TOP -#define CFG_DRV_ACT_RANGES_STA_2_TOP HCF_CFG_STA_2_TOP -#else -err: ; -#endif -#endif // HCF_CFG_STA_TOP - -#ifdef HCF_CFG_STA_2_BOTTOM // Bottom Compatibility for Station Firmware - driver I/F -#if CFG_DRV_ACT_RANGES_STA_2_BOTTOM <= HCF_CFG_STA_2_BOTTOM && HCF_CFG_STA_2_BOTTOM <= CFG_DRV_ACT_RANGES_STA_2_TOP -#undef CFG_DRV_ACT_RANGES_STA_2_BOTTOM -#define CFG_DRV_ACT_RANGES_STA_2_BOTTOM HCF_CFG_STA_2_BOTTOM -#else -err: ; -#endif -#endif // HCF_CFG_STA_BOTTOM - - -/************************************************************************************************/ -/************************************** MACROS ************************************************/ -/************************************************************************************************/ - -#ifdef HCF_SLEEP -#define MSF_WAIT(x) do { \ - PROT_CNT_INI; \ - HCF_WAIT_WHILE((IPW(HREG_IO) & HREG_IO_WOKEN_UP) == 0); \ - HCFASSERT( prot_cnt, IPW( HREG_IO ) ); \ - } while (0) -#else -#define MSF_WAIT(x) do { } while (0) -#endif // HCF_SLEEP - -#define LOF(x) (sizeof(x)/sizeof(hcf_16)-1) - -//resolve problems on for some 16 bits compilers to create 32 bit values -#define MERGE_2( hw, lw ) ( ( ((hcf_32)(hw)) << 16 ) | ((hcf_16)(lw)) ) - -#if ! defined HCF_STATIC -#define HCF_STATIC static -#endif // HCF_STATIC - -#if ( (HCF_TYPE) & HCF_TYPE_HII5 ) == 0 -#define DAWA_ACK( mask) do { \ - OPW( HREG_EV_ACK, mask | HREG_EV_ACK_REG_READY ); \ - OPW( HREG_EV_ACK, (mask & ~HREG_EV_ALLOC) | HREG_EV_ACK_REG_READY ); \ - } while (0) -#define DAWA_ZERO_FID(reg) OPW( reg, 0 ) -#else -#define DAWA_ACK( mask) OPW( HREG_EV_ACK, mask ) -#define DAWA_ZERO_FID(reg) do { } while (0) -#endif // HCF_TYPE_HII5 - -#if (HCF_TYPE) & HCF_TYPE_WPA -#define CALC_RX_MIC( p, len ) calc_mic_rx_frag( ifbp, p, len ) -#define CALC_TX_MIC( p, len ) calc_mic_tx_frag( ifbp, p, len ) -#else -#define CALC_RX_MIC( p, len ) -#define CALC_TX_MIC( p, len ) -#define MIC_RX_RTN( mic, dw ) -#define MIC_TX_RTN( mic, dw ) -#endif // HCF_TYPE_WPA - -#if HCF_TALLIES & HCF_TALLIES_HCF //HCF tally support -#define IF_TALLY(x) do { x; } while (0) -#else -#define IF_TALLY(x) do { } while (0) -#endif // HCF_TALLIES_HCF - - -#if HCF_DMA -#define IF_DMA(x) do { x; } while(0) -#define IF_NOT_DMA(x) do { } while(0) -#define IF_USE_DMA(x) if ( ifbp->IFB_CntlOpt & USE_DMA ) { x; } -#define IF_NOT_USE_DMA(x) if ( !(ifbp->IFB_CntlOpt & USE_DMA) ) { x; } -#else -#define IF_DMA(x) do { } while(0) -#define IF_NOT_DMA(x) do { x; } while(0) -#define IF_USE_DMA(x) do { } while(0) -#define IF_NOT_USE_DMA(x) do { x; } while(0) -#endif // HCF_DMA - - -#define IPW(x) ((hcf_16)IN_PORT_WORD( ifbp->IFB_IOBase + (x) ) ) -#define OPW(x, y) OUT_PORT_WORD( ifbp->IFB_IOBase + (x), y ) -/* make sure the implementation of HCF_WAIT_WHILE is such that there may be multiple HCF_WAIT_WHILE calls - * in a row and that when one fails all subsequent fail immediately without reinitialization of prot_cnt - */ -#if HCF_PROT_TIME == 0 -#define PROT_CNT_INI do { } while(0) -#define IF_PROT_TIME(x) do { } while(0) -#if defined HCF_YIELD -#define HCF_WAIT_WHILE( x ) do { } while( (x) && (HCF_YIELD) ) -#else -#define HCF_WAIT_WHILE( x ) do { } while ( x ) -#endif // HCF_YIELD -#else -#define PROT_CNT_INI hcf_32 prot_cnt = ifbp->IFB_TickIni -#define IF_PROT_TIME(x) do { x; } while(0) -#if defined HCF_YIELD -#define HCF_WAIT_WHILE( x ) while ( prot_cnt && (x) && (HCF_YIELD) ) prot_cnt--; -#else -#include -#define HCF_WAIT_WHILE( x ) while ( prot_cnt && (x) ) { udelay(2); prot_cnt--; } -#endif // HCF_YIELD -#endif // HCF_PROT_TIME - -#if defined HCF_EX_INT -//#if HCF_EX_INT & ~( HCF_EX_INT_TX_EX | HCF_EX_INT_TX_OK | HCF_EX_INT_TICK ) -;? out dated checking -err: you used an invalid bitmask; -// #endif // HCF_EX_INT validation -// #else -// #define HCF_EX_INT 0x000 -#endif // HCF_EX_INT - -#if 0 //get compiler going -#if HCF_EX_INT_TICK != HREG_EV_TICK -;? out dated checking -err: someone redefined these macros while the implementation assumes they are equal; -#endif -#if HCF_EX_INT_TX_OK != HFS_TX_CNTL_TX_OK || HFS_TX_CNTL_TX_OK != HREG_EV_TX_OK -;? out dated checking -err: someone redefined these macros while the implementation assumes they are equal; -#endif -#if HCF_EX_INT_TX_EX != HFS_TX_CNTL_TX_EX || HFS_TX_CNTL_TX_EX != HREG_EV_TX_EX -;? out dated checking -err: someone redefined these macros while the implementation assumes they are equal; -#endif -#endif // 0 get compiler going - - -/* The assert in HCFLOGENTRY checks against re-entrancy. Re-entrancy could be caused by MSF logic at - * task-level calling hcf_functions without shielding with HCF_ACT_ON/_OFF. When an interrupt occurs, - * the ISR could (either directly or indirectly) cause re-entering of the interrupted HCF-routine. - * - * The "(ifbp->IFB_AssertWhere = where)" test in HCFLOGENTRY services ALSO as a statement to get around: - * #pragma warning: conditional expression is constant - * on the if-statement - */ -#if HCF_ASSERT -#define HCFASSERT(x,q) do { if (!(x)) {mdd_assert(ifbp, __LINE__, q );} } while(0) -#define MMDASSERT(x,q) {if (!(x)) {mdd_assert( assert_ifbp, __LINE__ + FILE_NAME_OFFSET, q );}} - -#define HCFLOGENTRY( where, what ) do { \ - if ( (ifbp->IFB_AssertWhere = where) <= 15 ) { \ - HCFASSERT( (ifbp->IFB_AssertTrace & 1<<((where)&0xF)) == 0, ifbp->IFB_AssertTrace ); \ - ifbp->IFB_AssertTrace |= 1<<((where)&0xF); \ - } \ - HCFTRACE(ifbp, where ); \ - HCFTRACEVALUE(ifbp, what ); \ - } while (0) - -#define HCFLOGEXIT( where ) do { \ - if ( (ifbp->IFB_AssertWhere = where) <= 15 ) { \ - ifbp->IFB_AssertTrace &= ~(1<<((where)&0xF)); \ - } \ - HCFTRACE(ifbp, (where)|HCF_TRACE_EXIT ); \ - } while (0) - -#else // HCF_ASSERT -#define HCFASSERT( x, q ) do { } while(0) -#define MMDASSERT( x, q ) -#define HCFLOGENTRY( where, what ) do { } while(0) -#define HCFLOGEXIT( where ) do { } while(0) -#endif // HCF_ASSERT - -#if HCF_INT_ON -/* ;? HCFASSERT_INT - * #if (HCF_SLEEP) & HCF_DDS - * #define HCFASSERT_INT HCFASSERT( ifbp->IFB_IntOffCnt != 0xFFFF && ifbp->IFB_IntOffCnt != 0xFFFE, \ - * ifbp->IFB_IntOffCnt ) - * #else - */ -#define HCFASSERT_INT HCFASSERT( ifbp->IFB_IntOffCnt != 0xFFFF, ifbp->IFB_IntOffCnt ) -// #endif // HCF_DDS -#else -#define HCFASSERT_INT -#endif // HCF_INT_ON - - -#if defined HCF_TRACE -#define HCFTRACE(ifbp, where ) do {OPW( HREG_SW_1, where );} while(0) -//#define HCFTRACE(ifbp, where ) {HCFASSERT( DO_ASSERT, where );} -#define HCFTRACEVALUE(ifbp, what ) do {OPW( HREG_SW_2, what );} while (0) -//#define HCFTRACEVALUE(ifbp, what ) {HCFASSERT( DO_ASSERT, what );} -#else -#define HCFTRACE(ifbp, where ) do { } while(0) -#define HCFTRACEVALUE(ifbp, what ) do { } while(0) -#endif // HCF_TRACE - - -#if HCF_BIG_ENDIAN -#define BE_PAR(x) ,x -#else -#define BE_PAR(x) -#endif // HCF_BIG_ENDIAN - -/************************************************************************************************/ -/************************************** END OF MACROS *****************************************/ -/************************************************************************************************/ - -/************************************************************************************************/ -/*************************************** PROTOTYPES *******************************************/ -/************************************************************************************************/ - -#if HCF_ASSERT -extern IFBP BASED assert_ifbp; //to make asserts easily work under MMD and DHF -EXTERN_C void mdd_assert (IFBP ifbp, unsigned int line_number, hcf_32 q ); -#endif //HCF_ASSERT - -#if ! ( (HCF_IO) & HCF_IO_32BITS ) // defined 16 bits only -#undef OUT_PORT_STRING_32 -#undef IN_PORT_STRING_32 -#endif // HCF_IO -#endif //HCFDEFC_H - diff --git a/drivers/staging/wlags49_h2/man/wlags49.4 b/drivers/staging/wlags49_h2/man/wlags49.4 deleted file mode 100644 index 37df99879183..000000000000 --- a/drivers/staging/wlags49_h2/man/wlags49.4 +++ /dev/null @@ -1,734 +0,0 @@ -.\" vim:tw=78: -.\" Copyright (c) 1999-2003 Agere Systems Inc. -- http://www.agere.com -.\" wlags49.4 7.20-abg 04/28/2004 13:30:00 -.\" -.TH WLAGS49 4 "04/28/2004 13:30:00" "pcmcia-cs" -.SH NAME -wlags49 \- Agere Systems Wireless PC Card / PCI device drivers - -wlags49_h2_cs.o \- Hermes-II Card Services (PCMCIA/CF) driver -.br -wlags49_h2.o \- Hermes-II MiniPCI driver -.br -wlags49_h25.o \- Hermes-II.5 PCI/CardBus driver -.br -wlags49_h25_cs.o\- Hermes-II.5 Card Services (PCMCIA/CF) driver - -.SH SYNOPSIS -.nh -.fi -.B insmod wlags49_[h1,h2]_[cs].o -.br -.RB [ Authentication=n ] -.RB [ AuthKeyMngmtSuite=???? ] -.RB [ BRSC2GHz=b ]\p -.RB [ BRSC5GHz=b ] -.RB [ Coexistence=n ] -.RB [ Configured=???? ]\p -.RB [ ConnectionControl=???? ] -.RB [ CreateIBSS=s ] -.RB [ DebugFlag=n ]\p -.RB [ DesiredSSID=s ] -.RB [ DownloadFirmware=n ] -.RB [ DriverEnable=???? ]\p -.RB [ EnableEncryption=s ] -.RB [ Encryption=???? ] -.RB [ ExcludeUnencrypted=s ]\p -.RB [ IntraBSSRelay=s ] -.RB [ IrqList=i,j,... ] -.RB [ IrqMask=n ]\p -.RB [ Key1=s ] -.RB [ Key2=s ] -.RB [ Key3=s ] -.RB [ Key4=s ]\p -.RB [ LoadBalancing=s ] -.RB [ MaxSleepDuration=n ] -.RB [ MediumDistribution=s ]\p -.RB [ MicroWaveRobustness=s ] -.RB [ MulticastPMBuffering=s ] -.RB [ MulticastRate=n ]\p -.RB [ MulticastReceive=s ] -.RB [ NetworkAddress=n,n,n,n,n,n ] -.RB [ NetworkType=???? ]\p -.RB [ OwnATIMWindow=n ] -.RB [ OwnBeaconInterval=n ] -.RB [ OwnChannel=n ]\p -.RB [ OwnDTIMPeriod=n ] -.RB [ OwnName=s ] -.RB [ OwnSSID=s ]\p -.RB [ pc_debug=n ] -.RB [ PMEnabled=b ] -.RB [ PMHoldoverDuration=n ]\p -.RB [ PortType=n ] -.RB [ PowerMode=???? ] -.RB [ PromiscuousMode=s ]\p -.RB [ RejectANY=s ] -.RB [ RTSThreshold=n ]\p -.RB [ RTSThreshold1=n ] -.RB [ RTSThreshold2=n ] -.RB [ RTSThreshold3=n ]\p -.RB [ RTSThreshold4=n ] -.RB [ RTSThreshold5=n ] -.RB [ RTSThreshold6=n ]\p -.RB [ SRSC2GHz=b ] -.RB [ SRSC5GHz=b ] -.RB [ SystemScale=n ]\p -.RB [ TxKey=n ] -.RB [ TxRateControl=n ]\p -.RB [ TxRateControl1=n ] -.RB [ TxRateControl2=n ] -.RB [ TxRateControl3=n ]\p -.RB [ TxRateControl4=n ] -.RB [ TxRateControl5=n ] -.RB [ TxRateControl6=n ]\p -.RB [ WDSAddress=n,n,n,n,n,n ]\p -.RB [ WDSAddress1=n,n,n,n,n,n ] -.RB [ WDSAddress2=n,n,n,n,n,n ]\p -.RB [ WDSAddress3=n,n,n,n,n,n ] -.RB [ WDSAddress4=n,n,n,n,n,n ]\p -.RB [ WDSAddress5=n,n,n,n,n,n ] -.RB [ WDSAddress6=n,n,n,n,n,n ]\p -.fi - - - -.SH DESCRIPTION -.I wlags49 -is the low-level Card Services / PCI driver for the -.B Wireless PC Card, Wireless Integrated Card, Wireless Embedded Card -and other wireless adapters based on the Agere Systems Hermes-II, and Hermes-II.5 wireless MAC. When this driver is attached to a card, it -allocates the next available ethernet device (eth0..eth#). This -device name will be passed on to -.IR cardmgr (8), -or the PCI subsystem, for the card configuration, and reported in the kernel log file -with the I/O base address and MAC address used by the card. -.SH FEATURES - \- Hot plug/unplug - \- Access Point and peer-to-peer communication - \- Card power management - \- Support for Hermes-II & Hermes-II.5 based PCMCIA, Mini PCI, and CardBus cards - \- Wired Equivalent Privacy (WEP) - \- WPA-PSK support - \- Driver utility interface (UIL) - \- Wireless Extensions - \- Software AP mode -.SH PARAMETERS -.TP -.B Authentication=n -Algorithm used for Authentication. -.BR - 1 \- Open System -.BR - 2 \- Shared Key -.BR - Default: 1 -.TP -.B Auth_key_mgmt_suite -??????????????? -.TP -.B BRSC2GHz=b -Sets the card\'s Basic Rate Set in the 2.4GHz band. See SRSC2GHz -for the value\'s format. -.BR - Default: 15 (or 0x000F, only 11b rates to accept legacy 11b stations) -.TP -.B BRSC5GHz-b -Sets the card\'s Basic Rate Set in the 5.0GHz band. See SRSC2GHz for the -value\'s format -.BR - Default: 4080 (or 0x0FF0, all 11a rates) -.TP -.B Coexistence=n -Used to make the 802.11a/b/g coexistence behavior more strict. -.BR - Default \- 0 (Use standard behavior) -.TP -.B ConnectionControl=n -Configures the card\'s connection control process in dealing with multiple -bands (802.11b/g vs. 802.11a). -.BR - 0 \- Single Band operation in 2GHz -.BR - 1 \- Single Band operation in 5GHz -.BR - 2 \- Multiple Band operation starting with 2GHz -.BR - 3 \- Multiple Band operation starting with 5GHz -.BR - Default \- 2 -.TP -.B Configured -??????????????? -.TP -.B ConnectionControl -??????????????? -.TP -.B CreateIBSS=s -Enable or disable IBSS Creation. -For correct operation, specification of a OwnSSID is required. -This mode requires firmware 6.04 or higher. -.BR - N \- Disable -.BR - Y \- Enable -.BR - Default: N -.TP -.B DebugFlag=n -Selects the driver debugging level. This parameter is only available -if the module is compiled with debugging enabled. Refer to the -file -.B debug.h -in the source directory for information on the flag values. -.BR - 0x00000001L \- DBG_ERROR_ON -.BR - 0x00000002L \- DBG_WARNING_ON -.BR - 0x00000004L \- DBG_NOTICE_ON -.BR - 0x00000008L \- DBG_TRACE_ON -.BR - 0x00000010L \- DBG_VERBOSE_ON -.BR - 0x00000020L \- DBG_PARAM_ON -.BR - 0x00000040L \- DBG_BREAK_ON -.BR - 0x00000100L \- DBG_RX_ON -.BR - 0x00000200L \- DBG_TX_ON -.BR - 0x00000400L \- DBG_DS_ON -.BR -If the module is compiled with debugging enabled, DebugFlag -defaults to DBG_ERROR_ON, DBG_WARNING_ON and DBG_BREAK_ON. -DebugFlag overrules pc_debug. -.TP -.B DesiredSSID=s -Same as OwnSSID. -.TP -.B DownloadFirmware=n -This release of the driver introduces the ability to perform downloads of the STA/AP -firmware. In fact, this is required for Hermes-II based cards. This parameter tells -the driver which version of the firmware to download to the card. -.BR - 0 \- No download performed (Hermes-I only) -.BR - 1 \- Download STA firmware -.BR - 2 \- Download AP firmware -.BR - Default: 1, when STA mode functionality is - included in the build - 2, when code is built exclusively for - AP mode -.TP -.B DriverEnable -??????????????? -.TP -.B EnableEncryption=n -Set the method of Data encryption. -.BR - 0 \- Disable -.BR - 1 \- Enable WEP Encryption -.BR - 2 \- Enable WPA with TKIP encryption -.BR - Default: 0 -.TP -.B Encryption -??????????????? -.TP -.B ExcludeUnencrypted=s -Controls how the stations must communicate with the AP. -.BR - Y \- Stations must enable encryption and provide - the proper encryption key to communicate - with the AP. -.BR - N \- Stations do not need to enable encryption - to communicate with the AP. -.BR - Default: N -.TP -.B IntraBSSRelay=s -Controls the automatic relay of received messages that are destined for other -stations in the BSS. -.BR - Y \- Messages are relayed to the appropriate - station(s). -.BR - N \- Messages are passed up to the host. -.BR - Default: Y -.TP -.B IrqList=i,j,... -Specifies the set of interrupts (up to 4) that may be allocated by -this driver. This overrides the values set in the -.B IrqMask -parameter. NOTE: This parameter is for PCMCIA only. -.TP -.B IrqMask=n -Specifies a mask of valid interrupts that may be allocated by this driver. -If -.B IrqList -is also specified, the values in -.B IrqList -are used instead. NOTE: This parameter is for PCMCIA only. -.BR - Default: 0xdeb8 (IRQ 3,4,5,7,9,10,11,12,14,15) -.TP -.B Key1=s -Specifies one of 4 possible keys for the Data encryption. -One of these keys, identified by TxKey, -is used for the enciphering of Data that is transmitted by this station. -All keys specified can be used for the deciphering of Data that is received. -.BR -The key value can be an ASCII character string or a hexadecimal value. -The length of the key value can be 5 characters or 10 hexadecimal digits for -the standard encryption (Silver or Gold card), or 13 characters or 26 -hexadecimal digits for the encryption with extended keys (Gold card only). -The keys defined in the station must match the keys defined in the access -points; both on value and number (1 through 4). -.BR -In 2.0 series Linux kernel modules, values that begin with a number are -considered integers. In this case a hexadecimal value string or a character -string starting with a number, will need to be surrounded by escaped -double quotes (ie. Key1=\\"0x1122334455\\" Key2=\\"12xyz\\"). -.BR - 5 or 13, printable character string, or -.BR - 10 or 26 hex digits if preceded by "0x". -.BR - If this parameter is omitted, the default of the MAC is used ( = 0-length). -.TP -.B Key2=s -Same as Key1. -.TP -.B Key3=s -Same as Key1. -.TP -.B Key4=s -Same as Key1. -.TP -.B LoadBalancing=s -Control for the Load Balancing algorithm for both STAs and APs. The AP -includes a load balancing element in the Probe Response and Beacon frames. -The STA uses this info to select an AP, not only based on comms quality, but -also on the load of that AP. -.BR - Default: Y -.TP -.B MaxDataLength -??????????????? -.TP -.B MaxSleepDuration=n -Set the maximum Power Management sleep duration in milliseconds. -Valid values are 0 to 65535 milliseconds. -.BR - Default: 100 -.TP -.B MediumDistribution=s -Control for the distribution of medium parameters, like communication -thresholds, microwave robustness, RTS/CTS thresholds, by APs. The associated -stations replace their own values with the received values. -.BR - Default=Y -.TP -.B MicroWaveRobustness=s -Enable or disable Microwave Oven Robustness. -.BR - N \- Disable -.BR - Y \- Enable -.BR - Default: N -.TP -.B MulticastPMBuffering=s -Controls buffering of multicast MAC frames for transmission after DTIM. If no, -multicast MAC frames are directly placed in the output queue. -.BR - Default: Y -.TP -.B MulticastRate=n -Sets the data rate for multicast message transmission. -.BR - 1 \- Fixed 1Mb/s - 2 \- Fixed 2Mb/s - 3 \- Fixed 5.5Mb/s - 4 \- Fixed 11Mb/s -.BR - Default: 2 - -For Hermes-II.5, an INTEGER CONVERTED bit mask representing the -rate to multicast, where the rates supported are as follows: - -Bit : 15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00 -.br ------------------------------------------------------- -.br -Rate : XX|XX|XX|XX|54|48|36|24|18|12| 9| 6|11|5.5|2| 1 - - Default: 4 (Translates to 0x0004 = 5.5 Mb/sec) - -.TP -.B MulticastReceive=s -Enable or disable receiving of all multicast packets when Card Power Management -is enabled. When enabled, the station will wake up frequently -to receive the multicast frames. This causes less optimal power savings. -.BR - N \- Disable -.BR - Y \- Enable -.BR - Default: Y -.TP -.B NetworkAddress=n,n,n,n,n,n -Sets the adapter hardware ethernet address (MAC address) to the value -specified. Note that this is to be used to specify a Local MAC address. Do -not specify this parameter if the card\'s universal address is to be used. -Valid values are six hexadecimal digit-pairs (prefixed with 0x). -.BR - Default: -.TP -.B NetworkType -??????????????? -.TP -.B OwnATIMWindow=n -ATIM window time used for creating an IBSS. -.BR - Range: 0..100 -.BR - Default: 0 -.TP -.B OwnBeaconInterval=b -Beacon Interval in TU -.BR - Range 20..200 -.BR - Default \- 100 -.TP -.B channel=n -Same as OwnChannel. -.TP -.B OwnChannel=n -Sets the channel the Ad-Hoc or IBSS mode will use. -The default channel for Ad-Hoc mode is determined by the Wireless PC Card. -The default channel for IBSS is set to 10 by the driver. -This value has no effect when the adapter is used with an Access Point -(BSS network) since the Access Point automatically determines the channel. -Valid values are 0 to 14. However the channels allowed in -your region are subject to local regulations and are limited at -manufacturing time of the Wireless PC Card. When the provided value is -not allowed, the value remains unchanged. -.BR - 0 \- Use default channel -.BR - Default: 0 -.TP -.B OwnDTIMPeriod=n -The number of beacon intervals between successive Delivery Traffic Identification -Maps (DTIMs). -.BR - Range: 1..65535 -.BR - Default: 1 -.TP -.B OwnName=s -Sets the station name to the specified string value. This parameter -is used for diagnostic purposes, as a user\-friendly identification -of this system. This parameter accepts a maximum of 32 characters. -.BR - Default: Linux -.TP -.B OwnSSID=s -Sets the card network name to the specified string value. This parameter -accepts a maximum of 32 characters. Whitespace in the network name -will need to be escaped with a backslash (ie. OwnSSID=My\\ Network). -.BR - Default: ANY -.TP -.B pc_debug=n -Selects the PCMCIA debugging level. This parameter is only available -if the module is compiled with debugging enabled. A non\-zero value -enables debugging. Higher values yield more information, i.e. for any value all -lower values are implied. -.BR - 8 \- DBG_DS_ON -.BR - 7 \- DBG_RX_ON | DBG_TX_ON -.BR - 6 \- DBG_PARAM_ON -.BR - 5 \- DBG_TRACE_ON -.BR - 4 \- DBG_VERBOSE_ON -.BR -If the module is compiled with debugging enabled, pc_debug defaults to 5. -DebugFlag overrules pc_debug. -.BR -The name pc_debug rather than PcDebug, since pc_debug is used by many PCMCIA driver. -.TP -.B PMEnabled=b -Sets the card\'s Power Management state. -.BR - 0 \- Disable -.BR - 1 \- Enable Enhanced Mode -.BR - 2 \- Enabled Standard Mode -.BR - 0x8000 \- Enhanced?????? Mode (to be combined with 0x0001 or 0x0002) - - Default: 0 (Disabled) -.TP -.B PMHoldoverDuration=n -Time that the station remains in an awake state after a MAC frame transfer if -Enhanced Power Save is active. -.BR - Range: 1..1000 -.BR - Default: 100 -.TP -.B PowerMode -??????????????? -.TP -.B PortType=n -Selects the type of network operation. -.BR - 1 \- Normal Operation (BSS or IBSS) -.BR - 3 \- Ad-Hoc Demo Mode -.BR - Default: 1 -.TP -.B PromiscuousMode=s -Switch for promiscuous mode reception. -.BR - Default: N -.TP -.B RejectANY=s -Controls how stations associate to the device. -.BR - Y \- Stations must provide the correct SSID to - associate to the AP. -.BR - N \- Stations are not required to provide the - correct SSID to associate to the AP. - Known as an \'open\' network. -.BR - Default - N -.TP -.B RTSThreshold=n -Controls the RTS/CTS handshake threshold for transmissions in Station mode. -Valid values are 0 to 2347. -.BR - 500 \- Hidden Stations -.BR - 2347 \- No RTS/CTS -.BR - Default: 2347 -.TP -.B RTSThreshold1=n -Same as RTSThreshold, only for port 1 of in AccessPoint mode. -.TP -.B RTSThreshold2=n -Same as RTSThreshold1, only for port 2. -.TP -.B RTSThreshold3=n -Same as RTSThreshold1, only for port 3. -.TP -.B RTSThreshold4=n -Same as RTSThreshold1, only for port 4. -.TP -.B RTSThreshold5=n -Same as RTSThreshold1, only for port 5. -.TP -.B RTSThreshold6=n -Same as RTSThreshold1, only for port 6. -.TP -.B SRSC2GHz=b -Sets the card\'s Supported Rate Set in the 2.4GHz band. The value -is an INTEGER CONVERTED bit mask representing the rates to support, -where the rates supported are as follows: - -Bit : 15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00 -.br ------------------------------------------------------- -.br -Rate : XX|XX|XX|XX|54|48|36|24|18|12| 9| 6|11|5.5|2| 1 -.BR - Default: 4095 (or 0x0FFF, all 11b and 11g rates) -.TP -.B SRSC5GHz=b -Sets the card\'s Supported Rate Set in the 5.0GHz band. See SRSC2GHz -for the value\'s format. -.BR - Default: 4080 (or 0x0FF0, all 11a rates) -.TP -.B SystemScale=n -Sets the distance between Access Points in the network. This value -influences the Modem Thresholds (EnergyDetectThreshold, -CarrierDetectThreshold and DeferThreshold) and -the Roaming Thresholds (CellSearchThreshold and OutOfRangeThreshold). -.BR - 1 \- Large -.BR - 2 \- Medium -.BR - 3 \- Small -.BR - Default: 1 -.TP -.B TxRateControl=n -Sets the data rate to be used by the transmitter. For Hermes-II: -.BR - 1 \- Fixed Low (1 Mb/sec) -.BR - 2 \- Fixed Standard (2 Mb/sec) -.BR - 3 \- Auto Rate Select High (11, 5.5, 2, 1 Mb/sec) -.BR - 4 \- Fixed Medium (5.5 Mb/sec) -.BR - 5 \- Fixed High (11 Mb/sec) -.BR - 6 \- Auto Rate Select Standard (2, 1 Mb/sec) -.BR - 7 \- Auto Rate Select Medium (5.5, 2, 1 Mb/sec) -.BR - Default: 3 - -For Hermes-II.5, an INTEGER CONVERTED bit mask representing all of the -rates to support, where the rates supported are as follows: - -Bit : 15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00 -.br ------------------------------------------------------- -.br -Rate : XX|XX|XX|XX|54|48|36|24|18|12| 9| 6|11|5.5|2| 1 -.BR - Default: 4095 (Translates to 0xFFF, which is all rates) -.TP -.B RTSThreshold=n -Sets the number of octets in a message or fragment above which a -RTS/CTS handshake is performed. -Valid values are 0 to 2347. -.BR - 500 \- Hidden Stations -.BR - 2347 \- No RTS/CTS -.BR - Default: 2347 -.TP -.B TxKey=n -Designates which of the keys is to be used for the enciphering of data that is -transmitted by this station. -.BR - Integer in the range 1..4. -.BR - Default: 1 -.TP -.B TxPowLevel -??????????????? -.TP -.B TxRateControl=n -Sets the data rate to be used by the transmitter in Station mode. -.BR - 1 \- Fixed Low -.BR - 2 \- Fixed Standard -.BR - 3 \- Auto Rate Select (High) -.BR - 4 \- Fixed Medium -.BR - 5 \- Fixed High -.BR - 6 \- Auto Rate Select (Standard) -.BR - 7 \- Auto Rate Select (Medium) -.BR - Default: 3 - -For Hermes-II.5, an INTEGER CONVERTED bit mask representing all of the -rates to support, where the rates supported are as follows: - -Bit : 15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00 -.br ------------------------------------------------------- -.br -Rate : XX|XX|XX|XX|54|48|36|24|18|12| 9| 6|11|5.5|2| 1 -.BR - Default: 4095 (Translates to 0xFFF, which is all rates) - -.TP -.B TxRateControl1=n -Same as TxRateControl, only for port 1 in AccessPoint mode. -.TP -.B TxRateControl2=n -Same as TxRateControl1, only for port 2. -.TP -.B TxRateControl3=n -Same as TxRateControl1, only for port 3. -.TP -.B TxRateControl4=n -Same as TxRateControl1, only for port 4. -.TP -.B TxRateControl5=n -Same as TxRateControl1, only for port 5. -.TP -.B TxRateControl6=n -Same as TxRateControl1, only for port 6. -.TP -.B VendorDescription -??????????????? -.TP -.B WDSAddress=n,n,n,n,n,n -MAC address that identifies the corresponding node of the WDS port in Station mode. -Note that for WDS to work properly, a bridge interface must be setup between the device and -the wds network devices created by the driver. For more information on bridge -interfaces, please refer to the man page for \'brctl\'. -.BR - Default: 00:00:00:00:00:00 -.TP -.B WDSAddress1=n,n,n,n,n,n -Same as WDSAddress, only for port 1 in AccessPoint mode. -.TP -.B WDSAddress2=n,n,n,n,n,n -Same as WDSAddress1, only for port 2. -.TP -.B WDSAddress3=n,n,n,n,n,n -Same as WDSAddress1, only for port 3. -.TP -.B WDSAddress4=n,n,n,n,n,n -Same as WDSAddress1, only for port 4. -.TP -.B WDSAddress5=n,n,n,n,n,n -Same as WDSAddress1, only for port 5. -.TP -.B WDSAddress6=n,n,n,n,n,n -Same as WDSAddress1, only for port 6. -.SH SECURITY -On a multi-user system only the system administrator needs access to the WEP -encryption keys. In this case, consider removing the read permission for -normal users of the PCMCIA config.opts file, the system log file, and any -Agere proprietary iwconfig-eth scripts. -.SH CONTACT -If you encounter problems when installing or using this product, or would like -information about our other "Wireless" products, please contact your local -Authorized "Wireless" Reseller or Agere Systems sales office. - -Addresses and telephone numbers of the Agere Systems sales offices are -listed on our Agere Systems web site. -.TP -.B WWW -http://www.agere.com -.SH SEE ALSO -.BR cardmgr (8), -.BR pcmcia (5), -.BR ifconfig (8), -.BR insmod (8), -.BR brctl (8). diff --git a/drivers/staging/wlags49_h2/mdd.h b/drivers/staging/wlags49_h2/mdd.h deleted file mode 100644 index 0c914971c1ef..000000000000 --- a/drivers/staging/wlags49_h2/mdd.h +++ /dev/null @@ -1,1155 +0,0 @@ - -#ifndef MDD_H -#define MDD_H 1 - -/************************************************************************************************************* -* -* FILE : mdd.h -* -* DATE : $Date: 2004/08/05 11:47:10 $ $Revision: 1.6 $ -* Original : 2004/05/25 05:59:37 Revision: 1.57 Tag: hcf7_t20040602_01 -* Original : 2004/05/13 15:31:45 Revision: 1.54 Tag: hcf7_t7_20040513_01 -* Original : 2004/04/15 09:24:41 Revision: 1.47 Tag: hcf7_t7_20040415_01 -* Original : 2004/04/13 14:22:45 Revision: 1.46 Tag: t7_20040413_01 -* Original : 2004/04/01 15:32:55 Revision: 1.42 Tag: t7_20040401_01 -* Original : 2004/03/10 15:39:28 Revision: 1.38 Tag: t20040310_01 -* Original : 2004/03/04 11:03:37 Revision: 1.36 Tag: t20040304_01 -* Original : 2004/03/02 09:27:11 Revision: 1.34 Tag: t20040302_03 -* Original : 2004/02/24 13:00:27 Revision: 1.29 Tag: t20040224_01 -* Original : 2004/02/18 17:13:57 Revision: 1.26 Tag: t20040219_01 -* -* AUTHOR : Nico Valster -* -* DESC : Definitions and Prototypes for HCF, DHF, MMD and MSF -* -*************************************************************************************************************** -* -* -* SOFTWARE LICENSE -* -* This software is provided subject to the following terms and conditions, -* which you should read carefully before using the software. Using this -* software indicates your acceptance of these terms and conditions. If you do -* not agree with these terms and conditions, do not use the software. -* -* COPYRIGHT © 1994 - 1995 by AT&T. All Rights Reserved -* COPYRIGHT © 1996 - 2000 by Lucent Technologies. All Rights Reserved -* COPYRIGHT © 2001 - 2004 by Agere Systems Inc. All Rights Reserved -* All rights reserved. -* -* Redistribution and use in source or binary forms, with or without -* modifications, are permitted provided that the following conditions are met: -* -* . Redistributions of source code must retain the above copyright notice, this -* list of conditions and the following Disclaimer as comments in the code as -* well as in the documentation and/or other materials provided with the -* distribution. -* -* . Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following Disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* . Neither the name of Agere Systems Inc. nor the names of the contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. -* -* Disclaimer -* -* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -* INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF -* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY -* USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN -* RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGE. -* -* -************************************************************************************************************/ - - -/************************************************************************************************************ -* -* The macros Xn(...) and XXn(...) are used to define the LTV's (short for Length Type Value[ ]) , -* aka RIDs, processed by the Hermes. -* The n in Xn and XXn reflects the number of "Value" fields in these RIDs. -* -* Xn(...) : Macros used for RIDs which use only type hcf_16 for the "V" fields of the LTV. -* Xn takes as parameters a RID name and "n" name(s), one for each of the "V" fields of the LTV. -* -* XXn(...) : Macros used for RIDs which use at least one other type then hcf_16 for a "V" field -* of the LTV. -* XXn(..) takes as parameters a RID name and "n" pair(s) of type and name, one for each "V" field -* of the LTV - - ****************************************** e x a m p l e s *********************************************** - -* X1(RID_NAME, parameters...) : expands to : -* typedef struct RID_NAME_STRCT { -* hcf_16 len; -* hcf_16 typ; -* hcf_16 par1; -* } RID_NAME_STRCT; - -* X2(RID_NAME, parameters...) : expands to : -* typedef struct RID_NAME_STRCT { -* hcf_16 len; -* hcf_16 typ; -* hcf_16 par1; -* hcf_16 par2; -* } RID_NAME_STRCT; - - -* XX1(RID_NAME, par1type, par1name, ...) : expands to : -* typedef struct RID_NAME_STRCT { -* hcf_16 len; -* hcf_16 typ; -* par1type par1name; -* } RID_NAME_STRCT; - -************************************************************************************************************/ - -/******************************* XX Sub-macro definitions **************************************************/ - -#define XX1( name, type1, par1 ) \ -typedef struct { \ - hcf_16 len; \ - hcf_16 typ; \ - type1 par1; \ -} name##_STRCT; - -#define XX2( name, type1, par1, type2, par2 ) \ -typedef struct { \ - hcf_16 len; \ - hcf_16 typ; \ - type1 par1; \ - type2 par2; \ -} name##_STRCT; - -#define XX3( name, type1, par1, type2, par2, type3, par3 ) \ -typedef struct name##_STRCT { \ - hcf_16 len; \ - hcf_16 typ; \ - type1 par1; \ - type2 par2; \ - type3 par3; \ -} name##_STRCT; - -#define XX4( name, type1, par1, type2, par2, type3, par3, type4, par4 ) \ -typedef struct { \ - hcf_16 len; \ - hcf_16 typ; \ - type1 par1; \ - type2 par2; \ - type3 par3; \ - type4 par4; \ -} name##_STRCT; - -#define X1( name, par1 ) \ -typedef struct name##_STRCT { \ - hcf_16 len; \ - hcf_16 typ; \ - hcf_16 par1; \ -} name##_STRCT; - -#define X2( name, par1, par2 ) \ -typedef struct { \ - hcf_16 len; \ - hcf_16 typ; \ - hcf_16 par1; \ - hcf_16 par2; \ -} name##_STRCT; - -#define X3( name, par1, par2, par3 ) \ -typedef struct { \ - hcf_16 len; \ - hcf_16 typ; \ - hcf_16 par1; \ - hcf_16 par2; \ - hcf_16 par3; \ -} name##_STRCT; - -#define X4( name, par1, par2, par3, par4 ) \ -typedef struct { \ - hcf_16 len; \ - hcf_16 typ; \ - hcf_16 par1; \ - hcf_16 par2; \ - hcf_16 par3; \ - hcf_16 par4; \ -} name##_STRCT; - -#define X5( name, par1, par2, par3, par4, par5 ) \ -typedef struct { \ - hcf_16 len; \ - hcf_16 typ; \ - hcf_16 par1; \ - hcf_16 par2; \ - hcf_16 par3; \ - hcf_16 par4; \ - hcf_16 par5; \ -} name##_STRCT; - -#define X6( name, par1, par2, par3, par4, par5, par6 ) \ -typedef struct { \ - hcf_16 len; \ - hcf_16 typ; \ - hcf_16 par1; \ - hcf_16 par2; \ - hcf_16 par3; \ - hcf_16 par4; \ - hcf_16 par5; \ - hcf_16 par6; \ -} name##_STRCT; - -#define X8( name, par1, par2, par3, par4, par5, par6, par7, par8 ) \ -typedef struct { \ - hcf_16 len; \ - hcf_16 typ; \ - hcf_16 par1; \ - hcf_16 par2; \ - hcf_16 par3; \ - hcf_16 par4; \ - hcf_16 par5; \ - hcf_16 par6; \ - hcf_16 par7; \ - hcf_16 par8; \ -} name##_STRCT; - -#define X11( name, par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11 ) \ -typedef struct { \ - hcf_16 len; \ - hcf_16 typ; \ - hcf_16 par1; \ - hcf_16 par2; \ - hcf_16 par3; \ - hcf_16 par4; \ - hcf_16 par5; \ - hcf_16 par6; \ - hcf_16 par7; \ - hcf_16 par8; \ - hcf_16 par9; \ - hcf_16 par10; \ - hcf_16 par11; \ -} name##_STRCT; - -/******************************* Substructure definitions **************************************************/ - -//apparently not needed (CFG_CNF_COUNTRY) -typedef struct CHANNEL_SET { //channel set structure used in the CFG_CNF_COUNTRY LTV - hcf_16 first_channel; - hcf_16 number_of_channels; - hcf_16 max_tx_output_level; -} CHANNEL_SET; - -typedef struct KEY_STRCT { // key structure used in the CFG_DEFAULT_KEYS LTV - hcf_16 len; //length of key - hcf_8 key[14]; //encryption key -} KEY_STRCT; - -typedef struct SCAN_RS_STRCT { // Scan Result structure used in the CFG_SCAN LTV - hcf_16 channel_id; - hcf_16 noise_level; - hcf_16 signal_level; - hcf_8 bssid[6]; - hcf_16 beacon_interval_time; - hcf_16 capability; - hcf_16 ssid_len; - hcf_8 ssid_val[32]; -} SCAN_RS_STRCT; - -typedef struct CFG_RANGE_SPEC_STRCT { // range specification structure used in CFG_RANGES, CFG_RANGE1 etc - hcf_16 variant; - hcf_16 bottom; - hcf_16 top; -} CFG_RANGE_SPEC_STRCT; - -typedef struct CFG_RANGE_SPEC_BYTE_STRCT { // byte oriented range specification structure used in CFG_RANGE_B LTV - hcf_8 variant[2]; - hcf_8 bottom[2]; - hcf_8 top[2]; -} CFG_RANGE_SPEC_BYTE_STRCT; - -//used to set up "T" functionality for Info frames, i.e. log info frames in MSF supplied buffer and MailBox -XX1( RID_LOG, unsigned short FAR*, bufp ) -typedef RID_LOG_STRCT FAR *RID_LOGP; -XX1( CFG_RID_LOG, RID_LOGP, recordp ) - - X1( LTV, val[1] ) /*minimum LTV proto typ */ - X1( LTV_MAX, val[HCF_MAX_LTV] ) /*maximum LTV proto typ */ -XX2( CFG_REG_MB, hcf_16* , mb_addr, hcf_16, mb_size ) - -typedef struct CFG_MB_INFO_FRAG { // specification of buffer fragment - unsigned short FAR* frag_addr; - hcf_16 frag_len; -} CFG_MB_INFO_FRAG; - -/* Mail Box Info Block structures, - * the base form: CFG_MB_INFO_STRCT - * and the derived forms: CFG_MB_INFO_RANGE_STRCT with n is 1, 2, 3 or 20 - * predefined for a payload of 1, and up to 2, 3 and 20 CFG_MB_INFO_FRAG elements */ -XX3( CFG_MB_INFO, hcf_16, base_typ, hcf_16, frag_cnt, CFG_MB_INFO_FRAG, frag_buf[ 1] ) -XX3( CFG_MB_INFO_RANGE1, hcf_16, base_typ, hcf_16, frag_cnt, CFG_MB_INFO_FRAG, frag_buf[ 1] ) -XX3( CFG_MB_INFO_RANGE2, hcf_16, base_typ, hcf_16, frag_cnt, CFG_MB_INFO_FRAG, frag_buf[ 2] ) -XX3( CFG_MB_INFO_RANGE3, hcf_16, base_typ, hcf_16, frag_cnt, CFG_MB_INFO_FRAG, frag_buf[ 3] ) -XX3( CFG_MB_INFO_RANGE20, hcf_16, base_typ, hcf_16, frag_cnt, CFG_MB_INFO_FRAG, frag_buf[20] ) - -XX3( CFG_MB_ASSERT, hcf_16, line, hcf_16, trace, hcf_32, qualifier ) /*MBInfoBlock for asserts */ -#if (HCF_ASSERT) & ( HCF_ASSERT_LNK_MSF_RTN | HCF_ASSERT_RT_MSF_RTN ) -typedef void (MSF_ASSERT_RTN)( unsigned int , hcf_16, hcf_32 ); -typedef MSF_ASSERT_RTN /*can't link FAR*/ * MSF_ASSERT_RTNP; -/* CFG_REG_ASSERT_RTNP (0x0832) (de-)register MSF Callback routines - * lvl: Assert level filtering (not yet implemented) - * rtnp: address of MSF_ASSERT_RTN (native Endian format) */ -XX2( CFG_REG_ASSERT_RTNP, hcf_16, lvl, MSF_ASSERT_RTNP, rtnp ) -#endif // HCF_ASSERT_LNK_MSF_RTN / HCF_ASSERT_RT_MSF_RTN - - X1( CFG_HCF_OPT, val[20] ) /*(Compile time) options */ - X3( CFG_CMD_HCF, cmd, mode, add_info ) /*HCF Engineering command */ - -typedef struct { - hcf_16 len; - hcf_16 typ; - hcf_16 mode; // PROG_STOP/VOLATILE [FLASH/SEEPROM/SEEPROM_READBACK] - hcf_16 segment_size; // size of the segment in bytes - hcf_32 nic_addr; // destination address (in NIC memory) - hcf_16 flags; // 0x0001 : CRC Yes/No -// hcf_32 flags; // 0x0001 : CRC Yes/No - /* ;? still not the whole story - * flags is extended from 16 to 32 bits to force that compiling FW.C produces the same structures - * in memory as FUPU4 BIN files. - * Note that the problem arises from the violation of the constraint to use packing at byte boundaries - * as was stipulated in the WCI-specification - * The Pack pragma can't resolve this issue, because that impacts all members of the structure with - * disregard of their actual size, so aligning host_addr under MSVC 1.5 at 4 bytes, also aligns - * len, typ etc on 4 bytes - * */ -// hcf_16 pad; //!! be careful alignment problems for Bin download versus C download - hcf_8 FAR *host_addr; // source address (in Host memory) -} CFG_PROG_STRCT; // segment_descp; - -// a structure used for transporting debug-related information from firmware -// via the HCF, into the MSF -typedef struct { - hcf_16 len; - hcf_16 typ; - hcf_16 msg_id, msg_par, msg_tstamp; -} CFG_FW_PRINTF_STRCT; - -// a structure used to define the location and size of a certain debug-related -// buffer in nic-ram. -typedef struct { - hcf_16 len; - hcf_16 typ; - hcf_32 DbMsgCount, // ds (nicram) address of a counter - DbMsgBuffer, // ds (nicram) address of the buffer - DbMsgSize, // number of entries (each 3 word in size) in this buffer - DbMsgIntrvl; // ds (nicram) address of interval for generating InfDrop event -} CFG_FW_PRINTF_BUFFER_LOCATION_STRCT; - -XX3( CFG_RANGES, hcf_16, role, hcf_16, id, CFG_RANGE_SPEC_STRCT, var_rec[ 1] ) /*Actor/Supplier range (1 variant)*/ -XX3( CFG_RANGE1, hcf_16, role, hcf_16, id, CFG_RANGE_SPEC_STRCT, var_rec[ 1] ) /*Actor/Supplier range (1 variant)*/ -XX3( CFG_RANGE2, hcf_16, role, hcf_16, id, CFG_RANGE_SPEC_STRCT, var_rec[ 2] ) /*Actor range ( 2 variants) */ -XX3( CFG_RANGE3, hcf_16, role, hcf_16, id, CFG_RANGE_SPEC_STRCT, var_rec[ 3] ) /*Actor range ( 3 variants) */ -XX3( CFG_RANGE4, hcf_16, role, hcf_16, id, CFG_RANGE_SPEC_STRCT, var_rec[ 4] ) /*Actor range ( 4 variants) */ -XX3( CFG_RANGE5, hcf_16, role, hcf_16, id, CFG_RANGE_SPEC_STRCT, var_rec[ 5] ) /*Actor range ( 5 variants) */ -XX3( CFG_RANGE6, hcf_16, role, hcf_16, id, CFG_RANGE_SPEC_STRCT, var_rec[ 6] ) /*Actor range ( 6 variants) */ -XX3( CFG_RANGE7, hcf_16, role, hcf_16, id, CFG_RANGE_SPEC_STRCT, var_rec[ 7] ) /*Actor range ( 7 variants) */ -XX3( CFG_RANGE20, hcf_16, role, hcf_16, id, CFG_RANGE_SPEC_STRCT, var_rec[20] ) /*Actor range (20 variants) */ - -/*Frames */ - X3( CFG_ASSOC_STAT, assoc_stat, station_addr[3], val[46] ) /*Association status, basic */ - X2( CFG_ASSOC_STAT3, assoc_stat, station_addr[3] ) /*assoc_stat:3 */ - X3( CFG_ASSOC_STAT1, assoc_stat, station_addr[3], frame_body[43] ) /*assoc_stat:1 */ - X4( CFG_ASSOC_STAT2, assoc_stat, station_addr[3], old_ap_addr[3], frame_body[43] ) /*assoc_stat:2 */ - -/*Static Configurations */ - X1( CFG_CNF_PORT_TYPE, port_type ) /*[STA] Connection control characteristics */ - X1( CFG_MAC_ADDR, mac_addr[3] ) /*general: FC01,FC08,FC11,FC12,FC13,FC14,FC15,FC16 */ - X1( CFG_CNF_OWN_MAC_ADDR, mac_addr[3] ) - X1( CFG_ID, ssid[17] ) /*0xFC02, 0xFC04, 0xFC0E */ -/* X1( CFG_DESIRED_SSID, ssid[17] ) see Dynamic Configurations */ - X1( CFG_CNF_OWN_CHANNEL, channel ) /*Communication channel for BSS creation */ - X1( CFG_CNF_OWN_SSID, ssid[17] ) - X1( CFG_CNF_OWN_ATIM_WINDOW, atim_window ) - X1( CFG_CNF_SYSTEM_SCALE, system_scale ) - X1( CFG_CNF_MAX_DATA_LEN, max_data_len ) - X1( CFG_CNF_WDS_ADDR, mac_addr[3] ) /*[STA] MAC Address of corresponding WDS Link node */ - X1( CFG_CNF_PM_ENABLED, pm_enabled ) /*[STA] Switch for ESS Power Management (PM) On/Off */ - X1( CFG_CNF_PM_EPS, pm_eps ) /*[STA] Switch for ESS PM EPS/PS Mode */ - X1( CFG_CNF_MCAST_RX, mcast_rx ) /*[STA] Switch for ESS PM Multicast reception On/Off */ - X1( CFG_CNF_MAX_SLEEP_DURATION, duration ) /*[STA] Maximum sleep time for ESS PM */ - X1( CFG_CNF_PM_HOLDOVER_DURATION, duration ) /*[STA] Holdover time for ESS PM */ - X1( CFG_CNF_OWN_NAME, ssid[17] ) /*Identification text for diagnostic purposes */ - X1( CFG_CNF_OWN_DTIM_PERIOD, period ) /*[AP] Beacon intervals between successive DTIMs */ - X1( CFG_CNF_WDS_ADDR1, mac_addr[3] ) /*[AP] Port 1 MAC Adrs of corresponding WDS Link node */ - X1( CFG_CNF_WDS_ADDR2, mac_addr[3] ) /*[AP] Port 2 MAC Adrs of corresponding WDS Link node */ - X1( CFG_CNF_WDS_ADDR3, mac_addr[3] ) /*[AP] Port 3 MAC Adrs of corresponding WDS Link node */ - X1( CFG_CNF_WDS_ADDR4, mac_addr[3] ) /*[AP] Port 4 MAC Adrs of corresponding WDS Link node */ - X1( CFG_CNF_WDS_ADDR5, mac_addr[3] ) /*[AP] Port 5 MAC Adrs of corresponding WDS Link node */ - X1( CFG_CNF_WDS_ADDR6, mac_addr[3] ) /*[AP] Port 6 MAC Adrs of corresponding WDS Link node */ - X1( CFG_CNF_MCAST_PM_BUF, mcast_pm_buf ) /*[AP] Switch for PM buffering of Multicast Messages */ - X1( CFG_CNF_REJECT_ANY, reject_any ) /*[AP] Switch for PM buffering of Multicast Messages */ -//X1( CFG_CNF_ENCRYPTION_ENABLED, encryption ) /*specify encryption type of Tx/Rx messages */ - X1( CFG_CNF_ENCRYPTION, encryption ) /*specify encryption type of Tx/Rx messages */ - X1( CFG_CNF_AUTHENTICATION, authentication ) /*selects Authentication algorithm */ - X1( CFG_CNF_EXCL_UNENCRYPTED, exclude_unencrypted ) /*[AP] Switch for 'clear-text' rx message acceptance */ - X1( CFG_CNF_MCAST_RATE, mcast_rate ) /*Transmit Data rate for Multicast frames */ - X1( CFG_CNF_INTRA_BSS_RELAY, intra_bss_relay ) /*[AP] Switch for IntraBBS relay */ - X1( CFG_CNF_MICRO_WAVE, micro_wave ) /*MicroWave (Robustness) */ - X1( CFG_CNF_LOAD_BALANCING, load_balancing ) /*Load Balancing (Boolean, 0=OFF, 1=ON, default=1) */ - X1( CFG_CNF_MEDIUM_DISTRIBUTION, medium_distribution ) /*Medium Distribution (Boolean, 0=OFF, 1=ON, default=1) */ - X1( CFG_CNF_GROUP_ADDR_FILTER, group_addr_filter ) /*Group Address Filter */ - X1( CFG_CNF_TX_POW_LVL, tx_pow_lvl ) /*Tx Power Level */ -XX4( CFG_CNF_COUNTRY_INFO, \ - hcf_16, n_channel_sets, hcf_16, country_code[2], \ - hcf_16, environment, CHANNEL_SET, channel_set[1] ) /*Current Country Info */ -XX4( CFG_CNF_COUNTRY_INFO_MAX, \ - hcf_16, n_channel_sets, hcf_16, country_code[2], \ - hcf_16, environment, CHANNEL_SET, channel_set[14]) /*Current Country Info */ - -/*Dynamic Configurations */ - X1( CFG_DESIRED_SSID, ssid[17] ) /*[STA] Service Set identification for connection */ -#define GROUP_ADDR_SIZE (32 * 6) //32 6-byte MAC-addresses - X1( CFG_GROUP_ADDR, mac_addr[GROUP_ADDR_SIZE/2] ) /*[STA] Multicast MAC Addresses for Rx-message */ - X1( CFG_CREATE_IBSS, create_ibss ) /*[STA] Switch for IBSS creation On/Off */ - X1( CFG_RTS_THRH, rts_thrh ) /*[STA] Frame length used for RTS/CTS handshake */ - X1( CFG_TX_RATE_CNTL, tx_rate_cntl ) /*[STA] Data rate control for message transmission */ - X1( CFG_PROMISCUOUS_MODE, promiscuous_mode ) /*[STA] Switch for Promiscuous mode reception On/Of */ - X1( CFG_WOL, wake_on_lan ) /*[STA] Switch for Wake-On-LAN mode */ - X1( CFG_RTS_THRH0, rts_thrh ) /*[AP] Port 0 frame length for RTS/CTS handshake */ - X1( CFG_RTS_THRH1, rts_thrh ) /*[AP] Port 1 frame length for RTS/CTS handshake */ - X1( CFG_RTS_THRH2, rts_thrh ) /*[AP] Port 2 frame length for RTS/CTS handshake */ - X1( CFG_RTS_THRH3, rts_thrh ) /*[AP] Port 3 frame length for RTS/CTS handshake */ - X1( CFG_RTS_THRH4, rts_thrh ) /*[AP] Port 4 frame length for RTS/CTS handshake */ - X1( CFG_RTS_THRH5, rts_thrh ) /*[AP] Port 5 frame length for RTS/CTS handshake */ - X1( CFG_RTS_THRH6, rts_thrh ) /*[AP] Port 6 frame length for RTS/CTS handshake */ - X1( CFG_TX_RATE_CNTL0, rate_cntl ) /*[AP] Port 0 data rate control for transmission */ - X1( CFG_TX_RATE_CNTL1, rate_cntl ) /*[AP] Port 1 data rate control for transmission */ - X1( CFG_TX_RATE_CNTL2, rate_cntl ) /*[AP] Port 2 data rate control for transmission */ - X1( CFG_TX_RATE_CNTL3, rate_cntl ) /*[AP] Port 3 data rate control for transmission */ - X1( CFG_TX_RATE_CNTL4, rate_cntl ) /*[AP] Port 4 data rate control for transmission */ - X1( CFG_TX_RATE_CNTL5, rate_cntl ) /*[AP] Port 5 data rate control for transmission */ - X1( CFG_TX_RATE_CNTL6, rate_cntl ) /*[AP] Port 6 data rate control for transmission */ -XX1( CFG_DEFAULT_KEYS, KEY_STRCT, key[4] ) /*defines set of encryption keys */ - X1( CFG_TX_KEY_ID, tx_key_id ) /*select key for encryption of Tx messages */ - X1( CFG_SCAN_SSID, ssid[17] ) /*identification for connection */ - X5( CFG_ADD_TKIP_DEFAULT_KEY, \ - tkip_key_id_info, tkip_key_iv_info[4], tkip_key[8], \ - tx_mic_key[4], rx_mic_key[4] ) /* */ - X6( CFG_ADD_TKIP_MAPPED_KEY, bssid[3], tkip_key[8], \ - tsc[4], rsc[4], tx_mic_key[4], rx_mic_key[4] ) /* */ - X1( CFG_SET_WPA_AUTHENTICATION_SUITE, \ - ssn_authentication_suite ) /* */ - X1( CFG_REMOVE_TKIP_DEFAULT_KEY,tkip_key_id ) /* */ - X1( CFG_TICK_TIME, tick_time ) /*Auxiliary Timer tick interval */ - X1( CFG_DDS_TICK_TIME, tick_time ) /*Disconnected DeepSleep Timer tick interval */ - -/********************************************************************** -* Added for Pattern-matching WakeOnLan. (See firmware design note WMDN281C) -**********************************************************************/ -#define WOL_PATTERNS 5 // maximum of 5 patterns in firmware -#define WOL_PATTERN_LEN 124 // maximum 124 bytes pattern length per pattern in firmware -#define WOL_MASK_LEN 30 // maximum 30 bytes mask length per pattern in firmware -#define WOL_BUF_SIZE (WOL_PATTERNS * (WOL_PATTERN_LEN + WOL_MASK_LEN + 6) / 2) -X2( CFG_WOL_PATTERNS, nPatterns, buffer[WOL_BUF_SIZE] ) /*[STA] WakeOnLan pattern match, room for 5 patterns*/ - - X5( CFG_SUP_RANGE, role, id, variant, bottom, top ) /*[PRI] Primary Supplier compatibility range */ -/* NIC Information */ - X4( CFG_IDENTITY, comp_id, variant, version_major, version_minor ) /*identification Prototype */ -#define CFG_DRV_IDENTITY_STRCT CFG_IDENTITY_STRCT -#define CFG_PRI_IDENTITY_STRCT CFG_IDENTITY_STRCT -#define CFG_NIC_IDENTITY_STRCT CFG_IDENTITY_STRCT -#define CFG_FW_IDENTITY_STRCT CFG_IDENTITY_STRCT - X1( CFG_RID_INF_MIN, y ) /*lowest value representing an Information RID */ - X1( CFG_MAX_LOAD_TIME, max_load_time ) /*[PRI] Max response time of the Download command */ - X3( CFG_DL_BUF, buf_page, buf_offset, buf_len ) /*[PRI] Download buffer location and size */ -// X5( CFG_PRI_SUP_RANGE, role, id, variant, bottom, top ) /*[PRI] Primary Supplier compatibility range */ - X5( CFG_CFI_ACT_RANGES_PRI,role, id, variant, bottom, top ) /*[PRI] Controller Actor compatibility ranges */ -// X5( CFG_NIC_HSI_SUP_RANGE, role, id, variant, bottom, top ) /*H/W - S/W I/F supplier range */ - X1( CFG_NIC_SERIAL_NUMBER, serial_number[17] ) /*[PRI] Network I/F Card serial number */ - X5( CFG_NIC_MFI_SUP_RANGE, role, id, variant, bottom, top ) /*[PRI] Modem I/F Supplier compatibility range */ - X5( CFG_NIC_CFI_SUP_RANGE, role, id, variant, bottom, top ) /*[PRI] Controller I/F Supplier compatibility range*/ -//H-I X1( CFG_CHANNEL_LIST, channel_list ) /*Allowed communication channels */ -//H-I XX2( CFG_REG_DOMAINS, hcf_16, num_domain, hcf_8, reg_domains[10] ) /*List of intended regulatory domains */ - X1( CFG_NIC_TEMP_TYPE, temp_type ) /*Hardware temperature range code */ -//H-I X1( CFG_CIS, cis[240] ) /*PC Card Standard Card Information Structure */ - X5( CFG_NIC_PROFILE, \ - profile_code, capability_options, allowed_data_rates, val4, val5 ) /*Card Profile */ -// X5( CFG_FW_SUP_RANGE, role, id, variant, bottom, top ) /*[STA] Station I/F Supplier compatibility range */ - X5( CFG_MFI_ACT_RANGES, role, id, variant, bottom, top ) /*[STA] Modem I/F Actor compatibility ranges */ - X5( CFG_CFI_ACT_RANGES_STA,role, id, variant, bottom, top ) /*[STA] Controller I/F Actor compatibility ranges */ - X5( CFG_MFI_ACT_RANGES_STA,role, id, variant, bottom, top ) /*[STA] Controller I/F Actor compatibility ranges */ - X1( CFG_NIC_BUS_TYPE, nic_bus_type ) /*NIC bustype derived from BUSSEL host I/F signals */ - -/* MAC INFORMATION */ - X1( CFG_PORT_STAT, port_stat ) /*[STA] Actual MAC Port connection control status */ - X1( CFG_CUR_SSID, ssid[17] ) /*[STA] Identification of the actually connected SS */ - X1( CFG_CUR_BSSID, mac_addr[3] ) /*[STA] Identification of the actually connected BSS */ - X3( CFG_COMMS_QUALITY, coms_qual, signal_lvl, noise_lvl ) /*[STA] Quality of the Basic Service Set connection */ - X1( CFG_CUR_TX_RATE, rate ) /*[STA] Actual transmit data rate */ - X1( CFG_CUR_BEACON_INTERVAL, interval ) /*Beacon transmit interval time for BSS creation */ -#if (HCF_TYPE) & HCF_TYPE_WARP - X11( CFG_CUR_SCALE_THRH, \ - carrier_detect_thrh_cck, carrier_detect_thrh_ofdm, defer_thrh, \ - energy_detect_thrh, rssi_on_thrh_deviation, \ - rssi_off_thrh_deviation, cck_drop_thrh, ofdm_drop_thrh, \ - cell_search_thrh, out_of_range_thrh, delta_snr ) -#else - X6( CFG_CUR_SCALE_THRH, \ - energy_detect_thrh, carrier_detect_thrh, defer_thrh, \ - cell_search_thrh, out_of_range_thrh, delta_snr ) /*Actual System Scale thresholds settings */ -#endif // HCF_TYPE_WARP - X1( CFG_PROTOCOL_RSP_TIME, time ) /*Max time to await a response to a request message */ - X1( CFG_CUR_SHORT_RETRY_LIMIT, limit ) /*Max number of transmit attempts for short frames */ - X1( CFG_CUR_LONG_RETRY_LIMIT, limit ) /*Max number of transmit attempts for long frames */ - X1( CFG_MAX_TX_LIFETIME, time ) /*Max transmit frame handling duration */ - X1( CFG_MAX_RX_LIFETIME, time ) /*Max received frame handling duration */ - X1( CFG_CF_POLLABLE, cf_pollable ) /*[STA] Contention Free pollable capability indication */ - X2( CFG_AUTHENTICATION_ALGORITHMS,authentication_type, type_enabled ) /*Authentication Algorithm */ - X1( CFG_PRIVACY_OPT_IMPLEMENTED,privacy_opt_implemented ) /*WEP Option availability indication */ - X1( CFG_CUR_REMOTE_RATES, rates ) /*CurrentRemoteRates */ - X1( CFG_CUR_USED_RATES, rates ) /*CurrentUsedRates */ - X1( CFG_CUR_SYSTEM_SCALE, current_system_scale ) /*CurrentUsedRates */ - X1( CFG_CUR_TX_RATE1, rate ) /*[AP] Actual Port 1 transmit data rate */ - X1( CFG_CUR_TX_RATE2, rate ) /*[AP] Actual Port 2 transmit data rate */ - X1( CFG_CUR_TX_RATE3, rate ) /*[AP] Actual Port 3 transmit data rate */ - X1( CFG_CUR_TX_RATE4, rate ) /*[AP] Actual Port 4 transmit data rate */ - X1( CFG_CUR_TX_RATE5, rate ) /*[AP] Actual Port 5 transmit data rate */ - X1( CFG_CUR_TX_RATE6, rate ) /*[AP] Actual Port 6 transmit data rate */ - X1( CFG_OWN_MAC_ADDR, mac_addr[3] ) /*[AP] Unique local node MAC Address */ - X3( CFG_PCF_INFO, medium_occupancy_limit, \ - cfp_period, cfp_max_duration ) /*[AP] Point Coordination Function capability info */ - X1( CFG_CUR_WPA_INFO_ELEMENT, ssn_info_element[1] ) /* */ - X4( CFG_CUR_TKIP_IV_INFO, \ - tkip_seq_cnt0[4], tkip_seq_cnt1[4], \ - tkip_seq_cnt2[4], tkip_seq_cnt3[4] ) /* */ - X2( CFG_CUR_ASSOC_REQ_INFO, frame_type, frame_body[1] ) /* 0xFD8C */ - X2( CFG_CUR_ASSOC_RESP_INFO, frame_type, frame_body[1] ) /* 0xFD8D */ - - -/* Modem INFORMATION */ - X1( CFG_PHY_TYPE, phy_type ) /*Physical layer type indication */ - X1( CFG_CUR_CHANNEL, current_channel ) /*Actual frequency channel used for transmission */ - X1( CFG_CUR_POWER_STATE, current_power_state ) /*Actual power consumption status */ - X1( CFG_CCAMODE, cca_mode ) /*Clear channel assessment mode indication */ - X1( CFG_SUPPORTED_DATA_RATES, rates[5] ) /*Data rates capability information */ - - -/* FRAMES */ -XX1( CFG_SCAN, SCAN_RS_STRCT, scan_result[32] ) /*Scan results */ - - - -//-------------------------------------------------------------------------------------- -// UIL management function to be passed to WaveLAN/IEEE Drivers in DUI_STRCT field fun -//-------------------------------------------------------------------------------------- - -// HCF and UIL Common -#define MDD_ACT_SCAN 0x06 // Hermes Inquire Scan (F101) command -#define MDD_ACT_PRS_SCAN 0x07 // Hermes Probe Response Scan (F102) command - -// UIL Specific -#define UIL_FUN_CONNECT 0x00 // Perform connect command -#define UIL_FUN_DISCONNECT 0x01 // Perform disconnect command -#define UIL_FUN_ACTION 0x02 // Perform UIL Action command. -#define UIL_FUN_SEND_DIAG_MSG 0x03 // Send a diagnostic message. -#define UIL_FUN_GET_INFO 0x04 // Retrieve information from NIC. -#define UIL_FUN_PUT_INFO 0x05 // Put information on NIC. - -/* UIL_ACT_TALLIES 0x05 * this should not be exported to the USF - * it is solely intended as a strategic choice for the MSF to either - * - use HCF_ACT_TALLIES and direct IFB access - * - use CFG_TALLIES - */ -#define UIL_ACT_SCAN MDD_ACT_SCAN -#define UIL_ACT_PRS_SCAN MDD_ACT_PRS_SCAN -#define UIL_ACT_BLOCK 0x0B -#define UIL_ACT_UNBLOCK 0x0C -#define UIL_ACT_RESET 0x80 -#define UIL_ACT_REBIND 0x81 -#define UIL_ACT_APPLY 0x82 -#define UIL_ACT_DISCONNECT 0x83 //;?040108 possibly obsolete //Special for WINCE - -// HCF Specific -/* Note that UIL_ACT-codes must match HCF_ACT-codes across a run-time bound I/F - * The initial matching is achieved by "#define HCF_ACT_xxx HCF_UIL_ACT_xxx" where appropriate - * In other words, these codes should never, ever change to minimize migration problems between - * combinations of old drivers and new utilities and vice versa - */ -#define HCF_DISCONNECT 0x01 //disconnect request for hcf_connect (invalid as IO Address) -#define HCF_ACT_TALLIES 0x05 // ! UIL_ACT_TALLIES does not exist ! Hermes Inquire Tallies (F100) cmd -#if ( (HCF_TYPE) & HCF_TYPE_WARP ) == 0 -#define HCF_ACT_SCAN MDD_ACT_SCAN -#endif // HCF_TYPE_WARP -#define HCF_ACT_PRS_SCAN MDD_ACT_PRS_SCAN -#if HCF_INT_ON -#define HCF_ACT_INT_OFF 0x0D // Disable Interrupt generation -#define HCF_ACT_INT_ON 0x0E // Enable Interrupt generation -#define HCF_ACT_INT_FORCE_ON 0x0F // Enforce Enable Interrupt generation -#endif // HCF_INT_ON -#define HCF_ACT_RX_ACK 0x15 // Receiever ACK (optimization) -#if (HCF_TYPE) & HCF_TYPE_CCX -#define HCF_ACT_CCX_ON 0x1A // enable CKIP -#define HCF_ACT_CCX_OFF 0x1B // disable CKIP -#endif // HCF_TYPE_CCX -#if (HCF_SLEEP) & HCF_DDS -#define HCF_ACT_SLEEP 0x1C // DDS Sleep request -//#define HCF_ACT_WAKEUP 0x1D // DDS Wakeup request -#endif // HCF_DDS - -/* HCF_ACT_MAX // xxxx: start value for UIL-range, NOT to be passed to HCF - * Too bad, there was originally no spare room created to use - * HCF_ACT_MAX as an equivalent of HCF_ERR_MAX. Since creating - * this room in retrospect would create a backward incompatibility - * we will just have to live with the haphazard sequence of - * UIL- and HCF specific codes. Theoretically this could be - * corrected when and if there will ever be an overall - * incompatibility introduced for another reason - */ - -/*============================================================= HERMES RECORDS ============================*/ -#define CFG_RID_FW_MIN 0xFA00 //lowest value representing a Hermes-II based RID -// #define CFG_PDA_BEGIN 0xFA // -// #define CFG_PDA_END 0xFA // -// #define CFG_PDA_NIC_TOP_LVL_ASSEMBLY_NUMBER 0xFA // -// #define CFG_PDA_PCB_TRACER_NUMBER 0xFA // -// #define CFG_PDA_RMM_TRACER_NUMBER 0xFA // -// #define CFG_PDA_RMM_COMP_ID 0xFA // -// #define CFG_PDA_ 0xFA // - -/*============================================================= CONFIGURATION RECORDS =====================*/ -/*============================================================= mask 0xFCxx =====================*/ -#define CFG_RID_CFG_MIN 0xFC00 //lowest value representing a Hermes configuration RID - -// NETWORK PARAMETERS, STATIC CONFIGURATION ENTITIES -//FC05, FC0B, FC0C, FC0D: SEE W2DN149 - -#define CFG_CNF_PORT_TYPE 0xFC00 //[STA] Connection control characteristics -#define CFG_CNF_OWN_MAC_ADDR 0xFC01 //[STA] MAC Address of this node -// 0xFC02 see DYNAMIC CONFIGURATION ENTITIES -#define CFG_CNF_OWN_CHANNEL 0xFC03 //Communication channel for BSS creation -#define CFG_CNF_OWN_SSID 0xFC04 //IBSS creation (STA) or ESS (AP) Service Set Ident -#define CFG_CNF_OWN_ATIM_WINDOW 0xFC05 //[STA] ATIM Window time for IBSS creation -#define CFG_CNF_SYSTEM_SCALE 0xFC06 //System Scale that specifies the AP density -#define CFG_CNF_MAX_DATA_LEN 0xFC07 //Maximum length of MAC Frame Body data -#define CFG_CNF_PM_ENABLED 0xFC09 //[STA] Switch for ESS Power Management (PM) -#define CFG_CNF_MCAST_RX 0xFC0B //[STA] Switch for ESS PM Multicast reception On/Off -#define CFG_CNF_MAX_SLEEP_DURATION 0xFC0C //[STA] Maximum sleep time for ESS PM -#define CFG_CNF_HOLDOVER_DURATION 0xFC0D //[STA] Holdover time for ESS PM -#define CFG_CNF_OWN_NAME 0xFC0E //Identification text for diagnostic purposes - -#define CFG_CNF_OWN_DTIM_PERIOD 0xFC10 //[AP] Beacon intervals between successive DTIMs -#define CFG_CNF_WDS_ADDR1 0xFC11 //[AP] Port 1 MAC Adrs of corresponding WDS Link node -#define CFG_CNF_WDS_ADDR2 0xFC12 //[AP] Port 2 MAC Adrs of corresponding WDS Link node -#define CFG_CNF_WDS_ADDR3 0xFC13 //[AP] Port 3 MAC Adrs of corresponding WDS Link node -#define CFG_CNF_WDS_ADDR4 0xFC14 //[AP] Port 4 MAC Adrs of corresponding WDS Link node -#define CFG_CNF_WDS_ADDR5 0xFC15 //[AP] Port 5 MAC Adrs of corresponding WDS Link node -#define CFG_CNF_WDS_ADDR6 0xFC16 //[AP] Port 6 MAC Adrs of corresponding WDS Link node -#define CFG_CNF_PM_MCAST_BUF 0xFC17 //[AP] Switch for PM buffereing of Multicast Messages -#define CFG_CNF_MCAST_PM_BUF CFG_CNF_PM_MCAST_BUF //name does not match H-II spec -#define CFG_CNF_REJECT_ANY 0xFC18 //[AP] Switch for PM buffering of Multicast Messages - -#define CFG_CNF_ENCRYPTION 0xFC20 //select en/de-cryption of Tx/Rx messages -#define CFG_CNF_AUTHENTICATION 0xFC21 //[STA] selects Authentication algorithm -#define CFG_CNF_EXCL_UNENCRYPTED 0xFC22 //[AP] Switch for 'clear-text' rx message acceptance -#define CFG_CNF_MCAST_RATE 0xFC23 //Transmit Data rate for Multicast frames -#define CFG_CNF_INTRA_BSS_RELAY 0xFC24 //[AP] Switch for IntraBBS relay -#define CFG_CNF_MICRO_WAVE 0xFC25 //MicroWave (Robustness) -#define CFG_CNF_LOAD_BALANCING 0xFC26 //Load Balancing (Boolean, 0=OFF, 1=ON, default=1) -#define CFG_CNF_MEDIUM_DISTRIBUTION 0xFC27 //Medium Distribution (Boolean, 0=OFF, 1=ON, default=1) -#define CFG_CNF_RX_ALL_GROUP_ADDR 0xFC28 //[STA] Group Address Filter -#define CFG_CNF_COUNTRY_INFO 0xFC29 //Country Info -#if (HCF_TYPE) & HCF_TYPE_WARP -#define CFG_CNF_TX_POW_LVL 0xFC2A //TxPower Level -#define CFG_CNF_CONNECTION_CNTL 0xFC30 //[STA] Connection Control -#define CFG_CNF_OWN_BEACON_INTERVAL 0xFC31 //[AP] -#define CFG_CNF_SHORT_RETRY_LIMIT 0xFC32 // -#define CFG_CNF_LONG_RETRY_LIMIT 0xFC33 // -#define CFG_CNF_TX_EVENT_MODE 0xFC34 // -#define CFG_CNF_WIFI_COMPATIBLE 0xFC35 //[STA] Wifi compatible -#endif // HCF_TYPE_WARP -#if (HCF_TYPE) & HCF_TYPE_BEAGLE_HII5 -#define CFG_VOICE_RETRY_LIMIT 0xFC36 /* Voice frame retry limit. Range: 1-15, default: 4 */ -#define CFG_VOICE_CONTENTION_WINDOW 0xFC37 /* Contention window for voice frames. */ -#endif // BEAGLE_HII5 - -// NETWORK PARAMETERS, DYNAMIC CONFIGURATION ENTITIES -#define CFG_DESIRED_SSID 0xFC02 //[STA] Service Set identification for connection and scan - -#define CFG_GROUP_ADDR 0xFC80 //[STA] Multicast MAC Addresses for Rx-message -#define CFG_CREATE_IBSS 0xFC81 //[STA] Switch for IBSS creation On/Off -#define CFG_RTS_THRH 0xFC83 //Frame length used for RTS/CTS handshake -#define CFG_TX_RATE_CNTL 0xFC84 //[STA] Data rate control for message transmission -#define CFG_PROMISCUOUS_MODE 0xFC85 //[STA] Switch for Promiscuous mode reception On/Off -#define CFG_WOL 0xFC86 //[STA] Switch for Wake-On-LAN mode -#define CFG_WOL_PATTERNS 0xFC87 //[STA] Patterns for Wake-On-LAN -#define CFG_SUPPORTED_RATE_SET_CNTL 0xFC88 // -#define CFG_BASIC_RATE_SET_CNTL 0xFC89 // - -#define CFG_SOFTWARE_ACK_MODE 0xFC90 // -#define CFG_RTS_THRH0 0xFC97 //[AP] Port 0 frame length for RTS/CTS handshake -#define CFG_RTS_THRH1 0xFC98 //[AP] Port 1 frame length for RTS/CTS handshake -#define CFG_RTS_THRH2 0xFC99 //[AP] Port 2 frame length for RTS/CTS handshake -#define CFG_RTS_THRH3 0xFC9A //[AP] Port 3 frame length for RTS/CTS handshake -#define CFG_RTS_THRH4 0xFC9B //[AP] Port 4 frame length for RTS/CTS handshake -#define CFG_RTS_THRH5 0xFC9C //[AP] Port 5 frame length for RTS/CTS handshake -#define CFG_RTS_THRH6 0xFC9D //[AP] Port 6 frame length for RTS/CTS handshake - -#define CFG_TX_RATE_CNTL0 0xFC9E //[AP] Port 0 data rate control for transmission -#define CFG_TX_RATE_CNTL1 0xFC9F //[AP] Port 1 data rate control for transmission -#define CFG_TX_RATE_CNTL2 0xFCA0 //[AP] Port 2 data rate control for transmission -#define CFG_TX_RATE_CNTL3 0xFCA1 //[AP] Port 3 data rate control for transmission -#define CFG_TX_RATE_CNTL4 0xFCA2 //[AP] Port 4 data rate control for transmission -#define CFG_TX_RATE_CNTL5 0xFCA3 //[AP] Port 5 data rate control for transmission -#define CFG_TX_RATE_CNTL6 0xFCA4 //[AP] Port 6 data rate control for transmission - -#define CFG_DEFAULT_KEYS 0xFCB0 //defines set of encryption keys -#define CFG_TX_KEY_ID 0xFCB1 //select key for encryption of Tx messages -#define CFG_SCAN_SSID 0xFCB2 //Scan SSID -#define CFG_ADD_TKIP_DEFAULT_KEY 0xFCB4 //set KeyID and TxKey indication -#define KEY_ID 0x0003 //KeyID mask for tkip_key_id_info field -#define TX_KEY 0x8000 //Default Tx Key flag of tkip_key_id_info field -#define CFG_SET_WPA_AUTH_KEY_MGMT_SUITE 0xFCB5 //Authenticated Key Management Suite -#define CFG_REMOVE_TKIP_DEFAULT_KEY 0xFCB6 //invalidate KeyID and TxKey indication -#define CFG_ADD_TKIP_MAPPED_KEY 0xFCB7 //set MAC address pairwise station -#define CFG_REMOVE_TKIP_MAPPED_KEY 0xFCB8 //invalidate MAC address pairwise station -#define CFG_SET_WPA_CAPABILITIES_INFO 0xFCB9 //WPA Capabilities -#define CFG_CACHED_PMK_ADDR 0xFCBA //set MAC address of pre-authenticated AP -#define CFG_REMOVE_CACHED_PMK_ADDR 0xFCBB //invalidate MAC address of pre-authenticated AP -#define CFG_FCBC 0xFCBC //FW codes ahead of available documentation, so ??????? -#define CFG_FCBD 0xFCBD //FW codes ahead of available documentation, so ??????? -#define CFG_FCBE 0xFCBE //FW codes ahead of available documentation, so ??????? -#define CFG_FCBF 0xFCBF //FW codes ahead of available documentation, so ??????? - -#define CFG_HANDOVER_ADDR 0xFCC0 //[AP] Station MAC Address re-associated with other AP -#define CFG_SCAN_CHANNEL 0xFCC2 //Channel set for host requested scan -//;?#define CFG_SCAN_CHANNEL_MASK 0xFCC2 // contains -#define CFG_DISASSOCIATE_ADDR 0xFCC4 //[AP] Station MAC Address to be disassociated -#define CFG_PROBE_DATA_RATE 0xFCC5 //WARP connection control -#define CFG_FRAME_BURST_LIMIT 0xFCC6 // -#define CFG_COEXISTENSE_BEHAVIOUR 0xFCC7 //[AP] -#define CFG_DEAUTHENTICATE_ADDR 0xFCC8 //MAC address of Station to be deauthenticated - -// BEHAVIOR PARAMETERS -#define CFG_TICK_TIME 0xFCE0 //Auxiliary Timer tick interval -#define CFG_DDS_TICK_TIME 0xFCE1 //Disconnected DeepSleep Timer tick interval -//#define CFG_CNF_COUNTRY 0xFCFE apparently not needed ;? -#define CFG_RID_CFG_MAX 0xFCFF //highest value representing an Configuration RID - - -/*============================================================= INFORMATION RECORDS =====================*/ -/*============================================================= mask 0xFDxx =====================*/ -// NIC INFORMATION -#define CFG_RID_INF_MIN 0xFD00 //lowest value representing an Information RID -#define CFG_MAX_LOAD_TIME 0xFD00 //[INT] Maximum response time of the Download command. -#define CFG_DL_BUF 0xFD01 //[INT] Download buffer location and size. -#define CFG_PRI_IDENTITY 0xFD02 //[PRI] Primary Functions firmware identification. -#define CFG_PRI_SUP_RANGE 0xFD03 //[PRI] Primary Functions I/F Supplier compatibility range. -#define CFG_NIC_HSI_SUP_RANGE 0xFD09 //H/W - S/W I/F supplier range -#define CFG_NIC_SERIAL_NUMBER 0xFD0A //[PRI] Network Interface Card serial number. -#define CFG_NIC_IDENTITY 0xFD0B //[PRI] Network Interface Card identification. -#define CFG_NIC_MFI_SUP_RANGE 0xFD0C //[PRI] Modem I/F Supplier compatibility range. -#define CFG_NIC_CFI_SUP_RANGE 0xFD0D //[PRI] Controller I/F Supplier compatibility range. -#define CFG_CHANNEL_LIST 0xFD10 //Allowed communication channels. -#define CFG_NIC_TEMP_TYPE 0xFD12 //Hardware temperature range code. -#define CFG_CIS 0xFD13 //PC Card Standard Card Information Structure -#define CFG_NIC_PROFILE 0xFD14 //Card Profile -#define CFG_FW_IDENTITY 0xFD20 //firmware identification. -#define CFG_FW_SUP_RANGE 0xFD21 //firmware Supplier compatibility range. -#define CFG_MFI_ACT_RANGES_STA 0xFD22 //[STA] Modem I/F Actor compatibility ranges. -#define CFG_CFI_ACT_RANGES_STA 0xFD23 //[STA] Controller I/F Actor compatibility ranges. -#define CFG_NIC_BUS_TYPE 0xFD24 //Card Bustype -#define CFG_NIC_BUS_TYPE_PCCARD_CF 0x0000 //16 bit PC Card or Compact Flash -#define CFG_NIC_BUS_TYPE_USB 0x0001 //USB -#define CFG_NIC_BUS_TYPE_CARDBUS 0x0002 //CardBus -#define CFG_NIC_BUS_TYPE_PCI 0x0003 //(mini)PCI -#define CFG_DOMAIN_CODE 0xFD25 - -// MAC INFORMATION -#define CFG_PORT_STAT 0xFD40 //Actual MAC Port connection control status -#define CFG_CUR_SSID 0xFD41 //[STA] Identification of the actually connected SS -#define CFG_CUR_BSSID 0xFD42 //[STA] Identification of the actually connected BSS -#define CFG_COMMS_QUALITY 0xFD43 //[STA] Quality of the Basic Service Set connection -#define CFG_CUR_TX_RATE 0xFD44 //[STA] Actual transmit data rate -#define CFG_CUR_BEACON_INTERVAL 0xFD45 //Beacon transmit interval time for BSS creation -#define CFG_CUR_SCALE_THRH 0xFD46 //Actual System Scale thresholds settings -#define CFG_PROTOCOL_RSP_TIME 0xFD47 //Max time to await a response to a request message -#define CFG_CUR_SHORT_RETRY_LIMIT 0xFD48 //Max number of transmit attempts for short frames -#define CFG_CUR_LONG_RETRY_LIMIT 0xFD49 //Max number of transmit attempts for long frames -#define CFG_MAX_TX_LIFETIME 0xFD4A //Max transmit frame handling duration -#define CFG_MAX_RX_LIFETIME 0xFD4B //Max received frame handling duration -#define CFG_CF_POLLABLE 0xFD4C //[STA] Contention Free pollable capability indication -#define CFG_AUTHENTICATION_ALGORITHMS 0xFD4D //Available Authentication Algorithms indication -#define CFG_PRIVACY_OPT_IMPLEMENTED 0xFD4F //WEP Option availability indication - -#define CFG_CUR_REMOTE_RATES 0xFD50 //[STA] CurrentRemoteRates -#define CFG_CUR_USED_RATES 0xFD51 //[STA] CurrentUsedRates -#define CFG_CUR_SYSTEM_SCALE 0xFD52 //[STA] CurrentSystemScale - -#define CFG_CUR_TX_RATE1 0xFD80 //[AP] Actual Port 1 transmit data rate -#define CFG_CUR_TX_RATE2 0xFD81 //[AP] Actual Port 2 transmit data rate -#define CFG_CUR_TX_RATE3 0xFD82 //[AP] Actual Port 3 transmit data rate -#define CFG_CUR_TX_RATE4 0xFD83 //[AP] Actual Port 4 transmit data rate -#define CFG_CUR_TX_RATE5 0xFD84 //[AP] Actual Port 5 transmit data rate -#define CFG_CUR_TX_RATE6 0xFD85 //[AP] Actual Port 6 transmit data rate -#define CFG_NIC_MAC_ADDR 0xFD86 //Unique local node MAC Address -#define CFG_PCF_INFO 0xFD87 //[AP] Point Coordination Function capability info -//*RESERVED* #define CFG_HIGHEST_BASIC_RATE 0xFD88 // -#define CFG_CUR_COUNTRY_INFO 0xFD89 // -#define CFG_CUR_WPA_INFO_ELEMENT 0xFD8A // -#define CFG_CUR_TKIP_IV_INFO 0xFD8B // -#define CFG_CUR_ASSOC_REQ_INFO 0xFD8C // -#define CFG_CUR_ASSOC_RESP_INFO 0xFD8D // -#define CFG_CUR_LOAD 0xFD8E //[AP] current load on AP's channel - -#define CFG_SECURITY_CAPABILITIES 0xFD90 //Combined capabilities information - -// MODEM INFORMATION -#define CFG_PHY_TYPE 0xFDC0 //Physical layer type indication -#define CFG_CUR_CHANNEL 0xFDC1 //Actual frequency channel used for transmission -#define CFG_CUR_POWER_STATE 0xFDC2 //Actual power consumption status -#define CFG_CCA_MODE 0xFDC3 //Clear channel assessment mode indication -#define CFG_SUPPORTED_DATA_RATES 0xFDC6 //Data rates capability information - -#define CFG_RID_INF_MAX 0xFDFF //highest value representing an Information RID - -// ENGINEERING INFORMATION -#define CFG_RID_ENG_MIN 0xFFE0 //lowest value representing a Hermes engineering RID - - -/****************************** General define *************************************************************/ - - -//IFB field related -// IFB_CardStat -#define CARD_STAT_INCOMP_PRI 0x2000U // no compatible HSI / primary F/W -#define CARD_STAT_INCOMP_FW 0x1000U // no compatible station / tertiary F/W -#define CARD_STAT_DEFUNCT 0x0100U // HCF is in Defunct mode -// IFB_RxStat -#define RX_STAT_PRIO 0x00E0U //Priority subfield -#define RX_STAT_ERR 0x000FU //Error mask -#define RX_STAT_UNDECR 0x0002U //Non-decryptable encrypted message -#define RX_STAT_FCS_ERR 0x0001U //FCS error - -// SNAP header for E-II Encapsulation -#define ENC_NONE 0xFF -#define ENC_1042 0x00 -#define ENC_TUNNEL 0xF8 -/****************************** Xxxxxxxx *******************************************************************/ - - -#define HCF_SUCCESS 0x00 // OK -#define HCF_ERR_TIME_OUT 0x04 // Expected Hermes event did not occur in expected time -#define HCF_ERR_NO_NIC 0x05 /* card not found (usually yanked away during hcfio_in_string - * Also: card is either absent or disabled while it should be neither */ -#define HCF_ERR_LEN 0x08 /* buffer size insufficient - * - IFB_ConfigTable too small - * - hcf_get_info buffer has a size of 0 or 1 or less than needed - * to accommodate all data - * - hcf_put_info: CFG_DLNV_DATA exceeds intermediate - * buffer size */ -#define HCF_ERR_INCOMP_PRI 0x09 // primary functions are not compatible -#define HCF_ERR_INCOMP_FW 0x0A // station functions are compatible -#define HCF_ERR_MIC 0x0D // MIC check fails -#define HCF_ERR_SLEEP 0x0E // NIC in sleep mode -#define HCF_ERR_MAX 0x3F /* end of HCF range - *** ** *** ****** *** *************** */ -#define HCF_ERR_DEFUNCT 0x80 // BIT, reflecting that the HCF is in defunct mode (bits 0x7F reflect cause) -#define HCF_ERR_DEFUNCT_AUX 0x82 // Timeout on acknowledgement on en/disabling AUX registers -#define HCF_ERR_DEFUNCT_TIMER 0x83 // Timeout on timer calibration during initialization process -#define HCF_ERR_DEFUNCT_TIME_OUT 0x84 // Timeout on Busy bit drop during BAP setup -#define HCF_ERR_DEFUNCT_CMD_SEQ 0x86 // Hermes and HCF are out of sync in issuing/processing commands - -#define HCF_INT_PENDING 0x01 // return status of hcf_act( HCF_ACT_INT_OFF ) - -#define HCF_PORT_0 0x0000 // Station supports only single MAC Port -#define HCF_PORT_1 0x0100 // HCF_PORT_1 through HCF_PORT_6 are only supported by AP F/W -#define HCF_PORT_2 0x0200 -#define HCF_PORT_3 0x0300 -#define HCF_PORT_4 0x0400 -#define HCF_PORT_5 0x0500 -#define HCF_PORT_6 0x0600 - -#define HCF_CNTL_ENABLE 0x01 -#define HCF_CNTL_DISABLE 0x02 -#define HCF_CNTL_CONNECT 0x03 -#define HCF_CNTL_DISCONNECT 0x05 -#define HCF_CNTL_CONTINUE 0x07 - -#define USE_DMA 0x0001 -#define USE_16BIT 0x0002 -#define DMA_ENABLED 0x8000 //weak name, it really means: F/W enabled and DMA selected - -//#define HCF_DMA_FD_CNT (2*29) //size in bytes of one Tx/RxFS minus DA/SA -//;?the MSF ( H2PCI.C uses the next 2 mnemonics ) -#define HCF_DMA_RX_BUF1_SIZE (HFS_ADDR_DEST + 8) //extra bytes for LEN/SNAP if decapsulation -#define HCF_DMA_TX_BUF1_SIZE (HFS_ADDR_DEST + 2*6 + 8) //extra bytes for DA/SA/LEN/SNAP if encapsulation - -//HFS_TX_CNTL -/* Note that the HCF_.... System Constants influence the HFS_.... values below - * H-I H-I | H-II H-II H-II.5 - * WPA | WPA - * HFS_TX_CNTL_TX_OK 0002 0002 | 0002 0002 N/A <<<<<<<NULL pointer to matching CFG_RANGE_SPEC_STRCT substructure in actor-structure matching the supplier -* -*.NARRATIVE -* -* Parameters: -* actp address of the actor specification -* supp address of the supplier specification -* -* Description: mmd_check_comp is a support routine to check the compatibility between an actor and a -* supplier. mmd_check_comp is independent of the endianness of the actp and supp structures. This is -* achieved by checking the "bottom" or "role" fields of these structures. Since these fields are restricted -* to a limited range, comparing the contents to a value with a known endian-ess gives a clue to their actual -* endianness. -* -*.DIAGRAM -*1a: The role-field of the actor structure has a known non-zero, not "byte symmetric" value (namely -* COMP_ROLE_ACT or 0x0001), so if and only the contents of this field matches COMP_ROLE_ACT (in Native -* Endian format), the actor structure is Native Endian. -*2a: Since the role-field of the supplier structure is 0x0000, the test as used for the actor does not work -* for a supplier. A supplier has always exactly 1 variant,top,bottom record with (officially, but see the -* note below) each of these 3 values in the range 1 through 99, so one byte of the word value of variant, -* top and bottom words is 0x00 and the other byte is non-zero. Whether the lowest address byte or the -* highest address byte is non-zero depends on the Endianness of the LTV. If and only if the word value of -* bottom is less than 0x0100, the supplier is Native Endian. -* NOTE: the variant field of the supplier structure can not be used for the Endian Detection Algorithm, -* because a a zero-valued variant has been used as Controlled Deployment indication in the past. -* Note: An actor may have multiple sets of variant,top,bottom records, including dummy sets with variant, -* top and bottom fields with a zero-value. As a consequence the endianness of the actor can not be determined -* based on its variant,top,bottom values. -* -* Note: the L and T field of the structures are always in Native Endian format, so you can not draw -* conclusions concerning the Endianness of the structure based on these two fields. -* -*1b/2b -* The only purpose of the CFG_RANGE_SPEC_BYTE_STRCT is to give easy access to the non-zero byte of the word -* value of variant, top and bottom. The variables sup_endian and act_endian are used for the supplier and -* actor structure respectively. These variables must be 0 when the structure has LE format and 1 if the -* structure has BE format. This can be phrased as: -* the variable is false (i.e 0x0000) if either -* (the platform is LE and the LTV is the same as the platform) -* or -* (the platform is BE and the LTV differs from the platform). -* the variable is true (i.e 0x0001) if either -* (the platform is BE and the LTV is the same as the platform) -* or -* (the platform is LE and the LTV differs from the platform). -* -* Alternatively this can be phrased as: -* if the platform is LE -* if the LTV is LE (i.e the same as the platform), then the variable = 0 -* else (the LTV is BE (i.e. different from the platform) ), then the variable = 1 -* if the platform is BE -* if the LTV is BE (i.e the same as the platform), then the variable = 1 -* else (the LTV is LE (i.e. different from the platform) ), then the variable = 0 -* -* This is implemented as: -* #if HCF_BIG_ENDIAN == 0 //platform is LE -* sup/act_endian becomes reverse of structure-endianness as determined in 1a/1b -* #endif -*6: Each of the actor variant-bottom-top records is checked against the (single) supplier variant-bottom-top -* range till either an acceptable match is found or all actor records are tried. As explained above, due to -* the limited ranges of these values, checking a byte is acceptable and suitable. -*8: depending on whether a match was found or not (as reflected by the value of the control variable of the -* for loop), the NULL pointer or a pointer to the matching Number/Bottom/Top record of the Actor structure -* is returned. -* As an additional safety, checking the supplier length protects against invalid Supplier structures, which -* may be caused by failing hcf_get_info (in which case the len-field is zero). Note that the contraption -* "supp->len != sizeof(CFG_SUP_RANGE_STRCT)/sizeof(hcf_16) - 1" -* did turn out not to work for a compiler which padded the structure definition. -* -* Note: when consulting references like DesignNotes and Architecture specifications there is a confusing use -* of the notions number and variant. This resulted in an inconsistent use in the HCF nomenclature as well. -* This makes the logic hard to follow and one has to be very much aware of the context when walking through -* the code. -* NOTE: The Endian Detection Algorithm places limitations on future extensions of the fields, i.e. they should -* stay within the currently defined boundaries of 1 through 99 (although 1 through 255) would work as well -* and there should never be used a zero value for the bottom of a valid supplier. -* Note: relative to Asserts, the following can be observed: -* 1: Supplier variant 0x0000 has been used for Controlled Deployment -* 2: An actor may have one or more variant record specifications with a top of zero and a non-zero bottom -* to override the HCF default support of a particular variant by the MSF programmer via hcfcfg.h -* 3: An actor range can be specified as all zeros, e.g. as padding in the automatically generated firmware -* image files. -*.ENDDOC END DOCUMENTATION -*************************************************************************************************************/ -CFG_RANGE_SPEC_STRCT* -mmd_check_comp( CFG_RANGES_STRCT *actp, CFG_SUP_RANGE_STRCT *supp ) -{ - -CFG_RANGE_SPEC_BYTE_STRCT *actq = (CFG_RANGE_SPEC_BYTE_STRCT*)actp->var_rec; -CFG_RANGE_SPEC_BYTE_STRCT *supq = (CFG_RANGE_SPEC_BYTE_STRCT*)&(supp->variant); -hcf_16 i; -int act_endian; //actor endian flag -int sup_endian; //supplier endian flag - - act_endian = actp->role == COMP_ROLE_ACT; //true if native endian /* 1a */ - sup_endian = supp->bottom < 0x0100; //true if native endian /* 2a */ - -#if HCF_ASSERT - MMDASSERT( supp->len == 6, supp->len ) - MMDASSERT( actp->len >= 6 && actp->len%3 == 0, actp->len ) - - if ( act_endian ) { //native endian - MMDASSERT( actp->role == COMP_ROLE_ACT, actp->role ) - MMDASSERT( 1 <= actp->id && actp->id <= 99, actp->id ) - } else { //non-native endian - MMDASSERT( actp->role == CNV_END_SHORT(COMP_ROLE_ACT), actp->role ) - MMDASSERT( 1 <= CNV_END_SHORT(actp->id) && CNV_END_SHORT(actp->id) <= 99, actp->id ) - } - if ( sup_endian ) { //native endian - MMDASSERT( supp->role == COMP_ROLE_SUPL, supp->role ) - MMDASSERT( 1 <= supp->id && supp->id <= 99, supp->id ) - MMDASSERT( 1 <= supp->variant && supp->variant <= 99, supp->variant ) - MMDASSERT( 1 <= supp->bottom && supp->bottom <= 99, supp->bottom ) - MMDASSERT( 1 <= supp->top && supp->top <= 99, supp->top ) - MMDASSERT( supp->bottom <= supp->top, supp->bottom << 8 | supp->top ) - } else { //non-native endian - MMDASSERT( supp->role == CNV_END_SHORT(COMP_ROLE_SUPL), supp->role ) - MMDASSERT( 1 <= CNV_END_SHORT(supp->id) && CNV_END_SHORT(supp->id) <= 99, supp->id ) - MMDASSERT( 1 <= CNV_END_SHORT(supp->variant) && CNV_END_SHORT(supp->variant) <= 99, supp->variant ) - MMDASSERT( 1 <= CNV_END_SHORT(supp->bottom) && CNV_END_SHORT(supp->bottom) <=99, supp->bottom ) - MMDASSERT( 1 <= CNV_END_SHORT(supp->top) && CNV_END_SHORT(supp->top) <=99, supp->top ) - MMDASSERT( CNV_END_SHORT(supp->bottom) <= CNV_END_SHORT(supp->top), supp->bottom << 8 | supp->top ) - } -#endif // HCF_ASSERT - -#if HCF_BIG_ENDIAN == 0 - act_endian = !act_endian; /* 1b*/ - sup_endian = !sup_endian; /* 2b*/ -#endif // HCF_BIG_ENDIAN - - for ( i = actp->len ; i > 3; actq++, i -= 3 ) { /* 6 */ - MMDASSERT( actq->variant[act_endian] <= 99, i<<8 | actq->variant[act_endian] ) - MMDASSERT( actq->bottom[act_endian] <= 99 , i<<8 | actq->bottom[act_endian] ) - MMDASSERT( actq->top[act_endian] <= 99 , i<<8 | actq->top[act_endian] ) - MMDASSERT( actq->bottom[act_endian] <= actq->top[act_endian], i<<8 | actq->bottom[act_endian] ) - if ( actq->variant[act_endian] == supq->variant[sup_endian] && - actq->bottom[act_endian] <= supq->top[sup_endian] && - actq->top[act_endian] >= supq->bottom[sup_endian] - ) break; - } - if ( i <= 3 || supp->len != 6 /*sizeof(CFG_SUP_RANGE_STRCT)/sizeof(hcf_16) - 1 */ ) { - actq = NULL; /* 8 */ - } -#if HCF_ASSERT - if ( actq == NULL ) { - for ( i = 0; i <= supp->len; i += 2 ) { - MMDASSERT( DO_ASSERT, MERGE_2( ((hcf_16*)supp)[i], ((hcf_16*)supp)[i+1] ) ); - } - for ( i = 0; i <= actp->len; i += 2 ) { - MMDASSERT( DO_ASSERT, MERGE_2( ((hcf_16*)actp)[i], ((hcf_16*)actp)[i+1] ) ); - } - } -#endif // HCF_ASSERT - return (CFG_RANGE_SPEC_STRCT*)actq; -} // mmd_check_comp - diff --git a/drivers/staging/wlags49_h2/mmd.h b/drivers/staging/wlags49_h2/mmd.h deleted file mode 100644 index 14458035d9e9..000000000000 --- a/drivers/staging/wlags49_h2/mmd.h +++ /dev/null @@ -1,77 +0,0 @@ - -#ifndef MMD_H -#define MMD_H 1 - -/************************************************************************************************************* -* -* FILE : mmd.h -* -* DATE : $Date: 2004/07/19 08:16:14 $ $Revision: 1.2 $ -* Original: 2004/05/17 07:33:14 Revision: 1.18 Tag: hcf7_t20040602_01 -* Original: 2004/05/11 06:22:59 Revision: 1.17 Tag: hcf7_t7_20040513_01 -* Original: 2004/04/15 09:24:42 Revision: 1.13 Tag: hcf7_t7_20040415_01 -* Original: 2004/04/08 15:18:17 Revision: 1.12 Tag: t7_20040413_01 -* Original: 2004/04/01 15:32:55 Revision: 1.10 Tag: t7_20040401_01 -* Original: 2004/03/04 16:47:50 Revision: 1.7 Tag: t20040310_01 -* Original: 2004/03/03 12:47:05 Revision: 1.6 Tag: t20040304_01 -* Original: 2004/02/25 14:14:39 Revision: 1.5 Tag: t20040302_03 -* Original: 2004/02/24 13:00:29 Revision: 1.4 Tag: t20040224_01 -* Original: 2004/01/30 09:59:33 Revision: 1.3 Tag: t20040219_01 -* -* AUTHOR : Nico Valster -* -* DESC : Definitions and Prototypes for HCF, MSF, UIL as well as USF sources -* -*************************************************************************************************************** -* -* -* SOFTWARE LICENSE -* -* This software is provided subject to the following terms and conditions, -* which you should read carefully before using the software. Using this -* software indicates your acceptance of these terms and conditions. If you do -* not agree with these terms and conditions, do not use the software. -* -* COPYRIGHT © 2001 - 2004 by Agere Systems Inc. All Rights Reserved -* All rights reserved. -* -* Redistribution and use in source or binary forms, with or without -* modifications, are permitted provided that the following conditions are met: -* -* . Redistributions of source code must retain the above copyright notice, this -* list of conditions and the following Disclaimer as comments in the code as -* well as in the documentation and/or other materials provided with the -* distribution. -* -* . Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following Disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* . Neither the name of Agere Systems Inc. nor the names of the contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. -* -* Disclaimer -* -* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -* INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF -* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY -* USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN -* RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGE. -* -* -**************************************************************************************************************/ -#ifndef HCF_H -#include "hcf.h" //just to get going with swig -#endif - -EXTERN_C CFG_RANGE_SPEC_STRCT* mmd_check_comp( CFG_RANGES_STRCT *actp, CFG_SUP_RANGE_STRCT *supp ); - -#endif // MMD_H diff --git a/drivers/staging/wlags49_h2/sta_h2.c b/drivers/staging/wlags49_h2/sta_h2.c deleted file mode 100644 index 0ba8defc023a..000000000000 --- a/drivers/staging/wlags49_h2/sta_h2.c +++ /dev/null @@ -1,4480 +0,0 @@ -/* - * File: sta_h24.236 - * - * Abstract: This file contains memory image 'fw_image'. - * - * Contents: Total size of the memory image: 69294 bytes. - * Total number of blocks: 4 blocks. - * Block 1 : load address 00000060, 390 bytes. - * Block 2 : load address 00000C16, 9496 bytes. - * Block 3 : load address 001E312E, 15786 bytes. - * Block 4 : load address 001F4000, 43622 bytes. - * - * Identity: component id: 31 (variant 3) version 2.36 - * - * Compatibility: - * supplying interface 4 (variant 2) : 2 - 5 - * acting on interface 1 (variant 4) : 6 - 7 - * acting on interface 1 (variant 5) : 6 - 7 - * acting on interface 1 (variant 6) : 6 - 7 - * acting on interface 2 (variant 2) : 1 - 2 - * - * Generated: by g:\fw\fupu3.exe version 4.26 - * - * Commandline: g:\fw\fupu3.exe /f=4 /n=fw_image /i=r3023600.hex - */ - - -#include "hcfcfg.h" /* to get hcf_16 etc defined as well as */ - /* possible settings which influence mdd.h or dhf.h */ -#include "mdd.h" /* to get COMP_ID_STA etc defined */ -#include "dhf.h" /* used to be fhfmem.h, to get memblock,plugrecord, */ - -static const hcf_8 fw_image_1_data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x0D, 0x00, 0x00, - 0x3A, 0x0C, 0x00, 0x00, 0x3A, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 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, 0x0A, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x86, 0x19, 0x86, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 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, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xEA, 0x00, 0x00, 0xFF, 0x07, 0x01, 0x00, 0x64, 0x00, 0x64, 0x00, 0x10, 0x27, 0x10, 0x27, - 0x14, 0x00, 0xD0, 0x07, 0xD0, 0x07, 0x10, 0x27, 0x2F, 0x00, 0x32, 0x00, 0x32, 0x00, 0x05, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x10, 0x27, 0x05, 0x00, 0x00, 0x02, 0x00, 0x02, 0x13, 0x00, 0x0A, 0x00, - 0x07, 0x00, 0x03, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x09, 0x2B, 0x09, 0x2B, 0x09, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x14, 0x01, 0x00, 0x40, 0x00, 0x32, 0x00, 0x32, 0x00, - 0x0A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - -}; /* fw_image_1_data */ - -static const hcf_8 fw_image_2_data[] = { - 0x4B, 0xA3, 0x00, 0x0A, 0x10, 0x01, 0x68, 0xA4, 0xB0, 0x01, 0x84, 0x01, 0x30, 0x33, 0x31, 0x33, - 0x44, 0x44, 0x30, 0x33, 0x31, 0x33, 0x30, 0x33, 0x31, 0x33, 0x32, 0x33, 0x32, 0x33, 0x90, 0x00, - 0x78, 0x04, 0xAE, 0xE4, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, - 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0xC6, 0x84, 0xF8, 0x99, 0xEE, - 0x8D, 0xF6, 0x0D, 0xFF, 0xBD, 0xD6, 0xB1, 0xDE, 0x54, 0x91, 0x50, 0x60, 0x03, 0x02, 0xA9, 0xCE, - 0x7D, 0x56, 0x19, 0xE7, 0x62, 0xB5, 0xE6, 0x4D, 0x9A, 0xEC, 0x45, 0x8F, 0x9D, 0x1F, 0x40, 0x89, - 0x87, 0xFA, 0x15, 0xEF, 0xEB, 0xB2, 0xC9, 0x8E, 0x0B, 0xFB, 0xEC, 0x41, 0x67, 0xB3, 0xFD, 0x5F, - 0xEA, 0x45, 0xBF, 0x23, 0xF7, 0x53, 0x96, 0xE4, 0x5B, 0x9B, 0xC2, 0x75, 0x1C, 0xE1, 0xAE, 0x3D, - 0x6A, 0x4C, 0x5A, 0x6C, 0x41, 0x7E, 0x02, 0xF5, 0x4F, 0x83, 0x5C, 0x68, 0xF4, 0x51, 0x34, 0xD1, - 0x08, 0xF9, 0x93, 0xE2, 0x73, 0xAB, 0x53, 0x62, 0x3F, 0x2A, 0x0C, 0x08, 0x52, 0x95, 0x65, 0x46, - 0x5E, 0x9D, 0x28, 0x30, 0xA1, 0x37, 0x0F, 0x0A, 0xB5, 0x2F, 0x09, 0x0E, 0x36, 0x24, 0x9B, 0x1B, - 0x3D, 0xDF, 0x26, 0xCD, 0x69, 0x4E, 0xCD, 0x7F, 0x9F, 0xEA, 0x1B, 0x12, 0x9E, 0x1D, 0x74, 0x58, - 0x2E, 0x34, 0x2D, 0x36, 0xB2, 0xDC, 0xEE, 0xB4, 0xFB, 0x5B, 0xF6, 0xA4, 0x4D, 0x76, 0x61, 0xB7, - 0xCE, 0x7D, 0x7B, 0x52, 0x3E, 0xDD, 0x71, 0x5E, 0x97, 0x13, 0xF5, 0xA6, 0x68, 0xB9, 0x00, 0x00, - 0x2C, 0xC1, 0x60, 0x40, 0x1F, 0xE3, 0xC8, 0x79, 0xED, 0xB6, 0xBE, 0xD4, 0x46, 0x8D, 0xD9, 0x67, - 0x4B, 0x72, 0xDE, 0x94, 0xD4, 0x98, 0xE8, 0xB0, 0x4A, 0x85, 0x6B, 0xBB, 0x2A, 0xC5, 0xE5, 0x4F, - 0x16, 0xED, 0xC5, 0x86, 0xD7, 0x9A, 0x55, 0x66, 0x94, 0x11, 0xCF, 0x8A, 0x10, 0xE9, 0x06, 0x04, - 0x81, 0xFE, 0xF0, 0xA0, 0x44, 0x78, 0xBA, 0x25, 0xE3, 0x4B, 0xF3, 0xA2, 0xFE, 0x5D, 0xC0, 0x80, - 0x8A, 0x05, 0xAD, 0x3F, 0xBC, 0x21, 0x48, 0x70, 0x04, 0xF1, 0xDF, 0x63, 0xC1, 0x77, 0x75, 0xAF, - 0x63, 0x42, 0x30, 0x20, 0x1A, 0xE5, 0x0E, 0xFD, 0x6D, 0xBF, 0x4C, 0x81, 0x14, 0x18, 0x35, 0x26, - 0x2F, 0xC3, 0xE1, 0xBE, 0xA2, 0x35, 0xCC, 0x88, 0x39, 0x2E, 0x57, 0x93, 0xF2, 0x55, 0x82, 0xFC, - 0x47, 0x7A, 0xAC, 0xC8, 0xE7, 0xBA, 0x2B, 0x32, 0x95, 0xE6, 0xA0, 0xC0, 0x98, 0x19, 0xD1, 0x9E, - 0x7F, 0xA3, 0x66, 0x44, 0x7E, 0x54, 0xAB, 0x3B, 0x83, 0x0B, 0xCA, 0x8C, 0x29, 0xC7, 0xD3, 0x6B, - 0x3C, 0x28, 0x79, 0xA7, 0xE2, 0xBC, 0x1D, 0x16, 0x76, 0xAD, 0x3B, 0xDB, 0x56, 0x64, 0x4E, 0x74, - 0x1E, 0x14, 0xDB, 0x92, 0x0A, 0x0C, 0x6C, 0x48, 0xE4, 0xB8, 0x5D, 0x9F, 0x6E, 0xBD, 0xEF, 0x43, - 0xA6, 0xC4, 0xA8, 0x39, 0xA4, 0x31, 0x37, 0xD3, 0x8B, 0xF2, 0x32, 0xD5, 0x43, 0x8B, 0x59, 0x6E, - 0xB7, 0xDA, 0x8C, 0x01, 0x64, 0xB1, 0xD2, 0x9C, 0xE0, 0x49, 0xB4, 0xD8, 0xFA, 0xAC, 0x07, 0xF3, - 0x25, 0xCF, 0xAF, 0xCA, 0x8E, 0xF4, 0xE9, 0x47, 0x18, 0x10, 0xD5, 0x6F, 0x88, 0xF0, 0x6F, 0x4A, - 0x72, 0x5C, 0x24, 0x38, 0xF1, 0x57, 0xC7, 0x73, 0x51, 0x97, 0x23, 0xCB, 0x7C, 0xA1, 0x9C, 0xE8, - 0x21, 0x3E, 0xDD, 0x96, 0xDC, 0x61, 0x86, 0x0D, 0x85, 0x0F, 0x90, 0xE0, 0x42, 0x7C, 0xC4, 0x71, - 0xAA, 0xCC, 0xD8, 0x90, 0x05, 0x06, 0x01, 0xF7, 0x12, 0x1C, 0xA3, 0xC2, 0x5F, 0x6A, 0xF9, 0xAE, - 0xD0, 0x69, 0x91, 0x17, 0x58, 0x99, 0x27, 0x3A, 0xB9, 0x27, 0x38, 0xD9, 0x13, 0xEB, 0xB3, 0x2B, - 0x33, 0x22, 0xBB, 0xD2, 0x70, 0xA9, 0x89, 0x07, 0xA7, 0x33, 0xB6, 0x2D, 0x22, 0x3C, 0x92, 0x15, - 0x20, 0xC9, 0x49, 0x87, 0xFF, 0xAA, 0x78, 0x50, 0x7A, 0xA5, 0x8F, 0x03, 0xF8, 0x59, 0x80, 0x09, - 0x17, 0x1A, 0xDA, 0x65, 0x31, 0xD7, 0xC6, 0x84, 0xB8, 0xD0, 0xC3, 0x82, 0xB0, 0x29, 0x77, 0x5A, - 0x11, 0x1E, 0xCB, 0x7B, 0xFC, 0xA8, 0xD6, 0x6D, 0x3A, 0x2C, 0x00, 0x30, 0x00, 0x31, 0x00, 0x33, - 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3A, 0x00, 0x3B, - 0x00, 0x3C, 0x00, 0x3D, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x3F, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x02, 0x14, - 0x05, 0x32, 0x0B, 0x37, 0x08, 0x50, 0x0B, 0x6E, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x3F, 0x00, - 0x0C, 0x00, 0x30, 0x00, 0x03, 0x00, 0x0F, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x02, 0x00, 0x04, 0x00, - 0x0A, 0x00, 0x0B, 0x00, 0x10, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x63, 0x00, 0x20, 0x00, 0x63, 0x00, 0x63, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x10, - 0xEE, 0x10, 0xA6, 0x10, 0xE8, 0x10, 0xAC, 0x10, 0xE2, 0x10, 0xB2, 0x10, 0xDC, 0x10, 0xB8, 0x10, - 0xD6, 0x10, 0xBE, 0x10, 0xD0, 0x10, 0xC4, 0x10, 0xCA, 0x10, 0x07, 0x01, 0x00, 0x00, 0x0A, 0x22, - 0x00, 0x04, 0x08, 0x01, 0x00, 0x00, 0x0A, 0x26, 0x00, 0x04, 0x09, 0x01, 0x00, 0x00, 0x0A, 0x2A, - 0x00, 0x04, 0x0A, 0x01, 0x00, 0x00, 0x0A, 0x2E, 0x00, 0x04, 0x0B, 0x01, 0x00, 0x00, 0x10, 0x24, - 0x04, 0x04, 0x0C, 0x01, 0x00, 0x00, 0x10, 0x28, 0x04, 0x04, 0x0D, 0x01, 0x00, 0x00, 0x10, 0x2C, - 0x04, 0x04, 0x0E, 0x01, 0x00, 0x00, 0x10, 0x30, 0x04, 0x04, 0x0F, 0x01, 0x00, 0x00, 0x16, 0x34, - 0x08, 0x04, 0x10, 0x01, 0x00, 0x00, 0x16, 0x38, 0x08, 0x04, 0x11, 0x01, 0x00, 0x00, 0x16, 0x3C, - 0x08, 0x04, 0x12, 0x01, 0x00, 0x00, 0x16, 0x40, 0x08, 0x04, 0x13, 0x01, 0x00, 0x00, 0x17, 0x64, - 0x0C, 0x0B, 0x14, 0x01, 0x00, 0x00, 0x17, 0x68, 0x0C, 0x0B, 0x15, 0x01, 0x00, 0x00, 0x17, 0x6C, - 0x0C, 0x0B, 0x16, 0x01, 0x00, 0x00, 0x17, 0x70, 0x0C, 0x0B, 0x17, 0x01, 0x00, 0x00, 0x17, 0x74, - 0x0C, 0x0B, 0x18, 0x01, 0x00, 0x00, 0x17, 0x78, 0x0C, 0x0B, 0x19, 0x01, 0x00, 0x00, 0x17, 0x7C, - 0x0C, 0x0B, 0x1A, 0x01, 0x00, 0x00, 0x17, 0x80, 0x0C, 0x0B, 0x1B, 0x01, 0x00, 0x00, 0x17, 0x84, - 0x0C, 0x0B, 0x1C, 0x01, 0x00, 0x00, 0x17, 0x88, 0x0C, 0x0B, 0x1D, 0x01, 0x00, 0x00, 0x17, 0x8C, - 0x0C, 0x0B, 0x1E, 0x01, 0x00, 0x00, 0x1D, 0x95, 0x17, 0x04, 0x1F, 0x01, 0x00, 0x00, 0x1D, 0x99, - 0x17, 0x04, 0x20, 0x01, 0x00, 0x00, 0x1D, 0x9D, 0x17, 0x04, 0x21, 0x01, 0x00, 0x00, 0x1D, 0xA1, - 0x17, 0x04, 0x22, 0x01, 0x00, 0x00, 0x0E, 0xA5, 0x00, 0x00, 0x10, 0x11, 0x30, 0x11, 0x50, 0x11, - 0x70, 0x11, 0xC8, 0x11, 0x18, 0x11, 0x38, 0x11, 0x58, 0x11, 0x78, 0x11, 0xD0, 0x11, 0x20, 0x11, - 0x40, 0x11, 0x60, 0x11, 0x80, 0x11, 0xD8, 0x11, 0x28, 0x11, 0x48, 0x11, 0x68, 0x11, 0x88, 0x11, - 0xE0, 0x11, 0x90, 0x11, 0x98, 0x11, 0xA0, 0x11, 0xA8, 0x11, 0xB0, 0x11, 0xB8, 0x11, 0xC0, 0x11, - 0xE8, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x36, 0x25, 0x4F, 0x25, 0x72, 0x25, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xAC, 0x25, - 0x02, 0x2B, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xF3, 0x2D, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, - 0xE1, 0x24, 0xE1, 0x24, 0x8B, 0x27, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, - 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, - 0xE1, 0x24, 0xE1, 0x24, 0xE5, 0x27, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, - 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, - 0xE1, 0x24, 0x59, 0x27, 0x73, 0x27, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, 0xE1, 0x24, - 0xE1, 0x24, 0x47, 0x23, 0xCE, 0x25, 0xE1, 0x25, 0x91, 0x26, 0x95, 0x26, 0xE1, 0x24, 0xE1, 0x24, - 0x44, 0x27, 0x51, 0xEA, 0xFF, 0xE9, 0x00, 0x00, 0x48, 0xEA, 0x00, 0x00, 0x00, 0x00, 0xC9, 0xEA, - 0x65, 0x25, 0x89, 0x25, 0x00, 0x00, 0xF8, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x13, 0x2B, 0xE0, 0xFC, - 0x4C, 0x28, 0xC6, 0x2A, 0x5A, 0x00, 0x02, 0x00, 0xF9, 0xFF, 0x4C, 0x28, 0x62, 0x28, 0x00, 0x01, - 0x02, 0x00, 0xF7, 0xFF, 0x4C, 0x28, 0x62, 0x28, 0x50, 0x28, 0x06, 0x00, 0xF0, 0xFF, 0x4C, 0x28, - 0x29, 0x28, 0x00, 0x00, 0x00, 0x02, 0xF6, 0xFF, 0x4C, 0x28, 0x62, 0x28, 0x6C, 0x00, 0x02, 0x00, - 0xF4, 0xFF, 0x4C, 0x28, 0x62, 0x28, 0xAA, 0x01, 0x02, 0x00, 0xF5, 0xFF, 0x4C, 0x28, 0xCF, 0x2A, - 0x42, 0x28, 0x02, 0x00, 0xE0, 0xFF, 0x4C, 0x28, 0x62, 0x28, 0xCE, 0x2D, 0x02, 0x00, 0xE1, 0xFF, - 0x4C, 0x28, 0x62, 0x28, 0xD0, 0x2D, 0x02, 0x00, 0xE2, 0xFF, 0x4C, 0x28, 0x62, 0x28, 0xD2, 0x2D, - 0x02, 0x00, 0xE3, 0xFF, 0x4C, 0x28, 0x62, 0x28, 0xCA, 0x2D, 0x02, 0x00, 0x03, 0xFC, 0x4C, 0x28, - 0x17, 0x2A, 0x16, 0x2D, 0x02, 0x00, 0x04, 0xFC, 0x4C, 0x28, 0x5C, 0x28, 0x58, 0x28, 0x22, 0x00, - 0x06, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0x40, 0x28, 0x02, 0x00, 0x07, 0xFC, 0x4C, 0x28, 0x62, 0x28, - 0x9C, 0x28, 0x02, 0x00, 0x0E, 0xFC, 0x4C, 0x28, 0x29, 0x2A, 0xA6, 0x28, 0x22, 0x00, 0xB1, 0xFC, - 0x4C, 0x28, 0x1D, 0x2B, 0xA2, 0x29, 0x02, 0x00, 0x20, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0xCC, 0x28, - 0x02, 0x00, 0x25, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0xD6, 0x28, 0x02, 0x00, 0x26, 0xFC, 0x4C, 0x28, - 0x62, 0x28, 0xD8, 0x28, 0x02, 0x00, 0x27, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0xDA, 0x28, 0x02, 0x00, - 0xB2, 0xFC, 0x4C, 0x28, 0x5C, 0x28, 0xC6, 0x29, 0x22, 0x00, 0xC1, 0xFC, 0x4C, 0x28, 0x62, 0x28, - 0x5A, 0x2D, 0x20, 0x00, 0xB0, 0xFC, 0x1F, 0x28, 0x22, 0x2B, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xFC, - 0x1F, 0x28, 0xE7, 0x2A, 0x00, 0x00, 0x08, 0x00, 0xC8, 0xFC, 0x1F, 0x28, 0xE2, 0x2A, 0x00, 0x00, - 0x08, 0x00, 0xB4, 0xFC, 0x1F, 0x28, 0x60, 0x2B, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xFC, 0x1F, 0x28, - 0x11, 0x2C, 0x00, 0x00, 0x00, 0x00, 0xB7, 0xFC, 0x1F, 0x28, 0x3B, 0x2C, 0x00, 0x00, 0x00, 0x00, - 0xB8, 0xFC, 0x1F, 0x28, 0x98, 0x2C, 0x00, 0x00, 0x00, 0x00, 0xB5, 0xFC, 0x4C, 0x28, 0x62, 0x28, - 0xC6, 0x2D, 0x02, 0x00, 0xB9, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0xC8, 0x2D, 0x02, 0x00, 0x90, 0xFD, - 0x4C, 0x28, 0x29, 0x28, 0xCC, 0x2D, 0x02, 0x00, 0x23, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0xD2, 0x28, - 0x02, 0x00, 0x29, 0xFC, 0x44, 0x29, 0xF1, 0x28, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xFC, 0x4C, 0x28, - 0x62, 0x28, 0x0E, 0x2D, 0x02, 0x00, 0x32, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0xA0, 0x01, 0x02, 0x00, - 0x33, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0xA2, 0x01, 0x02, 0x00, 0x00, 0xFC, 0x4C, 0x28, 0x62, 0x28, - 0x56, 0x28, 0x02, 0x00, 0x01, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0x50, 0x28, 0x06, 0x00, 0x02, 0xFC, - 0x4C, 0x28, 0xDC, 0x28, 0xA4, 0x29, 0x22, 0x00, 0x05, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0x46, 0x28, - 0x02, 0x00, 0x08, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0x4A, 0x28, 0x06, 0x00, 0x09, 0xFC, 0x4C, 0x28, - 0x62, 0x28, 0x9E, 0x28, 0x02, 0x00, 0x0B, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0xA0, 0x28, 0x02, 0x00, - 0x0C, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0xA2, 0x28, 0x02, 0x00, 0x0D, 0xFC, 0x4C, 0x28, 0x62, 0x28, - 0xA4, 0x28, 0x02, 0x00, 0x21, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0xCE, 0x28, 0x02, 0x00, 0x80, 0xFC, - 0xB8, 0x28, 0xC8, 0x28, 0xE2, 0x28, 0xC0, 0x00, 0x81, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0xA8, 0x01, - 0x02, 0x00, 0x83, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0xAC, 0x01, 0x02, 0x00, 0x85, 0xFC, 0x4C, 0x28, - 0x49, 0x2A, 0xA6, 0x01, 0x02, 0x00, 0x86, 0xFC, 0x4C, 0x28, 0x5B, 0x2A, 0xB2, 0x01, 0x02, 0x00, - 0x28, 0xFC, 0x4C, 0x28, 0x62, 0x28, 0xDC, 0x28, 0x02, 0x00, 0x87, 0xFC, 0x4C, 0x28, 0x62, 0x28, - 0xEC, 0x29, 0x22, 0x03, 0x84, 0xFC, 0x4C, 0x28, 0x70, 0x2A, 0xB0, 0x01, 0x02, 0x00, 0x2B, 0xFC, - 0x4C, 0x28, 0x62, 0x28, 0x14, 0x31, 0x02, 0x00, 0xF8, 0xFF, 0x4C, 0x28, 0x62, 0x28, 0x0E, 0x31, - 0x02, 0x00, 0xF3, 0xFF, 0x4C, 0x28, 0x62, 0x28, 0x16, 0x31, 0x02, 0x00, 0x20, 0xFD, 0x7D, 0x28, - 0x29, 0x28, 0x23, 0x34, 0x08, 0x00, 0x21, 0xFD, 0x7D, 0x28, 0x29, 0x28, 0x27, 0x34, 0x0A, 0x00, - 0x22, 0xFD, 0x7D, 0x28, 0x29, 0x28, 0x2C, 0x34, 0x16, 0x00, 0x23, 0xFD, 0x7D, 0x28, 0x29, 0x28, - 0x37, 0x34, 0x0A, 0x00, 0x10, 0xFD, 0x4C, 0x28, 0x29, 0x28, 0x74, 0x01, 0x02, 0x00, 0x45, 0xFD, - 0x4C, 0x28, 0x29, 0x28, 0x00, 0x01, 0x02, 0x00, 0x47, 0xFD, 0x4C, 0x28, 0x29, 0x28, 0x78, 0x01, - 0x02, 0x00, 0x48, 0xFD, 0x9A, 0x29, 0x29, 0x28, 0xA0, 0x01, 0x02, 0x00, 0x49, 0xFD, 0x9A, 0x29, - 0x29, 0x28, 0xA2, 0x01, 0x02, 0x00, 0x4A, 0xFD, 0x4C, 0x28, 0x29, 0x28, 0x98, 0x01, 0x02, 0x00, - 0x4B, 0xFD, 0x4C, 0x28, 0x29, 0x28, 0x9A, 0x01, 0x02, 0x00, 0x4D, 0xFD, 0x7D, 0x28, 0x29, 0x28, - 0x3C, 0x34, 0x04, 0x00, 0x4F, 0xFD, 0xAE, 0x29, 0x29, 0x28, 0x1A, 0x2D, 0x02, 0x00, 0xC0, 0xFD, - 0x7D, 0x28, 0x29, 0x28, 0x3E, 0x34, 0x02, 0x00, 0xC2, 0xFD, 0xA4, 0x29, 0x29, 0x28, 0x00, 0x00, - 0x02, 0x00, 0xC3, 0xFD, 0x7D, 0x28, 0x29, 0x28, 0x3F, 0x34, 0x02, 0x00, 0x40, 0xFD, 0x75, 0x28, - 0x29, 0x28, 0xB8, 0x01, 0x02, 0x00, 0x24, 0xFD, 0xCB, 0x29, 0x29, 0x28, 0x00, 0x00, 0x02, 0x00, - 0x91, 0xFD, 0x4C, 0x28, 0x29, 0x28, 0x20, 0x24, 0x02, 0x00, 0x93, 0xFD, 0x4C, 0x28, 0x29, 0x28, - 0x26, 0x24, 0x02, 0x00, 0xC1, 0xFD, 0x4C, 0x28, 0x29, 0x28, 0xFE, 0x00, 0x02, 0x00, 0xC6, 0xFD, - 0xAA, 0x28, 0x29, 0x28, 0x28, 0x2D, 0x0A, 0x00, 0x89, 0xFD, 0x5B, 0x29, 0x29, 0x28, 0x00, 0x00, - 0x00, 0x00, 0x8A, 0xFD, 0x9A, 0x28, 0x29, 0x28, 0xA0, 0x2D, 0x24, 0x00, 0x41, 0xFD, 0x4C, 0x28, - 0x29, 0x28, 0x7A, 0x2D, 0x22, 0x00, 0x42, 0xFD, 0x4C, 0x28, 0x29, 0x28, 0x02, 0x01, 0x06, 0x00, - 0x43, 0xFD, 0xD8, 0x29, 0x29, 0x28, 0x00, 0x00, 0x06, 0x00, 0x44, 0xFD, 0xB8, 0x29, 0x29, 0x28, - 0xB4, 0x01, 0x02, 0x00, 0x46, 0xFD, 0x4C, 0x28, 0x29, 0x28, 0xBA, 0x01, 0x0C, 0x00, 0x4C, 0xFD, - 0x4C, 0x28, 0x29, 0x28, 0xEA, 0x29, 0x02, 0x00, 0x50, 0xFD, 0x4C, 0x28, 0x29, 0x28, 0xF4, 0x00, - 0x02, 0x00, 0x51, 0xFD, 0x4C, 0x28, 0x29, 0x28, 0xF6, 0x00, 0x02, 0x00, 0x52, 0xFD, 0x4C, 0x28, - 0x29, 0x28, 0xC6, 0x01, 0x02, 0x00, 0x8F, 0xFD, 0xEB, 0x29, 0x29, 0x28, 0x00, 0x00, 0x08, 0x00, - 0x92, 0xFD, 0x4C, 0x28, 0x29, 0x28, 0x54, 0x2D, 0x02, 0x00, 0x8C, 0xFD, 0x3F, 0x28, 0x29, 0x28, - 0x08, 0x2E, 0x56, 0x00, 0x8D, 0xFD, 0x3F, 0x28, 0x29, 0x28, 0x62, 0x2E, 0x14, 0x00, 0x00, 0xF1, - 0x46, 0x00, 0xE3, 0x27, 0x3A, 0x01, 0x01, 0xF1, 0x44, 0x07, 0xE1, 0x27, 0x3C, 0x01, 0x00, 0x03, - 0x2A, 0x68, 0x1E, 0x00, 0x76, 0x01, 0xFE, 0x00, 0xD6, 0x01, 0x02, 0x01, 0x3E, 0x01, 0xB8, 0x01, - 0x74, 0x27, 0x5A, 0x01, 0x20, 0x24, 0x20, 0x00, 0x00, 0x00, 0xBA, 0x1C, 0x00, 0x00, 0xBE, 0x1E, - 0x54, 0x01, 0x0B, 0x00, 0xBA, 0x00, 0xE4, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xAF, 0x37, 0xAF, 0x43, 0xB0, - 0x4C, 0xB0, 0x48, 0xAF, 0xDE, 0xAF, 0xB6, 0xAF, 0x1C, 0x33, 0x7F, 0x32, 0x1C, 0x33, 0xF3, 0x32, - 0x89, 0x32, 0x7D, 0x32, 0x3B, 0x33, 0x4C, 0x33, 0x4C, 0x33, 0x4C, 0x33, 0x55, 0x33, 0x70, 0x33, - 0xCD, 0x33, 0xE9, 0x33, 0xF4, 0x32, 0x07, 0x33, 0xDB, 0x32, 0x10, 0x00, 0x12, 0x00, 0x13, 0x00, - 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, - 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x14, 0x01, - 0x14, 0x01, 0x14, 0x01, 0x14, 0x01, 0x14, 0x01, 0x14, 0x01, 0x14, 0x01, 0x14, 0x01, 0xF3, 0x02, - 0xAD, 0x03, 0x60, 0x04, 0x04, 0x05, 0x07, 0x06, 0x08, 0x07, 0x0A, 0x08, 0x16, 0x09, 0x44, 0x0A, - 0x04, 0x0B, 0x40, 0x0C, 0x80, 0x0D, 0x00, 0x0E, 0x84, 0x0F, 0x01, 0x10, 0x10, 0x11, 0x02, 0x14, - 0x40, 0x20, 0x32, 0x21, 0x32, 0x22, 0x04, 0x23, 0x01, 0x24, 0x0F, 0x25, 0x00, 0x26, 0x00, 0x27, - 0x00, 0x28, 0x00, 0x29, 0x00, 0x2A, 0x01, 0x2B, 0x06, 0x2C, 0x00, 0x38, 0x00, 0x39, 0xD6, 0x3A, - 0x00, 0x3B, 0x00, 0x3C, 0x14, 0x3D, 0x7F, 0x3E, 0x00, 0x3F, 0x68, 0x40, 0x75, 0x41, 0x07, 0x42, - 0x07, 0x43, 0x00, 0x45, 0x3B, 0x4A, 0x00, 0x4B, 0x00, 0x4C, 0x0F, 0x4D, 0x02, 0x75, 0x00, 0x76, - 0x80, 0x00, 0x08, 0x01, 0x09, 0x01, 0x09, 0x01, 0x0A, 0x01, 0x0A, 0x01, 0x0B, 0x01, 0x0B, 0x01, - 0x0C, 0x01, 0x0C, 0x01, 0x0D, 0x01, 0x0D, 0x01, 0x0E, 0x01, 0x0E, 0x01, 0x0F, 0x01, 0x0F, 0x01, - 0x10, 0x01, 0x10, 0x01, 0x11, 0x01, 0x11, 0x01, 0x12, 0x01, 0x12, 0x01, 0x13, 0x01, 0x13, 0x01, - 0x14, 0x01, 0x14, 0x01, 0x15, 0x01, 0x15, 0x01, 0x16, 0x01, 0x16, 0x01, 0x17, 0x01, 0x17, 0x01, - 0x18, 0x01, 0x18, 0x01, 0x19, 0x01, 0x19, 0x01, 0x4D, 0x01, 0x4D, 0x01, 0x4E, 0x01, 0x4E, 0x01, - 0x4F, 0x01, 0x4F, 0x01, 0x50, 0x01, 0x50, 0x01, 0x51, 0x01, 0x51, 0x01, 0x52, 0x01, 0x52, 0x01, - 0x53, 0x01, 0x53, 0x01, 0x54, 0x01, 0x54, 0x01, 0x65, 0x01, 0x65, 0x01, 0x66, 0x01, 0x66, 0x01, - 0x67, 0x01, 0x67, 0x01, 0x68, 0x01, 0x68, 0x01, 0x69, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6A, 0x01, - 0x6B, 0x01, 0x6B, 0x01, 0x6C, 0x01, 0x6C, 0x01, 0x6D, 0x01, 0x6D, 0x01, 0x6E, 0x01, 0x6E, 0x01, - 0x6F, 0x01, 0x6F, 0x01, 0x70, 0x01, 0x70, 0x01, 0x71, 0x01, 0x71, 0x01, 0x72, 0x01, 0x72, 0x01, - 0x73, 0x01, 0x73, 0x01, 0x74, 0x01, 0x74, 0x01, 0x75, 0x01, 0x75, 0x01, 0x76, 0x01, 0x76, 0x01, - 0x77, 0x01, 0x77, 0x01, 0x78, 0x01, 0x78, 0x01, 0x79, 0x01, 0x79, 0x01, 0x7A, 0x01, 0x7A, 0x01, - 0x7B, 0x01, 0x7B, 0x01, 0x7C, 0x01, 0x7C, 0x01, 0x7D, 0x01, 0x7D, 0x01, 0x7E, 0x01, 0x7E, 0x01, - 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, - 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, - 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, 0x7F, 0x01, - 0x7F, 0x01, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, - 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x13, - 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, - 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x80, 0x13, 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, - 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, - 0x51, 0x44, 0x51, 0x44, 0x51, 0x44, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, - 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x23, 0x46, 0x23, 0x46, - 0x23, 0x46, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, - 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1D, 0x47, 0x9A, 0x48, - 0xDA, 0x48, 0x1A, 0x48, 0x5A, 0x48, 0x9A, 0x48, 0xDA, 0x48, 0x1A, 0x48, 0x5A, 0x48, 0x9A, 0x48, - 0xDA, 0x48, 0x1A, 0x48, 0x5A, 0x48, 0x9A, 0x48, 0x33, 0x48, 0x78, 0x49, 0x78, 0x49, 0x79, 0x49, - 0x79, 0x49, 0x79, 0x49, 0x79, 0x49, 0x7A, 0x49, 0x7A, 0x49, 0x7A, 0x49, 0x7A, 0x49, 0x7B, 0x49, - 0x7B, 0x49, 0x7B, 0x49, 0x7C, 0x49, 0x32, 0x00, 0x46, 0x00, 0x5A, 0x00, 0x6E, 0x00, 0x82, 0x00, - 0x96, 0x00, 0xAA, 0x00, 0xBE, 0x00, 0xD2, 0x00, 0xE6, 0x00, 0xFA, 0x00, 0x0E, 0x01, 0x22, 0x01, - 0x52, 0x01, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 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, - 0x03, 0x00, 0x15, 0x00, 0x6E, 0x6F, 0x6E, 0x2D, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x20, 0x53, 0x53, 0x49, 0x44, 0x20, 0x21, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x01, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x09, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0x64, 0x00, - 0x00, 0x00, 0x48, 0x45, 0x52, 0x4D, 0x45, 0x53, 0x20, 0x32, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x15, 0x00, 0x6E, 0x6F, 0x6E, 0x2D, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x20, 0x53, 0x53, 0x49, 0x44, 0x20, 0x21, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x01, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x09, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0x64, 0x00, - 0x00, 0x00, 0x48, 0x45, 0x52, 0x4D, 0x45, 0x53, 0x20, 0x32, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x20, 0x57, 0x61, 0x76, 0x65, 0x4C, 0x41, 0x4E, 0x20, 0x49, 0x49, - 0x20, 0x53, 0x53, 0x49, 0x44, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x02, 0x01, 0x82, 0x84, 0x8B, 0x96, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x85, 0x00, 0x01, - 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x01, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x53, 0x65, 0x74, 0x20, 0x49, 0x64, 0x65, 0x6E, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00, 0x06, 0xDD, 0x00, 0x50, 0xF2, 0x01, - 0x01, 0x00, 0x00, 0x50, 0xF2, 0x05, 0x02, 0x00, 0x00, 0x50, 0xF2, 0x02, 0x00, 0x50, 0xF2, 0x04, - 0x02, 0x00, 0x00, 0x50, 0xF2, 0x00, 0x00, 0x50, 0xF2, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x00, 0x14, 0x00, 0x15, 0x00, 0x36, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x14, 0x00, - 0x11, 0x00, 0x36, 0x00, 0x01, 0x00, 0x04, 0x00, 0x7A, 0x2D, 0x28, 0x2D, 0x0C, 0x2F, 0x10, 0x2F, - 0x14, 0x2F, 0xA0, 0x2D, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x29, 0x28, 0x2D, - 0xFF, 0xFF, 0x00, 0x00, 0x7A, 0x2D, 0x28, 0x2D, 0x0C, 0x2F, 0x10, 0x2F, 0x14, 0x2F, 0xA0, 0x2D, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x2D, 0x28, 0x2D, 0xFF, 0xFF, 0xE6, 0x2D, - 0x34, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00, 0x02, 0x06, 0x00, 0x00, 0x06, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - -}; /* fw_image_2_data */ - -static const hcf_8 fw_image_3_data[] = { - 0x00, 0xE1, 0x30, 0x40, 0x02, 0x36, 0xA1, 0xFF, 0x83, 0xFF, 0x8D, 0xFF, 0x5C, 0x44, 0x5C, 0x43, - 0x5C, 0x42, 0x5C, 0x41, 0x5C, 0x40, 0xAC, 0xFF, 0xAD, 0xFF, 0xE7, 0xE1, 0xAD, 0x60, 0x08, 0x78, - 0xFF, 0xFF, 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x03, 0x02, 0x28, 0xE2, 0x40, 0xFF, 0xA1, 0xFF, - 0x84, 0xFF, 0xBB, 0x60, 0x18, 0x64, 0x40, 0x42, 0xB0, 0x60, 0x97, 0x64, 0x40, 0x40, 0xBD, 0xF3, - 0x80, 0xFB, 0x0F, 0x60, 0x9A, 0x63, 0xCA, 0xF3, 0xBD, 0xDB, 0x00, 0x60, 0x9A, 0x64, 0xBD, 0xDB, - 0x02, 0x64, 0xBD, 0xDB, 0x04, 0x64, 0xA3, 0xDB, 0x5C, 0x49, 0x0A, 0x64, 0x40, 0x4B, 0x5C, 0x5C, - 0x01, 0x60, 0x39, 0xE2, 0x04, 0x60, 0x00, 0x7A, 0x89, 0xFF, 0x03, 0x60, 0xFF, 0x73, 0x88, 0xFF, - 0xB0, 0x60, 0x97, 0x78, 0xFF, 0xFF, 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x06, 0x02, 0x40, 0xFF, - 0x42, 0xFF, 0x43, 0xFF, 0x44, 0xFF, 0x45, 0xFF, 0xA1, 0xFF, 0x88, 0xFF, 0x85, 0xFF, 0x21, 0xE1, - 0x5C, 0x40, 0xBB, 0x60, 0x20, 0x78, 0xFF, 0xFF, 0xA2, 0xFF, 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, - 0x01, 0x02, 0xA1, 0xFF, 0x86, 0xFF, 0x88, 0xFF, 0x5C, 0x46, 0x5C, 0x49, 0x5C, 0x40, 0xE7, 0x60, - 0x58, 0x4F, 0x31, 0x78, 0xFF, 0xFF, 0xC7, 0x60, 0x58, 0x4F, 0xF6, 0x78, 0xFF, 0xFF, 0xCA, 0x60, - 0x58, 0x4F, 0x83, 0x78, 0xFF, 0xFF, 0xDD, 0x60, 0x58, 0x4F, 0x3D, 0x78, 0xFF, 0xFF, 0x1B, 0x60, - 0x58, 0x4F, 0x37, 0x78, 0xFF, 0xFF, 0xEC, 0x60, 0x58, 0x4F, 0x75, 0x78, 0xFF, 0xFF, 0xE0, 0x60, - 0x58, 0x4F, 0x1B, 0x78, 0xFF, 0xFF, 0xE4, 0x60, 0x58, 0x4F, 0xDC, 0x78, 0xFF, 0xFF, 0xF3, 0x60, - 0x58, 0x4F, 0xEB, 0x78, 0xFF, 0xFF, 0x13, 0xE1, 0xA3, 0xFF, 0xBF, 0x60, 0xE7, 0x78, 0xFF, 0xFF, - 0x03, 0xE1, 0xA3, 0xFF, 0xFE, 0xFC, 0xFF, 0xFC, 0x23, 0x60, 0xF4, 0x63, 0x17, 0xFD, 0xAE, 0xFF, - 0x25, 0x60, 0x11, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x26, 0x1A, 0x00, - 0x80, 0x3A, 0x15, 0x00, 0x81, 0xF1, 0x32, 0xF2, 0x33, 0xF2, 0xD0, 0x80, 0x82, 0xF1, 0x0F, 0x02, - 0xD0, 0x80, 0x34, 0xF2, 0x83, 0xF1, 0x0B, 0x02, 0xD0, 0x80, 0xFF, 0xFF, 0x08, 0x02, 0xDF, 0x60, - 0x58, 0x4F, 0x28, 0x78, 0xFF, 0xFF, 0x20, 0x60, 0x58, 0x4F, 0xBF, 0x78, 0xFF, 0xFF, 0x19, 0x60, - 0xE8, 0x78, 0xFF, 0xFF, 0x00, 0xF4, 0xAA, 0x60, 0xAA, 0x65, 0x09, 0xF2, 0x5A, 0xD0, 0xD4, 0x80, - 0x03, 0x64, 0x12, 0x02, 0xD0, 0x80, 0x1D, 0x60, 0x60, 0x65, 0x0E, 0x02, 0x5A, 0xD2, 0xFF, 0xFF, - 0xD4, 0x80, 0x01, 0x60, 0x00, 0x65, 0x08, 0x02, 0x5A, 0xD2, 0xFF, 0xFF, 0xD4, 0x80, 0xFF, 0xFF, - 0x03, 0x02, 0x19, 0x60, 0xE8, 0x78, 0xFF, 0xFF, 0x01, 0x60, 0xD6, 0x65, 0xA5, 0xD1, 0x5A, 0xD1, - 0x44, 0x48, 0x5A, 0xD1, 0x44, 0x4A, 0x26, 0x46, 0x3F, 0xF2, 0x00, 0xF4, 0x44, 0x4C, 0xD8, 0x83, - 0x70, 0x61, 0x68, 0x65, 0xD7, 0x80, 0xFF, 0xFF, 0x07, 0x0E, 0x08, 0xF2, 0x08, 0x00, 0x68, 0x65, - 0xD7, 0x80, 0xFF, 0xFF, 0x01, 0x0E, 0x03, 0x00, 0x19, 0x60, 0xFE, 0x78, 0xFF, 0xFF, 0x58, 0x4F, - 0x79, 0x00, 0x9C, 0x80, 0x01, 0x65, 0x02, 0x02, 0x00, 0x65, 0x02, 0x00, 0xFF, 0x3B, 0xF7, 0x01, - 0x58, 0x4F, 0x70, 0x00, 0x9C, 0x80, 0x45, 0x42, 0xEA, 0x02, 0x58, 0x4F, 0x6B, 0x00, 0x9C, 0x80, - 0xFF, 0xFF, 0xE5, 0x02, 0x58, 0x4F, 0x66, 0x00, 0x9C, 0x80, 0xFF, 0xFF, 0x03, 0x02, 0x00, 0x65, - 0x45, 0x42, 0xF8, 0x01, 0xFF, 0x3A, 0x29, 0x00, 0x60, 0x47, 0xFF, 0xB5, 0x28, 0x44, 0xFF, 0xB4, - 0x94, 0x80, 0xFF, 0xFF, 0xD4, 0x02, 0x60, 0x45, 0x28, 0x47, 0x2A, 0x5F, 0x40, 0x48, 0x2A, 0x47, - 0x2C, 0x5F, 0x40, 0x4A, 0x2C, 0x47, 0x65, 0x5F, 0x40, 0x4C, 0x10, 0x64, 0x40, 0x42, 0x28, 0x45, - 0x05, 0x00, 0x58, 0x4F, 0x47, 0x00, 0x94, 0x80, 0x28, 0x45, 0x26, 0x02, 0x58, 0x4F, 0x42, 0x00, - 0x94, 0x80, 0x2A, 0x45, 0x21, 0x02, 0x58, 0x4F, 0x3D, 0x00, 0x94, 0x80, 0xFF, 0xFF, 0x1C, 0x02, - 0x22, 0x44, 0x4C, 0x82, 0x2C, 0x45, 0x31, 0x03, 0xEC, 0x01, 0x10, 0x65, 0x45, 0x42, 0x28, 0x45, - 0x94, 0x80, 0x2A, 0x45, 0x21, 0x02, 0x58, 0x4F, 0x2D, 0x00, 0x94, 0x80, 0x2C, 0x45, 0x1C, 0x02, - 0x58, 0x4F, 0x28, 0x00, 0x94, 0x80, 0xFF, 0xFF, 0x17, 0x02, 0x22, 0x44, 0x4C, 0x82, 0x28, 0x45, - 0x1C, 0x03, 0x58, 0x4F, 0x1F, 0x00, 0xEC, 0x01, 0x40, 0x4B, 0x28, 0x47, 0x40, 0x48, 0x2A, 0x47, - 0x40, 0x4A, 0x2C, 0x47, 0x60, 0x45, 0x2A, 0x5E, 0x40, 0x4C, 0x2A, 0x44, 0x28, 0x5E, 0x40, 0x4A, - 0x28, 0x44, 0x65, 0x5E, 0x40, 0x48, 0x2B, 0x44, 0x68, 0x65, 0xD7, 0x80, 0xFF, 0xFF, 0x17, 0x0E, - 0x90, 0x01, 0x26, 0x46, 0xC5, 0x60, 0x5B, 0x78, 0xFF, 0xFF, 0xB9, 0xFF, 0x26, 0x46, 0xC5, 0x60, - 0x5B, 0x78, 0xFF, 0xFF, 0xC9, 0x81, 0xCB, 0x83, 0x07, 0x1C, 0x01, 0x1D, 0x08, 0x00, 0x00, 0xF4, - 0x01, 0xF2, 0xFF, 0xFF, 0xFF, 0xB4, 0xD8, 0x81, 0x5A, 0xD2, 0x2F, 0x58, 0xFF, 0xFF, 0x26, 0x46, - 0xC5, 0x60, 0x58, 0x4F, 0x78, 0x78, 0xFF, 0xFF, 0x02, 0x60, 0x00, 0x63, 0x00, 0xF4, 0x84, 0x65, - 0x78, 0x61, 0xA5, 0xD0, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x64, 0x44, - 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, 0x05, 0x03, 0x64, 0x47, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, - 0xF0, 0x02, 0x1C, 0x60, 0xAC, 0x63, 0x29, 0x60, 0xEC, 0x64, 0x08, 0x65, 0xC4, 0x81, 0x61, 0x44, - 0xA3, 0xDB, 0x1C, 0x60, 0xAA, 0x61, 0x00, 0x64, 0xA1, 0xDB, 0x29, 0x60, 0xEC, 0x61, 0xA1, 0xD3, - 0xFF, 0xFF, 0x60, 0x43, 0x1C, 0x60, 0xB0, 0x61, 0xA1, 0xDD, 0x1C, 0x60, 0xB0, 0x61, 0xA1, 0xD3, - 0xFF, 0xFF, 0x60, 0x45, 0x1C, 0x60, 0xAA, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0xD4, 0x80, 0xFF, 0xFF, - 0x01, 0x03, 0x03, 0x00, 0x1A, 0x60, 0xD6, 0x78, 0xFF, 0xFF, 0x1C, 0x60, 0xA8, 0x61, 0x01, 0x64, - 0xA1, 0xDB, 0x02, 0x60, 0x00, 0x61, 0x41, 0x4C, 0x03, 0x60, 0x00, 0x61, 0x41, 0x4A, 0x1C, 0x60, - 0xAC, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0x40, 0x48, 0x1C, 0x60, 0xB2, 0x63, 0x28, 0x41, 0x06, 0x65, - 0xD5, 0x81, 0xA1, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x26, 0x01, 0xA4, 0x60, 0x41, 0xA3, 0xDB, - 0x2A, 0x43, 0x28, 0x45, 0xA5, 0xD1, 0xDA, 0x85, 0x64, 0x44, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, - 0x05, 0x03, 0x64, 0x47, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, 0xF4, 0x02, 0x28, 0x41, 0x1C, 0x60, - 0xB2, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0x60, 0x45, 0x45, 0x8B, 0x1C, 0x60, 0xAE, 0x61, 0x2B, 0xD3, - 0xA1, 0xDB, 0x2C, 0x41, 0x28, 0x42, 0x4A, 0xD3, 0xFF, 0xFF, 0x60, 0x45, 0x45, 0x8C, 0x00, 0x7F, - 0x01, 0x7E, 0x40, 0x48, 0x1C, 0x60, 0xB2, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0x60, 0x45, 0x00, 0x64, - 0xD4, 0x80, 0xFF, 0xFF, 0x43, 0x03, 0x65, 0x44, 0xFF, 0xA4, 0xA1, 0xDB, 0x1C, 0x60, 0xAE, 0x61, - 0xA1, 0xD3, 0x28, 0x45, 0xA4, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x2C, 0xD3, 0x2A, 0xD3, 0x60, 0x45, - 0xD4, 0x80, 0xFF, 0xFF, 0x01, 0x03, 0x14, 0x00, 0x28, 0x44, 0xE0, 0x84, 0xFF, 0xFF, 0x02, 0x24, - 0x01, 0x00, 0x08, 0x00, 0x2B, 0x44, 0x58, 0x8B, 0x1C, 0x60, 0xAE, 0x63, 0x2B, 0xD3, 0xA3, 0xDB, - 0x00, 0x7F, 0x01, 0x7E, 0x40, 0x48, 0x2A, 0x44, 0x58, 0x8A, 0x2C, 0x44, 0x58, 0x8C, 0xD2, 0x01, - 0x1C, 0x60, 0xA8, 0x61, 0x00, 0x64, 0xA1, 0xDB, 0x1C, 0x60, 0xAC, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, - 0x60, 0x45, 0xFA, 0xA4, 0x60, 0x41, 0xA1, 0xD3, 0xFF, 0xFF, 0x60, 0x41, 0xC5, 0x81, 0x06, 0xA1, - 0x41, 0x48, 0x65, 0x41, 0xFC, 0xA1, 0xA1, 0xD3, 0x28, 0x41, 0x60, 0x40, 0x01, 0x26, 0x01, 0xA4, - 0x60, 0x45, 0xC5, 0x81, 0x61, 0x43, 0x1C, 0x60, 0xAC, 0x61, 0xA1, 0xDD, 0x1C, 0x60, 0xA8, 0x61, - 0xA1, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x26, 0x0D, 0x00, 0x1C, 0x60, 0xAA, 0x61, 0xA1, 0xD3, - 0xFF, 0xFF, 0x01, 0xA4, 0xA1, 0xDB, 0xFF, 0xFF, 0x1A, 0x60, 0x2C, 0x78, 0xFF, 0xFF, 0x19, 0x60, - 0xE8, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0xEC, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x01, 0x60, 0xBA, 0x61, - 0x1F, 0x60, 0x08, 0x63, 0xA1, 0xD3, 0x04, 0xA1, 0x20, 0x7F, 0xBD, 0xDB, 0x32, 0x7E, 0x21, 0x7F, - 0xBD, 0xDB, 0xA1, 0xD3, 0xFF, 0xFF, 0x22, 0x7F, 0xA3, 0xDB, 0x10, 0x00, 0x01, 0x60, 0xBA, 0x61, - 0x1F, 0x60, 0x08, 0x63, 0xA1, 0xD3, 0x00, 0x66, 0x20, 0x7F, 0xBD, 0xDB, 0x59, 0xD3, 0xFF, 0xFF, - 0x21, 0x7F, 0xBD, 0xDB, 0x59, 0xD3, 0xFF, 0xFF, 0x22, 0x7F, 0xA3, 0xDB, 0x0F, 0x60, 0xD8, 0x62, - 0xA2, 0xD1, 0x9F, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, - 0xDA, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0x1A, 0x60, 0xFD, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x24, 0x60, 0x9A, 0x62, 0x1F, 0x60, 0x06, 0x64, 0xA2, 0xDB, 0x20, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xDA, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, - 0x1B, 0x60, 0x25, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD8, 0x62, - 0xA2, 0xD1, 0x9F, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, - 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2E, 0x58, 0xFF, 0xFF, - 0x10, 0x60, 0x1E, 0x62, 0x1E, 0x60, 0xF4, 0x64, 0xA2, 0xDB, 0x1A, 0x60, 0x8A, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x06, 0xA2, 0x10, 0x60, 0x40, 0x64, 0xA2, 0xDB, 0x06, 0x64, 0x5A, 0xDB, 0x5A, 0xDB, - 0x1A, 0x60, 0x96, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x06, 0xA2, 0x10, 0x60, 0x44, 0x64, 0xA2, 0xDB, - 0x06, 0x64, 0x5A, 0xDB, 0x5A, 0xDB, 0x1A, 0x60, 0xA2, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x06, 0xA2, - 0x10, 0x60, 0x48, 0x64, 0xA2, 0xDB, 0x06, 0x64, 0x5A, 0xDB, 0x5A, 0xDB, 0xC0, 0xF1, 0x1A, 0x60, - 0xA6, 0x62, 0xA2, 0xD9, 0x10, 0x60, 0x3E, 0x62, 0x20, 0x60, 0x99, 0x64, 0xA2, 0xDB, 0x10, 0x60, - 0x42, 0x62, 0x20, 0x60, 0xA3, 0x64, 0xA2, 0xDB, 0x10, 0x60, 0x46, 0x62, 0x20, 0x60, 0xAD, 0x64, - 0xA2, 0xDB, 0x00, 0x60, 0x70, 0x61, 0xAE, 0x60, 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, 0x66, 0x44, - 0x63, 0xFB, 0x04, 0x64, 0x03, 0xFA, 0xA9, 0xF3, 0x07, 0xFA, 0x00, 0x64, 0x3E, 0xFA, 0x3F, 0xFA, - 0x0F, 0x60, 0xDA, 0x62, 0x00, 0x60, 0x02, 0x64, 0xA2, 0xDB, 0x1B, 0x60, 0x8A, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x03, 0x64, - 0x6A, 0xFB, 0x0F, 0x4E, 0xE0, 0x60, 0x58, 0x4F, 0x8E, 0x78, 0xFF, 0xFF, 0x0E, 0x4F, 0x00, 0x64, - 0x6C, 0xFB, 0x63, 0xF5, 0xEB, 0xF3, 0x2F, 0xFA, 0xEC, 0xF3, 0x30, 0xFA, 0xED, 0xF3, 0x31, 0xFA, - 0x81, 0xF3, 0x2C, 0xFA, 0x32, 0xFA, 0x82, 0xF3, 0x2D, 0xFA, 0x33, 0xFA, 0x83, 0xF3, 0x2E, 0xFA, - 0x34, 0xFA, 0xBC, 0xF3, 0x19, 0xFA, 0x06, 0x60, 0x80, 0x64, 0x0E, 0xFA, 0x20, 0x60, 0x58, 0x4E, - 0x71, 0x78, 0xFF, 0xFF, 0xF7, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x0F, 0x60, 0xD0, 0x62, - 0xA2, 0xD1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, 0xD8, 0x62, - 0xA2, 0xD1, 0xFF, 0x60, 0x8F, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0xC1, 0xF1, 0x1A, 0x60, 0x9A, 0x62, - 0xA2, 0xD9, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x96, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x64, 0x6C, 0xFB, 0x0F, 0x60, 0xDA, 0x62, 0x00, 0x60, 0x74, 0x64, - 0xA2, 0xDB, 0x1B, 0x60, 0xDE, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, - 0xD8, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x1E, 0x60, 0xF4, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x40, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xE0, 0x01, 0x00, 0x60, 0x20, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x11, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x20, 0x40, 0x50, 0x27, 0xD6, 0x01, 0xAF, 0xF3, 0xFF, 0xFF, - 0xFE, 0xA0, 0xFF, 0xFF, 0xD1, 0x06, 0x6C, 0xF3, 0xFF, 0xFF, 0xF6, 0xA0, 0xDC, 0x84, 0x01, 0x05, - 0xA2, 0xDB, 0xCA, 0x01, 0x00, 0x60, 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0xCE, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x00, 0x00, 0xE0, 0xF3, 0x29, 0x45, 0xD4, 0x80, 0x6C, 0xF3, 0x03, 0x04, 0x1C, 0x60, - 0x55, 0x78, 0xFF, 0xFF, 0xF6, 0xA0, 0xFF, 0xFF, 0x03, 0x04, 0x1C, 0x60, 0x55, 0x78, 0xFF, 0xFF, - 0x0F, 0x60, 0xDA, 0x62, 0x00, 0x60, 0x64, 0x64, 0xA2, 0xDB, 0x1C, 0x60, 0x2A, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1E, 0x60, 0xF4, 0x78, 0xFF, 0xFF, - 0x00, 0x60, 0x40, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xD2, 0x01, - 0x00, 0x60, 0x20, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0xE4, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x20, 0x40, - 0x50, 0x27, 0xDF, 0x01, 0xAF, 0xF3, 0xFF, 0xFF, 0xFE, 0xA0, 0xFF, 0xFF, 0xC3, 0x06, 0x6C, 0xF3, - 0xFF, 0xFF, 0xF6, 0xA0, 0xDC, 0x84, 0x01, 0x05, 0xA2, 0xDB, 0xBC, 0x01, 0x0F, 0x60, 0xD8, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x20, 0x40, 0x40, 0x2B, 0x0B, 0x00, 0x0F, 0x60, 0xDA, 0x62, 0x80, 0x60, - 0x00, 0x64, 0xA2, 0xDB, 0x1C, 0x60, 0x55, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x1C, 0x60, 0x92, 0x65, 0x01, 0x64, 0xA5, 0xDB, 0xC2, 0xF1, 0x1A, 0x60, 0x9A, 0x62, 0xA2, 0xD9, - 0x0C, 0x64, 0x53, 0xFB, 0x1C, 0x60, 0x77, 0x64, 0x6B, 0xFB, 0x1F, 0x60, 0x72, 0x78, 0xFF, 0xFF, - 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0xA2, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0xFF, 0x60, 0xDF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, - 0x88, 0xF1, 0x19, 0x60, 0x86, 0x63, 0xD3, 0x80, 0x68, 0xFD, 0x5F, 0x03, 0x68, 0xF3, 0xE2, 0xF1, - 0x60, 0x43, 0x29, 0x44, 0xA3, 0xD3, 0xC0, 0x85, 0xD4, 0x80, 0x5B, 0xD3, 0x56, 0x06, 0x60, 0x43, - 0x08, 0xA3, 0xBE, 0xD3, 0x83, 0xF1, 0xA3, 0xD3, 0xD0, 0x80, 0x82, 0xF1, 0x05, 0x02, 0xBF, 0xD3, - 0xD0, 0x80, 0x81, 0xF1, 0x01, 0x02, 0xD0, 0x80, 0xF8, 0xA3, 0x2B, 0x02, 0x1C, 0x60, 0xAB, 0x64, - 0x6B, 0xFB, 0x1F, 0x60, 0x29, 0x78, 0xFF, 0xFF, 0x01, 0xB0, 0x84, 0xF3, 0x3E, 0x03, 0x63, 0xF5, - 0x48, 0x7E, 0x2A, 0xFA, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x0F, 0x60, 0xDA, 0x62, - 0x00, 0x60, 0x01, 0x64, 0xA2, 0xDB, 0x1C, 0x60, 0xC8, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0xFF, 0x60, 0xFE, 0x64, 0xA0, 0x84, 0xA2, 0xDB, - 0x1C, 0x00, 0x2D, 0x60, 0x7A, 0x65, 0xA5, 0xD3, 0x65, 0x41, 0x10, 0xA3, 0x01, 0xA4, 0xFE, 0xB4, - 0xC4, 0x85, 0xFE, 0xA1, 0xBD, 0xD3, 0x59, 0xD1, 0xFF, 0xFF, 0xD0, 0x80, 0xD5, 0x80, 0x05, 0x02, - 0x01, 0x03, 0xF8, 0x01, 0x1E, 0x60, 0xE8, 0x78, 0xFF, 0xFF, 0x68, 0xF3, 0x88, 0xF1, 0x04, 0xA4, - 0xD0, 0x80, 0xFF, 0xFF, 0x02, 0x03, 0x68, 0xFB, 0xA1, 0x01, 0xE0, 0xF3, 0x29, 0x45, 0xD4, 0x80, - 0xFF, 0xFF, 0x0C, 0x07, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x96, 0x64, 0xA2, 0xDB, 0x03, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x1B, 0x60, 0xB1, 0x78, 0xFF, 0xFF, 0xE1, 0xF3, 0x29, 0x45, - 0xD4, 0x80, 0xFF, 0xFF, 0x17, 0x06, 0x04, 0x65, 0xE9, 0x60, 0x58, 0x4E, 0x7B, 0x78, 0xFF, 0xFF, - 0x05, 0x64, 0xDC, 0xFB, 0xF2, 0xF3, 0xFF, 0xFF, 0x01, 0xBC, 0xF2, 0xFB, 0x24, 0x60, 0xAA, 0x62, - 0x1A, 0x60, 0x96, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x1D, 0x60, - 0x6D, 0x78, 0xFF, 0xFF, 0x0F, 0x60, 0xDA, 0x62, 0x00, 0x60, 0x74, 0x64, 0xA2, 0xDB, 0x1D, 0x60, - 0x24, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, - 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1E, 0x60, - 0xF4, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x40, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x1C, 0x60, 0x87, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x20, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x17, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x20, 0x40, 0x50, 0x27, 0xA7, 0x01, 0xAF, 0xF3, 0x6C, 0xF3, - 0xFE, 0xA0, 0xF6, 0xA0, 0x0A, 0x06, 0x03, 0x04, 0x00, 0x64, 0x55, 0xFB, 0x40, 0x49, 0x6C, 0xF3, - 0xFF, 0xFF, 0xF6, 0xA0, 0xDC, 0x84, 0x01, 0x05, 0xA2, 0xDB, 0x1C, 0x60, 0x87, 0x78, 0xFF, 0xFF, - 0x00, 0x60, 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0xC6, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x24, 0x60, - 0xAA, 0x62, 0x1A, 0x60, 0xA2, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0x1C, 0x60, 0x55, 0x78, 0xFF, 0xFF, 0x1C, 0x60, 0xEC, 0x78, 0xFF, 0xFF, 0x0F, 0x60, 0xD8, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x20, 0x40, 0x40, 0x2B, 0x0B, 0x00, 0x0F, 0x60, 0xDA, 0x62, 0x80, 0x60, - 0x00, 0x64, 0xA2, 0xDB, 0x1D, 0x60, 0x6D, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x1C, 0x60, 0x92, 0x65, 0x00, 0x64, 0xA5, 0xDB, 0xC3, 0xF1, 0x1A, 0x60, 0x9A, 0x62, 0xA2, 0xD9, - 0x1F, 0x60, 0x80, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0x08, 0xB4, 0x01, 0xBC, 0x29, 0x02, 0xA2, 0xDB, - 0x0F, 0x60, 0xD8, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x4E, 0xE4, 0x60, 0x58, 0x4F, 0xFB, 0x78, - 0xFF, 0xFF, 0x0E, 0x4F, 0x0F, 0x60, 0xDA, 0x62, 0x10, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0x1D, 0x60, - 0xA4, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x1F, 0x60, 0x80, 0x64, 0xA0, 0xD3, - 0xFF, 0xFF, 0x60, 0x40, 0x0C, 0x26, 0x0C, 0x00, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x96, 0x64, - 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x1E, 0x60, 0x97, 0x78, 0xFF, 0xFF, - 0x01, 0x64, 0x31, 0x60, 0x2A, 0x62, 0xA2, 0xDB, 0x0D, 0x64, 0x53, 0xFB, 0x1D, 0x60, 0xC3, 0x64, - 0x6B, 0xFB, 0x1F, 0x60, 0x72, 0x78, 0xFF, 0xFF, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0xA2, 0x64, - 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, - 0xFF, 0x60, 0xDF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x88, 0xF1, 0x19, 0x60, 0x86, 0x63, 0xD3, 0x80, - 0x68, 0xFD, 0x01, 0x02, 0x43, 0x00, 0x68, 0xF3, 0x29, 0x41, 0xA0, 0xD1, 0x58, 0xD3, 0xD1, 0x80, - 0x64, 0x45, 0x60, 0x43, 0x0F, 0x05, 0x08, 0xA3, 0xBE, 0xD3, 0x83, 0xF1, 0xA3, 0xD3, 0xD0, 0x80, - 0x82, 0xF1, 0x05, 0x02, 0xBF, 0xD3, 0xD0, 0x80, 0x81, 0xF1, 0x01, 0x02, 0xD0, 0x80, 0xF8, 0xA3, - 0x07, 0x02, 0x45, 0x49, 0x1E, 0x60, 0x2A, 0x64, 0x6B, 0xFB, 0x1F, 0x60, 0x29, 0x78, 0xFF, 0xFF, - 0x2D, 0x60, 0x7A, 0x65, 0xA5, 0xD3, 0x65, 0x41, 0x10, 0xA3, 0x01, 0xA4, 0xFE, 0xB4, 0xC4, 0x85, - 0xFE, 0xA1, 0xBD, 0xD3, 0x59, 0xD1, 0xFF, 0xFF, 0xD0, 0x80, 0xD5, 0x80, 0x0F, 0x02, 0xF9, 0x02, - 0x05, 0x65, 0xE9, 0x60, 0x58, 0x4E, 0x7B, 0x78, 0xFF, 0xFF, 0x04, 0x64, 0xDC, 0xFB, 0xF2, 0xF3, - 0xFF, 0xFF, 0xFE, 0xB4, 0xF2, 0xFB, 0x1E, 0x60, 0xE8, 0x78, 0xFF, 0xFF, 0x68, 0xF3, 0x88, 0xF1, - 0x04, 0xA4, 0xD0, 0x80, 0xFF, 0xFF, 0x02, 0x03, 0x68, 0xFB, 0xBD, 0x01, 0xE1, 0xF3, 0x29, 0x45, - 0xD4, 0x80, 0xFF, 0xFF, 0x75, 0x05, 0x1E, 0x60, 0x2A, 0x63, 0x6B, 0xFD, 0x1A, 0x60, 0x4C, 0x63, - 0x1F, 0x60, 0x29, 0x78, 0xFF, 0xFF, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x96, 0x64, 0xA2, 0xDB, - 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x05, 0x65, 0xE9, 0x60, 0x58, 0x4E, 0x7B, 0x78, - 0xFF, 0xFF, 0x1F, 0x60, 0x52, 0x61, 0x00, 0x64, 0xA1, 0xDB, 0x04, 0x64, 0xDC, 0xFB, 0xF2, 0xF3, - 0xFF, 0xFF, 0xFE, 0xB4, 0xF2, 0xFB, 0x84, 0xF3, 0x63, 0xF5, 0x48, 0x7E, 0x2A, 0xFA, 0x02, 0x60, - 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, - 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x0F, 0x60, - 0xDA, 0x62, 0x00, 0x60, 0x01, 0x64, 0xA2, 0xDB, 0x1E, 0x60, 0x61, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0xFF, 0x60, 0xFE, 0x64, 0xA0, 0x84, - 0xA2, 0xDB, 0x1A, 0x60, 0x9A, 0x62, 0x00, 0x60, 0x32, 0x64, 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, - 0x1A, 0x60, 0x96, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x0F, 0x60, - 0xDA, 0x62, 0x00, 0x60, 0x10, 0x64, 0xA2, 0xDB, 0x1E, 0x60, 0x81, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0xFF, 0x60, 0xEF, 0x64, 0xA0, 0x84, - 0xA2, 0xDB, 0xFD, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, - 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x1B, 0x60, 0xB1, 0x78, 0xFF, 0xFF, - 0x0F, 0x60, 0xDA, 0x62, 0x00, 0x60, 0x74, 0x64, 0xA2, 0xDB, 0x1E, 0x60, 0xA2, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1E, 0x60, 0xF4, 0x78, 0xFF, 0xFF, - 0x00, 0x60, 0x40, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1D, 0x60, - 0xD3, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x20, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x17, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x20, 0x40, 0x50, 0x27, 0xDD, 0x01, 0xAF, 0xF3, 0x6C, 0xF3, 0xFE, 0xA0, 0xF6, 0xA0, - 0x0A, 0x06, 0x03, 0x04, 0x00, 0x64, 0x55, 0xFB, 0x40, 0x49, 0x6C, 0xF3, 0xFF, 0xFF, 0xF6, 0xA0, - 0xDC, 0x84, 0x01, 0x05, 0xA2, 0xDB, 0x1D, 0x60, 0xD3, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x10, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0xC6, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, - 0xA2, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x1D, 0x60, 0x6D, 0x78, - 0xFF, 0xFF, 0x08, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, - 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, - 0x8A, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x24, 0x60, 0xAA, 0x62, - 0x1A, 0x60, 0x96, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x24, 0x60, - 0xAA, 0x62, 0x1A, 0x60, 0xA2, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0x0F, 0x60, 0xD8, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, 0x00, 0x64, 0x6A, 0xFB, 0x0F, 0x60, - 0xD0, 0x62, 0xA2, 0xD1, 0x02, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, - 0xDA, 0x62, 0x00, 0x60, 0x02, 0x64, 0xA2, 0xDB, 0x1B, 0x60, 0x8A, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0xA3, 0xD3, 0x7F, 0xF1, 0x7E, 0xFB, 0xD0, 0x80, 0x00, 0x64, 0x40, 0x03, - 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0xBF, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0xDE, 0xFE, - 0x0B, 0x04, 0x0F, 0x60, 0xDA, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0x1F, 0x60, 0x2F, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0xDF, 0x60, - 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x7E, 0xF1, 0x7F, 0xF9, 0x24, 0x60, 0x9A, 0x62, 0xA2, 0xD9, - 0x1E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xDA, 0x62, 0x20, 0x60, 0x00, 0x64, - 0xA2, 0xDB, 0x1F, 0x60, 0x5E, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xBE, 0xFE, - 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0xDF, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x0F, 0x60, - 0xD0, 0x62, 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x01, 0x64, - 0x6B, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x0F, 0x60, - 0xD8, 0x62, 0xA2, 0xD1, 0x7F, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x20, 0x40, 0x51, 0x23, - 0x0B, 0x00, 0x0F, 0x60, 0xDA, 0x62, 0x80, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0x1F, 0x60, 0x76, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0x7F, 0x60, - 0xFF, 0x61, 0xA1, 0x84, 0x5A, 0xD1, 0x4A, 0xDB, 0xA1, 0x84, 0x5A, 0xDB, 0x40, 0x60, 0x00, 0x65, - 0x20, 0x44, 0x34, 0x80, 0x02, 0x64, 0x8C, 0xFB, 0xFF, 0xFF, 0xC1, 0xFE, 0x8C, 0xF3, 0x00, 0x65, - 0xD4, 0x80, 0xFF, 0xFF, 0x12, 0x03, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0x7F, 0x60, 0xFF, 0x64, - 0xA0, 0x84, 0xA2, 0xDB, 0x0F, 0x60, 0xDA, 0x62, 0x80, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0x1F, 0x60, - 0x99, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x2D, 0x60, 0x7A, 0x64, 0x54, 0xFB, - 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0xEF, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x1A, 0x60, - 0x58, 0x4E, 0xDC, 0x78, 0xFF, 0xFF, 0x0F, 0x4E, 0xEC, 0x60, 0x58, 0x4F, 0xB9, 0x78, 0xFF, 0xFF, - 0x0E, 0x4F, 0x0F, 0x60, 0xDA, 0x62, 0x10, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0x1F, 0x60, 0xD3, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x1A, 0x60, 0x58, 0x4E, 0xED, 0x78, 0xFF, 0xFF, - 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x96, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0xEF, 0x60, 0xEF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, - 0x01, 0x64, 0x8C, 0xFB, 0xBF, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x01, 0x60, 0x14, 0x62, - 0xA2, 0xD1, 0x12, 0x60, 0x46, 0x63, 0xC3, 0x85, 0xC6, 0xA3, 0x3A, 0xA3, 0xD7, 0x80, 0xAF, 0xF3, - 0x09, 0x04, 0xFE, 0xA0, 0x6C, 0xF3, 0x3A, 0x06, 0xF6, 0xA0, 0x00, 0x64, 0x37, 0x04, 0x55, 0xFB, - 0x40, 0x49, 0x34, 0x00, 0x08, 0xA3, 0xBE, 0xD3, 0x83, 0xF1, 0xA3, 0xD3, 0xD0, 0x80, 0x82, 0xF1, - 0x05, 0x02, 0xBF, 0xD3, 0xD0, 0x80, 0x81, 0xF1, 0x01, 0x02, 0xD0, 0x80, 0xF8, 0xA3, 0xE5, 0x02, - 0xBE, 0xD3, 0x5A, 0xD1, 0x60, 0x47, 0x40, 0x4A, 0x64, 0x47, 0x40, 0x48, 0x20, 0x60, 0x58, 0x4E, - 0x45, 0x78, 0xFF, 0xFF, 0x0A, 0x48, 0x20, 0x60, 0x58, 0x4E, 0x55, 0x78, 0xFF, 0xFF, 0x20, 0x60, - 0x58, 0x4E, 0x71, 0x78, 0xFF, 0xFF, 0x01, 0x60, 0x2E, 0x65, 0x6C, 0xF3, 0xA5, 0xD3, 0xF6, 0xA0, - 0x40, 0xBC, 0x06, 0x04, 0xA5, 0xDB, 0x6A, 0xF1, 0xFF, 0x60, 0xFB, 0x64, 0xA0, 0x84, 0x6A, 0xFB, - 0x6C, 0xF3, 0xFF, 0xFF, 0x00, 0xB8, 0xCC, 0x84, 0x01, 0x03, 0xA2, 0xDB, 0xFD, 0x60, 0xFF, 0x65, - 0x20, 0x44, 0x24, 0x80, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0xC1, 0xFE, 0x6B, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0xF1, 0x28, 0x44, - 0xD0, 0x84, 0x03, 0xA4, 0x03, 0x0E, 0xE8, 0x84, 0xE8, 0x84, 0x04, 0x00, 0xFA, 0xA4, 0xE8, 0x84, - 0xE8, 0x87, 0xC0, 0xBF, 0xC0, 0x84, 0xA2, 0xDB, 0x2E, 0x58, 0xFF, 0xFF, 0x56, 0xF1, 0x28, 0x44, - 0xD0, 0x84, 0x1F, 0xA4, 0x06, 0x0E, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, - 0x07, 0x00, 0xC2, 0xA4, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x87, 0xF8, 0xBF, - 0xC0, 0x84, 0x5C, 0xF1, 0x56, 0xFB, 0xD0, 0x80, 0xFF, 0xFF, 0x01, 0x05, 0x64, 0x44, 0x52, 0xFB, - 0x2E, 0x58, 0xFF, 0xFF, 0x52, 0xF1, 0x00, 0x65, 0x20, 0x40, 0x20, 0x2A, 0x06, 0x00, 0x5C, 0xF3, - 0xFF, 0xFF, 0xD0, 0x80, 0x64, 0x45, 0x01, 0x06, 0x60, 0x45, 0x2F, 0x67, 0xD4, 0x80, 0xFF, 0xFF, - 0x01, 0x06, 0x60, 0x45, 0x55, 0xF1, 0x8B, 0x67, 0xD0, 0x80, 0x60, 0x41, 0x02, 0x24, 0x64, 0x41, - 0xD5, 0x84, 0x80, 0x65, 0xC4, 0x87, 0x01, 0x05, 0x00, 0x64, 0xFF, 0xB4, 0x40, 0x49, 0x20, 0x40, - 0x20, 0x2A, 0x06, 0x00, 0x2E, 0x43, 0xF3, 0x60, 0x58, 0x4E, 0xA8, 0x78, 0xFF, 0xFF, 0x43, 0x4E, - 0x2E, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x08, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0x00, 0x60, - 0x10, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xD8, 0x62, - 0xA2, 0xD1, 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, 0xF6, 0x62, - 0xA2, 0xD1, 0x00, 0x60, 0x40, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x26, 0x46, 0x27, 0xF2, 0x70, 0x63, 0x60, 0x40, 0x0A, 0x36, 0x06, 0x00, 0x14, 0x36, 0x0A, 0x00, - 0x37, 0x36, 0x04, 0x00, 0x6E, 0x36, 0x04, 0x00, 0xD0, 0x63, 0x04, 0x00, 0x33, 0x63, 0x02, 0x00, - 0x21, 0x63, 0x00, 0x00, 0x1F, 0x60, 0x5A, 0x61, 0xA1, 0xDD, 0x26, 0x46, 0xBF, 0xF2, 0x01, 0x60, - 0x00, 0x65, 0xF4, 0xA1, 0xD5, 0x80, 0x00, 0xF4, 0x02, 0x24, 0x65, 0x41, 0x41, 0x48, 0x1E, 0x65, - 0x02, 0x60, 0x00, 0x63, 0xA5, 0xD0, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, - 0x64, 0x44, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, 0x05, 0x03, 0x64, 0x47, 0x00, 0x7F, 0xCD, 0x81, - 0xBD, 0xDB, 0xF0, 0x02, 0x02, 0x60, 0x00, 0x63, 0x28, 0x41, 0xBD, 0xD3, 0xBD, 0xD1, 0xFD, 0xA0, - 0xFF, 0xFF, 0x07, 0x03, 0x64, 0x44, 0xE0, 0x85, 0xD1, 0x81, 0xFE, 0xA1, 0xC7, 0x83, 0xF5, 0x0D, - 0x04, 0x00, 0x1A, 0x60, 0x4C, 0x61, 0xA3, 0xD3, 0xA1, 0xDB, 0x31, 0x40, 0x06, 0x26, 0x58, 0x00, - 0x00, 0x64, 0x70, 0xFB, 0x02, 0x60, 0x00, 0x63, 0x28, 0x41, 0xBD, 0xD3, 0xBD, 0xD1, 0xFC, 0xA0, - 0xFB, 0xA0, 0x08, 0x03, 0x28, 0x03, 0x64, 0x44, 0xE0, 0x85, 0xD1, 0x81, 0xFE, 0xA1, 0xC7, 0x83, - 0xF4, 0x0D, 0x46, 0x00, 0xBD, 0xD3, 0xBD, 0xD3, 0x00, 0xB8, 0x70, 0xFB, 0x6F, 0xFB, 0xBD, 0xD3, - 0x3F, 0x02, 0xA3, 0xD3, 0x60, 0x45, 0x60, 0x47, 0xB4, 0x84, 0x60, 0x41, 0x3F, 0xB5, 0xE8, 0x84, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x72, 0xFB, 0x65, 0x47, 0xE0, 0x84, - 0xE0, 0x84, 0x71, 0xFB, 0x64, 0x44, 0xE0, 0x85, 0xFA, 0xA3, 0xC7, 0x83, 0x1A, 0x60, 0x44, 0x62, - 0x61, 0x44, 0xA2, 0xDB, 0xD2, 0x01, 0xBD, 0xD3, 0xA3, 0xD3, 0x00, 0xB8, 0x6E, 0xFB, 0x74, 0xFB, - 0x1F, 0x02, 0x87, 0xF1, 0x70, 0xF3, 0x6D, 0xF9, 0x04, 0x65, 0x60, 0x40, 0x00, 0x3A, 0x06, 0x65, - 0x31, 0x44, 0xB4, 0x84, 0x40, 0x51, 0x02, 0x2A, 0x0B, 0x00, 0x08, 0xBC, 0x40, 0x51, 0x72, 0xF3, - 0x71, 0xF1, 0x00, 0xB8, 0x64, 0x45, 0x01, 0x03, 0x67, 0x45, 0x65, 0x50, 0xCC, 0x84, 0x73, 0xFB, - 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, 0x01, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x0F, 0x60, 0xEC, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x2A, 0x84, 0x00, 0x1F, 0x60, - 0x52, 0x61, 0x01, 0x64, 0xA1, 0xDB, 0x22, 0x60, 0x58, 0x4E, 0x3E, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0x00, 0xF4, 0x0D, 0xF2, 0x80, 0xFB, 0x00, 0x64, 0x86, 0xFB, 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, - 0x00, 0x60, 0x80, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x26, 0x46, 0x3F, 0xF2, 0x00, 0xF4, - 0x1E, 0x65, 0xF4, 0xA4, 0xD4, 0xA0, 0x60, 0x41, 0x01, 0x06, 0x2C, 0x61, 0x41, 0x48, 0x02, 0x60, - 0x00, 0x63, 0xA5, 0xD0, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x64, 0x44, - 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, 0x05, 0x03, 0x64, 0x47, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, - 0xF0, 0x02, 0x02, 0x60, 0x00, 0x63, 0x28, 0x41, 0xBD, 0xD3, 0xBD, 0xD1, 0x01, 0xA8, 0xC9, 0x81, - 0x06, 0x03, 0x64, 0x44, 0xD1, 0x81, 0xE0, 0x85, 0x42, 0x06, 0xC7, 0x83, 0xF5, 0x01, 0x43, 0x48, - 0x2D, 0x60, 0x2A, 0x63, 0x43, 0x4A, 0x64, 0x41, 0x28, 0x43, 0x00, 0x65, 0x45, 0x4C, 0x65, 0x5C, - 0xBD, 0xD3, 0x61, 0x40, 0x00, 0x36, 0x27, 0x00, 0xCD, 0x81, 0x60, 0x40, 0x02, 0x36, 0x60, 0x45, - 0x04, 0x36, 0x60, 0x45, 0x82, 0x36, 0x60, 0x45, 0x84, 0x36, 0x60, 0x45, 0x0B, 0x36, 0x60, 0x45, - 0x8B, 0x36, 0x60, 0x45, 0x16, 0x36, 0x60, 0x45, 0x96, 0x36, 0x60, 0x45, 0x65, 0x40, 0x00, 0x36, - 0xE7, 0x01, 0x64, 0x44, 0xDC, 0x9C, 0x2C, 0x44, 0x00, 0x3A, 0x02, 0x00, 0x45, 0x4C, 0xE0, 0x01, - 0x2C, 0x5E, 0x65, 0x5F, 0x00, 0x65, 0x45, 0x4C, 0x43, 0x48, 0x2A, 0x43, 0xBD, 0xDB, 0xFF, 0xFF, - 0x43, 0x4A, 0x28, 0x43, 0xD5, 0x01, 0x2D, 0x60, 0x28, 0x64, 0x60, 0xFE, 0xA0, 0xD9, 0xFF, 0xFF, - 0x20, 0xFE, 0x64, 0x40, 0x01, 0x3A, 0x39, 0x00, 0x2A, 0x43, 0x65, 0x44, 0xA3, 0xDB, 0x35, 0x00, - 0x23, 0x60, 0x34, 0x78, 0xFF, 0xFF, 0xDC, 0xF3, 0xFF, 0xFF, 0x03, 0xA8, 0x02, 0xA8, 0x02, 0x03, - 0x41, 0x02, 0xF6, 0x01, 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, 0xFF, 0x60, 0xFB, 0x64, 0xA0, 0x84, - 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0x26, 0x46, 0x1F, 0x60, 0x5A, 0x61, 0xA1, 0xD3, 0x25, 0xF2, 0x60, 0x45, - 0x24, 0xF0, 0x00, 0xF4, 0x64, 0x43, 0xC7, 0x83, 0x60, 0x41, 0x02, 0x24, 0x01, 0xA1, 0x0A, 0xF0, - 0x09, 0xF2, 0xD1, 0x80, 0xFF, 0xFF, 0x09, 0x07, 0x04, 0x04, 0x63, 0x45, 0xD4, 0x80, 0xFF, 0xFF, - 0x04, 0x06, 0x22, 0x60, 0x58, 0x4E, 0x3E, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x26, 0xF0, 0xFF, 0x67, - 0x20, 0x88, 0x64, 0x5F, 0x40, 0x4A, 0x20, 0x60, 0x58, 0x4E, 0x45, 0x78, 0xFF, 0xFF, 0x0A, 0x48, - 0x20, 0x60, 0x58, 0x4E, 0x55, 0x78, 0xFF, 0xFF, 0x20, 0x60, 0x58, 0x4E, 0x71, 0x78, 0xFF, 0xFF, - 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xDA, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x22, - 0xAF, 0x01, 0x01, 0x60, 0x2E, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xBF, 0xB4, 0xA2, 0xDB, 0x1F, 0x60, - 0x5A, 0x61, 0xA1, 0xD3, 0x26, 0x46, 0x60, 0x45, 0x1E, 0x60, 0xFE, 0x63, 0x00, 0xF4, 0x09, 0xF2, - 0xBD, 0xDB, 0xFF, 0xFF, 0x0A, 0xF2, 0xBD, 0xDB, 0x0B, 0xF2, 0xFF, 0xFF, 0xBD, 0xDB, 0x0C, 0xF2, - 0xA3, 0xDB, 0xFA, 0xA3, 0x26, 0x46, 0xA3, 0xD3, 0x24, 0xF0, 0x00, 0x61, 0xD0, 0x84, 0xF1, 0x81, - 0xD4, 0x84, 0xF1, 0x81, 0xBD, 0xDB, 0xA3, 0xD3, 0x03, 0xB1, 0x03, 0xA9, 0x25, 0xF0, 0x42, 0xFE, - 0x05, 0x03, 0xFD, 0xA1, 0xCC, 0x84, 0x01, 0x02, 0xCC, 0x84, 0x00, 0x61, 0xF1, 0x81, 0xD0, 0x84, - 0xF1, 0x81, 0xBD, 0xDB, 0xA3, 0xD3, 0x03, 0xB1, 0x03, 0xA9, 0x28, 0xF0, 0x42, 0xFE, 0x01, 0x03, - 0xCC, 0x84, 0xF1, 0x81, 0xD0, 0x84, 0xF1, 0x81, 0xBD, 0xDB, 0xA3, 0xD3, 0x03, 0xB1, 0x03, 0xA9, - 0x29, 0xF0, 0x01, 0x03, 0xCC, 0x84, 0xD0, 0x84, 0xA3, 0xDB, 0x1F, 0x60, 0x52, 0x61, 0xA1, 0xD3, - 0xFF, 0xFF, 0x02, 0xA8, 0xFF, 0xFF, 0x02, 0x02, 0x2E, 0x58, 0xFF, 0xFF, 0xF5, 0xFE, 0x1E, 0x60, - 0xFE, 0x64, 0xA0, 0xD1, 0x06, 0xA4, 0xA0, 0xD3, 0x64, 0x45, 0x60, 0x40, 0x80, 0x2B, 0x03, 0x00, - 0xFF, 0x60, 0xFF, 0x64, 0x94, 0x85, 0x00, 0x60, 0x96, 0x64, 0xD4, 0x80, 0xFF, 0xFF, 0x0B, 0x06, - 0x1F, 0x60, 0x52, 0x61, 0xA1, 0xD3, 0x6A, 0xF3, 0x00, 0xA8, 0x04, 0xB0, 0x04, 0x02, 0x03, 0x03, - 0x23, 0x60, 0x10, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x00, 0xF4, 0x09, 0xF2, 0x5A, 0xD2, 0x40, 0x48, - 0x40, 0x4A, 0x5A, 0xD2, 0x5A, 0xD2, 0x40, 0x4C, 0x60, 0x41, 0x5A, 0xD0, 0x80, 0xF9, 0x40, 0x63, - 0xAD, 0x80, 0xF0, 0xA3, 0x09, 0x02, 0x3C, 0x03, 0x2C, 0x41, 0x2A, 0x44, 0x40, 0x4C, 0x28, 0x44, - 0x40, 0x4A, 0x00, 0x64, 0x40, 0x48, 0xF4, 0x01, 0xD1, 0x80, 0x01, 0x02, 0x31, 0x04, 0x10, 0xA3, - 0x80, 0x60, 0x00, 0x65, 0xA5, 0x80, 0xCF, 0x83, 0x08, 0x02, 0x28, 0x44, 0x60, 0x88, 0x2A, 0x44, - 0x70, 0x8A, 0x2C, 0x44, 0x70, 0x8C, 0xF1, 0x81, 0xF5, 0x01, 0xE7, 0xA3, 0x64, 0x44, 0x00, 0xA8, - 0x00, 0x62, 0x02, 0x02, 0x00, 0x61, 0x1C, 0x00, 0xE0, 0x84, 0xDE, 0x82, 0xFD, 0x04, 0x42, 0xFE, - 0xF8, 0x84, 0x62, 0x45, 0xC7, 0x83, 0x60, 0x45, 0x02, 0xFE, 0xD5, 0x84, 0x02, 0x05, 0x01, 0x05, - 0x61, 0x44, 0xCF, 0x83, 0x60, 0x41, 0x08, 0x03, 0x28, 0x44, 0x60, 0x88, 0x2A, 0x44, 0x70, 0x8A, - 0x2C, 0x44, 0x70, 0x8C, 0xF1, 0x81, 0xF1, 0x01, 0xCE, 0x82, 0xE9, 0x81, 0xFD, 0x02, 0xF1, 0x81, - 0x09, 0xF2, 0xFF, 0xFF, 0x60, 0x47, 0xE8, 0x84, 0xE8, 0x84, 0x5A, 0xD2, 0x3F, 0xB5, 0xE0, 0x84, - 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xB4, 0x84, 0x61, 0x45, 0xD4, 0x84, - 0xC0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x93, 0x1F, 0x60, 0x52, 0x61, 0xA1, 0xD3, - 0xFF, 0xFF, 0x00, 0xA8, 0xFF, 0xFF, 0x02, 0x03, 0x2E, 0x58, 0xFF, 0xFF, 0x10, 0x65, 0x73, 0x44, - 0xD4, 0x93, 0x6A, 0xF3, 0x26, 0x46, 0x04, 0xBC, 0xA2, 0xDB, 0x26, 0xF0, 0xFF, 0x67, 0x20, 0x88, - 0x64, 0x5F, 0x40, 0x4A, 0x20, 0x60, 0x58, 0x4E, 0x45, 0x78, 0xFF, 0xFF, 0x0A, 0x48, 0x20, 0x60, - 0x58, 0x4E, 0x55, 0x78, 0xFF, 0xFF, 0x20, 0x60, 0x58, 0x4E, 0x71, 0x78, 0xFF, 0xFF, 0x6C, 0xF3, - 0xFF, 0xFF, 0x00, 0xB8, 0xCC, 0x84, 0x01, 0x03, 0xA2, 0xDB, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, - 0x00, 0x60, 0x40, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, - 0xA2, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x0F, 0x60, 0xD8, 0x62, - 0xA2, 0xD1, 0xFF, 0x60, 0xDF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, - 0x28, 0xF3, 0xFF, 0xFF, 0x60, 0x47, 0x0F, 0xB4, 0x59, 0x00, 0xFF, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x24, 0x60, 0x9E, 0x65, 0x04, 0x64, 0xA5, 0xDB, 0x12, 0x00, 0x24, 0x60, 0x9E, 0x65, 0x0C, 0x64, - 0xA5, 0xDB, 0x0D, 0x00, 0x24, 0x60, 0x9E, 0x65, 0x06, 0x64, 0xA5, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x24, 0x60, 0x9E, 0x65, 0x08, 0x64, 0xA5, 0xDB, 0x23, 0x60, - 0xA1, 0x64, 0xA1, 0xFB, 0xFF, 0xFF, 0x2D, 0xFF, 0x25, 0x60, 0x11, 0x78, 0xFF, 0xFF, 0x29, 0xF3, - 0x7F, 0xFB, 0xA4, 0xFB, 0x02, 0x60, 0xEE, 0x64, 0xA3, 0xFB, 0x07, 0x64, 0xA5, 0xFB, 0x23, 0x60, - 0xA1, 0x64, 0xA1, 0xFB, 0xFF, 0xFF, 0xDF, 0xFE, 0x00, 0x64, 0x19, 0xFF, 0x25, 0x60, 0x11, 0x78, - 0xFF, 0xFF, 0x24, 0x60, 0x0D, 0x63, 0x0C, 0x60, 0x16, 0x64, 0xA0, 0xDD, 0x62, 0xFF, 0x23, 0x60, - 0x8E, 0x63, 0xA1, 0xFD, 0xFF, 0xFF, 0x1A, 0xFF, 0x25, 0x60, 0x11, 0x78, 0xFF, 0xFF, 0xA3, 0x60, - 0x4B, 0x63, 0x0C, 0x60, 0x16, 0x64, 0xA0, 0xDD, 0x62, 0xFF, 0x29, 0xF5, 0x24, 0x60, 0x7A, 0x63, - 0x24, 0x60, 0x4C, 0x64, 0xBD, 0xDB, 0x66, 0x44, 0xBD, 0xDB, 0x02, 0x64, 0xA3, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xF9, 0xFE, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xA7, 0x01, 0x00, 0x36, 0xA8, 0x01, - 0x01, 0x36, 0xAB, 0x01, 0x02, 0x36, 0xAE, 0x01, 0x03, 0x36, 0xB5, 0x01, 0x04, 0x36, 0xD1, 0x01, - 0x05, 0x36, 0xCF, 0x01, 0x06, 0x36, 0xF1, 0x01, 0x07, 0x36, 0xCB, 0x01, 0x08, 0x36, 0xB7, 0x01, - 0x09, 0x36, 0x0C, 0x00, 0x0A, 0x36, 0x0D, 0x00, 0x0B, 0x36, 0x0E, 0x00, 0x0C, 0x36, 0x17, 0x00, - 0x0D, 0x36, 0x0D, 0x00, 0x0E, 0x36, 0x1E, 0x00, 0x0F, 0x36, 0x32, 0x00, 0x02, 0x60, 0x00, 0x64, - 0x08, 0x00, 0x04, 0x60, 0x00, 0x64, 0x05, 0x00, 0x00, 0x60, 0x01, 0x64, 0x02, 0x00, 0x20, 0x60, - 0x00, 0x64, 0x32, 0x45, 0xB4, 0x85, 0x45, 0x52, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x24, 0x60, - 0xD1, 0x63, 0x0C, 0x60, 0x16, 0x64, 0xA0, 0xDD, 0x62, 0xFF, 0xFF, 0xFF, 0x1A, 0xFF, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x3F, 0x40, 0x02, 0x2B, 0x05, 0x00, 0x90, 0x60, 0x00, 0xE8, 0x24, 0x60, - 0x0D, 0x63, 0x04, 0x00, 0x91, 0x60, 0x00, 0xE8, 0x24, 0x60, 0xBB, 0x63, 0x28, 0xE8, 0x0C, 0x60, - 0x16, 0x64, 0xA0, 0xDD, 0x62, 0xFF, 0xFF, 0xFF, 0x1A, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x91, 0x60, 0x00, 0xE8, 0x28, 0xE8, 0xD9, 0x60, 0xFE, 0x64, 0x32, 0x45, 0xA4, 0x85, 0x45, 0x52, - 0x99, 0xFF, 0xA5, 0x4F, 0xFF, 0xB4, 0x07, 0xFB, 0x98, 0xFF, 0xA3, 0x60, 0x4B, 0x63, 0x0C, 0x60, - 0x16, 0x64, 0xA0, 0xDD, 0x62, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x08, 0xE1, 0xA1, 0xFF, - 0xFF, 0xFF, 0x43, 0xFF, 0x01, 0x60, 0x00, 0xE1, 0x28, 0xF3, 0x47, 0xFF, 0x60, 0x40, 0x07, 0x37, - 0x4B, 0x00, 0x05, 0x3B, 0x04, 0x00, 0xFF, 0x0A, 0x80, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x29, 0xF5, - 0x2A, 0xF3, 0x47, 0xFF, 0x3F, 0xF0, 0x01, 0x1B, 0x01, 0x64, 0x60, 0x56, 0xAD, 0xE2, 0xB5, 0xFF, - 0x6C, 0x40, 0x40, 0xE1, 0xA1, 0xFF, 0x00, 0xF4, 0x6E, 0x61, 0x12, 0x62, 0x64, 0x43, 0x01, 0xE1, - 0x03, 0x64, 0xE2, 0xD0, 0xC9, 0x81, 0x64, 0x4C, 0xCC, 0x84, 0xDA, 0x82, 0xFA, 0x02, 0x01, 0x60, - 0x00, 0x6B, 0x9A, 0xFF, 0xCA, 0x82, 0x03, 0x00, 0x00, 0xF4, 0x81, 0xF2, 0xFF, 0xFF, 0x7A, 0xD0, - 0xA1, 0xFF, 0x64, 0x4C, 0xFC, 0x1C, 0xF8, 0x1D, 0x00, 0xB9, 0x06, 0x1E, 0x02, 0x02, 0x00, 0xF4, - 0xDA, 0x82, 0x5A, 0xD2, 0xA1, 0xFF, 0x60, 0x4D, 0x3F, 0x40, 0x02, 0x2B, 0x08, 0x00, 0x28, 0xF3, - 0xA5, 0x60, 0xC4, 0x65, 0x60, 0x40, 0x0E, 0x3B, 0x02, 0x00, 0x80, 0x4C, 0xFE, 0x01, 0xA1, 0xFF, - 0x87, 0x4E, 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0x67, 0x4C, 0xFF, 0xFF, 0xBC, 0xFF, - 0x00, 0xE1, 0xD5, 0xFE, 0xA1, 0xFF, 0xFF, 0xFF, 0x00, 0x64, 0x40, 0x46, 0x60, 0x41, 0xB5, 0xFF, - 0xB7, 0xFF, 0xB4, 0xFF, 0x29, 0xF5, 0x3F, 0xF0, 0x24, 0xF2, 0x44, 0x43, 0x40, 0x44, 0x00, 0xF4, - 0xF3, 0x60, 0xA0, 0x65, 0x10, 0x62, 0x5A, 0xD2, 0xD9, 0x81, 0xD4, 0x80, 0xFF, 0xFF, 0xFB, 0x02, - 0x61, 0x45, 0x24, 0x44, 0xD4, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xFD, 0xA5, 0x48, 0x60, - 0x00, 0x64, 0xC4, 0x9D, 0x0D, 0x60, 0x00, 0x6B, 0x24, 0x44, 0xC0, 0x83, 0xBB, 0xFF, 0x29, 0xF5, - 0x01, 0xE1, 0x00, 0xF4, 0x6C, 0x61, 0x10, 0x62, 0x05, 0x00, 0x00, 0xF4, 0x01, 0xF2, 0xFF, 0xFF, - 0x60, 0x41, 0x04, 0x62, 0xA1, 0xFF, 0xFF, 0xFF, 0x01, 0x10, 0x1A, 0x00, 0x26, 0x44, 0x01, 0x26, - 0x0C, 0x00, 0x24, 0x44, 0xC8, 0x84, 0x40, 0x44, 0x02, 0x03, 0x6C, 0x45, 0xF3, 0x01, 0x03, 0x15, - 0x01, 0x64, 0x05, 0xFA, 0x15, 0x00, 0x6C, 0x45, 0xED, 0x01, 0x23, 0x44, 0xC8, 0x84, 0x40, 0x43, - 0x02, 0x03, 0x6C, 0x45, 0xE7, 0x01, 0x00, 0x64, 0x01, 0x15, 0x01, 0x64, 0x6C, 0x45, 0x05, 0xFB, - 0xE2, 0xD2, 0xDA, 0x82, 0xC9, 0x81, 0x60, 0x4C, 0xDD, 0x1C, 0xD7, 0x03, 0xBC, 0xFF, 0xDA, 0x01, - 0x00, 0xE1, 0xD5, 0xFE, 0xA1, 0xFF, 0xFF, 0xFF, 0x08, 0xE1, 0xA1, 0xFF, 0x67, 0x4C, 0x43, 0xFF, - 0xAD, 0x4F, 0x02, 0xBC, 0x00, 0x7F, 0xA0, 0x5D, 0x01, 0xE1, 0x01, 0x60, 0x69, 0x6B, 0xA5, 0x60, - 0xC4, 0x64, 0x60, 0x4C, 0xBB, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x60, 0x4C, 0xA1, 0xFF, 0xFF, 0xFF, - 0x60, 0x4C, 0xFC, 0x01, 0x29, 0xF3, 0x2A, 0xF1, 0x07, 0xB5, 0x04, 0xE1, 0x65, 0x41, 0x64, 0x54, - 0xCD, 0xE2, 0x95, 0x81, 0xA1, 0x5D, 0xA1, 0xFF, 0xFF, 0xFF, 0xF9, 0x01, 0x61, 0x44, 0xFE, 0xFB, - 0xFF, 0xFD, 0xFF, 0x01, 0x7F, 0x67, 0x01, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0xB1, 0xFE, 0x08, 0x05, - 0xB0, 0xFE, 0x09, 0x05, 0xB2, 0xFE, 0xB3, 0xFE, 0x78, 0x43, 0x01, 0x61, 0x24, 0x60, 0xDD, 0x78, - 0x2D, 0x60, 0x5D, 0x78, 0xFF, 0xFF, 0x28, 0xF3, 0x29, 0xF1, 0x40, 0x44, 0x44, 0x45, 0x2A, 0xF1, - 0x2B, 0xF1, 0x44, 0x46, 0x44, 0x47, 0x3F, 0xB4, 0xE0, 0x85, 0x1F, 0x60, 0x88, 0x64, 0x44, 0xD7, - 0x58, 0x43, 0xFF, 0xFF, 0x60, 0x45, 0x1C, 0x60, 0xB4, 0x7C, 0xA4, 0xD3, 0x61, 0x43, 0x04, 0xB4, - 0x24, 0x44, 0x02, 0x03, 0x13, 0xFF, 0x06, 0x00, 0x3F, 0xB4, 0xB4, 0x84, 0xFF, 0x27, 0x05, 0xFD, - 0x04, 0xFB, 0x10, 0x75, 0xA1, 0xFF, 0xFF, 0xFF, 0x86, 0x3E, 0xB4, 0xFE, 0x0B, 0x05, 0xB5, 0xFE, - 0x02, 0x24, 0xA1, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0xFE, 0x07, 0x05, 0x78, 0x43, 0x01, 0x61, - 0x24, 0x60, 0xDD, 0x78, 0x2D, 0x60, 0x98, 0x78, 0xFF, 0xFF, 0x36, 0x44, 0x00, 0x7F, 0xF2, 0xA0, - 0x60, 0x45, 0x05, 0x05, 0x20, 0x60, 0x16, 0x64, 0x44, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x78, 0x43, - 0x01, 0x61, 0x24, 0x60, 0xDD, 0x78, 0x78, 0x43, 0x01, 0x61, 0x24, 0x60, 0xDD, 0x78, 0x7F, 0x60, - 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x10, 0x02, 0x10, 0x64, 0x40, 0x40, - 0x02, 0x64, 0x40, 0x50, 0x61, 0xFF, 0x3F, 0x40, 0x40, 0x26, 0x04, 0x00, 0x10, 0xE0, 0x46, 0x60, - 0x09, 0xE0, 0x00, 0x00, 0x27, 0xF1, 0x00, 0x66, 0x20, 0x78, 0x42, 0xFE, 0x23, 0x58, 0xFF, 0xFF, - 0x7F, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x1A, 0x02, 0x1C, 0x60, - 0xB4, 0x63, 0xA3, 0xD3, 0x07, 0x7C, 0x20, 0xB5, 0x0C, 0xB5, 0x04, 0x03, 0x03, 0x02, 0xDC, 0xF9, - 0x00, 0x67, 0x0F, 0x00, 0x00, 0x61, 0x41, 0x56, 0xC7, 0xFE, 0xAC, 0x01, 0x36, 0x47, 0xFF, 0x23, - 0x04, 0x00, 0x00, 0x7F, 0x60, 0x41, 0x7F, 0x67, 0x04, 0x00, 0x20, 0x44, 0x80, 0xBC, 0x40, 0x40, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x7F, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, - 0x02, 0x61, 0x31, 0x02, 0x1C, 0x60, 0xB4, 0x63, 0xA3, 0xD3, 0x01, 0x7C, 0x20, 0xB5, 0x0C, 0xB5, - 0x03, 0x03, 0x02, 0x02, 0xDC, 0xF9, 0xFF, 0xFF, 0x02, 0x61, 0x41, 0x56, 0xC7, 0xFE, 0x25, 0x60, - 0x11, 0x78, 0xFF, 0xFF, 0x9F, 0xF1, 0x20, 0x44, 0x64, 0x40, 0xFF, 0x26, 0x1B, 0x00, 0x7F, 0xB4, - 0x40, 0x40, 0x5C, 0x5E, 0x82, 0xFF, 0x26, 0x44, 0xFD, 0xB4, 0x40, 0x46, 0x5C, 0x41, 0x87, 0xFF, - 0x62, 0xFF, 0x00, 0x63, 0x24, 0x60, 0x5E, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, - 0x04, 0x03, 0x09, 0xF2, 0x0F, 0xFC, 0xAC, 0x86, 0xFB, 0x01, 0x24, 0x60, 0x9E, 0x62, 0x06, 0x64, - 0xA2, 0xDB, 0x2D, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x00, 0x67, 0x20, 0x40, 0x80, 0x2A, - 0x02, 0x00, 0x7F, 0x67, 0x06, 0x61, 0x60, 0x45, 0x1C, 0x60, 0xB4, 0x7C, 0xA4, 0xD3, 0x61, 0x43, - 0x04, 0xB4, 0x24, 0x44, 0x02, 0x03, 0x13, 0xFF, 0x55, 0x01, 0x3F, 0xB4, 0xB4, 0x84, 0xFF, 0x27, - 0x05, 0xFD, 0x04, 0xFB, 0x20, 0x40, 0x80, 0x2A, 0x02, 0x00, 0x10, 0x75, 0x07, 0x00, 0x2D, 0x60, - 0x9C, 0x62, 0x01, 0x64, 0xA2, 0xDB, 0xFF, 0xFF, 0x08, 0x60, 0x10, 0x75, 0x43, 0x01, 0x25, 0x46, - 0x01, 0xF2, 0x08, 0xF0, 0x60, 0x47, 0x03, 0xB4, 0x03, 0xAC, 0x7F, 0x67, 0x03, 0x61, 0x08, 0x02, - 0x24, 0x60, 0x7A, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x24, 0x40, 0x01, 0x2B, 0x49, 0x00, 0x25, 0x44, 0x1F, 0xB4, 0xE0, 0x85, - 0x25, 0x60, 0xEB, 0x64, 0xC4, 0x98, 0xFF, 0xFF, 0xC0, 0xFE, 0x3D, 0x00, 0xC1, 0xFE, 0x3B, 0x00, - 0xC2, 0xFE, 0x39, 0x00, 0xC3, 0xFE, 0x37, 0x00, 0xC4, 0xFE, 0x35, 0x00, 0xC5, 0xFE, 0x33, 0x00, - 0xC6, 0xFE, 0x31, 0x00, 0xC7, 0xFE, 0x2F, 0x00, 0xC8, 0xFE, 0x2D, 0x00, 0xC9, 0xFE, 0x2B, 0x00, - 0xCA, 0xFE, 0x29, 0x00, 0xCB, 0xFE, 0x27, 0x00, 0xCC, 0xFE, 0x25, 0x00, 0xCD, 0xFE, 0x23, 0x00, - 0xCE, 0xFE, 0x21, 0x00, 0xCF, 0xFE, 0x1F, 0x00, 0xD0, 0xFE, 0x1D, 0x00, 0xD1, 0xFE, 0x1B, 0x00, - 0xD2, 0xFE, 0x19, 0x00, 0xD3, 0xFE, 0x17, 0x00, 0xD4, 0xFE, 0x15, 0x00, 0xD5, 0xFE, 0x13, 0x00, - 0xD6, 0xFE, 0x11, 0x00, 0xD7, 0xFE, 0x0F, 0x00, 0xD8, 0xFE, 0x0D, 0x00, 0xD9, 0xFE, 0x0B, 0x00, - 0xDA, 0xFE, 0x09, 0x00, 0xDB, 0xFE, 0x07, 0x00, 0xDC, 0xFE, 0x05, 0x00, 0xDD, 0xFE, 0x03, 0x00, - 0xDE, 0xFE, 0x01, 0x00, 0xDF, 0xFE, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x9F, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x9E, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x9D, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x9C, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x9B, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x9A, 0xFE, 0xF0, 0x84, - 0xFF, 0xFF, 0x99, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x98, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x97, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x96, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x95, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x94, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x93, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x92, 0xFE, 0xF0, 0x84, - 0xFF, 0xFF, 0x91, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x90, 0xFE, 0xF0, 0x84, 0x06, 0xFB, 0x8F, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x8E, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x8D, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x8C, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x8B, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x8A, 0xFE, 0xF0, 0x84, - 0xFF, 0xFF, 0x89, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x88, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x87, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x86, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x85, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x84, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x83, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x82, 0xFE, 0xF0, 0x84, - 0xFF, 0xFF, 0x81, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x80, 0xFE, 0xF0, 0x84, 0x05, 0xFB, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x5C, 0x5C, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x24, 0x40, 0x01, 0x27, - 0x55, 0x00, 0x05, 0x60, 0x00, 0x63, 0x05, 0xFD, 0x30, 0x44, 0xBD, 0xDB, 0x31, 0x44, 0xBD, 0xDB, - 0x32, 0x44, 0xBD, 0xDB, 0x33, 0x44, 0xBD, 0xDB, 0x34, 0x44, 0xBD, 0xDB, 0x35, 0x44, 0xBD, 0xDB, - 0x36, 0x44, 0xBD, 0xDB, 0x37, 0x44, 0xBD, 0xDB, 0x38, 0x44, 0xBD, 0xDB, 0x39, 0x44, 0xBD, 0xDB, - 0x3A, 0x44, 0xBD, 0xDB, 0x3B, 0x44, 0xBD, 0xDB, 0x3C, 0x44, 0xBD, 0xDB, 0x3D, 0x44, 0xBD, 0xDB, - 0x3E, 0x44, 0xBD, 0xDB, 0x3F, 0x44, 0xBD, 0xDB, 0x02, 0x61, 0x61, 0x44, 0x02, 0x36, 0x82, 0xFF, - 0x03, 0x36, 0x83, 0xFF, 0x04, 0x36, 0x84, 0xFF, 0x05, 0x36, 0x85, 0xFF, 0x06, 0x36, 0x86, 0xFF, - 0x07, 0x36, 0x87, 0xFF, 0x20, 0x44, 0xBD, 0xDB, 0x21, 0x44, 0xBD, 0xDB, 0x22, 0x44, 0xBD, 0xDB, - 0x23, 0x44, 0xBD, 0xDB, 0x24, 0x44, 0xBD, 0xDB, 0x25, 0x44, 0xBD, 0xDB, 0x26, 0x44, 0xBD, 0xDB, - 0x27, 0x44, 0xBD, 0xDB, 0x28, 0x44, 0xBD, 0xDB, 0x29, 0x44, 0xBD, 0xDB, 0x2A, 0x44, 0xBD, 0xDB, - 0x2B, 0x44, 0xBD, 0xDB, 0x2C, 0x44, 0xBD, 0xDB, 0x2D, 0x44, 0xBD, 0xDB, 0x2E, 0x44, 0xBD, 0xDB, - 0x2F, 0x44, 0xBD, 0xDB, 0xDD, 0x81, 0x08, 0x3A, 0xD0, 0x01, 0x54, 0x00, 0x27, 0x40, 0x10, 0x26, - 0x30, 0x00, 0x26, 0x44, 0x01, 0x36, 0x2D, 0x00, 0x02, 0x36, 0x82, 0xFF, 0x03, 0x36, 0x83, 0xFF, - 0x04, 0x36, 0x84, 0xFF, 0x05, 0x36, 0x85, 0xFF, 0x06, 0x36, 0x86, 0xFF, 0x25, 0x44, 0x00, 0x36, - 0x44, 0x40, 0x01, 0x36, 0x44, 0x41, 0x02, 0x36, 0x44, 0x42, 0x03, 0x36, 0x44, 0x43, 0x04, 0x36, - 0x44, 0x44, 0x05, 0x36, 0x44, 0x45, 0x06, 0x36, 0x44, 0x46, 0x07, 0x36, 0x44, 0x47, 0x08, 0x36, - 0x44, 0x48, 0x09, 0x36, 0x44, 0x49, 0x0A, 0x36, 0x44, 0x4A, 0x0B, 0x36, 0x44, 0x4B, 0x0C, 0x36, - 0x44, 0x4C, 0x0D, 0x36, 0x44, 0x4D, 0x0E, 0x36, 0x44, 0x4E, 0x0F, 0x36, 0x44, 0x4F, 0x87, 0xFF, - 0x21, 0x00, 0x25, 0x44, 0x10, 0x36, 0x44, 0x50, 0x11, 0x36, 0x44, 0x51, 0x12, 0x36, 0x44, 0x52, - 0x13, 0x36, 0x44, 0x53, 0x14, 0x36, 0x44, 0x54, 0x15, 0x36, 0x44, 0x55, 0x16, 0x36, 0x44, 0x56, - 0x17, 0x36, 0x44, 0x57, 0x18, 0x36, 0x44, 0x58, 0x19, 0x36, 0x44, 0x59, 0x1A, 0x36, 0x44, 0x5A, - 0x1B, 0x36, 0x44, 0x5B, 0x1C, 0x36, 0x44, 0x5C, 0x1D, 0x36, 0x44, 0x5D, 0x1E, 0x36, 0x44, 0x5E, - 0x1F, 0x36, 0x44, 0x5F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0x46, 0xAE, 0x60, 0x58, 0x4F, - 0x6F, 0x78, 0xFF, 0xFF, 0x03, 0x61, 0x7F, 0x67, 0x0B, 0x02, 0x00, 0xF0, 0x24, 0x60, 0x7A, 0x62, - 0x04, 0x64, 0xA2, 0xDB, 0x5A, 0xD9, 0x0A, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x40, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, - 0x11, 0x02, 0x24, 0x60, 0x9E, 0x62, 0x1A, 0x64, 0xA2, 0xDB, 0x00, 0x60, 0x50, 0x63, 0x5A, 0xDD, - 0x27, 0x60, 0x6E, 0x64, 0xA1, 0xFB, 0x2D, 0xFF, 0x25, 0x60, 0x11, 0x78, 0xFF, 0xFF, 0x2A, 0xF3, - 0x05, 0xFB, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x40, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, - 0x7F, 0x67, 0x02, 0x61, 0x0F, 0x02, 0x24, 0x60, 0x9E, 0x62, 0x1C, 0x64, 0xA2, 0xDB, 0x00, 0x60, - 0x50, 0x63, 0x5A, 0xDD, 0x27, 0x60, 0x88, 0x64, 0xA1, 0xFB, 0x2D, 0xFF, 0x25, 0x60, 0x11, 0x78, - 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x7F, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, - 0x02, 0x61, 0x3E, 0x02, 0x25, 0x45, 0x20, 0x44, 0x80, 0x2A, 0x3A, 0x00, 0xF1, 0x60, 0x00, 0x64, - 0xD4, 0x80, 0xFF, 0xFF, 0x0B, 0x03, 0xF1, 0x60, 0x01, 0x64, 0xD4, 0x80, 0xFF, 0xFF, 0x06, 0x03, - 0xF1, 0x60, 0x02, 0x64, 0xD4, 0x80, 0xFF, 0xFF, 0x30, 0x03, 0x29, 0x00, 0x2D, 0x60, 0x0E, 0x62, - 0xA2, 0xD1, 0xBA, 0xF3, 0x1F, 0x60, 0x82, 0x61, 0xA0, 0x84, 0xA1, 0xDB, 0x25, 0x45, 0x23, 0x60, - 0xE4, 0x63, 0x02, 0x61, 0xBD, 0xD3, 0xBD, 0xD1, 0xD4, 0x80, 0xBD, 0xD3, 0xBD, 0xD5, 0xCD, 0x81, - 0x02, 0x03, 0x15, 0x03, 0xF7, 0x01, 0xA2, 0xFF, 0xA6, 0xD3, 0x40, 0x4C, 0x00, 0xA8, 0x67, 0x43, - 0x0C, 0x02, 0xA2, 0xDD, 0x42, 0x48, 0x64, 0x41, 0xAE, 0x60, 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, - 0x66, 0x44, 0x28, 0xDB, 0x02, 0x03, 0x2C, 0x58, 0xA3, 0xFF, 0x0C, 0x61, 0x03, 0x00, 0x04, 0x61, - 0x7F, 0x67, 0x01, 0x00, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x2D, 0x60, 0x0E, 0x62, 0xA2, 0xD1, - 0xBA, 0xF3, 0x1F, 0x60, 0x82, 0x61, 0xA0, 0x84, 0xA1, 0xDB, 0x1F, 0x60, 0x86, 0x61, 0x01, 0x64, - 0xA1, 0xDB, 0xFF, 0xFF, 0xC4, 0xFE, 0xEE, 0x01, 0xC6, 0xFE, 0xEC, 0x01, 0x7E, 0x60, 0xC0, 0x64, - 0x24, 0x45, 0xA4, 0x80, 0x02, 0x61, 0x3F, 0x02, 0x25, 0x45, 0xF8, 0x2B, 0x3B, 0x00, 0x2E, 0xF5, - 0x67, 0x44, 0xD4, 0x80, 0x20, 0x60, 0x24, 0x63, 0x39, 0x03, 0x60, 0x61, 0x24, 0x44, 0x01, 0x27, - 0x29, 0x00, 0xA3, 0xFC, 0xA4, 0xF8, 0xBD, 0xD3, 0xA3, 0xD1, 0xD4, 0x80, 0xCD, 0x81, 0x08, 0x24, - 0x64, 0x58, 0x08, 0xA3, 0xF8, 0x02, 0x08, 0x60, 0x00, 0x63, 0xBD, 0xD3, 0xA3, 0xD1, 0xFE, 0xA0, - 0xFA, 0x60, 0x00, 0x64, 0xD0, 0x80, 0x14, 0x02, 0x13, 0x02, 0x04, 0xA3, 0xBE, 0xD3, 0xBD, 0xD1, - 0x0F, 0x18, 0xD4, 0x80, 0x0D, 0x18, 0x03, 0x03, 0xC3, 0x83, 0xC3, 0x83, 0xF7, 0x01, 0x64, 0x41, - 0xDD, 0x81, 0xE1, 0x81, 0xCB, 0x83, 0x46, 0x65, 0x2F, 0x60, 0x58, 0x4F, 0x01, 0x78, 0xFF, 0xFF, - 0x00, 0x67, 0x0A, 0x00, 0xBD, 0xD3, 0xBE, 0xD1, 0xD4, 0x80, 0xCD, 0x81, 0x08, 0x24, 0x64, 0x58, - 0x08, 0xA3, 0xF8, 0x02, 0x04, 0x61, 0x7F, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x0F, 0x64, 0x23, 0xFA, - 0x67, 0x44, 0x24, 0xFA, 0x62, 0x41, 0x3C, 0x60, 0x00, 0x65, 0x1A, 0x63, 0x68, 0x60, 0x28, 0x64, - 0x65, 0x46, 0x58, 0xD0, 0x2E, 0xF5, 0x59, 0xD8, 0xFB, 0x1F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0xCB, 0x83, 0xBF, 0xD1, 0x4A, 0x65, 0x64, 0x43, 0xBD, 0xD3, 0xFF, 0xFF, 0x60, 0x41, 0x01, 0x26, - 0xDC, 0x81, 0xE9, 0x84, 0xDC, 0x84, 0x23, 0xFA, 0x09, 0x00, 0x4B, 0xD3, 0xFF, 0xFF, 0x60, 0x41, - 0xE8, 0x84, 0xDC, 0x84, 0x23, 0xFA, 0xBF, 0xD1, 0x4A, 0x65, 0x64, 0x43, 0x2F, 0x60, 0x58, 0x4F, - 0x01, 0x78, 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0xF2, 0xFF, 0xFF, 0xE0, 0xA0, - 0x20, 0x64, 0x01, 0x06, 0x25, 0xFA, 0x23, 0xF2, 0xDF, 0xD1, 0xCC, 0x84, 0xE0, 0x85, 0x0B, 0x06, - 0xBF, 0xD1, 0x64, 0x41, 0xD5, 0x80, 0x64, 0x43, 0x01, 0x06, 0x65, 0x41, 0x4A, 0x65, 0x29, 0x60, - 0x58, 0x4F, 0x83, 0x78, 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xDC, 0xF3, 0x02, 0x63, - 0x23, 0xFC, 0x07, 0xB4, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x4B, 0xD3, 0xBF, 0xD3, - 0x60, 0x41, 0xC9, 0x83, 0xE9, 0x81, 0xDD, 0x81, 0xA3, 0xFA, 0xE0, 0x81, 0x3C, 0x60, 0x00, 0x67, - 0x02, 0x24, 0x02, 0xA4, 0x60, 0x47, 0x40, 0x4B, 0xC9, 0x81, 0x4A, 0x65, 0xAB, 0x46, 0x59, 0xD0, - 0xAB, 0x46, 0xA5, 0xD8, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF6, 0x1F, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xFC, 0xA3, 0xA3, 0xD1, 0x4C, 0x65, 0xA4, 0xD3, 0xDA, 0x83, - 0x60, 0x47, 0x25, 0xFA, 0x00, 0x7E, 0x60, 0x47, 0x01, 0x26, 0xDC, 0x84, 0x60, 0x41, 0xE8, 0x84, - 0xD8, 0x84, 0x23, 0xFA, 0xAB, 0x01, 0xFC, 0xA3, 0xA3, 0xD1, 0x4C, 0x65, 0xA4, 0xD3, 0xDA, 0x83, - 0x00, 0x7F, 0x25, 0xFA, 0x60, 0x41, 0x01, 0x26, 0xDD, 0x81, 0xE9, 0x84, 0xD8, 0x84, 0x23, 0xFA, - 0x9D, 0x01, 0x28, 0x60, 0xE2, 0x63, 0xBF, 0xD3, 0xFF, 0xFF, 0x60, 0x41, 0xE8, 0x84, 0xDC, 0x84, - 0x23, 0xFA, 0x4A, 0x65, 0x2F, 0x60, 0x58, 0x4F, 0x01, 0x78, 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x28, 0x60, 0xE2, 0x63, 0x23, 0xF2, 0xC0, 0x65, 0xCC, 0x84, 0xE0, 0x81, 0x0A, 0x04, - 0xBF, 0xDB, 0xD5, 0x80, 0x07, 0x03, 0x01, 0x06, 0x65, 0x41, 0x61, 0x44, 0xBF, 0xDB, 0x4A, 0x65, - 0x58, 0x4F, 0xAA, 0x00, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x03, 0x4E, 0x28, 0x60, 0x58, 0x43, - 0x5C, 0x78, 0xFF, 0xFF, 0x29, 0x60, 0xC6, 0x61, 0x29, 0x60, 0xA4, 0x62, 0xA2, 0xD3, 0xA1, 0xDB, - 0xCC, 0x84, 0xA8, 0x83, 0x05, 0x04, 0x29, 0x60, 0xA4, 0x64, 0x58, 0xD1, 0x59, 0xD9, 0xFD, 0x1F, - 0x0E, 0x43, 0x81, 0x01, 0x23, 0xF2, 0x1C, 0x60, 0x8E, 0x65, 0x60, 0x41, 0x1C, 0x60, 0x2A, 0x63, - 0xA3, 0xDB, 0xFF, 0xA1, 0x48, 0x64, 0x58, 0xD0, 0x7E, 0xA8, 0x5B, 0xD9, 0x02, 0x02, 0x00, 0xF4, - 0x02, 0x64, 0xFF, 0xA1, 0xD7, 0x80, 0x02, 0x03, 0x01, 0x03, 0xF5, 0x01, 0x2E, 0xF5, 0x00, 0x60, - 0x2F, 0x65, 0x25, 0xF2, 0x00, 0x63, 0xCC, 0x84, 0x03, 0xA3, 0xFD, 0x05, 0x4A, 0x64, 0xD7, 0x80, - 0x1B, 0x60, 0xC6, 0x61, 0x2F, 0x05, 0xA1, 0xDD, 0xE3, 0x83, 0xFE, 0xA3, 0x58, 0xD0, 0x7E, 0xA8, - 0x59, 0xD9, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x64, 0xF9, 0x1F, 0x00, 0x63, 0x59, 0xDD, 0x2E, 0xF5, - 0x1B, 0x60, 0xC6, 0x64, 0x25, 0xF0, 0xA0, 0xD3, 0xD3, 0x80, 0x01, 0xB0, 0x04, 0x03, 0x01, 0xA4, - 0x03, 0x03, 0xA2, 0xDB, 0x01, 0x00, 0xA2, 0xDD, 0x1B, 0x60, 0xCE, 0x63, 0x10, 0x60, 0x5A, 0x65, - 0xBD, 0xD3, 0xBD, 0xD1, 0xE0, 0x84, 0xC4, 0x82, 0x10, 0x60, 0x7A, 0x65, 0x07, 0x64, 0x64, 0x41, - 0x5A, 0xDB, 0xD6, 0x80, 0xCD, 0x81, 0x06, 0x03, 0xFB, 0x02, 0x25, 0xF2, 0x02, 0xA3, 0xCC, 0x84, - 0xA2, 0xDA, 0xEC, 0x02, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x1C, 0x60, 0x2A, 0x61, 0xA1, 0xD3, - 0x23, 0xFA, 0xE0, 0x83, 0x4A, 0x65, 0x04, 0x02, 0x02, 0x63, 0x23, 0xFC, 0xA5, 0xFC, 0x09, 0x00, - 0xDB, 0x83, 0x59, 0xD1, 0xA5, 0xD8, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, - 0xF8, 0x1F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x1B, 0x60, 0xC6, 0x62, 0xA2, 0xD3, 0x00, 0x61, - 0x02, 0xA4, 0xFE, 0xA0, 0x23, 0xFA, 0x1B, 0x03, 0xFA, 0xA4, 0xFD, 0xA4, 0x01, 0xA1, 0xFD, 0x07, - 0x61, 0x43, 0x23, 0xF2, 0x25, 0xFC, 0xE0, 0x83, 0x02, 0xA3, 0x1B, 0x60, 0xC6, 0x61, 0x00, 0x60, - 0x4A, 0x64, 0x59, 0xD1, 0x58, 0xD8, 0x7E, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x02, 0x64, 0xF9, 0x1F, - 0x25, 0xF2, 0x23, 0xF2, 0x01, 0xB0, 0xCC, 0x84, 0x04, 0x02, 0x23, 0xFA, 0x02, 0x00, 0x00, 0x64, - 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x41, 0x4B, 0x65, 0x42, 0x80, 0x64, 0xD4, 0x85, - 0x2B, 0x41, 0x00, 0xA1, 0x55, 0x8B, 0x0D, 0x03, 0x02, 0x04, 0x65, 0x41, 0x02, 0x00, 0x00, 0x64, - 0x40, 0x4B, 0xCA, 0x84, 0x58, 0xD0, 0xC9, 0x81, 0xBD, 0xD9, 0xFC, 0x02, 0x00, 0xF4, 0x04, 0x65, - 0xEC, 0x01, 0x2F, 0x58, 0xFF, 0xFF, 0xFC, 0xA3, 0xA3, 0xD3, 0x02, 0x7C, 0xA0, 0xD3, 0x23, 0xF8, - 0xDC, 0x84, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x02, 0x64, 0x23, 0xFA, 0x01, 0x64, - 0x9D, 0xFE, 0x02, 0x28, 0x02, 0x64, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x2D, 0x60, - 0x1A, 0x62, 0xA2, 0xD3, 0x02, 0x7C, 0x23, 0xF8, 0x01, 0xB4, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0xFC, 0xA3, 0xA3, 0xD1, 0x02, 0x64, 0x23, 0xFA, 0xA4, 0xD3, 0x00, 0x63, 0x60, 0x40, - 0x0A, 0x37, 0x01, 0x63, 0x14, 0x37, 0x02, 0x63, 0x37, 0x37, 0x06, 0x63, 0x6E, 0x37, 0x0B, 0x63, - 0x25, 0xFC, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x02, 0x64, 0x23, 0xFA, 0x88, 0xFF, 0x75, 0x44, - 0x8D, 0xFF, 0xE8, 0x87, 0xE8, 0x84, 0xE8, 0x84, 0x03, 0xB4, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x04, 0x64, 0x23, 0xFA, 0x86, 0xFF, 0x29, 0x44, 0x87, 0xFF, 0x25, 0xFA, 0x55, 0xF3, - 0x52, 0xF1, 0x80, 0x65, 0xC4, 0x87, 0x00, 0x7F, 0x26, 0xFA, 0x64, 0x44, 0xC4, 0x87, 0x00, 0x7F, - 0x27, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x05, 0x64, 0x23, 0xFA, 0x52, 0x63, 0xB7, 0xF3, - 0x4B, 0xDA, 0xB6, 0xF3, 0x4B, 0xDA, 0xB5, 0xF3, 0x4B, 0xDA, 0x60, 0x41, 0x88, 0xFF, 0x72, 0x5C, - 0x89, 0xFF, 0x4A, 0xD8, 0xA2, 0x48, 0x20, 0x23, 0x0E, 0x00, 0x64, 0x40, 0x80, 0x27, 0x15, 0x00, - 0xDC, 0x84, 0xBD, 0xDA, 0xBD, 0xD2, 0x11, 0x04, 0xDC, 0x84, 0xA2, 0xDA, 0xA3, 0xD2, 0x0D, 0x04, - 0xDC, 0x84, 0xA3, 0xDA, 0x0A, 0x00, 0x52, 0x63, 0xB7, 0xF3, 0x4B, 0xDA, 0xB6, 0xF3, 0x4B, 0xDA, - 0xB5, 0xF3, 0x4B, 0xDA, 0x54, 0x90, 0x4C, 0x63, 0xE0, 0x02, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x25, 0xF0, 0x2D, 0x60, 0x16, 0x65, 0x23, 0xF2, 0xA5, 0xD9, 0x02, 0xA8, 0x64, 0x44, 0x07, 0x02, - 0x00, 0xBC, 0xF2, 0xA4, 0x04, 0x03, 0x03, 0x07, 0x28, 0x60, 0x44, 0x62, 0xA2, 0xD9, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x20, 0x63, 0x28, 0x60, 0xA4, 0x61, 0x48, 0x64, 0x58, 0xD0, 0x59, 0xD9, - 0xFD, 0x1F, 0x25, 0xF0, 0x20, 0x64, 0xD0, 0x81, 0xFF, 0xFF, 0x02, 0x07, 0x25, 0xFA, 0x0F, 0x00, - 0x28, 0x60, 0xA8, 0x63, 0xC3, 0x83, 0x01, 0x2A, 0x06, 0x00, 0xCF, 0x83, 0xA3, 0xD3, 0xCD, 0x81, - 0x00, 0x7F, 0xBD, 0xDB, 0x04, 0x03, 0x00, 0x64, 0xC9, 0x81, 0xBD, 0xDB, 0xFD, 0x02, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF0, 0x02, 0xA8, 0x01, 0x60, 0xA6, 0x62, 0x09, 0x02, - 0xA2, 0xD9, 0x64, 0x41, 0x32, 0x44, 0x02, 0xB5, 0x00, 0xB9, 0xD4, 0x84, 0x08, 0x28, 0x02, 0xBC, - 0x40, 0x52, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF0, 0x02, 0xA8, 0x01, 0x60, - 0xB2, 0x62, 0x0C, 0x02, 0xA2, 0xD9, 0x64, 0x41, 0x32, 0x44, 0x40, 0xB5, 0x00, 0xB9, 0xD4, 0x84, - 0x08, 0x24, 0x03, 0x00, 0x40, 0xBC, 0x02, 0xB5, 0xD4, 0x84, 0x40, 0x52, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF0, 0x01, 0x60, 0xB0, 0x63, 0xA3, 0xD9, 0xA9, 0xF1, 0x20, 0x61, - 0x41, 0x4B, 0x64, 0x43, 0xD8, 0xF3, 0x63, 0x45, 0x66, 0x41, 0x65, 0x46, 0x8C, 0xFA, 0x60, 0x40, - 0x01, 0x36, 0x06, 0x00, 0x02, 0x36, 0x04, 0x00, 0x04, 0x36, 0x02, 0x00, 0x05, 0x3A, 0x02, 0x00, - 0x00, 0x64, 0x01, 0x00, 0x01, 0x64, 0x6F, 0xFA, 0x79, 0xF3, 0x7A, 0xF1, 0xFF, 0xFF, 0xA0, 0x84, - 0x65, 0x43, 0x02, 0x02, 0x79, 0xF3, 0xFF, 0xFF, 0x60, 0x41, 0x0F, 0x60, 0xAE, 0x65, 0xD8, 0xF3, - 0xFF, 0xFF, 0xE0, 0x84, 0x44, 0xD3, 0x61, 0x45, 0xA4, 0x80, 0xFF, 0xFF, 0x04, 0x02, 0xE8, 0x84, - 0xA4, 0x80, 0xFF, 0xFF, 0xFC, 0x03, 0xA4, 0x84, 0x7B, 0xFB, 0x6F, 0xF0, 0x60, 0x47, 0x90, 0x84, - 0x6F, 0xFA, 0x60, 0x47, 0x60, 0x45, 0x80, 0x64, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0xFC, 0x03, - 0xA4, 0x84, 0x70, 0xF0, 0x70, 0xFA, 0x00, 0x61, 0xE8, 0x84, 0xFF, 0xFF, 0x02, 0x05, 0xDD, 0x81, - 0xFB, 0x01, 0xE1, 0x81, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, 0x66, 0x43, 0x0C, 0xF4, - 0x2B, 0x41, 0x4D, 0x8B, 0x02, 0xA3, 0xB6, 0x02, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, - 0x25, 0xF0, 0x02, 0xA8, 0x00, 0x67, 0x02, 0x02, 0x2D, 0xF9, 0x2C, 0xF9, 0x23, 0x58, 0xFF, 0xFF, - 0x28, 0x60, 0x42, 0x61, 0x23, 0xF2, 0x25, 0xF2, 0x02, 0xA8, 0x00, 0xA8, 0x09, 0x02, 0x07, 0x03, - 0xD0, 0xA0, 0x30, 0x65, 0x03, 0x04, 0xA7, 0xA0, 0x59, 0x65, 0x01, 0x06, 0x65, 0x44, 0xA1, 0xDB, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x31, 0x60, 0x2C, 0x61, 0x01, 0x64, 0xA1, 0xDB, 0x04, 0x00, - 0x31, 0x60, 0x2C, 0x61, 0x00, 0x64, 0xA1, 0xDB, 0x7E, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, - 0x7F, 0x67, 0x02, 0x61, 0x0E, 0x02, 0x06, 0x61, 0x41, 0x56, 0xC7, 0xFE, 0x25, 0x60, 0x11, 0x78, - 0xFF, 0xFF, 0x36, 0x47, 0xFF, 0x23, 0x04, 0x00, 0x00, 0x7F, 0x60, 0x41, 0x7F, 0x67, 0x01, 0x00, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x7E, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, - 0x02, 0x61, 0x12, 0x02, 0x2D, 0x60, 0x58, 0x61, 0x65, 0x43, 0xA1, 0xDD, 0x0C, 0x61, 0x41, 0x56, - 0xC7, 0xFE, 0x25, 0x60, 0x11, 0x78, 0xFF, 0xFF, 0x36, 0x47, 0xFF, 0x23, 0x04, 0x00, 0x00, 0x7F, - 0x60, 0x41, 0x7F, 0x67, 0x01, 0x00, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0xF0, 0x29, 0x60, - 0xA2, 0x62, 0xA2, 0xD9, 0x19, 0x00, 0x2D, 0x60, 0x1A, 0x64, 0xA0, 0xD1, 0xA0, 0xF9, 0x0C, 0x60, - 0x38, 0x62, 0x40, 0x63, 0x00, 0x64, 0x5A, 0xDB, 0xFE, 0x1F, 0x64, 0x40, 0x01, 0x2A, 0x0C, 0x00, - 0x04, 0x65, 0x0C, 0x60, 0x38, 0x61, 0x48, 0x64, 0x3E, 0x63, 0x7C, 0xA8, 0x58, 0xD0, 0x59, 0xD9, - 0x02, 0x02, 0x00, 0xF4, 0x02, 0x64, 0xF9, 0x1F, 0x29, 0x60, 0xA2, 0x62, 0xA2, 0xD1, 0x0D, 0x60, - 0x1C, 0x65, 0x02, 0xFE, 0x64, 0x44, 0xF8, 0x84, 0xF8, 0x84, 0xF8, 0x87, 0x60, 0x41, 0x64, 0x44, - 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x84, 0x3E, 0xFB, 0x60, 0x42, 0x61, 0x44, 0x03, 0xA2, 0x60, 0xFE, - 0xA2, 0xDB, 0xFF, 0xFF, 0x20, 0xFE, 0x64, 0x44, 0x0C, 0x60, 0x3A, 0x65, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x84, 0x40, 0xFB, 0xFF, 0xFF, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, - 0xFF, 0xFF, 0x2D, 0x60, 0x1A, 0x64, 0xA0, 0xD1, 0xA0, 0xF9, 0x00, 0x64, 0x40, 0x41, 0x64, 0x40, - 0x01, 0x2A, 0xA4, 0x00, 0x4A, 0x64, 0xA0, 0xD2, 0xFF, 0xFF, 0x40, 0x42, 0x80, 0x2B, 0x04, 0x00, - 0xFF, 0xB4, 0x40, 0x42, 0x01, 0x64, 0x40, 0x41, 0xA9, 0xF3, 0x46, 0x4B, 0x60, 0x46, 0x20, 0x63, - 0xE3, 0x83, 0xAB, 0x46, 0x26, 0xF0, 0xAB, 0x46, 0x55, 0xF8, 0xAB, 0x46, 0x27, 0xF0, 0xAB, 0x46, - 0x56, 0xF8, 0xAB, 0x46, 0x28, 0xF0, 0xAB, 0x46, 0x57, 0xF8, 0x66, 0x44, 0x02, 0xA6, 0xF1, 0x1F, - 0xA9, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0xAB, 0x46, 0x0C, 0x60, 0x7A, 0x65, 0x22, 0x44, 0xFF, 0xB4, - 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x81, 0xC9, 0x81, 0x52, 0x64, 0x0E, 0x63, - 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x21, 0x44, 0x01, 0x2A, 0x08, 0x00, 0xAB, 0x46, 0xF0, 0xA1, - 0x6E, 0x64, 0x0E, 0x63, 0x59, 0xD1, 0x58, 0xD8, 0xFD, 0x1F, 0xAB, 0x46, 0x22, 0x44, 0xFF, 0xB4, - 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0x0C, 0x60, 0xDC, 0x65, 0xC4, 0x81, 0x60, 0x45, 0xC9, 0x81, - 0x62, 0x64, 0x06, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x21, 0x44, 0x01, 0x2A, 0x08, 0x00, - 0xAB, 0x46, 0xF8, 0xA1, 0xAE, 0x64, 0x06, 0x63, 0x59, 0xD1, 0x58, 0xD8, 0xFD, 0x1F, 0xAB, 0x46, - 0x65, 0x44, 0x0C, 0x60, 0xFC, 0x65, 0xC4, 0x81, 0xC9, 0x81, 0x6A, 0x64, 0x06, 0x63, 0x58, 0xD0, - 0x59, 0xD9, 0xFD, 0x1F, 0x22, 0x44, 0xFF, 0xB4, 0xE0, 0x84, 0xE0, 0x85, 0xC4, 0x84, 0x0C, 0x60, - 0xC2, 0x65, 0xC4, 0x81, 0x72, 0x64, 0x04, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0xAB, 0x46, - 0x21, 0x44, 0x01, 0x2A, 0x06, 0x00, 0xFA, 0xA1, 0x88, 0x64, 0x04, 0x63, 0x59, 0xD1, 0x58, 0xD8, - 0xFD, 0x1F, 0x37, 0xF0, 0x21, 0x44, 0x01, 0x2A, 0x13, 0x00, 0x22, 0x44, 0x3D, 0xFB, 0x60, 0x41, - 0x02, 0xFE, 0xF8, 0x84, 0xF8, 0x84, 0xF8, 0x84, 0x3C, 0xFB, 0x0C, 0x60, 0xBE, 0x63, 0x88, 0xFF, - 0xCD, 0x81, 0x06, 0xA3, 0xFD, 0x0D, 0x8D, 0xFF, 0x3B, 0xFD, 0x64, 0x47, 0x80, 0xBF, 0x60, 0x5C, - 0x22, 0x43, 0x80, 0x61, 0x88, 0xFF, 0xCF, 0x83, 0xE1, 0x81, 0xFD, 0x0D, 0x8D, 0xFF, 0x61, 0x47, - 0x31, 0x91, 0xB1, 0x84, 0x37, 0xFA, 0x1F, 0x63, 0xE3, 0x83, 0x66, 0x44, 0x02, 0xA6, 0x37, 0xF0, - 0x66, 0x44, 0xB1, 0x9C, 0x37, 0xF8, 0x02, 0xA6, 0xFA, 0x1F, 0xAB, 0x46, 0x00, 0x67, 0x00, 0x61, - 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF0, 0x02, 0xA8, 0x00, 0x67, 0x22, 0x02, 0x3D, 0xF1, - 0x64, 0x44, 0x03, 0xB4, 0x40, 0x42, 0xD0, 0x80, 0xA9, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0xB7, 0xF4, - 0x80, 0x61, 0x02, 0x02, 0xE3, 0x83, 0xEB, 0x83, 0x22, 0x44, 0x88, 0xFF, 0xCC, 0x84, 0xE1, 0x81, - 0xFD, 0x0D, 0x8D, 0xFF, 0x61, 0x47, 0x31, 0x91, 0x9D, 0x85, 0xA7, 0x83, 0x37, 0xFC, 0x1F, 0x63, - 0xE3, 0x83, 0x66, 0x44, 0x02, 0xA6, 0xB7, 0xF2, 0x66, 0x44, 0xA5, 0x81, 0xB7, 0xFA, 0x02, 0xA6, - 0xFA, 0x1F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x2D, 0x60, 0x1A, 0x64, 0xA0, 0xD1, 0xA0, 0xF9, - 0x64, 0x40, 0x01, 0x2A, 0x4E, 0x00, 0x27, 0xF2, 0x1C, 0x60, 0xBA, 0x65, 0x60, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, - 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x26, 0xF0, 0x63, 0x46, - 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x25, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, - 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0xA9, 0xF3, 0x08, 0xFE, 0x60, 0x43, - 0x61, 0x46, 0x01, 0x03, 0x2A, 0x00, 0x43, 0x4B, 0xAB, 0x46, 0x37, 0xF2, 0x80, 0x60, 0x30, 0x7C, - 0xB0, 0x84, 0xA2, 0xDA, 0x4E, 0x61, 0x6E, 0x64, 0x0E, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, - 0x58, 0xD8, 0xFB, 0x1F, 0x88, 0x64, 0x04, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, - 0xFB, 0x1F, 0xD9, 0x81, 0x98, 0x64, 0x04, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, - 0xFB, 0x1F, 0xD9, 0x81, 0xAE, 0x64, 0x0E, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, - 0xFB, 0x1F, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x01, 0x67, 0x20, 0x61, 0x23, 0x58, - 0xFF, 0xFF, 0x2D, 0x60, 0x1A, 0x64, 0xA0, 0xD1, 0xA0, 0xF9, 0x64, 0x40, 0x01, 0x2A, 0x31, 0x00, - 0x27, 0xF2, 0x1C, 0x60, 0xBA, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, - 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, - 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x26, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, - 0x61, 0x46, 0x25, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, - 0x63, 0x46, 0xE8, 0x1B, 0xA9, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x01, 0x03, 0x0D, 0x00, - 0x43, 0x4B, 0xAB, 0x46, 0x37, 0xF2, 0x80, 0x60, 0x30, 0x61, 0x9D, 0x85, 0xA4, 0x84, 0xA2, 0xDA, - 0xAB, 0x46, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x01, 0x67, 0x20, 0x61, 0x23, 0x58, - 0xFF, 0xFF, 0xA2, 0xFF, 0x46, 0x45, 0x02, 0xF0, 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, 0x00, 0xF4, - 0x01, 0xF2, 0x66, 0x5C, 0x25, 0x46, 0x56, 0x02, 0x70, 0x27, 0x54, 0x00, 0x12, 0x64, 0x03, 0xFA, - 0x04, 0xF8, 0x0E, 0xF2, 0x87, 0xFC, 0x8D, 0xFC, 0x8E, 0xFC, 0xDA, 0x82, 0x16, 0x61, 0x00, 0x63, - 0xC9, 0x81, 0x5A, 0xDC, 0xFD, 0x02, 0x60, 0x40, 0xF0, 0x3B, 0x16, 0x00, 0x32, 0x44, 0xAF, 0xF3, - 0x01, 0xB0, 0xFA, 0xA0, 0x08, 0x24, 0x2C, 0x05, 0xDC, 0x83, 0xF0, 0x67, 0x0E, 0xFA, 0x24, 0x60, - 0x5E, 0x64, 0x2B, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xAF, 0xFD, 0x2B, 0xFF, - 0xFE, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x4F, 0x00, 0xB0, 0xF3, 0x06, 0x65, 0xD4, 0x80, 0xDC, 0x83, - 0x17, 0x05, 0xB0, 0xFD, 0x98, 0xFE, 0x04, 0x04, 0x00, 0x7F, 0x08, 0x7E, 0x0E, 0xFA, 0x3B, 0xFF, - 0x24, 0x60, 0x52, 0x64, 0x2B, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0x0E, 0xF2, - 0x2B, 0xFF, 0x60, 0x40, 0x08, 0x26, 0xF7, 0xFE, 0xFD, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x32, 0x00, - 0xAC, 0xF3, 0xFF, 0xFF, 0xD8, 0xA0, 0xFF, 0xFF, 0x0D, 0x04, 0x24, 0x60, 0x6A, 0x64, 0x2B, 0xDB, - 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFC, 0x64, 0x3B, 0x42, - 0x4A, 0xDB, 0x21, 0x00, 0x46, 0x45, 0x00, 0x64, 0x2B, 0xDB, 0x25, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xA2, 0xFF, 0x00, 0xF4, 0x01, 0xF0, 0x0A, 0x18, 0x70, 0x67, - 0xA0, 0x80, 0xF0, 0x67, 0x06, 0x03, 0xC0, 0x84, 0x01, 0xFA, 0x25, 0x46, 0x25, 0x44, 0x80, 0xFC, - 0x05, 0xFA, 0xAF, 0x60, 0x58, 0x4E, 0x95, 0x78, 0xFF, 0xFF, 0xD4, 0xFE, 0xA3, 0xFF, 0xFF, 0x64, - 0x3B, 0x42, 0x4A, 0xDB, 0xD4, 0xFE, 0xA3, 0xFF, 0x2D, 0x58, 0xFF, 0xFF, 0x24, 0x60, 0x58, 0x64, - 0x40, 0x47, 0x58, 0x4F, 0x0D, 0x00, 0x24, 0x60, 0x4C, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x18, 0x00, - 0x24, 0x60, 0x64, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x03, 0x00, 0x25, 0x60, 0x11, 0x78, 0xFF, 0xFF, - 0x27, 0xD5, 0x0E, 0xF2, 0x0B, 0x18, 0x60, 0x40, 0x01, 0x2A, 0x08, 0x00, 0x24, 0x60, 0x7A, 0x64, - 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0xF2, 0x01, 0x2F, 0x58, 0xFF, 0xFF, - 0x27, 0xD5, 0x0E, 0xF2, 0x14, 0x18, 0x60, 0x40, 0x01, 0x2A, 0x11, 0x00, 0x02, 0xF0, 0x09, 0x60, - 0x08, 0x64, 0xD0, 0x80, 0xA2, 0xFF, 0xB0, 0xF3, 0x02, 0x02, 0xCC, 0x84, 0xB0, 0xFB, 0x24, 0x60, - 0x7A, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0xE9, 0x01, 0x2F, 0x58, - 0xFF, 0xFF, 0xFB, 0x64, 0x3A, 0x42, 0x4A, 0xDB, 0xA2, 0xFF, 0xB3, 0xF3, 0xAF, 0xF3, 0xCC, 0x80, - 0xFD, 0xA0, 0x01, 0x14, 0x1E, 0x05, 0xAE, 0x60, 0x58, 0x4D, 0x9B, 0x78, 0xFF, 0xFF, 0xA2, 0xFF, - 0x18, 0x03, 0xF0, 0x67, 0x0E, 0xFA, 0x24, 0x60, 0x7A, 0x62, 0x24, 0x60, 0x5E, 0x64, 0xA2, 0xDB, - 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF6, 0x64, 0x3A, 0x42, - 0x4A, 0xDB, 0xB3, 0xF3, 0xAF, 0xF3, 0xCC, 0x83, 0xDC, 0x84, 0x01, 0x15, 0xB3, 0xFD, 0xAF, 0xFB, - 0xD4, 0xFE, 0xB2, 0xF3, 0xB0, 0xF3, 0x00, 0xA8, 0xB1, 0xF1, 0x03, 0x02, 0xD0, 0x80, 0xFF, 0xFF, - 0x27, 0x05, 0xAE, 0x60, 0x58, 0x4D, 0x9B, 0x78, 0xFF, 0xFF, 0xA2, 0xFF, 0x21, 0x03, 0x00, 0x63, - 0xB2, 0xF3, 0x0E, 0xFC, 0xCC, 0x84, 0xFF, 0x3A, 0xB2, 0xFB, 0x98, 0xFE, 0x03, 0x04, 0x08, 0xBB, - 0x0E, 0xFC, 0x3B, 0xFF, 0x24, 0x60, 0x7A, 0x62, 0x24, 0x60, 0x52, 0x64, 0xA2, 0xDB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF7, 0x64, 0x3A, 0x42, 0x4A, 0xDB, - 0xB0, 0xF3, 0x0E, 0xF2, 0xDC, 0x83, 0x08, 0xB0, 0xB0, 0xFD, 0x08, 0x28, 0xF7, 0xFE, 0xD4, 0xFE, - 0xA3, 0xFF, 0x25, 0x60, 0x11, 0x78, 0xFF, 0xFF, 0xB9, 0xFE, 0x13, 0xFF, 0x24, 0x40, 0x80, 0x2B, - 0x0B, 0x00, 0xA2, 0xFF, 0x25, 0x46, 0x09, 0xF4, 0x0E, 0xF2, 0x05, 0x18, 0x08, 0xBC, 0x0E, 0xFA, - 0xFF, 0xFF, 0xF7, 0xFE, 0x01, 0x00, 0xD8, 0xFE, 0xA3, 0xFF, 0x25, 0x46, 0x3E, 0xF2, 0x00, 0xF4, - 0x08, 0xF0, 0x25, 0x46, 0x06, 0xB4, 0xFF, 0x7F, 0x10, 0xBC, 0x06, 0x26, 0xFD, 0x7F, 0x0E, 0xFA, - 0x3E, 0xF2, 0x3F, 0xF2, 0x60, 0x41, 0x08, 0x2A, 0x64, 0x47, 0x3F, 0xFA, 0x60, 0x45, 0x27, 0x60, - 0xFC, 0x62, 0xA2, 0xD3, 0xA3, 0xFC, 0xAB, 0xFC, 0x91, 0xFC, 0xD4, 0x80, 0xC0, 0x60, 0xE1, 0x65, - 0xA5, 0x80, 0x01, 0x04, 0x07, 0x03, 0x23, 0xF0, 0x08, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0x2E, 0x60, - 0xC5, 0x78, 0xFF, 0xFF, 0x2F, 0x60, 0x58, 0x4F, 0x0F, 0x78, 0xFF, 0xFF, 0x14, 0x04, 0x23, 0xF0, - 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0xB8, 0xF1, 0x27, 0x60, 0x96, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, - 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x02, 0x00, - 0x20, 0x60, 0x00, 0x75, 0x83, 0x00, 0xDC, 0xF3, 0xA9, 0xF1, 0x07, 0xB4, 0x64, 0x43, 0xFD, 0xA0, - 0x2C, 0xF2, 0x71, 0x02, 0x01, 0xB0, 0x64, 0x43, 0x78, 0x02, 0x2E, 0xF2, 0x1C, 0x60, 0xBA, 0x65, - 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, - 0x16, 0x18, 0x61, 0x46, 0x2E, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, - 0x2D, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x2C, 0xF0, 0x63, 0x46, - 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0xA9, 0xF3, - 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x51, 0x03, 0x63, 0x46, 0x80, 0xF6, 0x25, 0x46, 0x43, 0x18, - 0x2E, 0xF2, 0x66, 0x41, 0x1C, 0x60, 0xBA, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xA9, 0xF1, 0xE0, 0x84, - 0x44, 0xD3, 0x64, 0x43, 0x11, 0x18, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xFC, 0x1B, 0x66, 0x44, - 0x64, 0x46, 0x80, 0xF0, 0x60, 0x46, 0x80, 0xF8, 0x65, 0x46, 0x65, 0x43, 0x80, 0xF0, 0x01, 0xFA, - 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x0B, 0x00, 0x64, 0x46, 0x62, 0x43, 0x00, 0xF2, 0xA3, 0xDB, - 0x60, 0x46, 0x80, 0xF0, 0x81, 0xFC, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x60, 0x43, 0x61, 0x46, - 0x43, 0x4B, 0x2C, 0xF0, 0xAD, 0xF0, 0x2E, 0xF2, 0xAB, 0x46, 0x03, 0xF8, 0x84, 0xF8, 0x05, 0xFA, - 0x03, 0x64, 0x06, 0xFA, 0xAB, 0x46, 0x1E, 0x60, 0xBC, 0x61, 0xA1, 0xD3, 0x1E, 0x60, 0xFE, 0x7C, - 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0xA0, 0xDD, 0xDA, 0x9C, 0xA1, 0xD9, 0x49, 0xD3, 0xFF, 0xFF, - 0xDC, 0x84, 0xA1, 0xDB, 0x0A, 0x00, 0xDC, 0xF3, 0x02, 0xA3, 0xFE, 0xA0, 0xF9, 0xA0, 0x01, 0x06, - 0x04, 0x02, 0x23, 0xF0, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0x07, 0xFC, 0x23, 0xF2, 0xFF, 0xFF, - 0x27, 0x1B, 0x27, 0x60, 0xFE, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x00, 0x3A, 0x10, 0x00, - 0x24, 0x60, 0x7A, 0x62, 0x24, 0x60, 0x22, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x0E, 0xF2, 0xC1, 0xFE, 0x10, 0xAC, 0x0E, 0xFA, 0x1F, 0x00, - 0x24, 0x60, 0x7A, 0x62, 0x24, 0x60, 0x34, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x0E, 0xF2, 0xC8, 0xFE, 0x10, 0xAC, 0x0E, 0xFA, 0x0F, 0x00, - 0x24, 0x60, 0x7A, 0x62, 0x24, 0x60, 0x46, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x0E, 0xF2, 0xCE, 0xFE, 0x10, 0xAC, 0x0E, 0xFA, 0x25, 0x60, - 0x11, 0x78, 0xFF, 0xFF, 0xCB, 0x84, 0xC9, 0x83, 0xFF, 0xFF, 0x08, 0x04, 0x58, 0xD1, 0xA5, 0xD8, - 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF8, 0x1F, 0x2F, 0x58, 0xFF, 0xFF, - 0x3E, 0xF2, 0xCC, 0xF1, 0x08, 0xB0, 0x19, 0xF8, 0x3B, 0x02, 0xEB, 0xF1, 0x2F, 0xF8, 0xEC, 0xF3, - 0x30, 0xFA, 0x60, 0x45, 0xED, 0xF3, 0x31, 0xFA, 0x46, 0x4A, 0x00, 0xF4, 0x60, 0x43, 0x05, 0xF2, - 0x06, 0xF2, 0xD0, 0x80, 0x07, 0xF0, 0x05, 0x02, 0xD4, 0x80, 0xD3, 0x80, 0x02, 0x02, 0xDC, 0xF3, - 0x03, 0x03, 0xAA, 0x46, 0x42, 0xFE, 0x25, 0x00, 0x60, 0x40, 0x03, 0x2A, 0x10, 0x00, 0x02, 0xF2, - 0x03, 0xF0, 0x04, 0xF2, 0x60, 0x43, 0xAA, 0x46, 0x2C, 0xFC, 0x2D, 0xF8, 0x2E, 0xFA, 0x81, 0xF1, - 0x32, 0xF8, 0x82, 0xF1, 0x33, 0xF8, 0x83, 0xF1, 0x34, 0xF8, 0x08, 0x64, 0x10, 0x00, 0x02, 0xF2, - 0x03, 0xF0, 0x04, 0xF2, 0x60, 0x43, 0xAA, 0x46, 0x32, 0xFC, 0x33, 0xF8, 0x34, 0xFA, 0x81, 0xF1, - 0x2C, 0xF8, 0x82, 0xF1, 0x2D, 0xF8, 0x83, 0xF1, 0x2E, 0xF8, 0x01, 0x60, 0x08, 0x64, 0x2A, 0xFA, - 0x02, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x03, 0x02, 0x42, 0xFF, - 0x47, 0xFF, 0xA1, 0xFF, 0x80, 0xFF, 0x90, 0xFF, 0x98, 0xFF, 0x88, 0xFF, 0x84, 0xE1, 0xFF, 0xFF, - 0x00, 0x00, 0xA1, 0xFF, 0xFF, 0xFF, 0x87, 0x3E, 0x2D, 0x60, 0x9C, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, - 0x01, 0x1B, 0xF7, 0x01, 0x87, 0xFF, 0x20, 0x44, 0x80, 0xFF, 0x60, 0x40, 0x80, 0x26, 0xF1, 0x01, - 0xC0, 0x60, 0x40, 0xEC, 0xC0, 0x60, 0x00, 0xED, 0xC0, 0x60, 0x80, 0xEE, 0xAC, 0x4F, 0xBF, 0xB4, - 0xA0, 0x5C, 0x2D, 0x60, 0x1A, 0x62, 0xA2, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x02, 0x27, 0x06, 0x00, - 0x28, 0xE2, 0x24, 0xE2, 0xBF, 0xFF, 0xFF, 0xFF, 0x75, 0x40, 0x10, 0x00, 0x28, 0xE2, 0x24, 0xE2, - 0x00, 0x60, 0x00, 0x61, 0x00, 0x60, 0x94, 0xE0, 0xBF, 0xFF, 0xFF, 0xFF, 0xA1, 0x50, 0x75, 0x40, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x10, 0xE0, 0x2D, 0x60, 0x9C, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x01, 0x60, 0x39, 0xE2, 0x04, 0x60, 0x00, 0x7A, 0xAC, 0x4F, 0x40, 0xBC, - 0x00, 0x7F, 0xA0, 0x5C, 0xC0, 0x60, 0xD9, 0xEC, 0xC0, 0x60, 0x0F, 0xED, 0xC0, 0x60, 0x8F, 0xEE, - 0xAE, 0x4F, 0x04, 0xBC, 0x00, 0x7F, 0xA0, 0x5E, 0x26, 0x61, 0xCD, 0x81, 0xFF, 0xFF, 0xFD, 0x02, - 0xAE, 0x4F, 0xFB, 0xB4, 0xA0, 0x5E, 0xAD, 0x01, 0x80, 0xFF, 0x90, 0xFF, 0x98, 0xFF, 0x2F, 0x60, - 0x54, 0x63, 0x20, 0x44, 0xBD, 0xDB, 0x21, 0x44, 0xBD, 0xDB, 0x22, 0x44, 0xBD, 0xDB, 0x23, 0x44, - 0xBD, 0xDB, 0x24, 0x44, 0xBD, 0xDB, 0x25, 0x44, 0xBD, 0xDB, 0x26, 0x44, 0xBD, 0xDB, 0x27, 0x44, - 0xBD, 0xDB, 0x28, 0x44, 0xBD, 0xDB, 0x29, 0x44, 0xBD, 0xDB, 0x2A, 0x44, 0xBD, 0xDB, 0x2B, 0x44, - 0xBD, 0xDB, 0x2C, 0x44, 0xBD, 0xDB, 0x2D, 0x44, 0xBD, 0xDB, 0x2E, 0x44, 0xBD, 0xDB, 0x2F, 0x44, - 0xBD, 0xDB, 0x2F, 0x60, 0x48, 0x64, 0xA0, 0xDD, 0x30, 0x60, 0x74, 0x63, 0x2F, 0x60, 0x4A, 0x64, - 0xA0, 0xDD, 0x2F, 0x60, 0x4C, 0x63, 0x30, 0x44, 0xA3, 0xDB, 0x2F, 0x60, 0x4E, 0x63, 0x31, 0x44, - 0xA3, 0xDB, 0x2F, 0x60, 0x50, 0x63, 0x32, 0x44, 0xA3, 0xDB, 0x2F, 0x60, 0x52, 0x63, 0x33, 0x44, - 0xA3, 0xDB, 0x81, 0xFF, 0x91, 0xFF, 0x58, 0x51, 0x4B, 0x00, 0x82, 0xFF, 0x92, 0xFF, 0x58, 0x51, - 0x47, 0x00, 0x83, 0xFF, 0x93, 0xFF, 0x58, 0x51, 0x43, 0x00, 0x84, 0xFF, 0x94, 0xFF, 0x58, 0x51, - 0x3F, 0x00, 0x85, 0xFF, 0x95, 0xFF, 0x58, 0x51, 0x3B, 0x00, 0x86, 0xFF, 0x96, 0xFF, 0x58, 0x51, - 0x37, 0x00, 0x87, 0xFF, 0x97, 0xFF, 0x58, 0x51, 0x33, 0x00, 0x80, 0xFF, 0x90, 0xFF, 0x99, 0xFF, - 0x2F, 0x60, 0x48, 0x64, 0xA0, 0xD1, 0x30, 0x44, 0x64, 0x43, 0xBD, 0xDB, 0x31, 0x44, 0xBD, 0xDB, - 0x32, 0x44, 0xBD, 0xDB, 0x33, 0x44, 0xBD, 0xDB, 0x34, 0x44, 0xBD, 0xDB, 0x35, 0x44, 0xBD, 0xDB, - 0x36, 0x44, 0xBD, 0xDB, 0x37, 0x44, 0xBD, 0xDB, 0x38, 0x44, 0xBD, 0xDB, 0x39, 0x44, 0xBD, 0xDB, - 0x3A, 0x44, 0xBD, 0xDB, 0x3B, 0x44, 0xBD, 0xDB, 0x3C, 0x44, 0xBD, 0xDB, 0x3D, 0x44, 0xBD, 0xDB, - 0x3E, 0x44, 0xBD, 0xDB, 0x3F, 0x44, 0xBD, 0xDB, 0xEF, 0x60, 0x48, 0x64, 0x0A, 0xFB, 0x40, 0x21, - 0xFE, 0x01, 0x80, 0xFF, 0x90, 0xFF, 0x98, 0xFF, 0x88, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x87, 0x3E, - 0x42, 0x50, 0x40, 0x53, 0x2F, 0x60, 0x4A, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x40, 0x52, 0x33, 0x44, - 0x32, 0x42, 0xA2, 0xDB, 0xDA, 0x82, 0xA2, 0xDD, 0xDA, 0x83, 0x65, 0x44, 0xBD, 0xDB, 0x61, 0x44, - 0xBD, 0xDB, 0x66, 0x44, 0xBD, 0xDB, 0xBD, 0xD9, 0x30, 0x44, 0xBD, 0xDB, 0x99, 0xFF, 0xA4, 0x4C, - 0xBD, 0xDB, 0xA5, 0x4C, 0xBD, 0xDB, 0xA0, 0x4C, 0xBD, 0xDB, 0xA1, 0x4C, 0xBD, 0xDB, 0x98, 0xFF, - 0x2F, 0x60, 0x4A, 0x64, 0xA0, 0xDD, 0x2F, 0x60, 0x4C, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x40, 0x50, - 0x2F, 0x60, 0x50, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x40, 0x52, 0x2F, 0x60, 0x52, 0x62, 0xA2, 0xD3, - 0xFF, 0xFF, 0x40, 0x53, 0x31, 0x41, 0x2F, 0x60, 0x4E, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x40, 0x51, - 0x2F, 0x60, 0x48, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x60, 0x43, 0x20, 0x44, 0xBD, 0xDB, 0x21, 0x44, - 0xBD, 0xDB, 0x22, 0x44, 0xBD, 0xDB, 0x23, 0x44, 0xBD, 0xDB, 0x24, 0x44, 0xBD, 0xDB, 0x25, 0x44, - 0xBD, 0xDB, 0x26, 0x44, 0xBD, 0xDB, 0x27, 0x44, 0xBD, 0xDB, 0x28, 0x44, 0xBD, 0xDB, 0x29, 0x44, - 0xBD, 0xDB, 0x2A, 0x44, 0xBD, 0xDB, 0x2B, 0x44, 0xBD, 0xDB, 0x2C, 0x44, 0xBD, 0xDB, 0x2D, 0x44, - 0xBD, 0xDB, 0x2E, 0x44, 0xBD, 0xDB, 0x2F, 0x44, 0xBD, 0xDB, 0x2F, 0x60, 0x48, 0x64, 0xA0, 0xDD, - 0x61, 0x58, 0xFF, 0xFF, 0x24, 0xE2, 0x2D, 0xF3, 0x2C, 0xF3, 0x00, 0xBD, 0xCC, 0x84, 0x08, 0x03, - 0x2C, 0xFB, 0x06, 0x02, 0x65, 0x44, 0x2C, 0xFB, 0x8A, 0xFF, 0x80, 0x60, 0x00, 0x75, 0x88, 0xFF, - 0xF2, 0xF3, 0x31, 0x40, 0x01, 0x2A, 0x44, 0x00, 0x60, 0x43, 0x04, 0xB0, 0x02, 0xB0, 0x08, 0x24, - 0x16, 0x02, 0x29, 0x44, 0xFF, 0xFF, 0x00, 0xA8, 0xCC, 0x81, 0x0E, 0x03, 0x41, 0x49, 0x37, 0x02, - 0x63, 0x40, 0x08, 0x2A, 0x09, 0x00, 0xF7, 0xB3, 0x31, 0x60, 0x1E, 0x7C, 0xA4, 0xD1, 0xAD, 0x4F, - 0xFD, 0xB4, 0xA0, 0x5D, 0x44, 0x49, 0x2B, 0x00, 0x63, 0x40, 0x02, 0x2A, 0x14, 0x00, 0x31, 0x60, - 0x20, 0x64, 0xA0, 0xD3, 0x31, 0x60, 0x1C, 0x7C, 0xA4, 0xDB, 0x40, 0x49, 0x31, 0x60, 0x22, 0x64, - 0xA0, 0xD3, 0x31, 0x60, 0x1E, 0x7C, 0xA4, 0xDB, 0x0C, 0xBB, 0xFD, 0xB3, 0xAD, 0x4F, 0x02, 0xBC, - 0x00, 0x7F, 0xA0, 0x5D, 0x14, 0x00, 0x31, 0x60, 0x24, 0x64, 0xA0, 0xD3, 0x31, 0x60, 0x1C, 0x7C, - 0x0E, 0x18, 0xA4, 0xDB, 0x40, 0x49, 0x31, 0x60, 0x26, 0x64, 0xA0, 0xD3, 0x31, 0x60, 0x1E, 0x7C, - 0xA4, 0xDB, 0x08, 0xBB, 0xFB, 0xB3, 0xAD, 0x4F, 0x02, 0xBC, 0x00, 0x7F, 0xA0, 0x5D, 0xF2, 0xFD, - 0x01, 0x60, 0x4E, 0x61, 0xA1, 0xD3, 0x61, 0x43, 0x17, 0x18, 0x58, 0xD3, 0x62, 0x41, 0x03, 0x18, - 0xCC, 0x84, 0xA1, 0xDB, 0x11, 0x00, 0x49, 0xD3, 0xA3, 0xDB, 0x06, 0xA1, 0xA1, 0xD3, 0x59, 0xD1, - 0x60, 0x45, 0xA5, 0xD3, 0x59, 0xD1, 0xB0, 0x84, 0xA5, 0xDB, 0x64, 0x44, 0x06, 0x36, 0xCD, 0xFE, - 0x07, 0x36, 0xD6, 0xFE, 0xE5, 0x01, 0x23, 0x46, 0xB0, 0x60, 0xA4, 0x78, 0xFF, 0xFF, 0x46, 0x43, - 0x24, 0x60, 0xA4, 0x61, 0xA1, 0xD3, 0x59, 0xD1, 0x06, 0x1B, 0x59, 0xD3, 0x59, 0xD1, 0x03, 0x1B, - 0x59, 0xD3, 0x59, 0xD1, 0xF0, 0x18, 0x00, 0x63, 0x49, 0xDD, 0x60, 0x40, 0x02, 0x36, 0x11, 0x00, - 0x03, 0x36, 0x32, 0x00, 0x01, 0x36, 0x08, 0x00, 0x05, 0x3A, 0xEA, 0x01, 0xA4, 0xD3, 0x5A, 0xD3, - 0x9C, 0x85, 0xA4, 0x84, 0xA2, 0xDB, 0xE4, 0x01, 0x01, 0x60, 0x4E, 0x61, 0x00, 0x64, 0xA1, 0xDB, - 0xDF, 0x01, 0x31, 0x60, 0x3C, 0x64, 0x40, 0x45, 0x22, 0x00, 0x01, 0x60, 0x4E, 0x66, 0xA6, 0xD3, - 0x04, 0xA1, 0x60, 0x43, 0xA1, 0xD3, 0xC9, 0x81, 0x60, 0x45, 0x00, 0xBB, 0xA1, 0xDB, 0xBE, 0xD3, - 0x09, 0x03, 0xD4, 0x84, 0x9C, 0x84, 0xDC, 0x84, 0xFF, 0xFF, 0x04, 0x0E, 0xA3, 0xD1, 0x63, 0x46, - 0x64, 0x43, 0xF2, 0x01, 0x9C, 0x84, 0xDC, 0x85, 0x49, 0xDD, 0x61, 0x44, 0x00, 0xBB, 0xA6, 0xDB, - 0x02, 0x03, 0x65, 0x44, 0xBE, 0xDB, 0xBC, 0x01, 0x31, 0x60, 0x17, 0x64, 0x40, 0x45, 0x01, 0x60, - 0x4E, 0x66, 0xA6, 0xD3, 0xFF, 0xFF, 0xD0, 0x80, 0x0F, 0x18, 0x02, 0x03, 0x60, 0x46, 0xF9, 0x01, - 0x58, 0xD3, 0xA4, 0xD3, 0x60, 0x45, 0x00, 0x63, 0xA4, 0xDD, 0x05, 0x18, 0x58, 0xD3, 0xFF, 0xFF, - 0xC4, 0x83, 0xA2, 0xDD, 0xCA, 0x84, 0xA6, 0xDB, 0x25, 0x58, 0x64, 0x41, 0x00, 0x60, 0x46, 0x74, - 0xCD, 0xE2, 0x04, 0xE1, 0x02, 0x60, 0x00, 0xE1, 0x3F, 0x44, 0x40, 0x26, 0x0B, 0x00, 0x01, 0x2A, - 0x05, 0x00, 0x42, 0x60, 0x09, 0xE0, 0x60, 0x60, 0x1C, 0xE0, 0x04, 0x00, 0x42, 0x60, 0x09, 0xE0, - 0x80, 0x60, 0x1C, 0xE0, 0x04, 0x29, 0xFE, 0x01, 0xC4, 0xE2, 0x43, 0x64, 0x3A, 0xDB, 0xA4, 0xF3, - 0xFF, 0xFF, 0x60, 0x41, 0x3F, 0x44, 0x02, 0x27, 0x84, 0x00, 0x20, 0x2B, 0xFF, 0x01, 0x80, 0xE1, - 0x95, 0x60, 0x80, 0xE7, 0x61, 0x40, 0x40, 0x2B, 0x0D, 0x00, 0x05, 0x63, 0x32, 0x60, 0x58, 0x4F, - 0x6A, 0x78, 0xFF, 0xFF, 0x28, 0x63, 0xFF, 0xFF, 0xFE, 0x1F, 0x01, 0x63, 0x32, 0x60, 0x58, 0x4F, - 0x6A, 0x78, 0xFF, 0xFF, 0xFF, 0xB1, 0xCD, 0x81, 0xE1, 0x85, 0x27, 0x60, 0x3C, 0x64, 0x44, 0xD1, - 0xFF, 0xFF, 0x64, 0x43, 0x32, 0x60, 0x58, 0x4F, 0x6A, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x00, 0x63, - 0x32, 0x60, 0x58, 0x4F, 0x6A, 0x78, 0xFF, 0xFF, 0x27, 0x60, 0x58, 0x61, 0x29, 0x60, 0xE8, 0x62, - 0xA2, 0xD3, 0x45, 0xD1, 0x47, 0xBC, 0xE0, 0x84, 0x62, 0x45, 0x64, 0x5F, 0xE8, 0x83, 0x32, 0x60, - 0x58, 0x4F, 0x6A, 0x78, 0xFF, 0xFF, 0xA3, 0xF3, 0xCD, 0xE2, 0x60, 0x54, 0x04, 0xE1, 0x04, 0x29, - 0xFE, 0x01, 0xC4, 0xE2, 0x15, 0x60, 0xA2, 0xE7, 0x38, 0x69, 0xFF, 0xFF, 0x68, 0x44, 0x01, 0x16, - 0xFD, 0x01, 0x01, 0x2A, 0x36, 0x00, 0x03, 0x60, 0x80, 0x7C, 0xA3, 0x83, 0x29, 0x60, 0xE8, 0x62, - 0xA2, 0xD1, 0x43, 0xBB, 0xB3, 0x83, 0x95, 0x60, 0x80, 0xE7, 0x32, 0x60, 0x58, 0x4F, 0x6A, 0x78, - 0xFF, 0xFF, 0xE3, 0x83, 0x15, 0x60, 0xA2, 0xE7, 0x38, 0x69, 0xFF, 0xFF, 0x68, 0x41, 0x01, 0x16, - 0xFD, 0x01, 0x63, 0x47, 0x61, 0x40, 0x01, 0x2A, 0x03, 0x00, 0x00, 0x3A, 0xCC, 0x84, 0x02, 0x00, - 0x07, 0x3A, 0xDC, 0x84, 0xFF, 0xB4, 0xA5, 0xDB, 0x60, 0x47, 0xE8, 0x84, 0x47, 0x65, 0x29, 0x60, - 0xE8, 0x62, 0xA2, 0xD3, 0xB4, 0x85, 0xB4, 0x83, 0x80, 0xE1, 0x95, 0x60, 0x80, 0xE7, 0x32, 0x60, - 0x58, 0x4F, 0x6A, 0x78, 0xFF, 0xFF, 0xA3, 0xF3, 0xCD, 0xE2, 0x60, 0x54, 0x04, 0x29, 0xFE, 0x01, - 0xC4, 0xE2, 0xA4, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x2B, 0x04, 0x00, 0x32, 0x60, 0x43, 0x78, - 0xFF, 0xFF, 0xFF, 0x01, 0xA4, 0xF3, 0x80, 0xE1, 0xCC, 0x84, 0xE0, 0x85, 0x15, 0x60, 0xA2, 0xE7, - 0x26, 0x60, 0x78, 0x64, 0x58, 0x4F, 0x4F, 0x00, 0x26, 0x60, 0x94, 0x64, 0x58, 0x4F, 0x4B, 0x00, - 0x26, 0x60, 0xB0, 0x64, 0x58, 0x4F, 0x47, 0x00, 0x26, 0x60, 0xCC, 0x64, 0x58, 0x4F, 0x43, 0x00, - 0x26, 0x60, 0xE8, 0x64, 0x58, 0x4F, 0x3F, 0x00, 0x27, 0x60, 0x04, 0x64, 0x58, 0x4F, 0x3B, 0x00, - 0x27, 0x60, 0x20, 0x64, 0x58, 0x4F, 0x37, 0x00, 0x01, 0x68, 0xFF, 0x6A, 0xFF, 0xFF, 0x01, 0x16, - 0xFE, 0x01, 0x3F, 0x44, 0x20, 0x27, 0x00, 0x00, 0x3F, 0x40, 0x40, 0x26, 0x08, 0x00, 0x00, 0x60, - 0x18, 0x64, 0x00, 0x60, 0x00, 0x65, 0x94, 0x84, 0xA0, 0x50, 0x1D, 0x60, 0x19, 0xE2, 0xC4, 0xE2, - 0x00, 0x63, 0xA3, 0xFD, 0x32, 0x7B, 0x4D, 0xE2, 0xBF, 0xFE, 0xC4, 0xE2, 0x41, 0xFF, 0xE0, 0xFE, - 0xE1, 0xFE, 0xE2, 0xFE, 0x43, 0xFF, 0x44, 0xFF, 0x46, 0xFF, 0xA5, 0xF3, 0x62, 0xFF, 0x60, 0x40, - 0x05, 0x36, 0x2D, 0xFF, 0x07, 0x36, 0xD5, 0xFE, 0x08, 0xE1, 0x88, 0x60, 0x85, 0x71, 0x8D, 0xE2, - 0xA2, 0x60, 0x16, 0x78, 0xFF, 0xFF, 0x50, 0xEC, 0x63, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, - 0x40, 0xEC, 0x2F, 0x58, 0xFF, 0xFF, 0x44, 0xD3, 0x80, 0x7C, 0x60, 0x48, 0x60, 0x47, 0x00, 0x7F, - 0xB0, 0x8A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x2F, 0x58, 0xFF, 0xFF, 0x42, 0xFF, 0x40, 0xFF, - 0xDD, 0xFE, 0xAD, 0x4F, 0x00, 0x7F, 0x01, 0xBC, 0xA0, 0x5D, 0x00, 0xEE, 0x19, 0x61, 0xCD, 0x81, - 0xFF, 0xFF, 0xFD, 0x02, 0x43, 0x45, 0x20, 0x44, 0x60, 0xBC, 0x40, 0x40, 0x02, 0x60, 0xEE, 0x63, - 0x7F, 0xF3, 0xA3, 0xFD, 0x40, 0x7F, 0xA4, 0xFB, 0x05, 0x64, 0xA5, 0xFB, 0xDF, 0xFE, 0x19, 0xFF, - 0x24, 0x60, 0xDD, 0x64, 0x3F, 0x40, 0x01, 0x2B, 0x02, 0x00, 0x32, 0x60, 0xA2, 0x64, 0xA6, 0xFB, - 0xBB, 0x60, 0x20, 0x78, 0xFF, 0xFF, 0x04, 0xEE, 0xAD, 0x4F, 0x00, 0x7F, 0x01, 0xBC, 0xA0, 0x5D, - 0x19, 0x61, 0xCD, 0x81, 0xFF, 0xFF, 0xFD, 0x02, 0xAD, 0x4F, 0x00, 0x7F, 0x01, 0xBC, 0xA0, 0x5D, - 0x00, 0xEE, 0x15, 0x60, 0xA2, 0xE7, 0x25, 0x60, 0x02, 0x63, 0x25, 0x60, 0x76, 0x65, 0xDF, 0xFE, - 0x80, 0xE1, 0xBD, 0xD3, 0xFF, 0xFF, 0x60, 0x48, 0x60, 0x47, 0x80, 0xBC, 0x00, 0x7F, 0x60, 0x4A, - 0xD7, 0x80, 0xA1, 0xFF, 0xFF, 0xFF, 0xF5, 0x02, 0x25, 0x60, 0x76, 0x63, 0x26, 0x60, 0x78, 0x65, - 0xBD, 0xD3, 0xFF, 0xFF, 0x60, 0x48, 0x60, 0x47, 0x80, 0xBC, 0x00, 0x7F, 0x60, 0x4A, 0xD7, 0x80, - 0xA1, 0xFF, 0xFF, 0xFF, 0xF5, 0x02, 0x3F, 0x40, 0x20, 0x2B, 0x00, 0x00, 0x01, 0x68, 0xFF, 0x6A, - 0xBF, 0xFE, 0x33, 0x60, 0x8A, 0x78, 0xFF, 0xFF, 0x3F, 0x40, 0x20, 0x2B, 0xAD, 0x00, 0x01, 0x16, - 0xFE, 0x01, 0x38, 0x69, 0xA1, 0xFF, 0xFF, 0xFF, 0x68, 0x44, 0x01, 0x2A, 0xA5, 0x00, 0x27, 0x60, - 0xB4, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xFF, 0xFF, 0x08, 0x28, 0xA2, 0xDB, 0x7F, 0xF1, - 0x80, 0x60, 0x00, 0x64, 0xB0, 0x9C, 0x01, 0x00, 0x7F, 0xF1, 0xDD, 0xFE, 0xAD, 0x4F, 0x00, 0x7F, - 0x01, 0xBC, 0xA0, 0x5D, 0x00, 0xEE, 0x43, 0x45, 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, 0x02, 0x60, - 0xEE, 0x64, 0xA3, 0xFB, 0xA4, 0xF9, 0x05, 0x64, 0xA5, 0xFB, 0xDF, 0xFE, 0x19, 0xFF, 0x83, 0x00, - 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, 0x43, 0x45, 0xA4, 0xD1, 0xDA, 0x83, 0xC3, 0x85, 0x80, 0xE1, - 0xDF, 0xFE, 0xBD, 0xD3, 0xFF, 0xFF, 0x60, 0x48, 0x60, 0x47, 0x80, 0xBC, 0x00, 0x7F, 0x60, 0x4A, - 0xD7, 0x80, 0xA1, 0xFF, 0xF6, 0x02, 0xBF, 0xFE, 0x6E, 0x00, 0x3F, 0x40, 0x40, 0x26, 0x13, 0x00, - 0x0B, 0x60, 0xF8, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x10, 0x64, 0x90, 0x84, 0xA0, 0x50, 0xF8, 0xA2, - 0xA2, 0xD1, 0x0A, 0x60, 0x19, 0x64, 0x90, 0x84, 0xA0, 0x52, 0x06, 0xA2, 0xA2, 0xD1, 0x46, 0x60, - 0x09, 0x64, 0x90, 0x84, 0xA0, 0x50, 0xAD, 0x4F, 0xFE, 0xB4, 0xA0, 0x5D, 0xAD, 0x4F, 0xFD, 0xB4, - 0xA0, 0x5D, 0x02, 0xEE, 0xBD, 0xFE, 0x50, 0x00, 0x80, 0xE1, 0x01, 0x16, 0xFE, 0x01, 0x64, 0x48, - 0x92, 0x6A, 0xA1, 0xFF, 0xFF, 0xFF, 0x68, 0x40, 0x27, 0x60, 0xA2, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, - 0xDC, 0x84, 0xFF, 0xFF, 0x08, 0x28, 0xA2, 0xDB, 0x3F, 0x00, 0x80, 0xE1, 0x01, 0x16, 0xFE, 0x01, - 0x01, 0x68, 0xA7, 0x6A, 0xA1, 0xFF, 0xFF, 0xFF, 0x68, 0x40, 0x36, 0x00, 0x20, 0x44, 0x20, 0xBC, - 0x40, 0x40, 0x80, 0xE1, 0x64, 0x46, 0x01, 0x16, 0xFE, 0x01, 0x21, 0x69, 0xA1, 0xFF, 0xFF, 0xFF, - 0x68, 0x5E, 0x01, 0x16, 0xFE, 0x01, 0x22, 0x69, 0xA1, 0xFF, 0xFF, 0xFF, 0x68, 0x5F, 0x26, 0xFA, - 0x1C, 0xF2, 0x01, 0x16, 0xFE, 0x01, 0x3A, 0x69, 0xA1, 0xFF, 0xFF, 0xFF, 0x68, 0x5F, 0x27, 0xFA, - 0x1B, 0x00, 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, 0x43, 0x45, 0xBE, 0xD5, 0xA4, 0xD2, 0x5A, 0x86, - 0xEF, 0xA0, 0x11, 0x61, 0x01, 0x06, 0x60, 0x41, 0x24, 0x60, 0xE0, 0x63, 0x80, 0xE1, 0xBD, 0xD3, - 0x26, 0x42, 0x01, 0x16, 0xFE, 0x01, 0x60, 0x49, 0xA1, 0xFF, 0xFF, 0xFF, 0x68, 0x44, 0xCD, 0x81, - 0xA2, 0xDA, 0x5A, 0x86, 0xF4, 0x02, 0x25, 0x43, 0x21, 0xE1, 0x00, 0x64, 0xBF, 0xDB, 0x20, 0x44, - 0x20, 0x2A, 0x07, 0x00, 0x07, 0xB4, 0x04, 0x36, 0xC3, 0xFE, 0x06, 0x36, 0xCC, 0xFE, 0x07, 0x36, - 0xD5, 0xFE, 0x20, 0x44, 0xD8, 0xB4, 0x40, 0x40, 0x20, 0x44, 0x40, 0x2A, 0x07, 0x00, 0x9F, 0xFE, - 0x1E, 0x05, 0xBF, 0xB4, 0x40, 0x40, 0xA6, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x24, 0x60, 0x80, 0x63, - 0xBD, 0xD3, 0x02, 0x61, 0x17, 0x1B, 0x04, 0xA3, 0xBD, 0xD3, 0x02, 0x61, 0x13, 0x1B, 0x04, 0xA3, - 0xBD, 0xD3, 0x02, 0x61, 0x0F, 0x1B, 0x04, 0xA3, 0xBD, 0xD3, 0x04, 0x61, 0x0B, 0x1B, 0x04, 0xA3, - 0xBD, 0xD3, 0x06, 0x61, 0x07, 0x1B, 0x04, 0xA3, 0xBD, 0xD3, 0x07, 0x61, 0x03, 0x1B, 0xBB, 0x60, - 0x20, 0x78, 0xFF, 0xFF, 0xA3, 0xD1, 0x40, 0x44, 0x20, 0x44, 0x07, 0xB5, 0xD4, 0x85, 0x35, 0x80, - 0x24, 0x45, 0x24, 0x60, 0xBC, 0x64, 0x44, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE1, 0x43, 0x45, - 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, 0x64, 0x43, 0xBD, 0xD3, 0xBD, 0xD1, 0x40, 0x44, 0x10, 0x27, - 0x10, 0x00, 0xFF, 0x60, 0x7F, 0x65, 0x15, 0x60, 0xA2, 0x64, 0x24, 0x40, 0x08, 0x2B, 0xA4, 0x84, - 0xA0, 0x57, 0xFF, 0xFF, 0x64, 0x49, 0xFF, 0xFF, 0x68, 0x44, 0x01, 0x16, 0xFD, 0x01, 0x00, 0x7F, - 0xA3, 0xDB, 0xA1, 0x01, 0x80, 0xE1, 0x43, 0x45, 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, 0x64, 0x43, - 0xBD, 0xD3, 0xBD, 0xD1, 0x40, 0x44, 0x10, 0x2B, 0x11, 0x00, 0xA3, 0xD3, 0xFF, 0xFF, 0x15, 0x60, - 0x80, 0xE7, 0x24, 0x40, 0x07, 0x27, 0x02, 0x00, 0x50, 0xEC, 0x00, 0x00, 0x60, 0x4A, 0xFF, 0xFF, - 0x01, 0x16, 0xFE, 0x01, 0x24, 0x40, 0x20, 0x2B, 0x40, 0xEC, 0x0F, 0x00, 0x15, 0x60, 0x22, 0x64, - 0x24, 0x40, 0x08, 0x27, 0x80, 0xBC, 0xA3, 0xD3, 0xA0, 0x57, 0x60, 0x48, 0x64, 0x44, 0x80, 0xBC, - 0xFF, 0xB4, 0x60, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x75, 0x01, 0x42, 0x6F, 0x6F, 0x74, - 0x63, 0x6F, 0x64, 0x65, 0x20, 0x21, 0x21, 0x20, 0x20, 0x00, 0x53, 0x54, 0x41, 0x2F, 0x41, 0x50, - 0x20, 0x46, 0x75, 0x6E, 0x63, 0x27, 0x73, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x02, 0x00, 0x24, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, - 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x40, 0x00, 0x32, 0x00, 0x32, 0x00, 0x0A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x40, 0x00, - 0x32, 0x00, 0x36, 0x00, 0x0A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x40, 0x00, 0x3B, 0x00, 0x40, 0x00, - 0x17, 0x00, 0x07, 0x00, 0x07, 0x00, 0x4A, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x1E, 0x00, 0x0C, 0x00, - 0x08, 0x00, 0x57, 0x00, 0x4D, 0x00, 0x57, 0x00, 0x2B, 0x00, 0x19, 0x00, 0x08, 0x00, 0x5D, 0x00, - 0x53, 0x00, 0x5D, 0x00, 0x31, 0x00, 0x1F, 0x00, 0x08, 0x00, 0xA9, 0xF3, 0x21, 0x61, 0x00, 0x7C, - 0x01, 0x00, 0x00, 0xFA, 0x60, 0x46, 0xFE, 0x63, 0xA3, 0xD8, 0xFE, 0x1F, 0xCD, 0x81, 0xD8, 0x84, - 0xF8, 0x02, 0x21, 0x61, 0x80, 0x67, 0x40, 0x4A, 0xA9, 0xF5, 0x14, 0x60, 0x02, 0x65, 0x01, 0x7C, - 0x07, 0x18, 0x2A, 0x43, 0x02, 0xFC, 0x5F, 0x8A, 0x8E, 0xF8, 0x70, 0xF8, 0x00, 0xF4, 0xF8, 0x01, - 0x2E, 0x58, 0xFF, 0xFF, 0x3F, 0x40, 0x40, 0x26, 0x0A, 0x00, 0x42, 0x60, 0x09, 0xE0, 0x3F, 0x40, - 0x01, 0x2A, 0x03, 0x00, 0x60, 0x60, 0x1C, 0xE0, 0x02, 0x00, 0x80, 0x60, 0x1C, 0xE0, 0x40, 0xEC, - 0x00, 0xED, 0x02, 0xEE, 0x80, 0x60, 0x58, 0xEC, 0x80, 0x60, 0x00, 0xED, 0x80, 0x60, 0x82, 0xEE, - 0xC0, 0x60, 0x59, 0xEC, 0xC0, 0x60, 0x07, 0xED, 0xAD, 0x4F, 0xFE, 0xB4, 0xA0, 0x5D, 0x00, 0xF3, - 0x28, 0xFB, 0x40, 0x44, 0x2F, 0x60, 0x52, 0x7C, 0x20, 0xF9, 0xA2, 0x60, 0x00, 0x7C, 0x21, 0xF9, - 0xA2, 0x60, 0xE0, 0x7C, 0x22, 0xF9, 0x18, 0x60, 0x97, 0x7C, 0x23, 0xF9, 0x18, 0x60, 0xA8, 0x7C, - 0x24, 0xF9, 0x18, 0x60, 0xD2, 0x7C, 0x25, 0xF9, 0x18, 0x60, 0xE3, 0x7C, 0x26, 0xF9, 0x91, 0x60, - 0x00, 0xE8, 0x28, 0xE8, 0x44, 0x60, 0x02, 0xE6, 0x10, 0x67, 0x40, 0x52, 0x10, 0x60, 0x04, 0xE6, - 0x08, 0x60, 0x00, 0x63, 0xFA, 0x60, 0x00, 0x65, 0xBD, 0xD3, 0xBD, 0xD3, 0x02, 0xA8, 0xD4, 0x80, - 0x4A, 0x02, 0x49, 0x02, 0xDB, 0x83, 0xFA, 0x60, 0x27, 0x65, 0x5B, 0xD3, 0xBF, 0xD1, 0x1A, 0x18, - 0xC3, 0x83, 0xD4, 0x80, 0xC3, 0x83, 0xF9, 0x02, 0xDB, 0x83, 0xD3, 0x83, 0xD3, 0x86, 0x64, 0x41, - 0xCD, 0x81, 0xA6, 0xD1, 0xDA, 0x86, 0x25, 0x60, 0x02, 0x65, 0x00, 0x60, 0x72, 0x63, 0xA5, 0xD3, - 0xDA, 0x85, 0x90, 0x84, 0xFF, 0x27, 0x02, 0x00, 0xA2, 0xD9, 0x01, 0x00, 0xF8, 0x1F, 0xCD, 0x81, - 0xFF, 0xFF, 0xEF, 0x02, 0x08, 0x60, 0x06, 0x63, 0xFA, 0x60, 0x28, 0x65, 0x5B, 0xD3, 0xBF, 0xD1, - 0x0B, 0x18, 0xC3, 0x83, 0xD4, 0x80, 0xC3, 0x83, 0xF9, 0x02, 0xBF, 0xD3, 0x29, 0x60, 0xE8, 0x62, - 0x0E, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0xA2, 0xDB, 0x08, 0x60, 0x06, 0x63, 0xFD, 0x60, 0x0C, 0x65, - 0x5B, 0xD3, 0xBF, 0xD1, 0x10, 0x18, 0xC3, 0x83, 0xD4, 0x80, 0xC3, 0x83, 0xF9, 0x02, 0xFA, 0xA3, - 0xA3, 0xD3, 0x02, 0x60, 0x00, 0x65, 0xF7, 0xA0, 0xFC, 0xA0, 0x0D, 0x05, 0x04, 0x05, 0x78, 0x43, - 0x02, 0x61, 0x24, 0x60, 0xDD, 0x78, 0x21, 0x60, 0x00, 0x65, 0x3F, 0x43, 0x3F, 0x43, 0x21, 0x60, - 0x00, 0x65, 0xC0, 0x60, 0x8F, 0xEE, 0xB7, 0x84, 0x40, 0x5F, 0x00, 0x60, 0x30, 0xE2, 0x00, 0x60, - 0x50, 0xE2, 0x00, 0x60, 0x79, 0xE2, 0x00, 0x60, 0x90, 0xE2, 0x01, 0x60, 0xD0, 0xE2, 0x01, 0x60, - 0xF0, 0xE2, 0x01, 0x60, 0xB0, 0xE2, 0x26, 0x64, 0x35, 0xFB, 0x01, 0x60, 0x30, 0x64, 0x0A, 0xA4, - 0x38, 0xFB, 0x60, 0x45, 0x00, 0x60, 0xF8, 0x64, 0x0A, 0xA4, 0x39, 0xFB, 0x35, 0xF1, 0x0A, 0x64, - 0xC4, 0x84, 0x36, 0xFB, 0xC0, 0x84, 0x0A, 0xA4, 0x37, 0xFB, 0x09, 0x60, 0x2A, 0x64, 0xB9, 0xFB, - 0x82, 0xFF, 0x92, 0xFF, 0x5C, 0x41, 0x5C, 0x46, 0x5C, 0x47, 0x00, 0xE1, 0xA3, 0x60, 0x4B, 0x63, - 0x0C, 0x60, 0x16, 0x64, 0xA0, 0xDD, 0x87, 0xFF, 0x97, 0xFF, 0x0C, 0x60, 0x02, 0x64, 0x40, 0x5A, - 0x06, 0xA4, 0x40, 0x5B, 0x5C, 0x5E, 0x5C, 0x51, 0x28, 0x60, 0x44, 0x62, 0xA2, 0xD3, 0x7F, 0xFB, - 0x2D, 0x60, 0xCC, 0x61, 0x27, 0x7C, 0xA1, 0xD9, 0x6D, 0x60, 0x1C, 0x63, 0x7F, 0xA3, 0xE3, 0x87, - 0x00, 0x7F, 0xAA, 0xFB, 0x02, 0x60, 0x7F, 0x64, 0x00, 0x60, 0x42, 0x65, 0xD4, 0x84, 0xAB, 0xFB, - 0xDC, 0x84, 0xA9, 0xFB, 0x24, 0x60, 0x0E, 0x62, 0xA2, 0xDB, 0x34, 0x60, 0x58, 0x4E, 0x64, 0x78, - 0xFF, 0xFF, 0xAB, 0xF1, 0xAA, 0xF3, 0x7C, 0x63, 0xAD, 0xFB, 0x60, 0x46, 0x01, 0xFC, 0xDC, 0x84, - 0xD0, 0x80, 0x00, 0xFA, 0xFA, 0x04, 0xAE, 0xFB, 0x60, 0x46, 0x00, 0x64, 0x00, 0xFA, 0x63, 0x44, - 0x80, 0x7F, 0x01, 0xFA, 0xAB, 0xF3, 0xAA, 0xF1, 0xDC, 0x84, 0xD0, 0x84, 0xAC, 0xFB, 0x03, 0x60, - 0x26, 0x61, 0xAE, 0x60, 0x58, 0x4D, 0xB1, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x2E, 0xFB, 0x82, 0xFF, - 0x40, 0x42, 0x87, 0xFF, 0xAC, 0xF3, 0xB4, 0xFB, 0x08, 0x60, 0x00, 0x63, 0xFA, 0x60, 0x00, 0x65, - 0xBD, 0xD3, 0xA3, 0xD3, 0x02, 0xA8, 0xD4, 0x80, 0x24, 0x02, 0x23, 0x02, 0x2D, 0x60, 0x1A, 0x62, - 0xA2, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x80, 0x26, 0x1C, 0x00, 0x04, 0xA3, 0xFD, 0x60, 0x0D, 0x65, - 0x5B, 0xD3, 0xBF, 0xD1, 0x16, 0x18, 0xC3, 0x83, 0xD4, 0x80, 0xC3, 0x83, 0xF9, 0x02, 0xBF, 0xD3, - 0xAD, 0x49, 0xFE, 0xA0, 0x00, 0x64, 0x0E, 0x04, 0x08, 0xB1, 0x20, 0xBC, 0x08, 0x28, 0x18, 0xBC, - 0x1C, 0x60, 0xB8, 0x63, 0x07, 0x7C, 0xA3, 0xD9, 0x1C, 0x60, 0xB6, 0x63, 0x05, 0x7C, 0xA3, 0xD9, - 0x01, 0x00, 0x00, 0x64, 0x1C, 0x60, 0xB4, 0x63, 0xA3, 0xDB, 0x00, 0x64, 0x40, 0x50, 0x63, 0xFF, - 0x60, 0xFF, 0x66, 0xFF, 0x65, 0xFF, 0x64, 0xFF, 0x61, 0xFF, 0x62, 0xFF, 0x49, 0x60, 0x02, 0xE1, - 0x52, 0x60, 0x02, 0xE1, 0x5B, 0x60, 0x02, 0xE1, 0x65, 0x60, 0x02, 0xE1, 0x6C, 0x60, 0x02, 0xE1, - 0x76, 0x60, 0x02, 0xE1, 0x41, 0x60, 0x02, 0xE1, 0x04, 0x65, 0x2D, 0x60, 0x18, 0x64, 0x44, 0xD3, - 0xEF, 0x60, 0x58, 0x4E, 0xBD, 0x78, 0xFF, 0xFF, 0x24, 0x60, 0x9E, 0x65, 0x0C, 0x64, 0xA5, 0xDB, - 0x36, 0x60, 0x1E, 0x64, 0xA1, 0xFB, 0x2D, 0xFF, 0x06, 0x61, 0x41, 0x4B, 0x09, 0x60, 0x08, 0x61, - 0xAE, 0x60, 0x58, 0x4D, 0xB1, 0x78, 0xFF, 0xFF, 0xF0, 0x67, 0x0E, 0xFA, 0x24, 0x60, 0x7A, 0x62, - 0x24, 0x60, 0x5E, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0x2B, 0x41, 0x4D, 0x8B, 0xFF, 0xFF, 0xE9, 0x02, 0x06, 0x61, 0x41, 0x4B, 0x09, 0x60, - 0x08, 0x61, 0xAE, 0x60, 0x58, 0x4D, 0xB1, 0x78, 0xFF, 0xFF, 0x24, 0x60, 0x7A, 0x62, 0x24, 0x60, - 0x52, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0x2B, 0x41, 0x4D, 0x8B, 0xFF, 0xFF, 0xEB, 0x02, 0x19, 0x60, 0x17, 0x78, 0xFF, 0xFF, 0x00, 0xEA, - 0x00, 0xEB, 0x50, 0x60, 0x03, 0xEA, 0x51, 0x60, 0x13, 0xEA, 0x52, 0x60, 0x30, 0xEA, 0x53, 0x60, - 0x40, 0xEA, 0x54, 0x60, 0x52, 0xEA, 0x55, 0x60, 0x6D, 0xEA, 0x56, 0x60, 0x71, 0xEA, 0x57, 0x60, - 0x8B, 0xEA, 0x58, 0x60, 0x47, 0xEA, 0x59, 0x60, 0xA0, 0xEA, 0x5A, 0x60, 0xB2, 0xEA, 0x5B, 0x60, - 0xC1, 0xEA, 0x5C, 0x60, 0xD7, 0xEA, 0x5D, 0x60, 0xEB, 0xEA, 0x5E, 0x60, 0xA0, 0xEA, 0x50, 0x60, - 0x36, 0xEB, 0x51, 0x60, 0x37, 0xEB, 0x52, 0x60, 0x20, 0xEB, 0x53, 0x60, 0xE4, 0xEB, 0x54, 0x60, - 0x34, 0xEB, 0x55, 0x60, 0x58, 0xEB, 0x56, 0x60, 0x48, 0xEB, 0x57, 0x60, 0xD0, 0xEB, 0x58, 0x60, - 0xC3, 0xEB, 0x59, 0x60, 0xFC, 0xEB, 0x5A, 0x60, 0x34, 0xEB, 0x5B, 0x60, 0x58, 0xEB, 0x5C, 0x60, - 0xC0, 0xEB, 0x5D, 0x60, 0xD0, 0xEB, 0x5E, 0x60, 0x91, 0xEB, 0x00, 0xEA, 0x00, 0xEB, 0xE0, 0x60, - 0x02, 0xEA, 0xE0, 0x60, 0x03, 0xEB, 0xA0, 0x60, 0x00, 0xEB, 0xB0, 0x60, 0x00, 0xEB, 0xAB, 0x48, - 0x40, 0x3B, 0x01, 0x00, 0xFC, 0x01, 0x00, 0xEB, 0x03, 0x60, 0x02, 0x62, 0x62, 0x44, 0xA2, 0xDB, - 0x0F, 0x64, 0x60, 0x7F, 0xA0, 0x5A, 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, - 0x00, 0xEA, 0x3F, 0x40, 0x40, 0x26, 0x08, 0x00, 0x00, 0x60, 0x18, 0x64, 0x00, 0x60, 0x00, 0x65, - 0x94, 0x84, 0xA0, 0x50, 0x1D, 0x60, 0x19, 0xE2, 0x24, 0x44, 0xFF, 0xB4, 0x04, 0xFB, 0x50, 0x60, - 0x00, 0x64, 0x05, 0xFB, 0x10, 0x60, 0x10, 0x75, 0x25, 0x60, 0x11, 0x78, 0xFF, 0xFF, 0x3F, 0x41, - 0xA5, 0x4C, 0x50, 0x37, 0x04, 0x00, 0x01, 0xB9, 0x41, 0x5F, 0xB5, 0x60, 0x55, 0xE0, 0x0C, 0x60, - 0x10, 0x62, 0xA2, 0xD3, 0x01, 0x60, 0x01, 0x65, 0xD4, 0x80, 0x5A, 0xD1, 0x0F, 0x02, 0x5A, 0xD3, - 0x3C, 0x60, 0x00, 0x66, 0xE0, 0x87, 0x40, 0x4A, 0x68, 0x60, 0x28, 0x61, 0x64, 0x44, 0xC8, 0x84, - 0x0C, 0x63, 0xAA, 0x46, 0x58, 0xD0, 0xAA, 0x46, 0x59, 0xD8, 0xFB, 0x1F, 0x08, 0x60, 0x00, 0x63, - 0xFA, 0x60, 0x00, 0x65, 0xBD, 0xD3, 0xA3, 0xD3, 0x02, 0xA8, 0xD4, 0x80, 0x61, 0x02, 0x60, 0x02, - 0x6E, 0x60, 0x58, 0x61, 0x3C, 0x60, 0x00, 0x66, 0x41, 0x4B, 0x2B, 0x41, 0x6E, 0x60, 0xA0, 0x7C, - 0xD1, 0x80, 0xA1, 0xD2, 0x25, 0x05, 0x59, 0xD0, 0x60, 0x45, 0x59, 0xD2, 0x44, 0x47, 0xE0, 0x87, - 0x40, 0x4A, 0x59, 0xD2, 0x59, 0x8B, 0x40, 0x4C, 0x08, 0x60, 0x00, 0x63, 0xBE, 0xD3, 0xBD, 0xD1, - 0xEC, 0x18, 0xD4, 0x80, 0xEA, 0x18, 0x03, 0x03, 0xC3, 0x83, 0xC3, 0x83, 0xF7, 0x01, 0x67, 0x44, - 0xC0, 0x84, 0xE0, 0x85, 0x2C, 0x44, 0xD4, 0x80, 0x63, 0x41, 0x01, 0x06, 0x65, 0x44, 0xC8, 0x83, - 0xAA, 0x46, 0x59, 0xD1, 0x27, 0xD8, 0x5A, 0x87, 0xFC, 0x1F, 0xAA, 0x46, 0x2B, 0x41, 0xD5, 0x01, - 0x6E, 0x60, 0xA0, 0x61, 0x41, 0x4B, 0x2B, 0x41, 0x6E, 0x60, 0xD8, 0x7C, 0xD1, 0x80, 0xA1, 0xD2, - 0x27, 0x05, 0x59, 0xD0, 0x60, 0x45, 0x59, 0xD2, 0x44, 0x47, 0xE0, 0x87, 0x40, 0x4A, 0x59, 0xD2, - 0x59, 0x8B, 0x40, 0x4C, 0x08, 0x60, 0x00, 0x63, 0xBE, 0xD3, 0xBD, 0xD1, 0xEC, 0x18, 0xD4, 0x80, - 0xEA, 0x18, 0x03, 0x03, 0xC3, 0x83, 0xC3, 0x83, 0xF7, 0x01, 0x04, 0xA3, 0xA3, 0xD1, 0x5A, 0x88, - 0x2C, 0x43, 0xD3, 0x80, 0xFF, 0xFF, 0x01, 0x06, 0x64, 0x43, 0xCF, 0x83, 0xAA, 0x46, 0x60, 0xFE, - 0x28, 0xD1, 0x5E, 0x88, 0x27, 0xD8, 0x5A, 0x87, 0xFB, 0x1F, 0x20, 0xFE, 0xAA, 0x46, 0xD3, 0x01, - 0xB8, 0xFE, 0xB9, 0xFE, 0xBA, 0xFE, 0xBB, 0xFE, 0xBD, 0xFE, 0xBF, 0xFE, 0x2D, 0x60, 0x1A, 0x62, - 0xA2, 0xD3, 0x12, 0x63, 0x60, 0x40, 0x01, 0x27, 0x05, 0x00, 0x0B, 0x60, 0xEA, 0x62, 0x00, 0x64, - 0x5A, 0xDB, 0xFE, 0x1F, 0x34, 0x60, 0x81, 0x78, 0xFF, 0xFF, 0xF1, 0xFF, 0xF6, 0x6C, 0x1E, 0x00, - 0x04, 0x00, 0xF2, 0xFF, 0xFA, 0x6C, 0x1E, 0x00, 0x04, 0x00, 0xFB, 0xFF, 0x02, 0x6D, 0x1E, 0x00, - 0x04, 0x00, 0xF1, 0xFF, 0x8C, 0x64, 0x1E, 0x00, 0x04, 0x00, 0xF2, 0xFF, 0x90, 0x64, 0x1E, 0x00, - 0x04, 0x00, 0xFB, 0xFF, 0x98, 0x64, 0x1E, 0x00, 0x04, 0x00, 0x86, 0xFD, 0x50, 0x28, 0x00, 0x00, - 0x06, 0x00, 0x10, 0xFD, 0x74, 0x01, 0x00, 0x00, 0x02, 0x00, 0x14, 0xFD, 0x18, 0x2D, 0x00, 0x00, - 0x0A, 0x00, 0x20, 0xFA, 0x94, 0x26, 0x00, 0x00, 0x0E, 0x00, 0x21, 0xFA, 0x78, 0x26, 0x00, 0x00, - 0x0E, 0x00, 0x22, 0xFA, 0xB0, 0x26, 0x00, 0x00, 0x0E, 0x00, 0x23, 0xFA, 0x64, 0x25, 0x00, 0x00, - 0x01, 0x00, 0x24, 0xFA, 0x58, 0x27, 0x00, 0x00, 0x0E, 0x00, 0x25, 0xFA, 0x78, 0x25, 0x00, 0x00, - 0x80, 0x00, 0x26, 0xFA, 0x5E, 0x25, 0x00, 0x00, 0x01, 0x00, - -}; /* fw_image_3_data */ - -static const hcf_8 fw_image_4_data[] = { - 0xA2, 0x60, 0xDD, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA2, 0x60, 0xC3, 0x78, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA2, 0x60, 0xC9, 0x78, 0xC4, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA2, 0x60, 0x19, 0x78, 0x43, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x44, 0xFF, 0x20, 0x54, 0xCD, 0xE2, 0xA2, 0x60, 0xDB, 0x78, 0x08, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA2, 0x60, 0xDD, 0x78, 0x44, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA2, 0x60, 0xDD, 0x78, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA2, 0x60, 0xDD, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA8, 0x60, 0x73, 0x78, 0x4C, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA7, 0x60, 0xFB, 0x78, 0x4C, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC4, 0xE2, 0x84, 0xFF, 0x22, 0x58, 0x82, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA3, 0x60, 0x7E, 0x78, 0x43, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xE4, 0xE2, 0xA8, 0x60, 0x14, 0x78, 0xB5, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBA, 0x60, 0xCE, 0x78, 0x64, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA8, 0x60, 0x87, 0x78, 0xA4, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA8, 0x60, 0x55, 0x78, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAE, 0x60, 0x1E, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAE, 0x60, 0x4B, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAC, 0x60, 0xD8, 0x78, 0x42, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAD, 0x60, 0x08, 0x78, 0x43, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAD, 0x60, 0x08, 0x78, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAF, 0x60, 0xC0, 0x78, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAD, 0x60, 0x0B, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x60, 0x83, 0x64, 0x80, 0x29, 0x09, 0xFB, 0xAD, 0x60, 0xE6, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, - 0x31, 0x60, 0x16, 0x78, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x30, 0x60, 0xA1, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB9, 0x60, 0x4B, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB8, 0x60, 0xBB, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB0, 0x60, 0x89, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA1, 0xFF, 0xFF, 0xFF, 0x83, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBB, 0x60, 0x25, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0x42, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xB0, 0xFF, 0xB1, 0xFF, 0x40, 0xFF, 0x43, 0xFF, 0xBB, 0x60, 0x20, 0x78, 0x44, 0xFF, 0xFF, 0x01, - 0xBB, 0x60, 0x25, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0x33, 0x60, 0x9B, 0x78, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xBB, 0x60, 0x20, 0x78, 0x84, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xBB, 0x60, 0x1F, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xBF, 0x60, 0xDB, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEB, 0x60, 0x1F, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBF, 0x60, 0xE3, 0x78, 0x42, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBF, 0x60, 0xE3, 0x78, 0x24, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xE9, 0x60, 0xE3, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBF, 0x60, 0xE3, 0x78, 0x44, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBF, 0x60, 0xE3, 0x78, 0x84, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBF, 0x60, 0xE3, 0x78, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x24, 0x60, 0xE5, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x25, 0x60, 0x14, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x25, 0x60, 0x32, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x25, 0x60, 0x11, 0x78, 0x28, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x25, 0x60, 0x11, 0x78, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x25, 0x60, 0x11, 0x78, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x25, 0x60, 0x11, 0x78, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x60, 0x87, 0x64, 0x80, 0x29, 0x09, 0xFB, 0x47, 0xFF, 0x25, 0x60, 0x11, 0x78, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2F, 0x60, 0x63, 0x78, 0x42, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2F, 0x60, 0xB3, 0x78, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x07, 0x02, 0x62, 0xFF, 0x63, 0xFF, 0x64, 0xFF, 0x65, 0xFF, - 0x66, 0xFF, 0xBF, 0xFE, 0xA1, 0xFF, 0x82, 0xFF, 0x88, 0xFF, 0x6C, 0x40, 0x41, 0xFF, 0xC4, 0xE2, - 0x43, 0xFF, 0x5C, 0x49, 0x08, 0xE1, 0xA2, 0x60, 0x16, 0x78, 0xFF, 0xFF, 0xA1, 0xFF, 0x98, 0xFF, - 0x80, 0x3E, 0x9F, 0xFE, 0x03, 0x04, 0x31, 0x60, 0x75, 0x78, 0xFF, 0xFF, 0xE2, 0xFE, 0x40, 0x05, - 0xE0, 0xFE, 0x5B, 0x05, 0xE1, 0xFE, 0xF2, 0x04, 0x29, 0x40, 0x08, 0x26, 0xEF, 0x01, 0x72, 0x44, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xB5, 0xF3, 0xE8, 0x85, 0xFF, 0xB7, - 0xE0, 0x84, 0xE0, 0x84, 0xB4, 0x85, 0x73, 0x44, 0xD4, 0x84, 0x10, 0x65, 0xD4, 0x80, 0xFF, 0xFF, - 0x26, 0x04, 0x3F, 0x40, 0x40, 0x26, 0x13, 0x00, 0x0B, 0x60, 0xF8, 0x62, 0xA2, 0xD1, 0x00, 0x60, - 0x10, 0x64, 0x90, 0x84, 0xA0, 0x50, 0xF8, 0xA2, 0xA2, 0xD1, 0x0A, 0x60, 0x19, 0x64, 0x90, 0x84, - 0xA0, 0x52, 0x06, 0xA2, 0xA2, 0xD1, 0x46, 0x60, 0x09, 0x64, 0x90, 0x84, 0xA0, 0x50, 0xF2, 0xF4, - 0x31, 0x60, 0x18, 0x7C, 0x63, 0x40, 0x01, 0x26, 0x08, 0x00, 0xA4, 0xD3, 0xFF, 0xFF, 0x01, 0xB4, - 0xFF, 0xFF, 0x03, 0x02, 0xAD, 0x4F, 0xFE, 0xB4, 0xA0, 0x5D, 0x02, 0xEE, 0xBD, 0xFE, 0xBE, 0x01, - 0x21, 0x46, 0x5E, 0x62, 0x9A, 0xFF, 0x07, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x06, 0x25, 0x10, 0x00, - 0xA2, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x62, 0x62, 0x01, 0x5D, 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, - 0x7A, 0xDC, 0x44, 0xFF, 0x06, 0x25, 0x04, 0x00, 0x0E, 0xE1, 0x02, 0x60, 0x01, 0xE1, 0x9E, 0x01, - 0x62, 0xFF, 0xC4, 0xE2, 0x41, 0xFF, 0x0A, 0xE1, 0x99, 0x01, 0xC8, 0x74, 0xCD, 0xE2, 0x29, 0x44, - 0x08, 0xBC, 0x40, 0x49, 0x05, 0xE1, 0x31, 0x60, 0x1A, 0x63, 0xA3, 0xD3, 0xF2, 0xF3, 0x06, 0x18, - 0x28, 0x40, 0x08, 0x2A, 0x05, 0x00, 0x28, 0x40, 0x48, 0x36, 0x02, 0x00, 0x02, 0xBC, 0xF2, 0xFB, - 0x3F, 0x40, 0x01, 0x2B, 0xFF, 0xFF, 0xA1, 0xFF, 0x67, 0x4C, 0x06, 0x61, 0xCD, 0x81, 0x04, 0x25, - 0x30, 0x00, 0x87, 0x4C, 0xFB, 0x02, 0x28, 0x40, 0x40, 0x2B, 0x02, 0x00, 0x15, 0x60, 0x6F, 0x6B, - 0xF3, 0x60, 0xA0, 0x64, 0x04, 0x25, 0x25, 0x00, 0x80, 0x4C, 0x30, 0x64, 0x3A, 0xDB, 0x44, 0xFF, - 0x04, 0x25, 0x1F, 0x00, 0x04, 0x60, 0x00, 0x65, 0x25, 0x44, 0x37, 0x36, 0xB4, 0x84, 0x6E, 0x36, - 0xB4, 0x84, 0x80, 0x4E, 0x24, 0x41, 0x04, 0x25, 0x14, 0x00, 0x61, 0x4C, 0x64, 0xA1, 0x61, 0x54, - 0xA1, 0xFF, 0xFF, 0xFF, 0x04, 0x25, 0x0D, 0x00, 0x67, 0x4E, 0x07, 0x64, 0x1C, 0xFB, 0x00, 0xE1, - 0x02, 0x60, 0x01, 0xE1, 0x53, 0x01, 0x33, 0xF3, 0xFD, 0x11, 0xFC, 0x18, 0x40, 0x64, 0x3A, 0xDB, - 0x0A, 0x00, 0xC4, 0xE2, 0x27, 0x44, 0x20, 0x2A, 0x04, 0x00, 0x42, 0x64, 0x3A, 0xDB, 0x67, 0x4C, - 0x02, 0x00, 0x41, 0x64, 0x3A, 0xDB, 0x62, 0xFF, 0x08, 0xE1, 0xE2, 0xFE, 0x72, 0x52, 0x5C, 0x49, - 0x32, 0x7B, 0x4D, 0xE2, 0x3B, 0x01, 0x08, 0xE1, 0x39, 0x01, 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, - 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x02, 0x02, 0xA1, 0xFF, 0xFF, 0xFF, 0x82, 0xFF, 0x88, 0xFF, - 0x48, 0xE2, 0x01, 0x70, 0xCE, 0xF1, 0x00, 0x6B, 0x89, 0xFF, 0x64, 0x54, 0x88, 0xFF, 0x9F, 0xFE, - 0x02, 0x05, 0x64, 0x44, 0x60, 0x54, 0xCD, 0xE2, 0xC2, 0x64, 0x3A, 0xDB, 0xBC, 0xFF, 0xB5, 0xFF, - 0x1D, 0xFF, 0x26, 0x44, 0x02, 0xB4, 0x40, 0x46, 0x3C, 0x44, 0x00, 0xBC, 0xFF, 0xFF, 0x06, 0x03, - 0x27, 0x40, 0x26, 0x22, 0x03, 0x00, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x27, 0x44, 0x20, 0x2A, - 0x04, 0x00, 0xA0, 0x60, 0x00, 0xEA, 0xB0, 0x60, 0x00, 0xEA, 0x5C, 0x4D, 0x27, 0x44, 0x18, 0xB4, - 0x40, 0x47, 0x00, 0xE1, 0x6C, 0x40, 0x44, 0xE2, 0xC4, 0xE2, 0x47, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, - 0x32, 0xF1, 0x08, 0x29, 0x09, 0x00, 0x64, 0x40, 0x07, 0x22, 0x06, 0x00, 0x43, 0xFF, 0x27, 0x44, - 0x10, 0xBC, 0x40, 0x47, 0x00, 0x64, 0x32, 0xFB, 0x31, 0x41, 0x3C, 0x44, 0x01, 0xB1, 0x00, 0xBC, - 0x0A, 0x02, 0x09, 0x03, 0x32, 0xF3, 0x00, 0x7C, 0x01, 0xB4, 0xFF, 0xFF, 0x04, 0x03, 0x32, 0xF9, - 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x48, 0x60, 0x2D, 0x7D, 0x08, 0x60, 0x00, 0x6B, 0x00, 0x64, - 0x33, 0xFB, 0x0C, 0x60, 0x16, 0x64, 0xA0, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x32, 0xF3, 0x08, 0x29, - 0x0A, 0x00, 0x60, 0x40, 0x07, 0x22, 0x07, 0x00, 0xFE, 0xB4, 0x32, 0xFB, 0x27, 0x44, 0x10, 0xBC, - 0xF7, 0xB4, 0x40, 0x47, 0x43, 0xFF, 0x00, 0x64, 0x3A, 0xDB, 0x01, 0x60, 0x08, 0xE1, 0x31, 0x40, - 0x01, 0x2A, 0x04, 0x00, 0x00, 0x64, 0x33, 0xFB, 0x01, 0x60, 0x0A, 0xE1, 0xE5, 0xFE, 0x1D, 0x05, - 0x27, 0x44, 0x10, 0x26, 0x1D, 0x00, 0x9F, 0xFE, 0x02, 0x04, 0x02, 0xE1, 0x10, 0x00, 0x3E, 0xE1, - 0x31, 0x44, 0x01, 0x2A, 0x0C, 0x00, 0x0E, 0x0A, 0x28, 0x44, 0x04, 0x27, 0x07, 0x00, 0xD4, 0x36, - 0x05, 0x00, 0xC4, 0x36, 0x03, 0x00, 0xAE, 0x4F, 0xF7, 0xB4, 0xA0, 0x5E, 0xBF, 0xE1, 0xA1, 0xFF, - 0xFF, 0xFF, 0x81, 0x3E, 0xAB, 0x60, 0x2C, 0x78, 0xFF, 0xFF, 0xA3, 0x60, 0xEC, 0x78, 0xFF, 0xFF, - 0x27, 0x44, 0x08, 0x26, 0xFF, 0xFF, 0xBA, 0x60, 0x70, 0x78, 0xFF, 0xFF, 0x48, 0xF3, 0x32, 0xF1, - 0x00, 0x63, 0x64, 0x40, 0x03, 0x22, 0x66, 0x00, 0x31, 0x40, 0x08, 0x26, 0xF4, 0x01, 0xCD, 0xE2, - 0x84, 0xE1, 0x70, 0x41, 0xAD, 0x80, 0x71, 0x40, 0x80, 0x27, 0xED, 0x12, 0x03, 0x03, 0xBA, 0x60, - 0xE7, 0x78, 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0xC4, 0xE2, 0x32, 0xFD, 0x60, 0x40, 0x01, 0x2A, - 0xDF, 0x01, 0x00, 0x63, 0x32, 0xFD, 0x6C, 0x40, 0x3C, 0x46, 0x3E, 0xF2, 0x2A, 0xF0, 0x27, 0x41, - 0x44, 0x48, 0x20, 0xB9, 0x01, 0xB4, 0xF7, 0xB1, 0x0A, 0x03, 0x64, 0x40, 0x08, 0x27, 0x07, 0x00, - 0x0F, 0x60, 0x92, 0x63, 0x00, 0x64, 0x45, 0xFB, 0x46, 0xFB, 0xBD, 0xDB, 0xA3, 0xDB, 0xCB, 0x0A, - 0x31, 0x60, 0x0E, 0x7C, 0xA4, 0xD3, 0xFF, 0xFF, 0x17, 0x18, 0x28, 0x40, 0xD4, 0x36, 0x14, 0x00, - 0xAC, 0x4C, 0x80, 0x2A, 0x11, 0x00, 0x31, 0x60, 0x14, 0x7C, 0xA4, 0xD3, 0xFF, 0xFF, 0x0C, 0x18, - 0x31, 0x60, 0x16, 0x7C, 0xA4, 0xD3, 0x31, 0x60, 0x10, 0x7C, 0xA4, 0xD3, 0x60, 0x45, 0xD4, 0x80, - 0xDC, 0x84, 0x02, 0x03, 0xA4, 0xDB, 0xAF, 0x01, 0x31, 0x60, 0x10, 0x7C, 0x00, 0x64, 0xA4, 0xDB, - 0x41, 0x47, 0x3F, 0x40, 0x01, 0x2B, 0x0D, 0x00, 0xF6, 0xFE, 0x67, 0x4C, 0x05, 0x60, 0x69, 0x6B, - 0x31, 0x60, 0x0E, 0x7C, 0xA4, 0xD3, 0xFF, 0xFF, 0x04, 0x18, 0xAE, 0x4F, 0x08, 0xBC, 0x00, 0x7F, - 0xA0, 0x5E, 0x02, 0xE1, 0x01, 0x60, 0x08, 0xE1, 0xF0, 0xFE, 0x84, 0xFF, 0xBB, 0x60, 0x18, 0x64, - 0x40, 0x42, 0x82, 0xFF, 0xE5, 0xFE, 0x03, 0x04, 0xA8, 0x60, 0x24, 0x78, 0xFF, 0xFF, 0xE4, 0xFE, - 0x0A, 0x04, 0x1D, 0xFF, 0x00, 0xEB, 0x60, 0x7F, 0xA0, 0x5A, 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, - 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0x43, 0xFF, 0xE6, 0xFE, 0x03, 0x05, 0xA3, 0x60, 0x4B, 0x78, - 0xFF, 0xFF, 0x3C, 0x44, 0x60, 0x46, 0x0F, 0xF0, 0x40, 0x42, 0x64, 0x40, 0x01, 0x2A, 0x03, 0x00, - 0xA6, 0x60, 0xB1, 0x78, 0xFF, 0xFF, 0x0B, 0x64, 0x3A, 0xDB, 0x1C, 0x42, 0x22, 0x46, 0x13, 0xF2, - 0xFF, 0x65, 0x60, 0x47, 0x2A, 0xF2, 0x40, 0x45, 0x40, 0x48, 0x04, 0x2B, 0x17, 0x00, 0x16, 0xF2, - 0x1D, 0xF2, 0x40, 0x43, 0x0F, 0xF2, 0x40, 0x44, 0x25, 0x5E, 0x3F, 0x40, 0x01, 0x27, 0x40, 0x45, - 0x0F, 0x64, 0x14, 0xF0, 0x35, 0xF2, 0xA0, 0x82, 0x0F, 0xB4, 0xCA, 0x85, 0xD4, 0x80, 0x10, 0xF2, - 0x01, 0x02, 0x2B, 0xFA, 0x27, 0x44, 0x40, 0xBC, 0x40, 0x47, 0x13, 0x00, 0x17, 0xF2, 0x2C, 0xF0, - 0x40, 0x43, 0x1B, 0xF2, 0x1D, 0xFA, 0x40, 0x44, 0x64, 0x40, 0x01, 0x2A, 0x02, 0x00, 0xAB, 0xFC, - 0x05, 0x00, 0x28, 0x40, 0xA4, 0x36, 0x02, 0x00, 0x11, 0xF2, 0x2B, 0xFA, 0x27, 0x44, 0xBF, 0xB4, - 0x40, 0x47, 0x28, 0x40, 0x40, 0x2B, 0xFF, 0xFF, 0xAB, 0x60, 0x4A, 0x78, 0xFF, 0xFF, 0x22, 0x46, - 0x2C, 0xF0, 0x27, 0x44, 0xDF, 0xB4, 0x40, 0x47, 0xB5, 0xFF, 0xBC, 0xFF, 0x47, 0xFF, 0xB7, 0xFF, - 0xB4, 0xFF, 0x48, 0x60, 0x2D, 0x7D, 0x08, 0x60, 0x00, 0x6B, 0x64, 0x40, 0x01, 0x2A, 0x09, 0x00, - 0x28, 0x44, 0x04, 0x27, 0x05, 0x00, 0xD4, 0x3A, 0x03, 0x00, 0xAE, 0x4F, 0xF7, 0xB4, 0xA0, 0x5E, - 0x1B, 0x00, 0x2A, 0xF0, 0x01, 0x65, 0x64, 0x40, 0xA4, 0x3A, 0x04, 0x65, 0x27, 0x44, 0x34, 0x87, - 0x36, 0xF3, 0xB4, 0xFF, 0x60, 0x5B, 0x4D, 0xE2, 0x04, 0x64, 0x3A, 0xDB, 0x01, 0x60, 0x0A, 0xE1, - 0x28, 0x44, 0x04, 0x27, 0x05, 0x00, 0xD4, 0x3A, 0x03, 0x00, 0xAE, 0x4F, 0xF7, 0xB4, 0xA0, 0x5E, - 0x2B, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x06, 0x64, 0x3A, 0xDB, 0x22, 0x46, 0x01, 0x64, - 0x31, 0xFB, 0xC0, 0xFE, 0xBA, 0x60, 0xF0, 0x78, 0xFF, 0xFF, 0xB5, 0xFF, 0xA1, 0xFF, 0x6C, 0x40, - 0x3F, 0x40, 0x01, 0x2B, 0x03, 0x00, 0x67, 0x4C, 0x05, 0x60, 0x69, 0x6B, 0x02, 0xE1, 0x01, 0x60, - 0x08, 0xE1, 0xC4, 0xE2, 0x08, 0x64, 0x3A, 0xDB, 0xF0, 0xFE, 0x25, 0x46, 0x01, 0xF2, 0x61, 0x45, - 0xD4, 0x9E, 0x21, 0x46, 0x16, 0xFA, 0x2A, 0x44, 0x72, 0x45, 0x24, 0xFA, 0xB5, 0xF3, 0x06, 0x04, - 0xE4, 0xE2, 0xDC, 0x9C, 0x29, 0x40, 0x01, 0x26, 0x64, 0x44, 0xB5, 0xF9, 0x25, 0xFA, 0xB6, 0xF3, - 0x02, 0x04, 0xDC, 0x84, 0xB6, 0xFB, 0x28, 0xFA, 0xB7, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0xB7, 0xFB, - 0x29, 0xFA, 0x2D, 0x44, 0x04, 0x2A, 0x06, 0x00, 0x28, 0x40, 0xA4, 0x36, 0x03, 0x00, 0xA5, 0x60, - 0x77, 0x78, 0xFF, 0xFF, 0x26, 0x43, 0x84, 0xBB, 0xFC, 0xB3, 0x21, 0x46, 0x01, 0x5D, 0x0F, 0xFC, - 0x5C, 0x46, 0x25, 0x44, 0x06, 0xFA, 0x05, 0xFF, 0x27, 0x44, 0x01, 0x2A, 0x13, 0x00, 0x50, 0xFE, - 0x28, 0x40, 0x08, 0x3A, 0x12, 0x00, 0x2F, 0xF2, 0x30, 0xF0, 0x60, 0x43, 0x31, 0xF2, 0x22, 0x46, - 0x64, 0x41, 0x2C, 0xF0, 0x2D, 0xF0, 0xD3, 0x80, 0x2E, 0xF0, 0xD1, 0x80, 0xD0, 0x80, 0x27, 0x44, - 0x09, 0x0C, 0x03, 0x00, 0x27, 0x44, 0x06, 0x22, 0x05, 0x00, 0xB8, 0xB4, 0x40, 0x47, 0x02, 0x64, - 0x31, 0xFB, 0xC0, 0xFE, 0xD4, 0x64, 0x40, 0x48, 0x0D, 0x64, 0x3A, 0xDB, 0x31, 0x60, 0x12, 0x7C, - 0x7C, 0x44, 0xA4, 0xDB, 0x21, 0x46, 0x1C, 0xF2, 0x7C, 0xF1, 0xFF, 0xB4, 0xD0, 0x80, 0xFF, 0xFF, - 0x01, 0x06, 0x64, 0x44, 0x40, 0x45, 0x0A, 0x36, 0x70, 0x64, 0x14, 0x36, 0x38, 0x64, 0x37, 0x3A, - 0x03, 0x00, 0x04, 0x7F, 0x40, 0x45, 0x15, 0x64, 0x6E, 0x3A, 0x03, 0x00, 0x84, 0x7F, 0x40, 0x45, - 0x0B, 0x64, 0x40, 0x44, 0x00, 0x63, 0x28, 0x44, 0xA4, 0x36, 0x0B, 0x00, 0x04, 0x2B, 0x09, 0x00, - 0x30, 0xF3, 0x24, 0x45, 0xD4, 0x84, 0xCA, 0x65, 0xD4, 0x83, 0x31, 0x60, 0x12, 0x7C, 0x01, 0x64, - 0xA4, 0xDB, 0xD4, 0x64, 0x1A, 0x00, 0x0F, 0x64, 0x3A, 0xDB, 0x21, 0x46, 0x70, 0x63, 0x1C, 0xF2, - 0xCA, 0x65, 0x40, 0x45, 0x0A, 0x36, 0x70, 0x64, 0x14, 0x36, 0x38, 0x64, 0x37, 0x3A, 0x03, 0x00, - 0x04, 0x7F, 0x40, 0x45, 0x15, 0x64, 0x6E, 0x3A, 0x03, 0x00, 0x84, 0x7F, 0x40, 0x45, 0x0B, 0x64, - 0x40, 0x44, 0x2B, 0xF2, 0xC4, 0x85, 0xD4, 0x83, 0xC4, 0x64, 0x40, 0x48, 0x2F, 0xF0, 0xB0, 0xF0, - 0xB1, 0xF2, 0x00, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x80, 0x4E, 0x83, 0x4C, 0x9A, 0xFF, 0x84, 0x4C, - 0x85, 0x4C, 0x81, 0x4C, 0xA1, 0xFF, 0x98, 0xFF, 0x87, 0x4F, 0x87, 0x4C, 0x87, 0x4F, 0x87, 0x4D, - 0x87, 0x4C, 0x01, 0x08, 0x01, 0x00, 0xFF, 0xFF, 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, - 0xFF, 0xFF, 0xFF, 0xFF, 0x6A, 0x44, 0xBC, 0xFF, 0xC4, 0xE2, 0x0C, 0x74, 0x04, 0xE1, 0xA1, 0xFF, - 0x35, 0xF3, 0xC4, 0xE2, 0x60, 0x54, 0x89, 0xFF, 0x13, 0x74, 0x88, 0xFF, 0xB5, 0xFF, 0x47, 0xFF, - 0x29, 0x44, 0xF7, 0xB4, 0x40, 0x49, 0xB7, 0xFF, 0xB4, 0xFF, 0x48, 0x60, 0x2D, 0x7D, 0x08, 0x60, - 0x00, 0x6B, 0x28, 0x40, 0xC4, 0x36, 0x08, 0x00, 0x31, 0x60, 0x12, 0x7C, 0xA4, 0xD3, 0xFF, 0xFF, - 0x03, 0x1B, 0xAE, 0x4F, 0xF7, 0xB4, 0xA0, 0x5E, 0x27, 0x44, 0x01, 0x2A, 0x05, 0x00, 0xFE, 0xB4, - 0x40, 0x47, 0xA4, 0x60, 0x7C, 0x78, 0xFF, 0xFF, 0xA3, 0x60, 0x3E, 0x78, 0xFF, 0xFF, 0x28, 0x40, - 0xB4, 0x3A, 0x09, 0x00, 0x27, 0x44, 0x07, 0x22, 0x05, 0x00, 0xF8, 0xB4, 0x40, 0x47, 0x02, 0x64, - 0x31, 0xFB, 0xC0, 0xFE, 0x90, 0x01, 0x28, 0x44, 0xD4, 0x36, 0x03, 0x00, 0xA6, 0x60, 0x98, 0x78, - 0xFF, 0xFF, 0x48, 0xE2, 0x27, 0x44, 0xFB, 0xB4, 0x40, 0x47, 0x2D, 0x60, 0x5A, 0x63, 0xA3, 0xD3, - 0xB0, 0x60, 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0x34, 0xFB, 0x1C, 0x42, 0x22, 0x46, 0x2A, 0xF0, - 0xF7, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDA, 0x60, 0x40, 0x40, 0x2B, 0xCC, 0x00, 0x22, 0xF2, - 0xFF, 0xFF, 0x60, 0x40, 0x22, 0x26, 0x42, 0x00, 0x01, 0x26, 0x03, 0x00, 0x04, 0x26, 0x07, 0x00, - 0xC2, 0x00, 0x04, 0x2B, 0xC0, 0x00, 0xA9, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0x01, 0x00, 0x07, 0xF4, - 0x47, 0xF2, 0xFF, 0xFF, 0xDC, 0x84, 0x47, 0xFA, 0x0D, 0x60, 0x3E, 0x62, 0x80, 0xFF, 0xBE, 0x60, - 0x78, 0x44, 0x02, 0xA4, 0xA2, 0xDB, 0xDE, 0x78, 0xFF, 0xFF, 0x82, 0xFF, 0xA9, 0xF3, 0x66, 0x5C, - 0xD0, 0x80, 0x00, 0x7C, 0x07, 0x03, 0x66, 0x43, 0x22, 0x46, 0x22, 0xF2, 0x63, 0x46, 0x60, 0x40, - 0x01, 0x2A, 0x01, 0x00, 0x3C, 0xF1, 0x47, 0xF0, 0x64, 0x41, 0x64, 0x47, 0xFF, 0xB4, 0x60, 0x5F, - 0x20, 0xBC, 0x80, 0x26, 0x80, 0xAC, 0x60, 0x47, 0x22, 0x46, 0x3A, 0xFA, 0x64, 0x44, 0x20, 0x7F, - 0x34, 0x94, 0x3B, 0xFA, 0x08, 0x60, 0x00, 0xEA, 0x0F, 0x64, 0x60, 0x7F, 0xA0, 0x5A, 0x80, 0x60, - 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0x85, 0x00, 0x2A, 0xF2, 0x00, 0x60, - 0x7C, 0x62, 0x60, 0x40, 0x40, 0x2B, 0x27, 0x00, 0xA2, 0xD3, 0x00, 0x61, 0x60, 0xFE, 0xA0, 0xD3, - 0xDE, 0x82, 0xA2, 0xD1, 0xFF, 0xFF, 0x20, 0xFE, 0x64, 0x5F, 0xDC, 0x84, 0xF1, 0x81, 0xC0, 0x2B, - 0x04, 0x00, 0x80, 0x2A, 0x02, 0x00, 0x7F, 0xA4, 0xDC, 0x84, 0xFF, 0x3B, 0x03, 0x00, 0x60, 0x47, - 0xDC, 0x87, 0x01, 0x61, 0xC0, 0x80, 0x00, 0x36, 0xDC, 0x84, 0x4E, 0xDB, 0x60, 0xFE, 0xDA, 0x82, - 0xA2, 0xD1, 0xFF, 0xFF, 0xC1, 0x84, 0xF0, 0x22, 0x10, 0xA4, 0xF0, 0x2A, 0x01, 0x00, 0x00, 0x64, - 0xA2, 0xDB, 0xFF, 0xFF, 0x20, 0xFE, 0x00, 0x60, 0x7C, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xA0, 0xD3, - 0x5A, 0xD1, 0x3A, 0xFA, 0x3B, 0xF8, 0x74, 0x62, 0xA2, 0xD0, 0xFF, 0xFF, 0x64, 0x44, 0xE0, 0x7F, - 0xA0, 0x5A, 0x64, 0x47, 0xE1, 0x7F, 0x5A, 0xD0, 0xA0, 0x5A, 0x64, 0x44, 0xE2, 0x7F, 0xA0, 0x5A, - 0x00, 0x60, 0x80, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xA0, 0xD1, 0x5A, 0xD1, 0x64, 0x45, 0x64, 0x44, - 0xE3, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xE4, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xE5, 0x7F, - 0xA0, 0x5A, 0x64, 0x47, 0xE6, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xE7, 0x7F, 0xA0, 0x5A, - 0x65, 0x40, 0x0D, 0x3A, 0x1C, 0x00, 0x64, 0x47, 0xE8, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, - 0xE9, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xEA, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xEB, 0x7F, - 0xA0, 0x5A, 0x64, 0x47, 0xEC, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xED, 0x7F, 0xA0, 0x5A, - 0x64, 0x47, 0xEE, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xEF, 0x7F, 0xA0, 0x5A, 0x08, 0x60, - 0x00, 0xEA, 0x65, 0x44, 0x02, 0xA4, 0x60, 0x7F, 0xA0, 0x5A, 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, - 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0x0B, 0xF2, 0xFF, 0xFF, 0x7F, 0xB4, 0x0C, 0xF0, 0x04, 0x02, - 0x64, 0x46, 0x00, 0xF0, 0x04, 0x64, 0x22, 0x46, 0x03, 0xFA, 0x60, 0x41, 0x64, 0x46, 0x01, 0xF2, - 0xFC, 0xA1, 0x61, 0x45, 0xD4, 0x84, 0xFF, 0xFF, 0x08, 0x02, 0x00, 0xF0, 0x04, 0x63, 0x64, 0x46, - 0x01, 0xF2, 0x22, 0x46, 0x1A, 0xFA, 0x03, 0xFC, 0x02, 0x00, 0x22, 0x46, 0x1A, 0xFA, 0x35, 0xF2, - 0x04, 0xF8, 0xDC, 0x84, 0x35, 0xFA, 0x14, 0xF2, 0x0F, 0xB5, 0x0F, 0xB4, 0xCC, 0x84, 0x94, 0x80, - 0x04, 0x60, 0x00, 0x65, 0x2A, 0xF2, 0x01, 0x02, 0x94, 0x84, 0x2A, 0xFA, 0x95, 0xFC, 0x06, 0x00, - 0xC4, 0x3A, 0x07, 0x00, 0x27, 0x44, 0xFD, 0xB4, 0x40, 0x47, 0x48, 0xE2, 0xA4, 0x60, 0x0B, 0x78, - 0xFF, 0xFF, 0x28, 0x44, 0x04, 0x26, 0x05, 0x00, 0x68, 0x3A, 0x03, 0x00, 0x32, 0x44, 0x00, 0x27, - 0x03, 0x00, 0xA3, 0x60, 0x4B, 0x78, 0xFF, 0xFF, 0x0A, 0x64, 0x3A, 0xDB, 0xA3, 0x60, 0x4B, 0x78, - 0xFF, 0xFF, 0x0E, 0x64, 0x3A, 0xDB, 0x10, 0x60, 0x00, 0x65, 0x3C, 0x46, 0x2A, 0xF2, 0x13, 0xF0, - 0xA4, 0x84, 0xB4, 0xBC, 0x40, 0x48, 0x7C, 0xF1, 0x64, 0x47, 0xFF, 0xB4, 0x60, 0x45, 0xD0, 0x80, - 0x70, 0x61, 0x01, 0x06, 0x64, 0x44, 0x0A, 0x36, 0x70, 0x64, 0x14, 0x36, 0x38, 0x64, 0x37, 0x36, - 0x15, 0x64, 0x6E, 0x36, 0x0B, 0x64, 0x40, 0x4E, 0xA0, 0x63, 0x0A, 0x64, 0x65, 0x40, 0x0A, 0x36, - 0x03, 0x00, 0x38, 0x61, 0x14, 0x64, 0xEB, 0x83, 0x40, 0x45, 0x43, 0x44, 0x02, 0x60, 0x5E, 0x65, - 0x2A, 0xF2, 0x2B, 0xF2, 0x60, 0x40, 0x04, 0x2B, 0x04, 0x00, 0x2E, 0x45, 0xD4, 0x85, 0xC5, 0x84, - 0x05, 0x00, 0x1B, 0xF0, 0xC5, 0x84, 0xC0, 0x84, 0x2E, 0x45, 0xC4, 0x84, 0x60, 0x43, 0x28, 0x44, - 0x00, 0xE1, 0xA1, 0xFF, 0x80, 0x4E, 0x83, 0x4C, 0x9A, 0xFF, 0x56, 0x62, 0x7A, 0xD4, 0x7A, 0xD4, - 0x7A, 0xD4, 0x5C, 0x62, 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0xA1, 0xFF, 0x98, 0xFF, 0x87, 0x4F, - 0x87, 0x4C, 0x87, 0x4F, 0x87, 0x4D, 0x87, 0x4C, 0x01, 0x08, 0x01, 0x00, 0xFF, 0xFF, 0x87, 0x4C, - 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0x6A, 0x44, 0xBC, 0xFF, 0xB5, 0xFF, - 0x47, 0xFF, 0x27, 0x44, 0x02, 0xBC, 0x40, 0x47, 0x36, 0xF3, 0xB7, 0xFF, 0xB4, 0xFF, 0x48, 0x60, - 0x2D, 0x7D, 0x08, 0x60, 0x00, 0x6B, 0x60, 0x5B, 0x4D, 0xE2, 0xA4, 0x60, 0x6C, 0x78, 0xFF, 0xFF, - 0x21, 0x46, 0xB5, 0xFF, 0xBC, 0xFF, 0x47, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0x48, 0x60, 0x2D, 0x7D, - 0x08, 0x60, 0x00, 0x6B, 0x28, 0x44, 0x04, 0x27, 0x09, 0x00, 0xD4, 0x36, 0x04, 0x00, 0x0C, 0x22, - 0x02, 0x00, 0x0C, 0x3A, 0x03, 0x00, 0xAE, 0x4F, 0xF7, 0xB4, 0xA0, 0x5E, 0x26, 0x43, 0x25, 0x44, - 0x06, 0xFA, 0x2A, 0x44, 0x72, 0x45, 0x24, 0xFA, 0xB5, 0xF3, 0x06, 0x04, 0xE4, 0xE2, 0xDC, 0x9C, - 0x29, 0x40, 0x01, 0x26, 0x64, 0x44, 0xB5, 0xF9, 0x25, 0xFA, 0xB6, 0xF3, 0x02, 0x04, 0xDC, 0x84, - 0xB6, 0xFB, 0x28, 0xFA, 0xB7, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0xB7, 0xFB, 0x29, 0xFA, 0x2D, 0x40, - 0x01, 0x2A, 0x0E, 0x00, 0x1D, 0xFF, 0x26, 0x44, 0x02, 0xBC, 0x40, 0x46, 0x27, 0x44, 0x07, 0x22, - 0x05, 0x00, 0xF8, 0xB4, 0x40, 0x47, 0x06, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x30, 0xF1, 0x76, 0x00, - 0xFC, 0xB3, 0x32, 0x40, 0x01, 0x2A, 0x06, 0x00, 0x0A, 0xBB, 0x0F, 0xFC, 0xCB, 0xFE, 0xA3, 0x60, - 0x4B, 0x78, 0xFF, 0xFF, 0x2D, 0x44, 0x04, 0x26, 0x28, 0x00, 0x0F, 0xFC, 0x05, 0xFF, 0xDC, 0xF3, - 0x28, 0x40, 0x80, 0x3A, 0x22, 0x00, 0x60, 0x40, 0x03, 0x3A, 0x1F, 0x00, 0x32, 0xF2, 0x81, 0xF1, - 0x33, 0xF2, 0xD0, 0x80, 0x82, 0xF1, 0x19, 0x02, 0xD0, 0x80, 0x34, 0xF2, 0x83, 0xF1, 0x15, 0x02, - 0xD0, 0x80, 0x3C, 0x44, 0x12, 0x02, 0xAC, 0x86, 0xBB, 0xFE, 0x0F, 0x03, 0x2A, 0xF2, 0x21, 0x46, - 0x60, 0x40, 0x80, 0x3A, 0x0A, 0x00, 0x01, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x00, 0x64, 0x32, 0xFB, - 0x84, 0xFF, 0xBB, 0x60, 0x18, 0x64, 0x40, 0x42, 0x82, 0xFF, 0x30, 0xF1, 0x27, 0x44, 0x05, 0x22, - 0x2D, 0x00, 0xFA, 0xB4, 0x40, 0x47, 0x2D, 0x44, 0x10, 0x2A, 0x24, 0x00, 0x28, 0x40, 0xD4, 0x3A, - 0x21, 0x00, 0x31, 0x40, 0x08, 0x26, 0x00, 0x7C, 0x2B, 0x44, 0xD0, 0x80, 0x70, 0x45, 0x02, 0x28, - 0x64, 0x44, 0xC4, 0x84, 0xFF, 0xFF, 0x04, 0x24, 0x00, 0xB4, 0x60, 0x50, 0x08, 0x28, 0x01, 0x00, - 0x20, 0x29, 0x6D, 0xE2, 0x1C, 0x60, 0x9A, 0x63, 0x1D, 0xF0, 0xC0, 0x64, 0xC0, 0x84, 0xA3, 0xD1, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xC0, 0x84, 0xA3, 0xDB, 0xA4, 0x60, - 0x7C, 0x78, 0xFF, 0xFF, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x07, 0x00, 0x02, 0x2A, 0x05, 0x00, - 0xFD, 0xB4, 0x40, 0x47, 0x06, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x05, 0x64, 0x3A, 0xDB, 0x28, 0x44, - 0xA4, 0x3A, 0x04, 0x00, 0x39, 0xF1, 0x25, 0x44, 0x0A, 0x36, 0x38, 0xF1, 0x31, 0x40, 0x08, 0x26, - 0x00, 0x7C, 0x2B, 0x44, 0xD0, 0x80, 0x70, 0x45, 0x02, 0x28, 0x64, 0x44, 0xC4, 0x84, 0xFF, 0xFF, - 0x04, 0x24, 0x00, 0xB4, 0x28, 0x40, 0xE4, 0x36, 0x00, 0xB4, 0x60, 0x50, 0x08, 0x28, 0x01, 0x00, - 0x20, 0x29, 0x6D, 0xE2, 0xA3, 0x60, 0x3E, 0x78, 0xFF, 0xFF, 0x21, 0x46, 0xB5, 0xFF, 0xBC, 0xFF, - 0x47, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0x48, 0x60, 0x2D, 0x7D, 0x08, 0x60, 0x00, 0x6B, 0xAE, 0x4F, - 0xF7, 0xB4, 0xA0, 0x5E, 0x27, 0x44, 0x07, 0x22, 0x05, 0x00, 0xF8, 0xB4, 0x40, 0x47, 0x06, 0x64, - 0x31, 0xFB, 0xC0, 0xFE, 0xE7, 0x01, 0x27, 0x44, 0x05, 0x22, 0x09, 0x00, 0xBA, 0xB4, 0x40, 0x47, - 0x3C, 0x46, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0xA3, 0x60, 0x4B, 0x78, 0xFF, 0xFF, 0x27, 0x44, - 0x02, 0x2A, 0x06, 0x00, 0xFD, 0xB4, 0x40, 0x47, 0x06, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0xF4, 0x01, - 0xF3, 0x0A, 0x7C, 0x50, 0x6D, 0xE2, 0xF0, 0x01, 0x72, 0x45, 0xDC, 0x84, 0xB5, 0xFB, 0x11, 0x64, - 0x3A, 0xDB, 0xB6, 0xF3, 0x06, 0x04, 0xDC, 0x84, 0xB6, 0xFB, 0xB7, 0xF3, 0x02, 0x04, 0xDC, 0x84, - 0xB7, 0xFB, 0xA3, 0x60, 0x56, 0x78, 0xFF, 0xFF, 0x00, 0x61, 0x12, 0x64, 0x3A, 0xDB, 0x1E, 0x60, - 0xFE, 0x63, 0xBD, 0xD3, 0x72, 0x45, 0x44, 0x8A, 0x02, 0x28, 0x02, 0x00, 0xE4, 0xE2, 0xDD, 0x81, - 0x02, 0x28, 0x02, 0x00, 0xE4, 0xE2, 0xDD, 0x81, 0xBD, 0xD3, 0xB5, 0xF1, 0x61, 0x45, 0xC0, 0x84, - 0x00, 0x61, 0x02, 0x24, 0x01, 0xB9, 0xC4, 0x84, 0x60, 0x55, 0x2A, 0x52, 0xB5, 0xFB, 0x02, 0x24, - 0x01, 0xB9, 0xBD, 0xD3, 0xB6, 0xF1, 0x61, 0x45, 0xC0, 0x84, 0x00, 0x61, 0x02, 0x24, 0x01, 0xB9, - 0xC4, 0x84, 0xB6, 0xFB, 0x02, 0x24, 0x01, 0xB9, 0xBD, 0xD3, 0xB7, 0xF1, 0x61, 0x45, 0xC0, 0x84, - 0xC4, 0x84, 0xB7, 0xFB, 0xA3, 0x60, 0xEF, 0x78, 0xFF, 0xFF, 0x31, 0x40, 0x04, 0x0A, 0xAE, 0x4F, - 0xF7, 0xB4, 0xA0, 0x5E, 0x09, 0x00, 0x31, 0x60, 0x0E, 0x7C, 0xA4, 0xD3, 0xFF, 0xFF, 0x04, 0x18, - 0xAE, 0x4F, 0x08, 0xBC, 0x00, 0x7F, 0xA0, 0x5E, 0x9F, 0x01, 0xA1, 0xFF, 0xFF, 0xFF, 0x01, 0x25, - 0x09, 0x00, 0x04, 0x25, 0x03, 0x00, 0x47, 0xFF, 0x32, 0x74, 0x96, 0x01, 0xC4, 0xE2, 0xAB, 0x60, - 0x2C, 0x78, 0xFF, 0xFF, 0x4C, 0x4E, 0x47, 0xFF, 0x31, 0x60, 0x0E, 0x7C, 0xA4, 0xD3, 0xFF, 0xFF, - 0x04, 0x18, 0xAE, 0x4F, 0x08, 0xBC, 0x00, 0x7F, 0xA0, 0x5E, 0x32, 0x74, 0xCD, 0xE2, 0xA8, 0x60, - 0x8A, 0x78, 0x00, 0x61, 0x10, 0x64, 0x3A, 0xDB, 0xA3, 0x60, 0x4B, 0x78, 0xFF, 0xFF, 0xA3, 0x60, - 0x4B, 0x78, 0xFF, 0xFF, 0x5C, 0x4D, 0x26, 0x44, 0x02, 0x26, 0x0C, 0x00, 0x3E, 0x46, 0x09, 0xF2, - 0x1E, 0x41, 0x03, 0x1B, 0xAA, 0x60, 0xDB, 0x78, 0xFF, 0xFF, 0x40, 0x5E, 0xFD, 0xFB, 0x21, 0x44, - 0x02, 0x64, 0x40, 0x46, 0x41, 0x5D, 0x21, 0x46, 0x00, 0xF2, 0x46, 0x45, 0x87, 0xFC, 0x4C, 0xE2, - 0x01, 0x64, 0x33, 0xFB, 0x01, 0x60, 0x0E, 0xE1, 0x03, 0xE1, 0x3F, 0x40, 0x01, 0x27, 0x00, 0x00, - 0x21, 0x69, 0xB6, 0xFF, 0xA1, 0xFF, 0x6C, 0x5E, 0xB6, 0xFF, 0xB7, 0xFF, 0x60, 0x5C, 0x20, 0x64, - 0x3A, 0xDB, 0x68, 0x43, 0x26, 0xFC, 0x22, 0x69, 0x64, 0x44, 0xA1, 0xFF, 0xFF, 0xFF, 0x6C, 0x5F, - 0x60, 0x43, 0x26, 0xF2, 0xFF, 0xFF, 0x68, 0x5F, 0x26, 0xFA, 0x3A, 0x69, 0x1D, 0xFC, 0x2E, 0x44, - 0x36, 0xF1, 0x1C, 0xFA, 0xC3, 0x94, 0xCD, 0xE2, 0x2E, 0x44, 0x14, 0x36, 0x12, 0x00, 0x0A, 0x36, - 0x0F, 0x00, 0x63, 0x45, 0xE3, 0x83, 0xE3, 0x83, 0xC7, 0x83, 0xE3, 0x83, 0xC7, 0x83, 0xFF, 0xFF, - 0x37, 0x36, 0x05, 0x00, 0x6E, 0x36, 0x04, 0x00, 0xAA, 0x60, 0xF3, 0x78, 0xFF, 0xFF, 0xEB, 0x83, - 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0xFF, 0xFF, 0x80, 0x27, 0xCF, 0x83, 0x1B, 0xFC, 0x01, 0x64, - 0x51, 0xFB, 0xA1, 0xFF, 0x1C, 0xF2, 0x29, 0x41, 0xF9, 0x81, 0x52, 0x4A, 0x71, 0x89, 0x68, 0x5F, - 0x27, 0xFA, 0x6C, 0x40, 0x03, 0x15, 0xAB, 0x60, 0x04, 0x78, 0xFF, 0xFF, 0x88, 0x60, 0x85, 0x71, - 0x8D, 0xE2, 0xB9, 0xF1, 0xFC, 0xA3, 0xD3, 0x80, 0x43, 0x43, 0x03, 0x04, 0xAA, 0x60, 0xFB, 0x78, - 0xFF, 0xFF, 0x32, 0x40, 0x01, 0x2A, 0x4C, 0x00, 0x9A, 0xFF, 0x23, 0x43, 0x18, 0x61, 0xA1, 0xFF, - 0x8C, 0x44, 0xCB, 0x83, 0x2A, 0xFA, 0x40, 0x48, 0x40, 0x27, 0x04, 0xA1, 0x60, 0x40, 0x03, 0x2B, - 0x01, 0x00, 0x06, 0xA1, 0x88, 0xB0, 0x88, 0x36, 0xD9, 0x81, 0x62, 0x45, 0x23, 0x44, 0x54, 0x94, - 0x28, 0x40, 0x04, 0x26, 0x00, 0x64, 0x3F, 0xFA, 0xC9, 0x81, 0x65, 0x42, 0x7A, 0xDC, 0x00, 0xB9, - 0xFD, 0x1C, 0x00, 0xF4, 0x6E, 0x61, 0x10, 0x62, 0x14, 0x02, 0x05, 0x1D, 0x12, 0x1E, 0x0C, 0x00, - 0x00, 0xF4, 0x7C, 0x61, 0x02, 0x62, 0x7A, 0xDC, 0x63, 0x40, 0xFD, 0x1C, 0xF9, 0x1D, 0xFF, 0xB1, - 0x08, 0x1E, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x62, 0xB6, 0xFF, 0xB7, 0xFF, 0xA1, 0xFF, 0x6C, 0x44, - 0x5A, 0xDA, 0x98, 0xFF, 0x01, 0x60, 0x08, 0xE1, 0x81, 0xE1, 0xA1, 0xFF, 0x6C, 0x40, 0xA1, 0xFF, - 0x47, 0xFF, 0x26, 0x44, 0xFD, 0xB4, 0x84, 0xBC, 0x01, 0x15, 0x7F, 0xB4, 0x40, 0x46, 0xA1, 0xFF, - 0x6C, 0x40, 0x14, 0x63, 0x01, 0x11, 0x01, 0x00, 0xFD, 0x1F, 0xAA, 0x60, 0x6E, 0x78, 0xFF, 0xFF, - 0x9A, 0xFF, 0x54, 0x63, 0x12, 0x64, 0x40, 0x46, 0x00, 0x64, 0x0F, 0xFA, 0xA1, 0xFF, 0xEB, 0xF1, - 0x12, 0x61, 0x50, 0xFE, 0x2D, 0x60, 0x52, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, - 0x0B, 0x00, 0x8C, 0x45, 0x98, 0xF8, 0x00, 0x64, 0x3A, 0xFA, 0x3B, 0xFA, 0x3C, 0xFA, 0x3D, 0xFA, - 0xBF, 0x60, 0xFF, 0x64, 0xA4, 0x84, 0x01, 0x00, 0x8C, 0x44, 0xEC, 0xF0, 0xBD, 0xDA, 0x40, 0x48, - 0x04, 0x26, 0x40, 0x00, 0xA1, 0xFF, 0x8C, 0x44, 0xBD, 0xDA, 0x30, 0xFB, 0x6C, 0x44, 0xBD, 0xDA, - 0xFF, 0xFF, 0x01, 0x26, 0x24, 0x00, 0xD0, 0x80, 0xA1, 0xFF, 0x8C, 0x44, 0x6C, 0x5C, 0xF2, 0xFE, - 0xBD, 0xDA, 0xED, 0xF3, 0xD4, 0x80, 0xD0, 0x80, 0xBD, 0xD8, 0x2D, 0x44, 0x15, 0x0C, 0x32, 0x40, - 0x02, 0x2A, 0x07, 0x00, 0x28, 0x42, 0x0C, 0xB2, 0x08, 0x3A, 0x03, 0x00, 0x10, 0xBC, 0x40, 0x4D, - 0x4D, 0x00, 0x03, 0x0A, 0xAB, 0x60, 0x09, 0x78, 0xFF, 0xFF, 0x11, 0xBC, 0x40, 0x4D, 0x28, 0x45, - 0xBF, 0x60, 0xFF, 0x64, 0x24, 0x88, 0x42, 0x00, 0x30, 0xBC, 0x40, 0x4D, 0x3F, 0x00, 0x20, 0xB9, - 0x5C, 0x8E, 0xA1, 0xFF, 0x8C, 0x44, 0xBD, 0xDA, 0xDC, 0x9C, 0x6C, 0x44, 0xF2, 0xFE, 0xBD, 0xDA, - 0x08, 0x28, 0x44, 0x4E, 0xDC, 0x84, 0x2E, 0x5C, 0xB0, 0x84, 0xEF, 0xB1, 0x08, 0x24, 0x40, 0xB9, - 0x41, 0x46, 0x2C, 0x00, 0x8C, 0x44, 0x04, 0x61, 0xBD, 0xDA, 0x50, 0xFE, 0x80, 0x27, 0x00, 0x64, - 0x30, 0xFB, 0x8C, 0x44, 0xBD, 0xDA, 0xD0, 0x80, 0x8C, 0x44, 0xBD, 0xDA, 0xD4, 0x80, 0x00, 0x65, - 0x8C, 0x44, 0xED, 0xF1, 0xBD, 0xDA, 0xD0, 0x80, 0x28, 0x44, 0x03, 0x0C, 0xA0, 0x2A, 0x0A, 0x00, - 0x11, 0x00, 0x10, 0x65, 0x60, 0x40, 0xC4, 0x36, 0x04, 0x00, 0xD4, 0x3A, 0x08, 0x00, 0x27, 0x40, - 0x40, 0x26, 0x30, 0x65, 0x00, 0x64, 0x3F, 0xFA, 0x46, 0x4E, 0x35, 0x8D, 0x5F, 0x00, 0x40, 0x26, - 0xF9, 0x01, 0x30, 0x65, 0x9D, 0xDC, 0x9D, 0xDC, 0x9D, 0xDC, 0xF4, 0x01, 0x00, 0xE1, 0x23, 0x43, - 0xE8, 0xA3, 0x6A, 0x62, 0x9A, 0xFF, 0xA1, 0xFF, 0x28, 0x44, 0x03, 0x2B, 0x04, 0x00, 0x7A, 0xDC, - 0x7A, 0xDC, 0x7A, 0xDC, 0x28, 0x44, 0x88, 0xB0, 0x88, 0x2A, 0x03, 0x00, 0x70, 0x62, 0x7A, 0xDC, - 0x28, 0x44, 0x40, 0x2B, 0x13, 0x00, 0x72, 0x62, 0x7A, 0xDC, 0x04, 0xE6, 0x7A, 0xDC, 0x3B, 0xF2, - 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x2B, 0x02, 0x00, 0x7A, 0xDC, 0x7A, 0xDC, 0x08, 0x60, 0x00, 0xEB, - 0xFC, 0xA3, 0x25, 0xFF, 0x3F, 0xFC, 0x04, 0xA3, 0xB0, 0xFF, 0x01, 0x00, 0x3F, 0xFC, 0xCF, 0x83, - 0xDF, 0x83, 0x04, 0x02, 0x00, 0xF4, 0x10, 0x62, 0x6C, 0x61, 0x1F, 0x00, 0x27, 0x03, 0xCB, 0x83, - 0xFF, 0x60, 0xFE, 0x65, 0x0E, 0xA3, 0xA7, 0x84, 0xF2, 0xA3, 0x00, 0xF4, 0x10, 0x62, 0x6C, 0x61, - 0x7A, 0xDC, 0xFE, 0x1C, 0x03, 0x1D, 0x7C, 0xA8, 0xD9, 0x81, 0x0A, 0x02, 0x00, 0xF4, 0x02, 0x62, - 0xA7, 0x84, 0x7A, 0x61, 0x7A, 0xDC, 0xFE, 0x1C, 0xF9, 0x1D, 0x7C, 0xA8, 0xD9, 0x81, 0xF6, 0x03, - 0xFF, 0xB1, 0x0C, 0x1E, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x62, 0xA1, 0xFF, 0x01, 0x60, 0x0C, 0xE1, - 0xB6, 0xFF, 0xB7, 0xFF, 0xA1, 0xFF, 0xCD, 0x81, 0x6C, 0x44, 0x5A, 0xDA, 0x98, 0xFF, 0x00, 0xE6, - 0x7C, 0x44, 0x33, 0xFB, 0x01, 0x60, 0x0C, 0xE1, 0x83, 0xE1, 0xA1, 0xFF, 0x8C, 0x44, 0x46, 0x45, - 0xA1, 0xFF, 0x14, 0x63, 0x01, 0x10, 0xFE, 0x1F, 0x01, 0x60, 0x08, 0xE1, 0x0A, 0x64, 0x60, 0x54, - 0x47, 0xFF, 0x50, 0x4B, 0x67, 0x50, 0x69, 0xE2, 0x6A, 0x40, 0x40, 0x2B, 0x01, 0x15, 0x29, 0x00, - 0x6C, 0x40, 0x28, 0x40, 0x03, 0x26, 0x15, 0x00, 0x31, 0x40, 0x20, 0x2A, 0x03, 0x00, 0x28, 0x40, - 0x50, 0x3A, 0x0F, 0x00, 0x2D, 0x44, 0x20, 0x2A, 0x0C, 0x00, 0x2B, 0x44, 0xAC, 0x80, 0x28, 0x40, - 0xB4, 0x3A, 0x03, 0x00, 0x02, 0x03, 0x30, 0xFB, 0x04, 0x00, 0x2B, 0x50, 0xA4, 0x60, 0x85, 0x78, - 0x04, 0xE1, 0x04, 0xE1, 0xA1, 0xFF, 0x35, 0xF1, 0x26, 0x44, 0x64, 0x54, 0xCD, 0xE2, 0x84, 0xBC, - 0x2D, 0x40, 0x0C, 0x22, 0xFD, 0xB4, 0x40, 0x46, 0x23, 0x64, 0x3A, 0xDB, 0xA7, 0x60, 0x18, 0x78, - 0xFF, 0xFF, 0x27, 0x40, 0x26, 0x22, 0x04, 0x00, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0xFF, 0xFF, - 0x6C, 0x40, 0xB7, 0xFF, 0xB4, 0xFF, 0x48, 0x60, 0x2D, 0x7D, 0x08, 0x60, 0x00, 0x6B, 0x37, 0xF3, - 0x2B, 0x45, 0xD4, 0x80, 0xFF, 0xFF, 0x02, 0x28, 0x65, 0x44, 0x60, 0x50, 0xA0, 0x4C, 0x20, 0xBC, - 0xFF, 0xB4, 0xA0, 0x51, 0x35, 0xF1, 0x74, 0x44, 0xC0, 0x94, 0x32, 0x40, 0x02, 0x2A, 0x18, 0x00, - 0x28, 0x44, 0xA4, 0x36, 0x04, 0x00, 0x0C, 0xB4, 0xFF, 0xFF, 0x04, 0x36, 0x11, 0x00, 0x26, 0x43, - 0xFD, 0xB3, 0x04, 0xBB, 0x43, 0x46, 0x01, 0x2A, 0x03, 0x00, 0x28, 0x47, 0x40, 0xBF, 0x40, 0x48, - 0x0A, 0xBB, 0x0F, 0xFC, 0x50, 0x4B, 0x67, 0x50, 0x00, 0x64, 0x30, 0xFB, 0x05, 0xFF, 0xC6, 0x01, - 0x24, 0x64, 0x3A, 0xDB, 0x28, 0x44, 0x04, 0x2A, 0x06, 0x00, 0xAE, 0x4F, 0xF7, 0xB4, 0xA0, 0x5E, - 0xA3, 0x60, 0x3E, 0x78, 0xFF, 0xFF, 0x1D, 0xFF, 0x48, 0xE2, 0x27, 0x44, 0x06, 0x22, 0x05, 0x00, - 0xF9, 0xB4, 0x40, 0x47, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x26, 0x40, 0x10, 0x2A, 0x18, 0x00, - 0x26, 0xF2, 0xFF, 0xFF, 0x60, 0x47, 0xFF, 0xB4, 0xC0, 0xA0, 0xFF, 0xFF, 0x11, 0x0E, 0xB8, 0xF1, - 0x27, 0x60, 0x92, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, - 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, - 0xA7, 0x60, 0xE5, 0x78, 0xFF, 0xFF, 0xB8, 0xF1, 0x27, 0x60, 0x94, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, - 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, - 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x2A, 0x64, 0x3A, 0xDB, 0x5C, 0x41, 0x87, 0xE1, - 0xA1, 0xFF, 0x6C, 0x40, 0x02, 0x00, 0x29, 0x64, 0x3A, 0xDB, 0x01, 0x60, 0x08, 0xE1, 0x87, 0xE1, - 0xA1, 0xFF, 0x6C, 0x40, 0x11, 0x00, 0x27, 0x60, 0xA6, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, - 0xFF, 0xFF, 0x08, 0x28, 0xA2, 0xDB, 0xF1, 0x01, 0x01, 0x60, 0x08, 0xE1, 0x21, 0x64, 0x3A, 0xDB, - 0x03, 0x00, 0x01, 0x60, 0x08, 0xE1, 0x6C, 0x40, 0x00, 0x64, 0x33, 0xFB, 0x32, 0x74, 0x40, 0x63, - 0x01, 0x16, 0xFE, 0x01, 0x01, 0x68, 0x01, 0x11, 0x09, 0x00, 0xA7, 0x6A, 0x22, 0x64, 0x3A, 0xDB, - 0x03, 0x60, 0xC9, 0x63, 0x01, 0x11, 0x02, 0x00, 0x6C, 0x40, 0xFC, 0x1F, 0x6C, 0x40, 0xB5, 0xFF, - 0x6C, 0x40, 0xBC, 0xFF, 0x6C, 0x40, 0xB7, 0xFF, 0xB4, 0xFF, 0x48, 0x60, 0x2D, 0x7D, 0x08, 0x60, - 0x00, 0x6B, 0xAE, 0x4F, 0xF7, 0xB4, 0xA0, 0x5E, 0x03, 0x0A, 0xA3, 0x60, 0x4B, 0x78, 0xFF, 0xFF, - 0x01, 0x64, 0x51, 0xFB, 0x31, 0x60, 0x0E, 0x7C, 0xA4, 0xD3, 0xFF, 0xFF, 0x04, 0x18, 0xAE, 0x4F, - 0x08, 0xBC, 0x00, 0x7F, 0xA0, 0x5E, 0x27, 0x44, 0x06, 0x22, 0x06, 0x00, 0xF9, 0xB4, 0x40, 0x47, - 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x48, 0xE2, 0x27, 0x64, 0x3A, 0xDB, 0xB3, 0xE1, 0xA1, 0xFF, - 0xFF, 0xFF, 0x81, 0x3E, 0x54, 0x62, 0x22, 0x46, 0xA2, 0xD0, 0x16, 0x63, 0x7C, 0x41, 0x44, 0x48, - 0x80, 0x36, 0x04, 0x61, 0x28, 0x40, 0x50, 0x36, 0x04, 0x61, 0x41, 0x4E, 0x28, 0x44, 0xA4, 0x36, - 0x0E, 0x63, 0x1C, 0x60, 0x9C, 0x62, 0xA2, 0xD1, 0x24, 0x44, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, - 0xE8, 0x84, 0xE8, 0x84, 0xC0, 0x84, 0xA2, 0xDB, 0x9A, 0xFF, 0xA1, 0xFF, 0x2D, 0x60, 0x52, 0x62, - 0xA2, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x06, 0x00, 0x18, 0xF2, 0xAA, 0xF0, 0xFF, 0xFF, - 0xB4, 0x84, 0x08, 0x36, 0x2A, 0xFA, 0x54, 0x62, 0xA2, 0xD2, 0xFF, 0xFF, 0x6A, 0x40, 0x80, 0x4E, - 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0xFF, 0xFF, - 0x01, 0x1D, 0x78, 0x00, 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0x28, 0x40, 0x03, 0x2B, - 0x04, 0x00, 0x7A, 0xD4, 0x7A, 0xD4, 0x7A, 0xD4, 0x6A, 0x40, 0x70, 0x62, 0x28, 0x44, 0x88, 0xB0, - 0x88, 0x36, 0x7A, 0xD4, 0x28, 0x40, 0x40, 0x2B, 0x0B, 0x00, 0x72, 0x62, 0x7A, 0xD4, 0x7A, 0xD4, - 0xA2, 0xD2, 0xFF, 0xFF, 0x60, 0x40, 0x20, 0x2B, 0x02, 0x00, 0x7A, 0xD4, 0x7A, 0xD4, 0x46, 0x00, - 0x23, 0x43, 0xCF, 0x83, 0xDF, 0x83, 0x02, 0x03, 0x55, 0x03, 0x04, 0x00, 0x03, 0xF0, 0x04, 0xF4, - 0x64, 0x42, 0x37, 0x00, 0x2E, 0x40, 0x04, 0x2A, 0x21, 0x00, 0xA1, 0xFF, 0x02, 0xFE, 0x10, 0x25, - 0x42, 0xFE, 0x72, 0x45, 0x65, 0x4C, 0xB5, 0xF3, 0x03, 0x04, 0xE4, 0xE2, 0xDC, 0x84, 0xB5, 0xFB, - 0xA1, 0xFF, 0x80, 0x4C, 0xB6, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0xB6, 0xFB, 0x80, 0x4C, 0xB7, 0xF3, - 0x02, 0x04, 0xDC, 0x84, 0xB7, 0xFB, 0x80, 0x4C, 0x5C, 0x4E, 0xF8, 0xA3, 0x03, 0xF2, 0x9A, 0xF2, - 0x04, 0xF4, 0xFF, 0xB1, 0xF8, 0xA1, 0x06, 0xA4, 0x60, 0x42, 0x09, 0x00, 0x03, 0xF2, 0x9A, 0xF2, - 0x04, 0xF4, 0xC8, 0x82, 0xFF, 0xB1, 0x03, 0x00, 0x00, 0xF4, 0x81, 0xF2, 0xFF, 0xB1, 0x7A, 0xD4, - 0xFF, 0xFF, 0xFD, 0x1C, 0xF9, 0x1D, 0xFF, 0xB1, 0x17, 0x1E, 0x02, 0x02, 0x00, 0xF4, 0xDA, 0x82, - 0xDA, 0x82, 0xA2, 0xD2, 0xA1, 0xFF, 0x09, 0x74, 0x80, 0x4D, 0x0E, 0x00, 0x03, 0xF2, 0x9A, 0xF2, - 0x04, 0xF4, 0x23, 0x43, 0xA1, 0xFF, 0xA0, 0xD2, 0xFE, 0xA1, 0xCB, 0x83, 0x80, 0x4E, 0xAF, 0x83, - 0x02, 0x1D, 0x02, 0x03, 0xED, 0x01, 0xE3, 0x01, 0xA1, 0xFF, 0x28, 0x40, 0x40, 0x2B, 0x02, 0x00, - 0x9C, 0x4E, 0x9C, 0x4C, 0xA1, 0xFF, 0xDA, 0x83, 0x66, 0x44, 0x22, 0x46, 0x0C, 0xFA, 0x0B, 0xFC, - 0x87, 0x4F, 0x87, 0x4C, 0x87, 0x4F, 0x87, 0x4D, 0x87, 0x4C, 0x01, 0x08, 0x01, 0x00, 0xFF, 0xFF, - 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0x6A, 0x44, 0xBC, 0xFF, - 0x01, 0x60, 0x08, 0xE1, 0x0C, 0x74, 0x04, 0xE1, 0xA1, 0xFF, 0x35, 0xF3, 0xC4, 0xE2, 0x60, 0x54, - 0x89, 0xFF, 0x13, 0x74, 0x88, 0xFF, 0x29, 0x44, 0xF7, 0xB4, 0x40, 0x49, 0x34, 0x64, 0x3A, 0xDB, - 0x06, 0xE1, 0x47, 0xFF, 0xA4, 0x60, 0x47, 0x78, 0xFF, 0xFF, 0xFF, 0x01, 0x10, 0x61, 0x7F, 0x60, - 0xC0, 0x64, 0xA0, 0x80, 0x7F, 0x67, 0x02, 0x63, 0x26, 0x02, 0x98, 0xFE, 0x1A, 0x05, 0x24, 0x60, - 0x52, 0x62, 0xA2, 0xD5, 0x0E, 0xF2, 0x15, 0x18, 0x02, 0x18, 0x09, 0xF4, 0xFB, 0x01, 0x23, 0x44, - 0x00, 0xA8, 0x08, 0x7E, 0x0A, 0x02, 0x66, 0x44, 0x11, 0xFB, 0x46, 0x43, 0x23, 0x47, 0x80, 0xBF, - 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x08, 0xB9, 0x10, 0x7E, 0x00, 0x7F, 0x0E, 0xFA, 0x00, 0x67, - 0x0A, 0x00, 0x20, 0x44, 0xDC, 0x85, 0x0F, 0xB4, 0xFA, 0xA0, 0x7F, 0x67, 0x07, 0x63, 0x03, 0x05, - 0x45, 0x40, 0x00, 0x67, 0xD8, 0xFE, 0xFF, 0x27, 0x05, 0xFD, 0x0A, 0x7E, 0x04, 0xFB, 0x61, 0x55, - 0x4A, 0x00, 0x28, 0xFB, 0x01, 0xF3, 0x29, 0xFB, 0x44, 0x46, 0x40, 0x45, 0x10, 0x61, 0x7E, 0x60, - 0xC0, 0x64, 0xA0, 0x80, 0x7F, 0x67, 0x02, 0x63, 0x31, 0x02, 0xAE, 0x60, 0x58, 0x4F, 0x6F, 0x78, - 0xFF, 0xFF, 0x7F, 0x67, 0x03, 0x63, 0x2A, 0x02, 0x26, 0x40, 0x01, 0x2B, 0x24, 0x00, 0x98, 0xFE, - 0x19, 0x05, 0x24, 0x60, 0x52, 0x62, 0xA2, 0xD5, 0x0E, 0xF2, 0x14, 0x18, 0x02, 0x18, 0x09, 0xF4, - 0xFB, 0x01, 0x23, 0x44, 0x00, 0xA8, 0x08, 0x7E, 0x0A, 0x02, 0x66, 0x44, 0x11, 0xFB, 0x46, 0x43, - 0x23, 0x47, 0x80, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x08, 0xB9, 0x10, 0x7E, 0x00, 0x7F, - 0x0E, 0xFA, 0x09, 0x00, 0x20, 0x44, 0xDC, 0x85, 0x0F, 0xB4, 0xFA, 0xA0, 0x7F, 0x67, 0x07, 0x63, - 0x05, 0x05, 0x45, 0x40, 0xD8, 0xFE, 0x00, 0x67, 0xD0, 0xFE, 0xD9, 0xFE, 0xFF, 0x27, 0x05, 0xFD, - 0x0B, 0x7E, 0x04, 0xFB, 0x1C, 0x60, 0xB4, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0x20, 0xB0, 0x80, 0xBC, - 0x08, 0x28, 0xA3, 0xDB, 0x61, 0x55, 0x63, 0x00, 0x04, 0xB5, 0x82, 0xB5, 0x25, 0x02, 0x04, 0x03, - 0x20, 0x44, 0x7F, 0xB4, 0x40, 0x40, 0xA3, 0xD3, 0x99, 0xFE, 0x04, 0x04, 0x02, 0xBC, 0xFE, 0xB4, - 0xA3, 0xDB, 0x56, 0x00, 0xDC, 0xF3, 0x20, 0x40, 0x80, 0x26, 0x52, 0x00, 0xA3, 0xD3, 0xFF, 0xA0, - 0xF8, 0xB4, 0x02, 0x02, 0xA3, 0xDB, 0x1C, 0x00, 0x04, 0xBC, 0xBF, 0xB4, 0xA3, 0xDB, 0x08, 0xB0, - 0x01, 0x64, 0x08, 0x24, 0x02, 0x64, 0x28, 0xFB, 0x20, 0x44, 0x80, 0xBC, 0x40, 0x40, 0xD0, 0xFE, - 0x3F, 0x00, 0xBF, 0xB4, 0xA3, 0xDB, 0x3C, 0x00, 0x40, 0xB0, 0xFF, 0xFF, 0xFA, 0x02, 0xF8, 0xB4, - 0xA3, 0xDB, 0x08, 0xB5, 0x07, 0x7C, 0x01, 0x02, 0xDC, 0xF9, 0x20, 0x44, 0x7F, 0xB4, 0x40, 0x40, - 0x1C, 0x60, 0xB4, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0x20, 0xB5, 0x07, 0xB5, 0x08, 0x28, 0xC4, 0x02, - 0x99, 0xFE, 0x26, 0x05, 0x20, 0x44, 0x80, 0x26, 0x23, 0x00, 0x20, 0x2A, 0x00, 0x00, 0x40, 0x2A, - 0x1F, 0x00, 0xBF, 0xB4, 0x40, 0x40, 0x09, 0x00, 0xA8, 0xFF, 0x20, 0x44, 0x99, 0xFE, 0x02, 0x05, - 0x80, 0x2A, 0x03, 0x00, 0x40, 0xBC, 0x40, 0x40, 0x13, 0x00, 0x00, 0xF1, 0x80, 0xBC, 0x40, 0x40, - 0x64, 0x44, 0xE0, 0x84, 0xE8, 0x84, 0x0A, 0x36, 0x29, 0x01, 0x0B, 0x36, 0x5A, 0x01, 0x28, 0xFB, - 0x01, 0xF1, 0x29, 0xF9, 0x02, 0xF1, 0x2A, 0xF9, 0x03, 0xF1, 0x2B, 0xF9, 0xD0, 0xFE, 0xAE, 0xFF, - 0xA1, 0xFF, 0xFF, 0xFF, 0x82, 0x3E, 0x75, 0x44, 0x02, 0xB0, 0x01, 0xB0, 0x29, 0x02, 0xDC, 0x02, - 0x04, 0xB0, 0x08, 0xB0, 0x0B, 0x02, 0x20, 0x02, 0x40, 0x26, 0xA7, 0xFF, 0x8C, 0xFF, 0x75, 0x40, - 0x80, 0x2B, 0x01, 0x00, 0xAB, 0xFF, 0x75, 0x44, 0x8D, 0xFF, 0xEA, 0x01, 0x0A, 0xF3, 0xAA, 0xFF, - 0x60, 0x40, 0x20, 0x2B, 0x02, 0x00, 0x60, 0xFF, 0x0D, 0x00, 0x01, 0x26, 0x0C, 0x00, 0xC0, 0x60, - 0x00, 0x7C, 0xA0, 0x84, 0x80, 0x3B, 0x02, 0x00, 0xC0, 0x67, 0x03, 0x00, 0x40, 0x3B, 0x02, 0x00, - 0x00, 0x67, 0x0A, 0xFB, 0xD5, 0x01, 0xD4, 0x01, 0xAB, 0xFF, 0x38, 0xFF, 0x00, 0x00, 0xD0, 0x01, - 0x79, 0x63, 0xFF, 0xFF, 0xFF, 0x1F, 0xA9, 0xFF, 0x77, 0x44, 0x60, 0x57, 0x10, 0x60, 0x00, 0x75, - 0x40, 0x4A, 0x01, 0x2A, 0x1C, 0x00, 0x24, 0x44, 0xAC, 0x86, 0x08, 0xF2, 0x18, 0x03, 0x24, 0x60, - 0x58, 0x65, 0xD4, 0x80, 0x0E, 0xF2, 0x02, 0x03, 0xA5, 0xD5, 0x04, 0x00, 0x01, 0xBC, 0x0E, 0xFA, - 0x09, 0xF4, 0xD1, 0xFE, 0x46, 0x44, 0x0B, 0x18, 0x66, 0x44, 0x10, 0xFB, 0x66, 0x47, 0x20, 0xBF, - 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x0E, 0xF2, 0x01, 0x75, 0x10, 0xBC, 0x0E, 0xFA, 0x2A, 0x44, - 0x08, 0x2A, 0x18, 0x00, 0x23, 0x44, 0x00, 0xA8, 0x5C, 0x43, 0x14, 0x03, 0x24, 0x60, 0x52, 0x62, - 0xA2, 0xD5, 0x01, 0x00, 0x09, 0xF4, 0x0E, 0xF2, 0x0D, 0x18, 0x08, 0xB0, 0x18, 0xAC, 0xFA, 0x03, - 0x0E, 0xFA, 0x66, 0x43, 0x11, 0xFD, 0x46, 0x43, 0x23, 0x47, 0x80, 0xBF, 0x3B, 0x42, 0x04, 0xA2, - 0xA2, 0xDB, 0x08, 0x75, 0x2A, 0x44, 0x06, 0x22, 0x2D, 0x00, 0x22, 0x44, 0x00, 0xA8, 0x60, 0x46, - 0x0E, 0xF2, 0x28, 0x03, 0x10, 0xB0, 0x01, 0xBC, 0x03, 0x02, 0x00, 0x64, 0x40, 0x42, 0x22, 0x00, - 0x0E, 0xFA, 0xD1, 0xFE, 0x24, 0x60, 0x4C, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x84, 0x00, 0x46, 0x42, - 0x19, 0x02, 0x22, 0x47, 0x40, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x23, 0xF2, 0x66, 0x43, - 0x00, 0xA8, 0x0E, 0xF2, 0x08, 0x02, 0x60, 0x40, 0x02, 0x2A, 0xE4, 0x01, 0x12, 0xFD, 0x10, 0x64, - 0x0E, 0xFA, 0x02, 0x75, 0x07, 0x00, 0x60, 0x40, 0x04, 0x2A, 0xDC, 0x01, 0x12, 0xFD, 0x10, 0x64, - 0x0E, 0xFA, 0x04, 0x75, 0x2A, 0x44, 0x80, 0x2A, 0x19, 0x00, 0x21, 0x44, 0xAC, 0x86, 0x0E, 0xF2, - 0x15, 0x03, 0x01, 0xBC, 0x0E, 0xFA, 0xD1, 0xFE, 0x24, 0x60, 0x64, 0x64, 0x40, 0x47, 0x58, 0x4F, - 0x5A, 0x00, 0x46, 0x41, 0x0B, 0x02, 0x21, 0x47, 0x10, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, - 0x0E, 0xF2, 0x66, 0x43, 0x08, 0xFD, 0x10, 0xBC, 0x0E, 0xFA, 0x80, 0x75, 0x2A, 0x44, 0x10, 0xB0, - 0x20, 0x44, 0x15, 0x03, 0x7F, 0xB4, 0x40, 0x40, 0x1C, 0x60, 0xB4, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, - 0x20, 0xB0, 0x80, 0xB0, 0x09, 0x03, 0x08, 0x03, 0x40, 0xBC, 0x7F, 0xB4, 0x04, 0xB0, 0xA3, 0xDB, - 0x03, 0x03, 0x20, 0x44, 0x80, 0xBC, 0x40, 0x40, 0xAC, 0x60, 0xD8, 0x78, 0xFF, 0xFF, 0x2A, 0x40, - 0x08, 0x2B, 0x01, 0x00, 0x10, 0xFF, 0xAD, 0x60, 0x08, 0x78, 0xFF, 0xFF, 0xE8, 0xFE, 0x14, 0x05, - 0xEA, 0xFE, 0x24, 0x05, 0xE9, 0xFE, 0x1C, 0x05, 0xE7, 0xFE, 0x09, 0x05, 0x47, 0xFF, 0x20, 0x44, - 0x0F, 0x22, 0x03, 0x00, 0xCC, 0x84, 0x40, 0x40, 0x0F, 0x22, 0xB8, 0xFE, 0xEC, 0x01, 0x23, 0x41, - 0x00, 0xB9, 0x5C, 0x4A, 0xE8, 0x02, 0x6A, 0x01, 0x24, 0x41, 0x00, 0xB9, 0x24, 0x60, 0x58, 0x65, - 0x45, 0x47, 0xE1, 0x02, 0x58, 0x4F, 0x0F, 0x00, 0xDE, 0x02, 0x5C, 0x4A, 0x46, 0x44, 0x4C, 0x01, - 0x22, 0x41, 0x00, 0xB9, 0x5C, 0x4A, 0x08, 0x24, 0x7D, 0x01, 0xD5, 0x01, 0x21, 0x41, 0x00, 0xB9, - 0x5C, 0x4A, 0xA2, 0x03, 0xD0, 0x01, 0x27, 0xD3, 0x03, 0x00, 0x10, 0xB0, 0x09, 0xF2, 0x04, 0x03, - 0xAC, 0x86, 0x0E, 0xF2, 0xFA, 0x02, 0x08, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0E, 0xF3, 0x0F, 0x60, - 0xFE, 0x65, 0x0C, 0xF3, 0x24, 0x86, 0x24, 0x46, 0x60, 0x40, 0xFB, 0x3B, 0x07, 0x00, 0x80, 0x26, - 0x02, 0x00, 0x23, 0x46, 0x03, 0x4C, 0x46, 0x61, 0x3A, 0x65, 0x0C, 0x00, 0x2E, 0xF3, 0x40, 0x45, - 0xF8, 0x2B, 0x02, 0x00, 0x40, 0x45, 0x03, 0x00, 0x58, 0x4F, 0x39, 0x00, 0x07, 0x02, 0x58, 0x4F, - 0x45, 0x00, 0x04, 0x05, 0x66, 0x50, 0x65, 0x52, 0x61, 0x51, 0x09, 0x00, 0x26, 0x47, 0x00, 0xBF, - 0x0E, 0xFB, 0x2E, 0xF5, 0x05, 0xF0, 0x80, 0x60, 0x64, 0x50, 0x00, 0x72, 0x7E, 0x71, 0xAC, 0xFF, - 0xAD, 0x60, 0x08, 0x78, 0xFF, 0xFF, 0x8E, 0xFF, 0x0F, 0xF3, 0x0F, 0x60, 0xFE, 0x65, 0x24, 0x86, - 0x0D, 0xF3, 0x2E, 0xF3, 0x40, 0x45, 0xF8, 0x2B, 0x02, 0x00, 0x40, 0x45, 0x03, 0x00, 0x58, 0x4F, - 0x16, 0x00, 0x07, 0x02, 0x58, 0x4F, 0x22, 0x00, 0x04, 0x05, 0x66, 0x50, 0x65, 0x52, 0x61, 0x51, - 0x09, 0x00, 0x26, 0x47, 0x00, 0xBF, 0x0F, 0xFB, 0x2E, 0xF5, 0x05, 0xF0, 0x80, 0x60, 0x64, 0x50, - 0x00, 0x72, 0x7E, 0x71, 0x8D, 0xFF, 0xAD, 0xFF, 0xAD, 0x60, 0x08, 0x78, 0xFF, 0xFF, 0x25, 0x44, - 0xAA, 0xF1, 0xAB, 0xF1, 0xD0, 0x80, 0xD0, 0x80, 0x07, 0x04, 0x01, 0x06, 0x05, 0x00, 0x25, 0x46, - 0x01, 0xF0, 0x03, 0x67, 0xA0, 0x85, 0x94, 0x80, 0x2F, 0x58, 0xFF, 0xFF, 0x25, 0x46, 0x26, 0x41, - 0x46, 0x63, 0x01, 0xF2, 0xFF, 0xFF, 0xFF, 0xB5, 0xD5, 0x81, 0x00, 0xF2, 0x05, 0x04, 0x04, 0x63, - 0x60, 0x46, 0xF7, 0x1B, 0x42, 0xFE, 0x0D, 0x00, 0x61, 0x44, 0xC5, 0x81, 0x63, 0x45, 0xC5, 0x81, - 0x9C, 0x84, 0xDC, 0x84, 0x01, 0xF2, 0xF0, 0x85, 0xF0, 0x80, 0x65, 0x44, 0xF8, 0x85, 0xFF, 0xFF, - 0x02, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xA2, 0xFF, 0x24, 0x60, 0x6A, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, - 0xAC, 0x86, 0x0E, 0xF2, 0x07, 0x03, 0x00, 0xA8, 0x09, 0xF2, 0xFA, 0x02, 0x01, 0x67, 0x0E, 0xFA, - 0x08, 0xFE, 0x17, 0x00, 0xAC, 0xF3, 0xFF, 0xFF, 0xD8, 0xA0, 0x00, 0xB4, 0x12, 0x06, 0x09, 0x60, - 0x08, 0x61, 0x41, 0x4A, 0x7C, 0xA1, 0x0E, 0xA1, 0xA2, 0xFF, 0xAE, 0x60, 0x58, 0x4E, 0xE4, 0x78, - 0xFF, 0xFF, 0xA3, 0xFF, 0x06, 0x03, 0x2A, 0x43, 0xAF, 0x60, 0x58, 0x4E, 0x05, 0x78, 0xFF, 0xFF, - 0x08, 0xFE, 0xA3, 0xFF, 0x2D, 0x58, 0xFF, 0xFF, 0x41, 0x4A, 0x7C, 0xA1, 0x0E, 0xA1, 0xA2, 0xFF, - 0xAE, 0x60, 0x58, 0x4E, 0xE4, 0x78, 0xFF, 0xFF, 0x07, 0x03, 0x2A, 0x43, 0xAF, 0x60, 0x58, 0x4E, - 0x05, 0x78, 0xFF, 0xFF, 0x08, 0xFE, 0x0D, 0x00, 0x24, 0x60, 0x6A, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, - 0xAC, 0x86, 0x0E, 0xF2, 0x06, 0x03, 0x00, 0xA8, 0x09, 0xF2, 0xFA, 0x02, 0x01, 0x67, 0x0E, 0xFA, - 0x08, 0xFE, 0xA3, 0xFF, 0x2D, 0x58, 0xFF, 0xFF, 0xAD, 0xF3, 0x7C, 0x63, 0x00, 0xBE, 0x40, 0x45, - 0x1A, 0x03, 0x00, 0x65, 0x65, 0x44, 0xDC, 0x85, 0x84, 0xA1, 0x00, 0xF2, 0x06, 0x06, 0x01, 0xFC, - 0x00, 0xA8, 0x60, 0x46, 0xF7, 0x02, 0x40, 0x45, 0x0E, 0x00, 0xAC, 0xF3, 0x00, 0x63, 0xD4, 0x84, - 0xAC, 0xFB, 0x80, 0x60, 0x7C, 0x64, 0x01, 0xFA, 0x00, 0xF0, 0x00, 0xFC, 0xD3, 0x80, 0xAD, 0xF9, - 0x02, 0x02, 0xAE, 0xF9, 0x08, 0xFE, 0x2E, 0x58, 0xFF, 0xFF, 0x66, 0x44, 0x25, 0x46, 0x05, 0xFA, - 0x06, 0xFA, 0x01, 0xF0, 0x03, 0x67, 0x02, 0xFC, 0xB0, 0x84, 0x3A, 0x7E, 0x01, 0xFA, 0x12, 0x64, - 0x03, 0xFA, 0x00, 0xF0, 0x04, 0xF8, 0x00, 0x64, 0x0C, 0x61, 0x10, 0x63, 0x59, 0xDA, 0xFE, 0x1F, - 0x2E, 0x58, 0xFF, 0xFF, 0x27, 0x43, 0xE3, 0x81, 0xE9, 0x81, 0x03, 0x05, 0x16, 0x03, 0x00, 0x61, - 0x01, 0x00, 0xE4, 0x63, 0x61, 0x46, 0xBF, 0xD2, 0x27, 0x45, 0xDC, 0x84, 0xA2, 0xDA, 0xBE, 0xD2, - 0x25, 0x46, 0x88, 0xF8, 0x04, 0x1B, 0x25, 0x44, 0x61, 0x46, 0xA3, 0xDA, 0x04, 0x00, 0x0A, 0xFA, - 0x60, 0x46, 0x25, 0x44, 0x09, 0xFA, 0x61, 0x46, 0xBE, 0xDA, 0x2F, 0x58, 0xFF, 0xFF, 0x25, 0x44, - 0x00, 0xA8, 0x07, 0x4B, 0x0C, 0x03, 0x58, 0x4F, 0x33, 0x00, 0x0B, 0x47, 0x24, 0x60, 0x5E, 0x65, - 0x27, 0x44, 0xD4, 0x80, 0x00, 0x64, 0x01, 0x02, 0x0F, 0xFA, 0x58, 0x4F, 0xD3, 0x01, 0x70, 0x00, - 0x25, 0x43, 0xE3, 0x84, 0x7C, 0x41, 0x02, 0x04, 0xE8, 0x81, 0xE4, 0x63, 0x61, 0x46, 0xA3, 0xD2, - 0x00, 0x7C, 0x40, 0x45, 0xBF, 0xD8, 0xA3, 0xD8, 0xBE, 0xD8, 0x27, 0x42, 0x5A, 0xD3, 0x25, 0x5C, - 0x60, 0x41, 0x02, 0x1B, 0x27, 0xD9, 0x05, 0x00, 0x25, 0x46, 0x0A, 0xFA, 0x61, 0x46, 0x25, 0x44, - 0x09, 0xFA, 0x25, 0x44, 0x27, 0x43, 0x00, 0x61, 0x60, 0x46, 0x09, 0xF2, 0x08, 0xFC, 0x00, 0xA8, - 0xDD, 0x81, 0xFA, 0x02, 0xBF, 0xD1, 0x66, 0x44, 0xBE, 0xDB, 0xC1, 0x84, 0xBF, 0xDB, 0x48, 0x00, - 0x25, 0x46, 0xE4, 0x63, 0x08, 0xF2, 0x89, 0xF2, 0x1E, 0x18, 0x40, 0x47, 0xE0, 0x84, 0xE8, 0x85, - 0x02, 0x05, 0xE8, 0x83, 0x00, 0x65, 0x65, 0x46, 0xBF, 0xD2, 0x61, 0x5C, 0xCC, 0x84, 0xA2, 0xDA, - 0x25, 0x46, 0x0A, 0xF2, 0x00, 0xB9, 0x65, 0x46, 0x08, 0x24, 0xBE, 0xDA, 0x02, 0x1B, 0xA3, 0xD8, - 0x02, 0x00, 0x60, 0x46, 0x89, 0xFA, 0x00, 0xB9, 0x61, 0x46, 0x08, 0x28, 0x0A, 0xFA, 0x25, 0x46, - 0x89, 0xFC, 0x8A, 0xFC, 0x88, 0xFC, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x61, 0x28, 0x65, 0x25, 0x43, - 0xAE, 0xF3, 0xAF, 0x83, 0x00, 0xBE, 0x18, 0x03, 0x02, 0x03, 0x00, 0xFC, 0x01, 0x00, 0xAD, 0xFD, - 0x63, 0x46, 0x65, 0x44, 0xCC, 0x85, 0x00, 0xF2, 0x07, 0x02, 0xAE, 0xF5, 0x00, 0x64, 0x00, 0xFA, - 0xDE, 0x60, 0xAF, 0x64, 0x09, 0xFB, 0x08, 0x00, 0x66, 0x43, 0x00, 0xBE, 0xDD, 0x81, 0xF1, 0x02, - 0xAC, 0xF1, 0xAE, 0xFD, 0xC1, 0x84, 0xAC, 0xFB, 0x2E, 0x58, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x45, - 0x29, 0x43, 0xFC, 0xA3, 0x66, 0x44, 0xBD, 0xDB, 0x25, 0x44, 0xBD, 0xDB, 0x00, 0x64, 0xBD, 0xDB, - 0x03, 0x61, 0x0E, 0x65, 0x24, 0x60, 0x72, 0x63, 0x43, 0x49, 0xA3, 0xD3, 0x06, 0xA3, 0x00, 0xA8, - 0xCD, 0x81, 0x04, 0x02, 0xF9, 0x02, 0xAD, 0x60, 0x08, 0x78, 0xFF, 0xFF, 0x01, 0x26, 0xE6, 0x01, - 0xD4, 0x80, 0x60, 0x45, 0xE3, 0x05, 0xF6, 0xA3, 0xBD, 0xD1, 0xBD, 0xD1, 0x44, 0x47, 0x44, 0x48, - 0x44, 0x45, 0x24, 0x60, 0xB0, 0x64, 0x44, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x24, 0x60, 0x22, 0x63, - 0x0D, 0x65, 0x00, 0x61, 0x41, 0x48, 0xA3, 0xD3, 0x06, 0xA3, 0xAC, 0x86, 0x00, 0x61, 0x09, 0x03, - 0x00, 0xF2, 0x09, 0xF0, 0xAC, 0x86, 0x00, 0xF2, 0xDD, 0x81, 0xFC, 0x02, 0x64, 0x44, 0xAC, 0x86, - 0xF6, 0x01, 0x61, 0x44, 0x25, 0x46, 0x27, 0xDA, 0x65, 0x44, 0x28, 0x45, 0x45, 0x88, 0xCC, 0x85, - 0x5A, 0x87, 0xE9, 0x02, 0x00, 0x64, 0x27, 0xDA, 0x5A, 0xDA, 0x5A, 0x87, 0xA9, 0xF3, 0xA8, 0xF1, - 0x02, 0xA4, 0x60, 0x46, 0x60, 0x45, 0x00, 0x61, 0x1E, 0xF2, 0xFF, 0xFF, 0xAC, 0x86, 0x00, 0xF2, - 0x04, 0x03, 0xAC, 0x86, 0x00, 0xF2, 0xDD, 0x81, 0xFC, 0x02, 0x65, 0x44, 0x02, 0xA5, 0x65, 0x46, - 0x64, 0x44, 0xCC, 0x9C, 0xFF, 0xFF, 0xF0, 0x02, 0x61, 0x44, 0x25, 0x46, 0x27, 0xDA, 0x5A, 0x87, - 0x28, 0x45, 0x45, 0x88, 0x00, 0x64, 0x27, 0xDA, 0x5A, 0x87, 0x06, 0x60, 0x40, 0x65, 0xAD, 0xF3, - 0x01, 0x61, 0xAC, 0x86, 0x00, 0xF2, 0x03, 0x03, 0xD5, 0x80, 0xDD, 0x81, 0xFA, 0x04, 0xCD, 0x84, - 0x25, 0x46, 0x27, 0xDA, 0x28, 0x45, 0xC4, 0x84, 0x5A, 0xDA, 0xDA, 0x81, 0xAC, 0xF1, 0x59, 0xD8, - 0x24, 0x60, 0x20, 0x64, 0x18, 0x63, 0xA0, 0xD1, 0x06, 0xA4, 0x59, 0xD8, 0xFC, 0x1F, 0x00, 0x64, - 0x59, 0xDA, 0x59, 0xDA, 0x01, 0x60, 0x5C, 0x64, 0x0A, 0x63, 0x58, 0xD1, 0x59, 0xD8, 0xFD, 0x1F, - 0xDC, 0xF1, 0x59, 0xD8, 0x75, 0x01, 0x07, 0x4B, 0xAF, 0x60, 0x58, 0x4F, 0x70, 0x78, 0xFF, 0xFF, - 0x0B, 0x47, 0x58, 0x4F, 0x21, 0x00, 0x6C, 0x01, 0x07, 0x4B, 0xAF, 0x60, 0x58, 0x4F, 0x70, 0x78, - 0xFF, 0xFF, 0x0B, 0x47, 0x27, 0x44, 0x00, 0xBE, 0x08, 0xF0, 0x15, 0x03, 0x64, 0x42, 0x4A, 0xD3, - 0x09, 0xF2, 0xDC, 0x83, 0xA2, 0xDD, 0x25, 0x43, 0x09, 0xFC, 0x63, 0x46, 0x27, 0x43, 0x0A, 0xFC, - 0x09, 0xFA, 0x08, 0xF8, 0x00, 0xA8, 0x66, 0x43, 0x03, 0x02, 0x64, 0x44, 0x58, 0xDD, 0x03, 0x00, - 0x60, 0x46, 0x25, 0x44, 0x0A, 0xFA, 0x4C, 0x01, 0x27, 0x43, 0xE3, 0x81, 0xE9, 0x81, 0x03, 0x05, - 0x16, 0x03, 0x00, 0x61, 0x01, 0x00, 0xE4, 0x63, 0x61, 0x46, 0xBF, 0xD2, 0x27, 0x45, 0xDC, 0x84, - 0xA2, 0xDA, 0xA3, 0xD2, 0x25, 0x46, 0x88, 0xF8, 0x04, 0x1B, 0x25, 0x44, 0x61, 0x46, 0xBE, 0xDA, - 0x04, 0x00, 0x09, 0xFA, 0x60, 0x46, 0x25, 0x44, 0x0A, 0xFA, 0x61, 0x46, 0xA3, 0xDA, 0x2F, 0x58, - 0xFF, 0xFF, 0xA0, 0xFE, 0x07, 0x05, 0xA3, 0xFE, 0x07, 0x05, 0xA1, 0xFE, 0x52, 0x05, 0x60, 0x64, - 0x3B, 0xDB, 0x12, 0x00, 0x20, 0x58, 0xFF, 0xFF, 0x4F, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x1C, 0x60, - 0xB8, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0xFB, 0xB4, 0xA3, 0xDB, 0xA0, 0x4C, 0x59, 0xBC, 0xFF, 0xB4, - 0xA0, 0x51, 0xA0, 0x4C, 0x7D, 0xB4, 0xA0, 0x51, 0xA1, 0xFF, 0xFF, 0xFF, 0x83, 0x3E, 0x40, 0x60, - 0x0B, 0x65, 0x2B, 0x44, 0x00, 0x63, 0xE8, 0x80, 0xF8, 0x84, 0x02, 0x24, 0x94, 0x84, 0xF3, 0x83, - 0xCD, 0x81, 0xFF, 0xFF, 0xF8, 0x02, 0xDF, 0x83, 0x2F, 0x58, 0x40, 0x4B, 0x00, 0x62, 0x01, 0x64, - 0xD4, 0x80, 0xE0, 0x84, 0x1A, 0x03, 0xD4, 0x80, 0xE0, 0x84, 0x15, 0x03, 0x61, 0x44, 0x11, 0x61, - 0xE0, 0x84, 0xCD, 0x81, 0xFD, 0x04, 0x01, 0x00, 0xE0, 0x84, 0xF2, 0x82, 0xFF, 0xFF, 0x02, 0x24, - 0xC6, 0x82, 0x02, 0x28, 0xD6, 0x82, 0xE2, 0x80, 0xCD, 0x81, 0x02, 0x28, 0x01, 0xBC, 0xF4, 0x02, - 0x01, 0x2A, 0xC6, 0x82, 0x03, 0x00, 0xE9, 0x81, 0xF2, 0x82, 0x61, 0x44, 0x2D, 0x58, 0xFF, 0xFF, - 0x00, 0xA8, 0x10, 0x61, 0x04, 0x03, 0xF0, 0x84, 0xCD, 0x81, 0xFD, 0x04, 0x61, 0x44, 0x2D, 0x58, - 0xFF, 0xFF, 0x00, 0x64, 0x3B, 0xDB, 0x3C, 0x44, 0xAC, 0x80, 0xFF, 0xFF, 0xBD, 0x02, 0x8B, 0xF3, - 0x8C, 0xF3, 0x02, 0xA8, 0x02, 0xA8, 0x08, 0x02, 0x00, 0x64, 0x8D, 0xFB, 0x8B, 0xFB, 0x8C, 0xFB, - 0x00, 0x64, 0x8E, 0xFB, 0xCA, 0xFE, 0x2D, 0x00, 0x03, 0x02, 0x00, 0x64, 0x8C, 0xFB, 0xCA, 0xFE, - 0x01, 0x64, 0x3B, 0xDB, 0x24, 0x60, 0x28, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, - 0x14, 0x03, 0xDC, 0xF3, 0x2A, 0xF2, 0xFD, 0xA0, 0x60, 0x40, 0x80, 0x3A, 0x29, 0x00, 0x28, 0x02, - 0x9B, 0xFE, 0x26, 0x05, 0x24, 0x60, 0x6E, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xE5, 0x01, 0x8C, 0xF3, 0xFF, 0xFF, 0x01, 0xA8, - 0xFF, 0xFF, 0x07, 0x02, 0x24, 0x60, 0x22, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, - 0x0F, 0x02, 0x86, 0xFF, 0x20, 0x40, 0x52, 0x27, 0x07, 0x00, 0x9A, 0xFE, 0x05, 0x04, 0x9D, 0xFE, - 0x03, 0x04, 0xF1, 0xFE, 0x12, 0x64, 0x3B, 0xDB, 0x84, 0xFF, 0xB0, 0x60, 0x97, 0x78, 0xFF, 0xFF, - 0x66, 0x44, 0xFC, 0xFB, 0x46, 0x5C, 0x2D, 0x60, 0x5A, 0x63, 0xA3, 0xD3, 0xB0, 0x60, 0x58, 0x4D, - 0xD8, 0x78, 0xFF, 0xFF, 0x0D, 0xF2, 0x60, 0x5C, 0x64, 0x5F, 0x0D, 0xFA, 0x11, 0x64, 0x3B, 0xDB, - 0x9D, 0xFE, 0x0B, 0x05, 0x24, 0x60, 0x92, 0x65, 0x08, 0x64, 0xA5, 0xDB, 0xB1, 0x60, 0x4D, 0x64, - 0x4F, 0xFB, 0x2D, 0xFF, 0xB0, 0x60, 0xA4, 0x78, 0xFF, 0xFF, 0x07, 0xF0, 0x00, 0x64, 0xD0, 0x80, - 0xA9, 0xF3, 0x07, 0x02, 0x23, 0xF0, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0xB8, 0x60, 0x36, 0x78, - 0xFF, 0xFF, 0xD0, 0x80, 0xD8, 0xF3, 0x40, 0x03, 0x60, 0x40, 0x03, 0x3A, 0x3D, 0x00, 0x66, 0x41, - 0x64, 0x46, 0x6F, 0xF2, 0x61, 0x46, 0x64, 0x41, 0x4D, 0xF1, 0x60, 0x40, 0x03, 0x3A, 0x34, 0x00, - 0x64, 0x40, 0xFF, 0x22, 0x31, 0x00, 0x05, 0x7E, 0x66, 0x45, 0x61, 0x46, 0x6F, 0xFA, 0x65, 0x46, - 0x07, 0xF0, 0x00, 0x65, 0x65, 0x43, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, 0x8C, 0xFA, 0x00, 0xA8, - 0x6F, 0xF2, 0x15, 0x03, 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, 0x00, 0xBB, 0xFF, 0xA0, 0x07, 0x03, - 0x0E, 0x06, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, 0x08, 0x00, 0xB9, 0x81, - 0xE8, 0x84, 0xD9, 0x81, 0xFD, 0x04, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, 0x0C, 0xF4, - 0xFF, 0xFF, 0x00, 0x64, 0x4D, 0xFB, 0x4C, 0xFB, 0x07, 0xF0, 0x66, 0x41, 0x64, 0x46, 0x0E, 0xF2, - 0x61, 0x46, 0xFF, 0xFF, 0xF0, 0x7E, 0x4E, 0xFB, 0x2A, 0xF2, 0x00, 0x63, 0x40, 0x47, 0x50, 0x36, - 0x05, 0x00, 0xA4, 0x36, 0x03, 0x00, 0x80, 0x36, 0x01, 0x00, 0x01, 0x63, 0x48, 0xFD, 0x40, 0x47, - 0x08, 0x2A, 0x0A, 0x00, 0x03, 0x2F, 0x08, 0x00, 0x81, 0xF1, 0x2C, 0xF8, 0x82, 0xF1, 0xFF, 0xFF, - 0x2D, 0xF8, 0x83, 0xF1, 0x2E, 0xF8, 0xFF, 0xFF, 0x4A, 0xF3, 0x35, 0xFA, 0x10, 0xA4, 0x4A, 0xFB, - 0x00, 0x64, 0x15, 0xFA, 0x16, 0xFA, 0x0F, 0xFA, 0xFF, 0xFF, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, - 0x0E, 0xF0, 0x63, 0x46, 0x00, 0x7F, 0x64, 0x5E, 0x4B, 0xFB, 0x64, 0x44, 0x00, 0x7E, 0xDB, 0xFB, - 0x07, 0xF0, 0xA9, 0xF3, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x03, 0x03, 0xDB, 0xF3, 0xDA, 0xFB, - 0x60, 0x41, 0x03, 0xF2, 0x00, 0xF4, 0x01, 0xF2, 0xFC, 0xA5, 0x00, 0x7F, 0xD4, 0x84, 0x27, 0x45, - 0x3C, 0x46, 0x1A, 0xFA, 0x22, 0x63, 0x7B, 0x60, 0xFF, 0x64, 0xA4, 0x84, 0x03, 0x2B, 0x1C, 0x63, - 0x2A, 0xFA, 0x60, 0x40, 0xA4, 0x36, 0x14, 0x63, 0x43, 0x4C, 0x00, 0x7C, 0x22, 0xF8, 0x64, 0x41, - 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x36, 0xF2, 0x63, 0x46, 0xFF, 0xB4, 0x22, 0xFA, 0x60, 0x40, - 0x00, 0x36, 0x76, 0x00, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x3A, 0xA5, 0x00, 0x03, 0xF2, - 0x00, 0xF4, 0xA0, 0xD2, 0xAA, 0x60, 0xAA, 0x65, 0x5A, 0xD0, 0xD4, 0x80, 0x03, 0x64, 0x0A, 0x02, - 0xD0, 0x80, 0x00, 0x64, 0x5A, 0xD0, 0x06, 0x02, 0xD0, 0x80, 0xF8, 0x7F, 0xD0, 0x80, 0x01, 0x03, - 0x01, 0x02, 0x01, 0x61, 0x62, 0x43, 0x46, 0x43, 0x3C, 0x46, 0x07, 0xF4, 0x36, 0xF2, 0xFF, 0xFF, - 0xA3, 0x46, 0x60, 0x40, 0x22, 0x26, 0x5C, 0x00, 0x60, 0x45, 0x63, 0x42, 0x5A, 0xD0, 0xCD, 0x81, - 0x3C, 0x46, 0x14, 0x02, 0x64, 0x44, 0x88, 0x3A, 0x11, 0x00, 0x8E, 0x3B, 0x0F, 0x00, 0x65, 0x44, - 0x01, 0x26, 0x7A, 0x00, 0x04, 0x26, 0x03, 0x00, 0x10, 0x26, 0x01, 0x00, 0x2D, 0x00, 0xA3, 0x46, - 0x37, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x2B, 0x6F, 0x00, 0x56, 0x00, 0xA3, 0x46, 0x65, 0x44, - 0x01, 0x26, 0x0B, 0x00, 0x04, 0x26, 0x03, 0x00, 0x10, 0x26, 0x01, 0x00, 0x1D, 0x00, 0x37, 0xF2, - 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x27, 0x48, 0x00, 0x17, 0x00, 0xA9, 0xF3, 0xFF, 0xFF, 0x60, 0x46, - 0x36, 0xF2, 0x66, 0x43, 0xFF, 0xB4, 0x3C, 0x46, 0x22, 0xF0, 0x60, 0x47, 0xB0, 0x84, 0x22, 0xFA, - 0x63, 0x46, 0x37, 0xF0, 0x60, 0x40, 0x04, 0x27, 0x03, 0x00, 0x10, 0x27, 0x01, 0x00, 0x04, 0x00, - 0x64, 0x40, 0x80, 0x27, 0x31, 0x00, 0x00, 0x00, 0x3C, 0x46, 0x02, 0x65, 0xB7, 0x60, 0x66, 0x78, - 0xFF, 0xFF, 0xCD, 0x81, 0x63, 0x42, 0x5A, 0xD0, 0x3C, 0x46, 0x26, 0x02, 0x64, 0x44, 0x88, 0x3A, - 0x23, 0x00, 0x77, 0x37, 0x39, 0x00, 0x78, 0x37, 0x37, 0x00, 0x8E, 0x37, 0x35, 0x00, 0xF1, 0x01, - 0x2D, 0x60, 0x52, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x2D, 0x00, 0x07, 0x00, - 0x2D, 0x60, 0x52, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0xE2, 0x01, 0x3C, 0x46, - 0x3E, 0xF2, 0x40, 0x60, 0x00, 0x65, 0xF0, 0x84, 0xA4, 0x84, 0x18, 0xFA, 0x2A, 0xF2, 0xBF, 0x60, - 0xFF, 0x65, 0xA4, 0x84, 0x2A, 0xFA, 0x18, 0x00, 0x3C, 0x46, 0x22, 0xF0, 0x80, 0x67, 0xB0, 0x84, - 0xA2, 0xDA, 0xFF, 0xFF, 0x3F, 0xF2, 0x3E, 0xF0, 0x08, 0xA4, 0x60, 0x41, 0x22, 0xF2, 0xFF, 0xFF, - 0x60, 0x40, 0x01, 0x26, 0x03, 0x00, 0x04, 0x26, 0x03, 0x00, 0x06, 0x00, 0x04, 0x2B, 0x04, 0x00, - 0x61, 0x44, 0x64, 0x40, 0x10, 0x26, 0x3F, 0xFA, 0x3C, 0x46, 0x2C, 0xF2, 0x27, 0x40, 0x01, 0x27, - 0x32, 0xF2, 0xD5, 0xF1, 0x60, 0x40, 0x01, 0x26, 0x53, 0x00, 0x09, 0x60, 0x00, 0x64, 0xD0, 0x80, - 0x3F, 0xF2, 0x09, 0x06, 0x2C, 0x45, 0xC4, 0x84, 0xD0, 0x80, 0x40, 0x4A, 0x40, 0x06, 0x60, 0x43, - 0x64, 0x44, 0x54, 0x88, 0x18, 0x00, 0x60, 0x45, 0x28, 0x60, 0x36, 0x64, 0xA0, 0xD3, 0xDB, 0xF3, - 0x00, 0xBC, 0x60, 0x47, 0xEC, 0xA0, 0x33, 0x03, 0x32, 0x07, 0x2C, 0x44, 0xC4, 0x81, 0x02, 0x60, - 0x1C, 0x65, 0x45, 0x4A, 0xD5, 0x80, 0x2C, 0x45, 0x2A, 0x06, 0x27, 0x40, 0x04, 0x27, 0x30, 0x00, - 0x2A, 0x43, 0xD7, 0x85, 0x45, 0x48, 0xD6, 0xF1, 0x0F, 0xF2, 0xD3, 0x80, 0x01, 0x65, 0x01, 0x07, - 0x00, 0x65, 0xB4, 0x84, 0x0F, 0xFA, 0x00, 0x63, 0x3F, 0xF2, 0x28, 0x45, 0x60, 0x41, 0xD4, 0x84, - 0xDF, 0x83, 0xFC, 0x07, 0x14, 0xFC, 0x61, 0x44, 0x01, 0x36, 0x02, 0x00, 0x09, 0x3A, 0x06, 0x00, - 0x28, 0x44, 0x48, 0x88, 0x2A, 0x44, 0xC8, 0x83, 0x43, 0x4A, 0xE5, 0x01, 0x17, 0xFA, 0x04, 0x60, - 0x00, 0x64, 0x27, 0x45, 0xB4, 0x84, 0x2A, 0xFA, 0x28, 0x43, 0x16, 0xFC, 0x0D, 0x00, 0x3F, 0xF2, - 0x2C, 0x45, 0xD6, 0xF1, 0xC4, 0x81, 0xD1, 0x80, 0x0F, 0xF2, 0x01, 0x06, 0x01, 0xBC, 0x0F, 0xFA, - 0x3F, 0xF2, 0x17, 0xFA, 0x01, 0x64, 0x14, 0xFA, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x0E, 0xF0, - 0x63, 0x46, 0x00, 0x7F, 0x64, 0x5E, 0x4B, 0xFB, 0x64, 0x44, 0x00, 0x7E, 0xDB, 0xFB, 0x7C, 0xF1, - 0x60, 0x43, 0x60, 0x47, 0xD0, 0x80, 0xC0, 0x65, 0x01, 0x06, 0x64, 0x44, 0x0A, 0x36, 0x70, 0x64, - 0x14, 0x36, 0x38, 0x64, 0x37, 0x36, 0x15, 0x64, 0x6E, 0x36, 0x0B, 0x64, 0x44, 0x86, 0x2A, 0xF2, - 0x07, 0xF0, 0x60, 0x40, 0xB0, 0x3A, 0x03, 0x00, 0x40, 0x3B, 0x01, 0x00, 0x12, 0x00, 0x0C, 0xB4, - 0x08, 0x3A, 0x55, 0x00, 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x2B, 0x50, 0x00, 0x17, 0xF2, - 0x22, 0xF0, 0xFF, 0xFF, 0x64, 0x40, 0x22, 0x22, 0x04, 0x00, 0x00, 0xA8, 0x01, 0xA8, 0x47, 0x03, - 0x46, 0x03, 0x3C, 0x46, 0x2A, 0xF0, 0x40, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0x60, 0x45, 0x22, 0xF2, - 0xFF, 0xFF, 0x60, 0x43, 0x60, 0x40, 0x01, 0x26, 0x03, 0x00, 0x04, 0x26, 0x0A, 0x00, 0x02, 0x00, - 0x04, 0x27, 0x07, 0x00, 0x65, 0x44, 0x2A, 0x65, 0x60, 0x40, 0x03, 0x2B, 0x24, 0x65, 0x45, 0x4C, - 0x2E, 0x00, 0x65, 0x44, 0x2E, 0x65, 0x60, 0x40, 0x03, 0x2B, 0x28, 0x65, 0x45, 0x4C, 0x07, 0xF0, - 0xA9, 0xF3, 0xFF, 0xFF, 0xD0, 0x80, 0x00, 0x7C, 0x03, 0x03, 0x63, 0x40, 0x01, 0x2A, 0x01, 0x00, - 0x3D, 0xF1, 0x2A, 0xF2, 0xFF, 0xFF, 0x08, 0xB0, 0x3E, 0xF2, 0x19, 0x03, 0x60, 0x47, 0xE8, 0x84, - 0xE8, 0x84, 0xE8, 0x84, 0x03, 0xB4, 0xD0, 0x80, 0xFF, 0xFF, 0x11, 0x03, 0x24, 0x60, 0x6E, 0x62, - 0x24, 0x60, 0x46, 0x64, 0xA2, 0xDB, 0x3C, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0x5C, 0x5C, 0xFC, 0xFC, 0xCE, 0xFE, 0xB0, 0x60, 0xE1, 0x78, 0xFF, 0xFF, 0xDB, 0xF1, - 0x2C, 0x45, 0x64, 0x43, 0x17, 0xF2, 0x4B, 0xF1, 0xC4, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x81, - 0x63, 0x40, 0x37, 0x37, 0xE1, 0x81, 0x64, 0x45, 0xB0, 0x60, 0x58, 0x4D, 0xB6, 0x78, 0xFF, 0xFF, - 0xAE, 0x82, 0xFC, 0xA2, 0x0A, 0x03, 0x63, 0x40, 0x6E, 0x3B, 0x06, 0x00, 0x60, 0x41, 0x04, 0x0D, - 0x63, 0x44, 0x80, 0x7E, 0xDB, 0xFB, 0x61, 0x44, 0xDC, 0x84, 0x2B, 0xF0, 0x1B, 0xFA, 0x64, 0x44, - 0x80, 0x27, 0x34, 0x00, 0x16, 0xF2, 0x0F, 0xF0, 0xAC, 0x84, 0x2C, 0x45, 0x29, 0x03, 0x4B, 0xF1, - 0xC4, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x81, 0x63, 0x40, 0x37, 0x37, 0xE1, 0x81, 0x64, 0x45, - 0x0F, 0xF0, 0xB0, 0x60, 0x58, 0x4D, 0xB6, 0x78, 0xFF, 0xFF, 0xAE, 0x82, 0xFC, 0xA2, 0x0A, 0x03, - 0x63, 0x40, 0x6E, 0x3B, 0x06, 0x00, 0x60, 0x41, 0x04, 0x0D, 0x80, 0x67, 0xB0, 0x84, 0x0F, 0xFA, - 0x61, 0x44, 0xDC, 0x84, 0x1D, 0xFA, 0xDE, 0x65, 0xC4, 0x85, 0x26, 0x41, 0xE1, 0x81, 0xC5, 0x84, - 0x2B, 0xFA, 0x1B, 0xF0, 0xDE, 0x64, 0xC0, 0x85, 0x26, 0x44, 0xE0, 0x84, 0xC4, 0x84, 0x10, 0xFA, - 0x26, 0x44, 0x2C, 0xF0, 0x0A, 0xA4, 0x64, 0x40, 0x01, 0x26, 0x00, 0x64, 0x11, 0xFA, 0xDB, 0xF3, - 0x13, 0xFA, 0xFF, 0xFF, 0x0D, 0xF2, 0x3E, 0xF0, 0x60, 0x47, 0xFF, 0xB4, 0x64, 0x41, 0x01, 0xB1, - 0x01, 0x63, 0x1D, 0x02, 0x60, 0x41, 0xFF, 0x22, 0x04, 0x00, 0xB0, 0x60, 0x58, 0x4F, 0xA7, 0x78, - 0xFF, 0xFF, 0x0F, 0x60, 0x92, 0x64, 0xA0, 0xDD, 0x2D, 0x60, 0x5A, 0x62, 0xA2, 0xD3, 0xB0, 0x60, - 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0x60, 0x41, 0x01, 0x63, 0x61, 0x40, 0xFF, 0x22, 0x04, 0x00, - 0xB0, 0x60, 0x58, 0x4F, 0xA7, 0x78, 0xFF, 0xFF, 0x0F, 0x60, 0x94, 0x64, 0xA0, 0xDD, 0x2A, 0xF2, - 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x27, 0x03, 0x00, 0xB5, 0x60, 0x19, 0x78, 0xFF, 0xFF, 0x22, 0xF2, - 0x46, 0x43, 0x60, 0x40, 0x22, 0x26, 0x8B, 0x00, 0x01, 0x26, 0x05, 0x00, 0x04, 0x26, 0x0C, 0x00, - 0xB5, 0x60, 0x19, 0x78, 0xFF, 0xFF, 0x04, 0x27, 0x03, 0x00, 0xB5, 0x60, 0x19, 0x78, 0xFF, 0xFF, - 0xA9, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0x02, 0x00, 0x07, 0xF4, 0xFF, 0xFF, 0xA3, 0x46, 0x2A, 0xF2, - 0xA3, 0x46, 0x60, 0x40, 0x08, 0x27, 0x3B, 0x00, 0xA9, 0xF3, 0x66, 0x5C, 0xD0, 0x80, 0x37, 0xF0, - 0x08, 0x03, 0x64, 0x40, 0x10, 0x2A, 0x12, 0x00, 0xFF, 0x60, 0xEF, 0x64, 0xA0, 0x84, 0x37, 0xFA, - 0x24, 0x00, 0x3D, 0xF3, 0x01, 0x61, 0x60, 0x43, 0xCF, 0x83, 0xE1, 0x81, 0xFD, 0x0D, 0xE9, 0x81, - 0xA1, 0x80, 0xFF, 0xFF, 0x03, 0x03, 0x91, 0x84, 0x37, 0xFA, 0x17, 0x00, 0x47, 0xF2, 0xFF, 0xFF, - 0x10, 0xA0, 0xFF, 0xFF, 0x02, 0x04, 0xFF, 0x60, 0xFF, 0x64, 0xDC, 0x84, 0x47, 0xFA, 0x46, 0xF2, - 0x16, 0x04, 0xDC, 0x84, 0x46, 0xFA, 0x45, 0xF2, 0x08, 0x04, 0xDC, 0x84, 0x45, 0xFA, 0x05, 0x04, - 0x37, 0xF2, 0xFF, 0xFF, 0xE0, 0x84, 0xE8, 0x84, 0x37, 0xFA, 0x0D, 0x60, 0x3E, 0x62, 0x80, 0xFF, - 0x78, 0x44, 0x03, 0xA4, 0xA2, 0xDB, 0xBE, 0x60, 0x66, 0x78, 0xFF, 0xFF, 0x84, 0xFF, 0x0D, 0x60, - 0x3E, 0x62, 0x80, 0xFF, 0x78, 0x44, 0x03, 0xA4, 0xA2, 0xDB, 0xBE, 0x60, 0xDE, 0x78, 0xFF, 0xFF, - 0x84, 0xFF, 0xA9, 0xF3, 0x66, 0x5C, 0xD0, 0x80, 0x00, 0x7C, 0x07, 0x03, 0x66, 0x43, 0x3C, 0x46, - 0x22, 0xF2, 0x63, 0x46, 0x60, 0x40, 0x01, 0x2A, 0x01, 0x00, 0x3C, 0xF1, 0x47, 0xF0, 0x64, 0x41, - 0x64, 0x47, 0xFF, 0xB4, 0x60, 0x5F, 0x20, 0xBC, 0x80, 0x26, 0x80, 0xAC, 0x60, 0x47, 0xA3, 0x46, - 0x3A, 0xFA, 0x64, 0x44, 0x20, 0x7F, 0x34, 0x94, 0x3B, 0xFA, 0xA3, 0x46, 0x46, 0xF2, 0x45, 0xF0, - 0xA3, 0x46, 0x3C, 0xFA, 0x3D, 0xF8, 0x08, 0x60, 0x00, 0xEA, 0x0F, 0x64, 0x60, 0x7F, 0xA0, 0x5A, - 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0x8A, 0x00, 0x2A, 0xF2, - 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x27, 0x35, 0x00, 0x2A, 0xF2, 0x00, 0x60, 0x7C, 0x62, 0x60, 0x40, - 0x40, 0x2B, 0x27, 0x00, 0xA2, 0xD3, 0x00, 0x61, 0x60, 0xFE, 0xA0, 0xD3, 0xDE, 0x82, 0xA2, 0xD1, - 0xFF, 0xFF, 0x20, 0xFE, 0x64, 0x5F, 0xDC, 0x84, 0xF1, 0x81, 0xC0, 0x2B, 0x04, 0x00, 0x80, 0x2A, - 0x02, 0x00, 0x7F, 0xA4, 0xDC, 0x84, 0xFF, 0x3B, 0x03, 0x00, 0x60, 0x47, 0xDC, 0x87, 0x01, 0x61, - 0xC0, 0x80, 0x00, 0x36, 0xDC, 0x84, 0x4E, 0xDB, 0x60, 0xFE, 0xDA, 0x82, 0xA2, 0xD1, 0xFF, 0xFF, - 0xC1, 0x84, 0xF0, 0x22, 0x10, 0xA4, 0xF0, 0x2A, 0x01, 0x00, 0x00, 0x64, 0xA2, 0xDB, 0xFF, 0xFF, - 0x20, 0xFE, 0x00, 0x60, 0x7C, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xA0, 0xD3, 0x5A, 0xD1, 0x3A, 0xFA, - 0x3B, 0xF8, 0x74, 0x62, 0xA2, 0xD0, 0xFF, 0xFF, 0x64, 0x44, 0xE0, 0x7F, 0xA0, 0x5A, 0x64, 0x47, - 0xE1, 0x7F, 0x5A, 0xD0, 0xA0, 0x5A, 0x64, 0x44, 0xE2, 0x7F, 0xA0, 0x5A, 0x00, 0x60, 0x80, 0x62, - 0xA2, 0xD3, 0xFF, 0xFF, 0xA0, 0xD1, 0x5A, 0xD1, 0x64, 0x45, 0x64, 0x44, 0xE3, 0x7F, 0xA0, 0x5A, - 0x64, 0x47, 0xE4, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xE5, 0x7F, 0xA0, 0x5A, 0x64, 0x47, - 0xE6, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xE7, 0x7F, 0xA0, 0x5A, 0x65, 0x40, 0x0D, 0x3A, - 0x1C, 0x00, 0x64, 0x47, 0xE8, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xE9, 0x7F, 0xA0, 0x5A, - 0x64, 0x47, 0xEA, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xEB, 0x7F, 0xA0, 0x5A, 0x64, 0x47, - 0xEC, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xED, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xEE, 0x7F, - 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xEF, 0x7F, 0xA0, 0x5A, 0x08, 0x60, 0x00, 0xEA, 0x65, 0x44, - 0x02, 0xA4, 0x60, 0x7F, 0xA0, 0x5A, 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, - 0x00, 0xEA, 0x02, 0x64, 0x3B, 0xDB, 0xB8, 0x60, 0xBE, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0xFC, 0xFB, - 0x07, 0xF0, 0x00, 0x64, 0xD0, 0x80, 0xA9, 0xF3, 0x17, 0x03, 0xD0, 0x80, 0x66, 0x41, 0x64, 0x46, - 0x6F, 0xF2, 0x61, 0x46, 0x7B, 0x03, 0x60, 0x40, 0x00, 0x36, 0x78, 0x00, 0x47, 0xF1, 0x07, 0xF0, - 0x64, 0x40, 0x02, 0x26, 0x01, 0x00, 0x0B, 0x00, 0x03, 0x12, 0xB6, 0x60, 0x38, 0x78, 0xFF, 0xFF, - 0xFC, 0x0A, 0xB7, 0x60, 0x56, 0x78, 0xFF, 0xFF, 0xB7, 0x60, 0x56, 0x78, 0xFF, 0xFF, 0x66, 0x41, - 0x64, 0x46, 0x0E, 0xF2, 0x60, 0x45, 0x61, 0x46, 0x10, 0x7E, 0x4E, 0xFB, 0x65, 0x44, 0x60, 0x40, - 0x01, 0x36, 0x5C, 0x00, 0x02, 0x36, 0x5D, 0x00, 0x03, 0x36, 0x34, 0x00, 0x04, 0x36, 0x45, 0x00, - 0x67, 0x00, 0x00, 0x64, 0x4C, 0xFB, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, 0x05, 0x7E, - 0x6F, 0xFA, 0x61, 0x46, 0x00, 0x65, 0x65, 0x43, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, 0x8C, 0xFA, - 0x00, 0xA8, 0x6F, 0xF2, 0x15, 0x03, 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, 0x00, 0xBB, 0xFF, 0xA0, - 0x07, 0x03, 0x0E, 0x06, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, 0x08, 0x00, - 0xB9, 0x81, 0xE8, 0x84, 0xD9, 0x81, 0xFD, 0x04, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, - 0x0C, 0xF4, 0xFF, 0xFF, 0x66, 0x41, 0x64, 0x46, 0x0E, 0xF2, 0x61, 0x46, 0xFF, 0xFF, 0xA0, 0x7E, - 0x4E, 0xFB, 0x24, 0x00, 0x4C, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, 0x4C, 0xFB, 0xCB, 0xF3, 0x60, 0x45, - 0xD4, 0x80, 0xFF, 0xFF, 0x1B, 0x02, 0x24, 0x60, 0xA6, 0x62, 0x0F, 0x60, 0x96, 0x64, 0xA2, 0xDB, - 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0xBC, 0x01, 0x4C, 0xF3, 0x66, 0x41, 0xDC, 0x84, - 0x4C, 0xFB, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, 0x03, 0x7E, 0x6F, 0xFA, 0x61, 0x46, 0x66, 0x41, - 0x64, 0x46, 0x0E, 0xF2, 0x61, 0x46, 0xFF, 0xFF, 0xA4, 0x7E, 0x4E, 0xFB, 0xB7, 0x60, 0x56, 0x78, - 0xFF, 0xFF, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, 0x01, 0x7E, 0x6F, 0xFA, 0x61, 0x46, - 0x66, 0x41, 0x64, 0x46, 0x0E, 0xF2, 0x61, 0x46, 0xFF, 0xFF, 0xA8, 0x7E, 0x4E, 0xFB, 0xEE, 0x01, - 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0x8C, 0xFA, 0x60, 0x47, 0x70, 0xF2, 0xFF, 0xB5, 0x08, 0x18, - 0xE4, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x03, 0x02, 0xFB, 0x04, 0x01, 0x64, 0x01, 0x00, 0x00, 0x64, - 0x0C, 0xF4, 0x00, 0xA8, 0xFF, 0xFF, 0xDD, 0x02, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, - 0x60, 0x47, 0x70, 0xF2, 0xFF, 0xB5, 0x61, 0x46, 0x00, 0xA8, 0xFF, 0xFF, 0x29, 0x03, 0xE0, 0x84, - 0xA4, 0x80, 0xFF, 0xFF, 0xFC, 0x03, 0x66, 0x41, 0x64, 0x46, 0x70, 0xFA, 0x61, 0x46, 0x01, 0x65, - 0x65, 0x43, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, 0x8C, 0xFA, 0x00, 0xA8, 0x6F, 0xF2, 0x15, 0x03, - 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, 0x00, 0xBB, 0xFF, 0xA0, 0x07, 0x03, 0x0E, 0x06, 0xE8, 0x84, - 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, 0x08, 0x00, 0xB9, 0x81, 0xE8, 0x84, 0xD9, 0x81, - 0xFD, 0x04, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, 0x0C, 0xF4, 0xFF, 0xFF, 0x95, 0x01, - 0x94, 0x01, 0x65, 0x44, 0x60, 0x40, 0x01, 0x36, 0xA1, 0x01, 0x02, 0x36, 0x01, 0x00, 0x9E, 0x01, - 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, 0x01, 0x7E, 0x6F, 0xFA, 0x61, 0x46, 0x00, 0x65, - 0x65, 0x43, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, 0x8C, 0xFA, 0x00, 0xA8, 0x6F, 0xF2, 0x15, 0x03, - 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, 0x00, 0xBB, 0xFF, 0xA0, 0x07, 0x03, 0x0E, 0x06, 0xE8, 0x84, - 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, 0x08, 0x00, 0xB9, 0x81, 0xE8, 0x84, 0xD9, 0x81, - 0xFD, 0x04, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, 0x0C, 0xF4, 0xFF, 0xFF, 0x66, 0x41, - 0x64, 0x46, 0x0E, 0xF2, 0x61, 0x46, 0xD0, 0x7E, 0x4E, 0xFB, 0xB7, 0x60, 0x56, 0x78, 0xFF, 0xFF, - 0x60, 0x45, 0x66, 0x41, 0x64, 0x46, 0x0E, 0xF2, 0x61, 0x46, 0x20, 0x7E, 0x4E, 0xFB, 0x65, 0x44, - 0x60, 0x40, 0x01, 0x36, 0x0B, 0x00, 0x02, 0x36, 0x1A, 0x00, 0x03, 0x36, 0x53, 0x00, 0x04, 0x36, - 0x70, 0x00, 0x05, 0x36, 0x14, 0x00, 0xB7, 0x60, 0x56, 0x78, 0xFF, 0xFF, 0x07, 0xF0, 0x66, 0x41, - 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, 0x02, 0x7E, 0x6F, 0xFA, 0x61, 0x46, 0x66, 0x41, 0x64, 0x46, - 0x0E, 0xF2, 0x61, 0x46, 0xB0, 0x7E, 0x4E, 0xFB, 0xB7, 0x60, 0x56, 0x78, 0xFF, 0xFF, 0x07, 0xF0, - 0x01, 0x65, 0x65, 0x43, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, 0x8C, 0xFA, 0x00, 0xA8, 0x6F, 0xF2, - 0x15, 0x03, 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, 0x00, 0xBB, 0xFF, 0xA0, 0x07, 0x03, 0x0E, 0x06, - 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, 0x08, 0x00, 0xB9, 0x81, 0xE8, 0x84, - 0xD9, 0x81, 0xFD, 0x04, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, 0x0C, 0xF4, 0xFF, 0xFF, - 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0x00, 0x63, 0x03, 0x7E, 0x6F, 0xFA, 0x61, 0x46, 0x4C, 0xFD, - 0x66, 0x41, 0x64, 0x46, 0x0E, 0xF2, 0x61, 0x46, 0xB4, 0x7E, 0x4E, 0xFB, 0x24, 0x60, 0xA6, 0x62, - 0x0F, 0x60, 0x96, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0xB7, 0x60, - 0x56, 0x78, 0xFF, 0xFF, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, 0x4C, 0xF3, 0x02, 0xB0, 0x61, 0x46, - 0xCC, 0x84, 0x05, 0x03, 0x04, 0x28, 0x4C, 0xFB, 0xB7, 0x60, 0x56, 0x78, 0xFF, 0xFF, 0x04, 0x28, - 0x4C, 0xFB, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, 0x04, 0x7E, 0x6F, 0xFA, 0x61, 0x46, - 0x66, 0x41, 0x64, 0x46, 0x0E, 0xF2, 0x61, 0x46, 0xB8, 0x7E, 0x4E, 0xFB, 0xB7, 0x60, 0x56, 0x78, - 0xFF, 0xFF, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, - 0x61, 0x46, 0xFF, 0xA0, 0xFF, 0xFF, 0x35, 0x06, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, - 0xFB, 0x04, 0x2F, 0x00, 0x64, 0x46, 0x70, 0xFA, 0x01, 0x65, 0x65, 0x43, 0x66, 0x41, 0x64, 0x46, - 0x70, 0xF2, 0x8C, 0xFA, 0x00, 0xA8, 0x6F, 0xF2, 0x15, 0x03, 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, - 0x00, 0xBB, 0xFF, 0xA0, 0x07, 0x03, 0x0E, 0x06, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, - 0xFB, 0x04, 0x08, 0x00, 0xB9, 0x81, 0xE8, 0x84, 0xD9, 0x81, 0xFD, 0x04, 0x0F, 0x60, 0xA2, 0x65, - 0x45, 0xD3, 0x0E, 0xFA, 0x0C, 0xF4, 0xFF, 0xFF, 0x6F, 0xF2, 0x00, 0x63, 0x03, 0x7E, 0x6F, 0xFA, - 0x3C, 0x46, 0x4C, 0xFD, 0x66, 0x41, 0x64, 0x46, 0x0E, 0xF2, 0x61, 0x46, 0xC0, 0x7E, 0x4E, 0xFB, - 0x5D, 0x00, 0x5C, 0x00, 0x65, 0x44, 0x60, 0x40, 0x01, 0x36, 0x03, 0x00, 0x02, 0x36, 0x18, 0x00, - 0x55, 0x00, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, 0x61, 0x46, 0x01, 0xB0, 0xFF, 0xFF, 0x4E, 0x02, - 0x07, 0xF0, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, 0x02, 0x7E, 0x6F, 0xFA, 0x61, 0x46, - 0x66, 0x41, 0x64, 0x46, 0x0E, 0xF2, 0x61, 0x46, 0xE0, 0x7E, 0x4E, 0xFB, 0x3F, 0x00, 0x3E, 0x00, - 0x07, 0xF0, 0x66, 0x41, 0x64, 0x46, 0x6F, 0xF2, 0xFF, 0xFF, 0x01, 0x7E, 0x6F, 0xFA, 0x60, 0x47, - 0xFF, 0xB5, 0x70, 0xF2, 0x61, 0x46, 0xFF, 0xA0, 0xFF, 0xFF, 0xF1, 0x06, 0xE8, 0x84, 0xA4, 0x80, - 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, 0xEB, 0x01, 0x66, 0x41, 0x64, 0x46, 0x70, 0xFA, 0x61, 0x46, - 0x00, 0x65, 0x65, 0x43, 0x66, 0x41, 0x64, 0x46, 0x70, 0xF2, 0x8C, 0xFA, 0x00, 0xA8, 0x6F, 0xF2, - 0x15, 0x03, 0x60, 0x47, 0xFF, 0xB5, 0x70, 0xF2, 0x00, 0xBB, 0xFF, 0xA0, 0x07, 0x03, 0x0E, 0x06, - 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0x02, 0x02, 0xFB, 0x04, 0x08, 0x00, 0xB9, 0x81, 0xE8, 0x84, - 0xD9, 0x81, 0xFD, 0x04, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, 0x0C, 0xF4, 0xFF, 0xFF, - 0x66, 0x41, 0x64, 0x46, 0x0E, 0xF2, 0x61, 0x46, 0xE4, 0x7E, 0x4E, 0xFB, 0x03, 0x64, 0x3B, 0xDB, - 0xCA, 0xFE, 0x47, 0xF1, 0x01, 0x65, 0x32, 0x40, 0x04, 0x27, 0x08, 0x00, 0x2C, 0xF2, 0x64, 0x45, - 0x02, 0x22, 0x04, 0x00, 0x60, 0x40, 0x01, 0x26, 0x01, 0x00, 0xE3, 0x00, 0x14, 0xF2, 0x65, 0x40, - 0x01, 0x26, 0x1D, 0x00, 0x60, 0x45, 0x05, 0x64, 0x3B, 0xDB, 0x65, 0x44, 0xCC, 0x85, 0xB8, 0xF1, - 0x27, 0x60, 0x78, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xD8, 0x80, 0xC4, 0x84, 0x0B, 0x03, 0x07, 0x05, - 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x09, 0x04, 0xC6, 0xFE, 0x07, 0x00, 0x00, 0x64, - 0xB8, 0x84, 0xA2, 0xDB, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0xAF, 0x00, 0x60, 0x41, - 0x2A, 0xF0, 0x00, 0x60, 0x0C, 0x64, 0xA0, 0x84, 0x04, 0x36, 0x02, 0x00, 0x0C, 0x3A, 0x01, 0x00, - 0xA5, 0x00, 0x61, 0x45, 0x60, 0x41, 0xB8, 0xF1, 0x27, 0x60, 0x78, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, - 0xD8, 0x80, 0xC4, 0x84, 0x0B, 0x03, 0x07, 0x05, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, - 0x09, 0x04, 0xC6, 0xFE, 0x07, 0x00, 0x00, 0x64, 0xB8, 0x84, 0xA2, 0xDB, 0x8A, 0xFF, 0x20, 0x60, - 0x00, 0x75, 0x88, 0xFF, 0x61, 0x40, 0x08, 0x36, 0x01, 0x00, 0x88, 0x00, 0x14, 0xF2, 0x1C, 0x65, - 0x60, 0x41, 0x00, 0x63, 0xCD, 0x81, 0xC7, 0x83, 0xFD, 0x02, 0x3F, 0xF0, 0x2C, 0xF2, 0xC3, 0x83, - 0x60, 0x40, 0x01, 0x2A, 0x29, 0x00, 0xB8, 0xF1, 0x27, 0x60, 0x76, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, - 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, - 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0xB8, 0xF1, 0x27, 0x60, 0x7C, 0x64, 0xA0, 0xD3, - 0x63, 0x45, 0xD8, 0x80, 0xC4, 0x84, 0x0B, 0x03, 0x07, 0x05, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, - 0xA2, 0xDB, 0x09, 0x04, 0xC6, 0xFE, 0x07, 0x00, 0x00, 0x64, 0xB8, 0x84, 0xA2, 0xDB, 0x8A, 0xFF, - 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x52, 0x00, 0xB8, 0xF1, 0x27, 0x60, 0x74, 0x64, 0xA0, 0xD3, - 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, - 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0xB8, 0xF1, 0x27, 0x60, 0x7A, 0x64, - 0xA0, 0xD3, 0x63, 0x45, 0xD8, 0x80, 0xC4, 0x84, 0x0B, 0x03, 0x07, 0x05, 0xDC, 0x80, 0xD0, 0x80, - 0x04, 0x03, 0xA2, 0xDB, 0x09, 0x04, 0xC6, 0xFE, 0x07, 0x00, 0x00, 0x64, 0xB8, 0x84, 0xA2, 0xDB, - 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x15, 0xF2, 0xFF, 0xFF, 0x0F, 0xB4, 0x00, 0xA8, - 0x01, 0xA8, 0x24, 0x03, 0x12, 0x03, 0xB8, 0xF1, 0x27, 0x60, 0x82, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, - 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, - 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x11, 0x00, 0xB8, 0xF1, 0x27, 0x60, 0x80, 0x64, - 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, - 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x04, 0x64, 0x3B, 0xDB, - 0x24, 0x60, 0x6E, 0x62, 0x24, 0x60, 0x46, 0x64, 0xA2, 0xDB, 0x3C, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x5C, 0x5C, 0xFC, 0xFC, 0xCE, 0xFE, 0xB0, 0x60, 0xE1, 0x78, - 0xFF, 0xFF, 0x0F, 0xF0, 0x15, 0xF2, 0x64, 0x41, 0x01, 0x2A, 0x02, 0x00, 0xD1, 0xF1, 0x02, 0x00, - 0xD0, 0xF1, 0xFF, 0xFF, 0x64, 0x45, 0xDC, 0x84, 0xD4, 0x80, 0x15, 0xFA, 0x30, 0x07, 0x61, 0x40, - 0x01, 0x2A, 0x09, 0x00, 0x27, 0x60, 0xA8, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xFF, 0xFF, - 0x08, 0x28, 0xA2, 0xDB, 0x08, 0x00, 0x27, 0x60, 0xAA, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, - 0xFF, 0xFF, 0x08, 0x28, 0xA2, 0xDB, 0x2A, 0xF0, 0x08, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0x00, 0x64, - 0x48, 0xFB, 0x2D, 0x60, 0x52, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x0C, 0x00, - 0x3C, 0x46, 0x3E, 0xF2, 0x40, 0x60, 0x00, 0x65, 0xF0, 0x84, 0xA4, 0x84, 0x18, 0xFA, 0x2A, 0xF2, - 0xBF, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0x2A, 0xFA, 0xB2, 0x60, 0xFC, 0x78, 0xFF, 0xFF, 0x00, 0x64, - 0x49, 0xFB, 0xB8, 0xF1, 0x27, 0x60, 0x82, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, - 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, - 0x00, 0x75, 0x88, 0xFF, 0xB8, 0xF1, 0x27, 0x60, 0x84, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, - 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, - 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x2D, 0x60, 0x5A, 0x63, 0xA3, 0xD3, 0xB0, 0x60, 0x58, 0x4D, - 0xD8, 0x78, 0xFF, 0xFF, 0x0D, 0xF2, 0x60, 0x5C, 0x64, 0x5F, 0x0D, 0xFA, 0x23, 0xF0, 0x01, 0x64, - 0xB0, 0x84, 0xA2, 0xDA, 0x7B, 0x01, 0xB9, 0x60, 0x43, 0x78, 0xFF, 0xFF, 0x21, 0x64, 0x3B, 0xDB, - 0x31, 0xF3, 0x01, 0x63, 0xC4, 0xB4, 0x31, 0xFB, 0x32, 0xFD, 0xB8, 0x60, 0xEF, 0x62, 0x42, 0x40, - 0xA0, 0x4C, 0x40, 0xBC, 0x7D, 0xB4, 0xA0, 0x51, 0xA0, 0xFE, 0x1A, 0xFF, 0x24, 0x60, 0x3A, 0x64, - 0x08, 0xF0, 0x07, 0xF0, 0xD0, 0x80, 0x24, 0x60, 0x40, 0x62, 0x14, 0x02, 0xA2, 0xD3, 0x01, 0x63, - 0xAC, 0x86, 0x07, 0xF2, 0x0F, 0x03, 0xD0, 0x80, 0x09, 0xF2, 0xFA, 0x02, 0x23, 0xFC, 0x24, 0x60, - 0x6E, 0x62, 0x24, 0x60, 0x46, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0x3C, 0x46, 0x06, 0x64, 0xA1, 0xFF, 0x49, 0xFB, 0x83, 0x3E, 0x31, 0xF3, - 0x87, 0x60, 0x80, 0x61, 0x1D, 0xF0, 0x60, 0x40, 0x01, 0x2A, 0x15, 0x00, 0xFE, 0xB4, 0x31, 0xFB, - 0x00, 0x64, 0x49, 0xFB, 0x01, 0x64, 0x47, 0xFB, 0x2D, 0x60, 0x5A, 0x63, 0xA3, 0xD3, 0xB0, 0x60, - 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x71, 0x64, 0x5F, 0x0D, 0xFA, 0x40, 0x64, 0x3B, 0xDB, - 0xB9, 0x60, 0x43, 0x78, 0xFF, 0xFF, 0x02, 0x2A, 0x1B, 0x00, 0xD1, 0x91, 0x8D, 0xE2, 0x41, 0x64, - 0x3B, 0xDB, 0x31, 0xF3, 0x2D, 0x60, 0x62, 0x63, 0xFD, 0xB4, 0x31, 0xFB, 0xA3, 0xD3, 0xB0, 0x60, - 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0x02, 0x63, 0x60, 0x5C, 0x0D, 0xF2, 0x47, 0xFD, 0xFF, 0xB5, - 0x60, 0x47, 0xD0, 0x80, 0xDC, 0x84, 0x1F, 0x03, 0x60, 0x47, 0xB4, 0x84, 0x0D, 0xFA, 0x1B, 0x00, - 0x08, 0x2A, 0x07, 0x00, 0x42, 0x64, 0x3B, 0xDB, 0x31, 0xF3, 0xFF, 0xFF, 0xF7, 0xB4, 0x31, 0xFB, - 0x12, 0x00, 0x10, 0x2A, 0x09, 0x00, 0x43, 0x64, 0x3B, 0xDB, 0x31, 0xF3, 0xFF, 0xFF, 0xEF, 0xB4, - 0x31, 0xFB, 0xB8, 0x60, 0xBE, 0x78, 0xFF, 0xFF, 0x44, 0x64, 0x3B, 0xDB, 0x31, 0xF3, 0xFF, 0xFF, - 0xDF, 0xB4, 0x31, 0xFB, 0x00, 0x00, 0x2A, 0x64, 0x3B, 0xDB, 0xB0, 0x60, 0x97, 0x64, 0x40, 0x40, - 0xB5, 0x60, 0x1E, 0x78, 0xFF, 0xFF, 0x1C, 0x60, 0xB8, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0x02, 0xB5, - 0x04, 0xB5, 0x04, 0x03, 0x03, 0x03, 0xBA, 0x60, 0x3C, 0x78, 0xFF, 0xFF, 0x86, 0xFF, 0x20, 0x44, - 0x84, 0xFF, 0x20, 0x2A, 0x04, 0x00, 0xF3, 0x60, 0x58, 0x4E, 0x14, 0x78, 0xFF, 0xFF, 0x31, 0x40, - 0x01, 0x26, 0x17, 0x00, 0xA0, 0x4C, 0x49, 0xBC, 0xFF, 0xB4, 0xA0, 0x51, 0x1C, 0x60, 0xB8, 0x63, - 0xA3, 0xD3, 0xFF, 0xFF, 0x02, 0xB5, 0x04, 0xBC, 0x09, 0x03, 0x60, 0x40, 0x01, 0x26, 0xED, 0xE2, - 0xFE, 0xB4, 0xA3, 0xDB, 0xA0, 0x4C, 0x7D, 0xB4, 0xA0, 0x51, 0x03, 0x00, 0xA0, 0x4C, 0x6D, 0xB4, - 0xA0, 0x51, 0xDC, 0xF3, 0xFF, 0xFF, 0xFD, 0xA0, 0xFF, 0xFF, 0x48, 0x03, 0x31, 0x40, 0x04, 0x2A, - 0x3E, 0x00, 0x6D, 0xF3, 0x74, 0xF3, 0xCC, 0x83, 0x6D, 0xFD, 0xCC, 0x84, 0x74, 0xFB, 0x1F, 0x02, - 0x31, 0x40, 0x02, 0x2A, 0x12, 0x00, 0x6F, 0xF3, 0x70, 0xF1, 0xCC, 0x84, 0x6F, 0xFB, 0x0D, 0x02, - 0x6F, 0xF9, 0x31, 0x44, 0x08, 0xBC, 0x40, 0x51, 0x72, 0xF3, 0x71, 0xF1, 0x00, 0xB8, 0x64, 0x45, - 0x01, 0x03, 0x67, 0x45, 0x65, 0x50, 0xCC, 0x84, 0x73, 0xFB, 0x28, 0x60, 0x00, 0x64, 0xA0, 0xD3, - 0x6E, 0xF1, 0x00, 0xB8, 0x74, 0xF9, 0x03, 0x03, 0x87, 0xF3, 0x6D, 0xFB, 0x04, 0x00, 0x6D, 0xF3, - 0x87, 0xF1, 0x15, 0x1B, 0x6D, 0xF9, 0x31, 0x40, 0x01, 0x2A, 0x11, 0x00, 0xDD, 0xFE, 0x0F, 0x05, - 0xBA, 0xFE, 0xAD, 0x4F, 0x00, 0x7F, 0x01, 0xBC, 0xA0, 0x5D, 0x00, 0xEE, 0x7F, 0xF1, 0x02, 0x60, - 0xEE, 0x64, 0xA3, 0xFB, 0xA4, 0xF9, 0x04, 0x64, 0xA5, 0xFB, 0xDF, 0xFE, 0x19, 0xFF, 0x1A, 0x60, - 0x42, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xCC, 0x84, 0xFF, 0x2B, 0xA2, 0xDB, 0x31, 0x40, 0x01, 0x2A, - 0x29, 0x00, 0x9D, 0xFE, 0x27, 0x04, 0x26, 0x0A, 0x9F, 0xFE, 0x24, 0x05, 0x85, 0xFF, 0x20, 0x44, - 0x84, 0xFF, 0x40, 0x26, 0x1F, 0x00, 0x3F, 0x40, 0x20, 0x2B, 0x1C, 0x00, 0x38, 0x69, 0xFF, 0xFF, - 0x68, 0x44, 0x01, 0x16, 0xFD, 0x01, 0x01, 0x2A, 0x15, 0x00, 0x27, 0x60, 0xB4, 0x64, 0xA0, 0xD3, - 0xFF, 0xFF, 0xDC, 0x84, 0xFF, 0xFF, 0x08, 0x28, 0xA2, 0xDB, 0x7F, 0xF1, 0x02, 0x60, 0xEE, 0x64, - 0xA3, 0xFB, 0xFF, 0xFF, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA4, 0xFB, 0x04, 0x64, 0xA5, 0xFB, - 0xDF, 0xFE, 0x19, 0xFF, 0x10, 0x64, 0x3B, 0xDB, 0x80, 0xF3, 0x73, 0x45, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x93, 0xC9, 0xFE, 0x49, 0xF3, 0x3C, 0x46, 0x27, 0x18, 0xCC, 0x84, - 0x49, 0xFB, 0x24, 0x02, 0xBB, 0x60, 0x18, 0x64, 0x40, 0x42, 0xFC, 0xFC, 0x00, 0x64, 0x5C, 0x5C, - 0x32, 0xFB, 0x82, 0xFF, 0x5C, 0x47, 0x84, 0xFF, 0x62, 0xFF, 0x27, 0x60, 0xA4, 0x64, 0xA0, 0xD3, - 0xFF, 0xFF, 0xDC, 0x84, 0xFF, 0xFF, 0x08, 0x28, 0xA2, 0xDB, 0x23, 0xF0, 0x01, 0x64, 0xB0, 0x84, - 0xA2, 0xDA, 0x24, 0x60, 0x6E, 0x62, 0x24, 0x60, 0x46, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0xCE, 0xFE, 0x6A, 0xF3, 0xFF, 0xFF, - 0x60, 0x41, 0xFD, 0xB4, 0xA2, 0xDB, 0x61, 0x44, 0x01, 0xB0, 0x02, 0xB0, 0x0C, 0x03, 0x0B, 0x02, - 0x9D, 0xFE, 0x09, 0x04, 0x24, 0x60, 0xA6, 0x62, 0x1A, 0x60, 0xA2, 0x64, 0xA2, 0xDB, 0x02, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x07, 0x00, 0x80, 0xF3, 0x73, 0x45, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x93, 0x1C, 0x60, 0xB4, 0x63, 0xA3, 0xD3, 0xAD, 0x49, 0x20, 0xB5, - 0x08, 0xB1, 0x23, 0x03, 0xE1, 0x81, 0x10, 0xB5, 0x95, 0x81, 0x60, 0x41, 0x18, 0x02, 0x1C, 0x60, - 0xB6, 0x7C, 0xA4, 0xD3, 0xFF, 0xFF, 0xCC, 0x84, 0xA4, 0xDB, 0x17, 0x02, 0x05, 0x64, 0xA4, 0xDB, - 0x61, 0x44, 0x07, 0xB4, 0xFF, 0xFF, 0x11, 0x02, 0x08, 0xB1, 0xE1, 0x81, 0x95, 0x81, 0xA3, 0xD3, - 0x0C, 0x03, 0x08, 0xAC, 0x01, 0xBC, 0xA3, 0xDB, 0xFF, 0xFF, 0x13, 0xFF, 0x06, 0x00, 0x10, 0xAC, - 0xA3, 0xDB, 0x1C, 0x60, 0xB6, 0x63, 0x05, 0x7C, 0xA3, 0xD9, 0xB0, 0x60, 0xA4, 0x78, 0xFF, 0xFF, - 0x46, 0xF3, 0x45, 0xF1, 0x05, 0x1B, 0x64, 0x44, 0x03, 0x1B, 0x0F, 0x60, 0x92, 0x62, 0xA2, 0xD3, - 0x45, 0xFB, 0x00, 0x63, 0x46, 0xFD, 0x60, 0x41, 0x25, 0x64, 0x3B, 0xDB, 0x27, 0x44, 0xEF, 0xB4, - 0x40, 0x47, 0x00, 0xB9, 0x71, 0x40, 0x80, 0x27, 0x01, 0x12, 0x2B, 0x03, 0xBA, 0x60, 0x93, 0x62, - 0x84, 0xFF, 0x42, 0x42, 0x82, 0xFF, 0xA0, 0x4C, 0x14, 0xBC, 0xFF, 0xB4, 0xA0, 0x51, 0x31, 0x0A, - 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x70, 0x44, 0xAC, 0x80, 0x2B, 0x0A, 0x71, 0x40, 0x80, 0x27, - 0xF7, 0x12, 0x45, 0xF3, 0x4C, 0x02, 0x15, 0x18, 0x31, 0x60, 0x0E, 0x7C, 0xA4, 0xD3, 0xFF, 0xFF, - 0x0B, 0x18, 0x31, 0x60, 0x10, 0x7C, 0xA4, 0xD3, 0xFF, 0xFF, 0x06, 0x18, 0xAC, 0x4C, 0x80, 0x26, - 0x03, 0x00, 0x00, 0x64, 0x45, 0xFB, 0x05, 0x00, 0x45, 0xF3, 0xFF, 0xFF, 0xCC, 0x84, 0x45, 0xFB, - 0xDF, 0x02, 0x06, 0x0A, 0xA0, 0x4C, 0xFB, 0xB4, 0xA0, 0x51, 0xA3, 0x60, 0x99, 0x78, 0xFF, 0xFF, - 0x84, 0xFF, 0xBA, 0x60, 0x70, 0x64, 0x40, 0x42, 0x82, 0xFF, 0xA0, 0x4C, 0x14, 0xBC, 0xFF, 0xB4, - 0xA0, 0x51, 0xAB, 0x60, 0x2C, 0x78, 0xFF, 0xFF, 0x3C, 0x44, 0xAC, 0x80, 0x32, 0xF1, 0x25, 0x03, - 0x64, 0x40, 0x07, 0x22, 0x22, 0x00, 0xA3, 0x60, 0x7B, 0x78, 0xFF, 0xFF, 0xA0, 0x4C, 0x1C, 0xBC, - 0xDF, 0xB4, 0xA0, 0x51, 0x31, 0x40, 0x08, 0x2A, 0xEF, 0x01, 0x73, 0xF3, 0x71, 0xF1, 0x00, 0xA0, - 0xDC, 0x80, 0x05, 0x03, 0x08, 0x03, 0xCC, 0x84, 0x73, 0xFB, 0x67, 0x50, 0x08, 0x00, 0xCC, 0x84, - 0x73, 0xFB, 0x64, 0x50, 0x04, 0x00, 0x31, 0x44, 0xF7, 0xB4, 0x40, 0x51, 0x06, 0x00, 0x28, 0x64, - 0x3A, 0xDB, 0xA0, 0x4C, 0x30, 0xBC, 0xF3, 0xB4, 0xA0, 0x51, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, - 0x28, 0x64, 0x3B, 0xDB, 0x0F, 0x60, 0x94, 0x62, 0xA2, 0xD3, 0x32, 0x40, 0x02, 0x27, 0x16, 0x00, - 0x46, 0xFB, 0x14, 0x18, 0xBB, 0x60, 0x06, 0x64, 0x84, 0xFF, 0x40, 0x42, 0x82, 0xFF, 0xA0, 0x4C, - 0x14, 0xBC, 0xF7, 0xB4, 0xA0, 0x51, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x70, 0x44, 0xAC, 0x80, - 0x46, 0xF3, 0xB7, 0x0A, 0xDC, 0x02, 0xCC, 0x84, 0x46, 0xFB, 0xF5, 0x02, 0x84, 0xFF, 0xBB, 0x60, - 0x18, 0x64, 0x40, 0x42, 0x82, 0xFF, 0x27, 0x44, 0x08, 0xBC, 0x40, 0x47, 0xBB, 0xE1, 0x04, 0x00, - 0x3A, 0xE1, 0x31, 0x40, 0x01, 0x26, 0xBB, 0xE1, 0xA3, 0x60, 0x6F, 0x78, 0xFF, 0xFF, 0x43, 0xFF, - 0x39, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x84, 0x3E, 0xFB, 0x01, 0xA0, 0x4C, 0x3D, 0x46, 0x2A, 0xF2, - 0x46, 0x4D, 0x10, 0x25, 0x0E, 0x00, 0x09, 0xE1, 0xA1, 0xFF, 0x66, 0x40, 0x0F, 0xF2, 0x01, 0x29, - 0x02, 0x00, 0x40, 0xFF, 0x0A, 0xBC, 0xA2, 0xDA, 0x08, 0x25, 0xE9, 0x01, 0xCB, 0xFE, 0x5C, 0x5D, - 0xE7, 0x01, 0x44, 0xFF, 0x31, 0xF2, 0x1C, 0x60, 0xBA, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x31, 0xF0, - 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x30, 0xF0, 0x63, 0x46, 0xD0, 0x80, - 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x2F, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, - 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0xA9, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, - 0x07, 0xFC, 0x3F, 0xF2, 0x09, 0x60, 0xB0, 0x65, 0xD4, 0x80, 0x2A, 0xF2, 0xC4, 0x05, 0x08, 0x25, - 0xB6, 0x01, 0x00, 0x64, 0x0D, 0x60, 0x2C, 0x61, 0x40, 0x4B, 0xA1, 0xDB, 0x2D, 0x46, 0x3B, 0xF2, - 0xA9, 0xF1, 0x87, 0xF4, 0x60, 0x40, 0x20, 0x2B, 0x12, 0x00, 0xD3, 0x80, 0x2C, 0xF0, 0xB3, 0x03, - 0x07, 0xF4, 0x64, 0x40, 0x01, 0x26, 0xA9, 0xF5, 0xB6, 0xF4, 0x2D, 0x46, 0x04, 0x64, 0x04, 0xB3, - 0x22, 0xFA, 0x04, 0x03, 0xBC, 0x60, 0x72, 0x78, 0xFF, 0xFF, 0x01, 0x00, 0xDE, 0x00, 0x74, 0x62, - 0xA2, 0xD0, 0xFF, 0xFF, 0x64, 0x44, 0xE0, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xE1, 0x7F, 0x5A, 0xD0, - 0xA0, 0x5B, 0x64, 0x44, 0xE2, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0x7C, 0x5F, 0xE8, 0x84, 0xE8, 0x85, - 0x0C, 0x60, 0x3A, 0x64, 0x44, 0xD3, 0x5A, 0xD1, 0x03, 0x1B, 0xBC, 0x60, 0x65, 0x78, 0xFF, 0xFF, - 0x60, 0x45, 0x64, 0x44, 0xE3, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xE4, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, - 0x64, 0x44, 0xE5, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xE6, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, - 0xE7, 0x7F, 0xA0, 0x5B, 0x65, 0x40, 0x0D, 0x3A, 0x1C, 0x00, 0x64, 0x47, 0xE8, 0x7F, 0x5A, 0xD1, - 0xA0, 0x5B, 0x64, 0x44, 0xE9, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xEA, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, - 0x64, 0x44, 0xEB, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xEC, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, - 0xED, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xEE, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, 0xEF, 0x7F, - 0xA0, 0x5B, 0x65, 0x44, 0xD8, 0x84, 0x08, 0x25, 0x76, 0x00, 0x60, 0x7F, 0xA0, 0x5B, 0x80, 0x60, - 0x00, 0xEB, 0xA0, 0x60, 0x00, 0xEB, 0xD1, 0x60, 0x00, 0xEB, 0x3F, 0xF2, 0x04, 0x65, 0xC4, 0x83, - 0x0A, 0xE1, 0xB3, 0xFF, 0x9A, 0xFF, 0xCB, 0x83, 0x00, 0xF4, 0x10, 0x62, 0x6C, 0x61, 0x0E, 0xA3, - 0xAB, 0x84, 0xF2, 0xA3, 0xA1, 0xFF, 0x08, 0x00, 0x00, 0xF4, 0x81, 0xF2, 0x02, 0x62, 0xC9, 0x81, - 0xAB, 0x84, 0xA1, 0xFF, 0x01, 0x00, 0xA2, 0xDC, 0x7A, 0xD4, 0xFD, 0x1C, 0xA2, 0xDC, 0x08, 0x25, - 0x52, 0x00, 0xF2, 0x1D, 0x7C, 0xA8, 0xD9, 0x81, 0xEF, 0x03, 0xFF, 0xB1, 0x09, 0x1E, 0x02, 0x02, - 0x00, 0xF4, 0x02, 0x62, 0x5A, 0xD2, 0x89, 0xFF, 0x80, 0x4F, 0x6F, 0x44, 0xA2, 0xDA, 0x88, 0xFF, - 0x98, 0xFF, 0x09, 0xE1, 0xA1, 0xFF, 0x3D, 0x46, 0x08, 0x25, 0x3D, 0x00, 0x40, 0xFF, 0x0F, 0xF0, - 0x0A, 0x64, 0xB0, 0x84, 0x16, 0x14, 0xF7, 0xB4, 0xA2, 0xDA, 0x0D, 0x60, 0x2C, 0x62, 0xA2, 0xD3, - 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x0C, 0x00, 0xF1, 0xF5, 0xF0, 0xF4, 0x0D, 0x60, 0x2C, 0x61, - 0x59, 0xD1, 0x37, 0xF8, 0x05, 0x64, 0x59, 0xD1, 0xCC, 0x84, 0xBD, 0xD8, 0xFC, 0x02, 0x2D, 0x46, - 0x0D, 0x01, 0xA2, 0xDA, 0x2D, 0x46, 0x3B, 0xF0, 0xFF, 0xFF, 0x64, 0x40, 0x20, 0x2B, 0x18, 0x00, - 0xF1, 0xF5, 0xB7, 0xF0, 0x2A, 0x44, 0xA4, 0x84, 0xFF, 0xFF, 0x2F, 0x26, 0x10, 0x00, 0x2D, 0x46, - 0x64, 0x44, 0x3A, 0xF0, 0xBC, 0xF0, 0x64, 0x5F, 0x3D, 0xF0, 0x07, 0xF4, 0xF0, 0xF4, 0xFF, 0xFF, - 0x08, 0xA3, 0x5B, 0xD8, 0x65, 0x5C, 0x5B, 0xD8, 0x5B, 0xDA, 0x2D, 0x46, 0x01, 0x00, 0x2D, 0x46, - 0xBB, 0x60, 0x36, 0x78, 0xFF, 0xFF, 0x98, 0xFF, 0x43, 0xFF, 0x40, 0xFF, 0xB0, 0xFF, 0xB1, 0xFF, - 0x2D, 0x46, 0x0D, 0x60, 0x2C, 0x61, 0xA1, 0xD3, 0x2D, 0x46, 0x60, 0x40, 0x01, 0x2A, 0x0A, 0x00, - 0xF1, 0xF5, 0xF0, 0xF4, 0x59, 0xD1, 0x37, 0xF8, 0x05, 0x64, 0x59, 0xD1, 0xCC, 0x84, 0xBD, 0xD8, - 0xFC, 0x02, 0x2D, 0x46, 0xBB, 0x60, 0x20, 0x78, 0xFF, 0xFF, 0x98, 0xFF, 0x09, 0xE1, 0xA1, 0xFF, - 0x3D, 0x46, 0x08, 0x25, 0xE0, 0x01, 0x0F, 0xF2, 0x40, 0xFF, 0x02, 0xBC, 0xA2, 0xDA, 0xBB, 0x60, - 0x36, 0x78, 0xFF, 0xFF, 0x00, 0x64, 0x0D, 0x60, 0x2C, 0x62, 0xA2, 0xDB, 0x04, 0x64, 0x22, 0xFA, - 0x87, 0xF4, 0xA9, 0xF1, 0xFF, 0xFF, 0xD3, 0x80, 0x3B, 0xF2, 0xE7, 0x03, 0x60, 0x47, 0xC0, 0xB7, - 0x02, 0xFE, 0xF0, 0x84, 0xF0, 0x84, 0xF0, 0x84, 0x00, 0xA8, 0x40, 0x4A, 0x16, 0x03, 0xE0, 0x81, - 0x61, 0x43, 0x42, 0xFE, 0x00, 0x64, 0xF0, 0x84, 0xFE, 0x1F, 0x40, 0x4A, 0xE1, 0x84, 0xE0, 0x84, - 0x2D, 0x46, 0x07, 0xF4, 0xE0, 0x81, 0x37, 0xF0, 0x2A, 0x47, 0x0C, 0x60, 0x7A, 0x63, 0xA0, 0x84, - 0x47, 0x9C, 0x10, 0x03, 0x7C, 0x44, 0xA0, 0x63, 0x11, 0x00, 0x20, 0x64, 0x40, 0x4A, 0x63, 0x46, - 0x37, 0xF0, 0x66, 0x44, 0x64, 0x40, 0x80, 0x2B, 0x05, 0x00, 0x00, 0x60, 0x70, 0x7C, 0x00, 0x60, - 0x90, 0x63, 0x04, 0x00, 0x2D, 0x46, 0xBC, 0x60, 0x65, 0x78, 0xFF, 0xFF, 0x2D, 0x46, 0xEE, 0xFB, - 0xEF, 0xF9, 0xF0, 0xFD, 0x07, 0xF2, 0xF1, 0xFB, 0x60, 0x46, 0x37, 0xF0, 0x2A, 0x44, 0x0D, 0x60, - 0x2C, 0x62, 0x5A, 0xD9, 0x00, 0x65, 0x45, 0x4B, 0xA0, 0x84, 0xFF, 0xFF, 0x3F, 0x22, 0x05, 0x00, - 0x90, 0x84, 0x37, 0xFA, 0x01, 0x64, 0x40, 0x4B, 0x21, 0x00, 0xAD, 0x46, 0x0A, 0xA3, 0x3D, 0xF2, - 0xAD, 0x46, 0xA3, 0xD0, 0xAD, 0x46, 0xD0, 0x80, 0x3C, 0xF2, 0xAD, 0x46, 0x02, 0x03, 0x16, 0x07, - 0x14, 0x04, 0x5B, 0xD0, 0xAD, 0x46, 0xD0, 0x80, 0x3B, 0xF2, 0x03, 0x03, 0xAD, 0x46, 0x0E, 0x07, - 0x0C, 0x04, 0x3A, 0xF0, 0xAD, 0x46, 0x5B, 0xD0, 0x64, 0x5F, 0xD0, 0x80, 0x2B, 0x44, 0x18, 0x07, - 0x04, 0x03, 0xD0, 0x84, 0x10, 0xA4, 0xFF, 0xFF, 0x13, 0x07, 0x7F, 0x01, 0x01, 0x64, 0x0D, 0x60, - 0x2C, 0x62, 0xA2, 0xDB, 0x2D, 0x46, 0x0D, 0x60, 0x3C, 0x62, 0x80, 0xFF, 0x78, 0x44, 0x03, 0xA4, - 0xA2, 0xDB, 0xBD, 0x60, 0x0B, 0x78, 0xFF, 0xFF, 0x85, 0xFF, 0x2D, 0x46, 0x08, 0x25, 0x53, 0x01, - 0x2D, 0x46, 0x0D, 0x60, 0x3C, 0x62, 0x80, 0xFF, 0x78, 0x44, 0x03, 0xA4, 0xA2, 0xDB, 0xBD, 0x60, - 0x94, 0x78, 0xFF, 0xFF, 0x85, 0xFF, 0x2D, 0x46, 0x08, 0x25, 0x45, 0x01, 0x00, 0x60, 0x0F, 0x64, - 0xBB, 0x60, 0xD3, 0x78, 0xFF, 0xFF, 0x07, 0xF4, 0x66, 0x41, 0x03, 0xF2, 0x04, 0xF2, 0x40, 0x42, - 0x05, 0xF2, 0x40, 0x43, 0x40, 0x44, 0x61, 0x46, 0x3C, 0xF2, 0x3D, 0xF2, 0x40, 0x40, 0x40, 0x41, - 0x0D, 0x60, 0x70, 0x65, 0x00, 0x61, 0xEF, 0xF1, 0xEE, 0xF5, 0x44, 0x4C, 0x2C, 0x5C, 0xE9, 0x80, - 0x00, 0x64, 0xF0, 0x84, 0xF0, 0x84, 0xC0, 0x83, 0xBD, 0xD2, 0x24, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x20, 0x44, 0x40, 0x80, 0xDB, 0x83, 0xBD, 0xD2, 0x20, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x21, 0x44, 0x40, 0x81, 0xDB, 0x83, 0xBD, 0xD2, 0x21, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x22, 0x44, 0x40, 0x82, 0xDB, 0x83, 0xBD, 0xD2, 0x22, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x23, 0x44, 0x40, 0x83, 0xF2, 0xA3, 0xBD, 0xD2, 0x23, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x24, 0x44, 0xC0, 0x9C, 0x41, 0x84, 0xDD, 0x81, 0x08, 0x2A, 0xA7, 0x01, 0x0D, 0x60, - 0x2E, 0x61, 0x05, 0x64, 0xF0, 0xF4, 0xF1, 0xF5, 0xFE, 0xA3, 0x5B, 0xD0, 0xCC, 0x84, 0x59, 0xD9, - 0xFC, 0x02, 0xF0, 0xF3, 0xF1, 0xF5, 0x60, 0x42, 0x20, 0x44, 0xA2, 0xDA, 0x21, 0x44, 0x5A, 0xDA, - 0x22, 0x44, 0x5A, 0xDA, 0x23, 0x44, 0x5A, 0xDA, 0x24, 0x44, 0x5A, 0xDA, 0x61, 0x46, 0x0D, 0x60, - 0x3C, 0x62, 0xA2, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0x41, 0xF0, 0xF3, 0xF1, 0xF5, 0xA0, 0xD2, - 0x5A, 0xD0, 0x40, 0x40, 0x44, 0x41, 0x5A, 0xD2, 0x5A, 0xD0, 0x40, 0x42, 0x5A, 0xD0, 0x44, 0x43, - 0x61, 0x46, 0xBA, 0xF0, 0x3B, 0xF2, 0x44, 0x44, 0x65, 0x5F, 0x40, 0x85, 0xEF, 0xF4, 0xEE, 0xF5, - 0x43, 0x4C, 0x0D, 0x60, 0x70, 0x65, 0xBD, 0xD2, 0x25, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x20, 0x44, 0x40, 0x80, 0xBD, 0xD2, 0x20, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x21, 0x44, - 0x40, 0x81, 0xBD, 0xD2, 0x21, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x22, 0x44, 0x40, 0x82, - 0xBD, 0xD2, 0x22, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x23, 0x44, 0x40, 0x83, 0xBD, 0xD2, - 0x23, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x24, 0x44, 0x40, 0x84, 0xBD, 0xD2, 0x24, 0x5C, - 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x25, 0x44, 0x40, 0x85, 0x61, 0x46, 0x3A, 0xF0, 0xFF, 0xFF, - 0x64, 0x44, 0xE0, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xE1, 0x7F, 0x5A, 0xD0, 0xA0, 0x5B, 0x64, 0x44, - 0xE2, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xEE, 0xF5, 0xBD, 0xD2, 0x25, 0x5C, 0x90, 0x84, 0xE8, 0x80, - 0xF8, 0x84, 0x20, 0x5C, 0x40, 0x80, 0x20, 0x44, 0xE4, 0x7F, 0xA0, 0x5B, 0x20, 0x47, 0xE5, 0x7F, - 0xA0, 0x5B, 0xBD, 0xD2, 0x20, 0x5C, 0x90, 0x84, 0xE8, 0x80, 0xF8, 0x84, 0x21, 0x5C, 0x40, 0x81, - 0x21, 0x44, 0xE6, 0x7F, 0xA0, 0x5B, 0x21, 0x47, 0xE7, 0x7F, 0xA0, 0x5B, 0x21, 0x44, 0xE8, 0x80, - 0xF8, 0x84, 0x22, 0x5C, 0x40, 0x82, 0x22, 0x44, 0xE8, 0x7F, 0xA0, 0x5B, 0x22, 0x47, 0xE9, 0x7F, - 0xA0, 0x5B, 0x22, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x23, 0x5C, 0x40, 0x83, 0x23, 0x44, 0xEA, 0x7F, - 0xA0, 0x5B, 0x23, 0x47, 0xEB, 0x7F, 0xA0, 0x5B, 0x23, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x24, 0x5C, - 0x40, 0x84, 0x24, 0x44, 0xEC, 0x7F, 0xA0, 0x5B, 0x24, 0x47, 0xED, 0x7F, 0xA0, 0x5B, 0x24, 0x44, - 0xE8, 0x80, 0xF8, 0x84, 0x25, 0x5C, 0x40, 0x85, 0x25, 0x44, 0xEE, 0x7F, 0xA0, 0x5B, 0x25, 0x47, - 0xEF, 0x7F, 0xA0, 0x5B, 0x2C, 0x43, 0xA3, 0xD2, 0x25, 0x5C, 0x90, 0x81, 0xE9, 0x84, 0xE3, 0x7F, - 0xA0, 0x5B, 0x0D, 0x60, 0x3C, 0x62, 0xA2, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xF3, 0x5A, 0xD3, - 0x40, 0x48, 0x5A, 0xD3, 0x40, 0x49, 0x40, 0x4A, 0x00, 0x60, 0x70, 0x7C, 0x44, 0x4D, 0x45, 0xF2, - 0x46, 0xF2, 0x40, 0x47, 0x40, 0x46, 0x0D, 0x60, 0x70, 0x65, 0x00, 0x61, 0x2D, 0x5C, 0xE9, 0x80, - 0x00, 0x64, 0xF0, 0x84, 0xF0, 0x84, 0xC0, 0x83, 0xBD, 0xD2, 0x2A, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x26, 0x44, 0x40, 0x86, 0xDB, 0x83, 0xBD, 0xD2, 0x26, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x27, 0x44, 0x40, 0x87, 0xDB, 0x83, 0xBD, 0xD2, 0x27, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x28, 0x44, 0x40, 0x88, 0xDB, 0x83, 0xBD, 0xD2, 0x28, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x29, 0x44, 0x40, 0x89, 0xF2, 0xA3, 0xBD, 0xD2, 0x29, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x2A, 0x44, 0xC0, 0x9C, 0x41, 0x8A, 0xDD, 0x81, 0x08, 0x2A, 0xA7, 0x01, 0x26, 0x44, - 0x40, 0xFA, 0x27, 0x44, 0x41, 0xFA, 0x28, 0x44, 0x42, 0xFA, 0x29, 0x44, 0x43, 0xFA, 0x2A, 0x44, - 0x44, 0xFA, 0x0D, 0x60, 0x3E, 0x62, 0xA2, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x80, 0x7C, - 0x44, 0x4D, 0x2D, 0x42, 0xA2, 0xD2, 0x5A, 0xD0, 0x40, 0x46, 0x44, 0x47, 0x5A, 0xD2, 0x5A, 0xD0, - 0x40, 0x48, 0x5A, 0xD0, 0x44, 0x49, 0x47, 0xF2, 0x44, 0x4A, 0x40, 0x8B, 0x60, 0x5C, 0x64, 0x47, - 0xE0, 0x7F, 0xA0, 0x5A, 0xFF, 0xB4, 0x20, 0xBC, 0x7F, 0xB4, 0xE1, 0x7F, 0xA0, 0x5A, 0x64, 0x44, - 0xE2, 0x7F, 0xA0, 0x5A, 0x00, 0x60, 0x70, 0x63, 0x0D, 0x60, 0x70, 0x65, 0xBD, 0xD2, 0x2B, 0x5C, - 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x26, 0x44, 0x40, 0x86, 0xBD, 0xD2, 0x26, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x27, 0x44, 0x40, 0x87, 0xBD, 0xD2, 0x27, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x28, 0x44, 0x40, 0x88, 0xBD, 0xD2, 0x28, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x29, 0x44, 0x40, 0x89, 0xBD, 0xD2, 0x29, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x2A, 0x44, - 0x40, 0x8A, 0xBD, 0xD2, 0x2A, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x2B, 0x44, 0x40, 0x8B, - 0xBD, 0xD2, 0x2B, 0x5C, 0x90, 0x84, 0xE8, 0x80, 0xF8, 0x84, 0x26, 0x5C, 0x40, 0x86, 0x26, 0x44, - 0xE4, 0x7F, 0xA0, 0x5A, 0x26, 0x47, 0xE5, 0x7F, 0xA0, 0x5A, 0xBD, 0xD2, 0x26, 0x5C, 0x90, 0x84, - 0xE8, 0x80, 0xF8, 0x84, 0x27, 0x5C, 0x40, 0x87, 0x27, 0x44, 0xE6, 0x7F, 0xA0, 0x5A, 0x27, 0x47, - 0xE7, 0x7F, 0xA0, 0x5A, 0x27, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x28, 0x5C, 0x40, 0x88, 0x28, 0x44, - 0xE8, 0x7F, 0xA0, 0x5A, 0x28, 0x47, 0xE9, 0x7F, 0xA0, 0x5A, 0x28, 0x44, 0xE8, 0x80, 0xF8, 0x84, - 0x29, 0x5C, 0x40, 0x89, 0x29, 0x44, 0xEA, 0x7F, 0xA0, 0x5A, 0x29, 0x47, 0xEB, 0x7F, 0xA0, 0x5A, - 0x29, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x2A, 0x5C, 0x40, 0x8A, 0x2A, 0x44, 0xEC, 0x7F, 0xA0, 0x5A, - 0x2A, 0x47, 0xED, 0x7F, 0xA0, 0x5A, 0x2A, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x2B, 0x5C, 0x40, 0x8B, - 0x2B, 0x44, 0xEE, 0x7F, 0xA0, 0x5A, 0x2B, 0x47, 0xEF, 0x7F, 0xA0, 0x5A, 0x38, 0xF0, 0x2B, 0x44, - 0x90, 0x84, 0xE8, 0x84, 0xE3, 0x7F, 0xA0, 0x5A, 0x0D, 0x60, 0x3E, 0x62, 0xA2, 0xD7, 0xFF, 0xFF, - 0xFF, 0xFF, 0xE4, 0x60, 0xC8, 0x78, 0xFF, 0xFF, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x80, 0x60, - 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x32, 0x00, 0xDC, 0xF3, 0x31, 0x41, 0x01, 0xB1, - 0x03, 0xA8, 0x2D, 0x03, 0x17, 0x02, 0x20, 0x40, 0x04, 0x2B, 0x0C, 0x00, 0xBB, 0xFE, 0xCA, 0xFE, - 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0x08, 0x00, 0x0F, 0x60, 0xD2, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x80, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x0C, 0x00, 0xA9, 0xFE, 0xD8, 0x05, 0xAB, 0xFE, 0x0C, 0x05, 0xA8, 0xFE, - 0xC8, 0x05, 0xAA, 0xFE, 0xC9, 0x05, 0x78, 0x43, 0x01, 0x61, 0x24, 0x60, 0xDD, 0x78, 0xA1, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x3E, 0x24, 0x60, 0x5E, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, - 0x60, 0x46, 0x03, 0x02, 0xBF, 0x60, 0xE7, 0x78, 0xFF, 0xFF, 0x26, 0x45, 0xD4, 0x80, 0x0F, 0xF0, - 0xF9, 0x03, 0x64, 0x44, 0x70, 0xB0, 0x70, 0x2A, 0x14, 0x00, 0x27, 0x60, 0xB2, 0x64, 0xA0, 0xD3, - 0xFF, 0xFF, 0xDC, 0x84, 0xFF, 0xFF, 0x08, 0x28, 0xA2, 0xDB, 0xA2, 0xFF, 0xAF, 0xF3, 0xFF, 0xFF, - 0xCC, 0x84, 0xFE, 0xA0, 0xAF, 0xFB, 0x01, 0x07, 0xD4, 0xFE, 0xA3, 0xFF, 0xC5, 0x60, 0x5B, 0x78, - 0xFF, 0xFF, 0x64, 0x40, 0x02, 0x26, 0x09, 0x00, 0x66, 0x45, 0x09, 0xF4, 0x0F, 0xF2, 0x02, 0x18, - 0x65, 0x46, 0xE3, 0x1B, 0x00, 0x64, 0x40, 0x46, 0xCA, 0x01, 0xA2, 0xFF, 0xAF, 0xF3, 0x46, 0x46, - 0xCC, 0x84, 0xFE, 0xA0, 0xAF, 0xFB, 0x01, 0x07, 0xD4, 0xFE, 0xA3, 0xFF, 0x0F, 0xF0, 0xA3, 0xFC, - 0x64, 0x44, 0x80, 0x26, 0x22, 0x00, 0xB8, 0xF1, 0x27, 0x60, 0x92, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, - 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, - 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x32, 0x44, 0x01, 0x2A, 0x03, 0x00, 0x07, 0x60, - 0x01, 0x64, 0x04, 0x00, 0x02, 0x2A, 0x06, 0x00, 0x00, 0x60, 0x01, 0x64, 0x23, 0xFA, 0xC5, 0x60, - 0x67, 0x78, 0xFF, 0xFF, 0xC5, 0x60, 0x5B, 0x78, 0xFF, 0xFF, 0x08, 0x26, 0x3F, 0x00, 0x2A, 0xF2, - 0x60, 0x63, 0x60, 0x40, 0x02, 0x2B, 0x66, 0x63, 0xBE, 0xD2, 0x83, 0xF1, 0xA3, 0xD2, 0xD0, 0x80, - 0x82, 0xF1, 0x18, 0x02, 0xBF, 0xD2, 0xD0, 0x80, 0x81, 0xF1, 0x14, 0x02, 0xD0, 0x80, 0xFF, 0xFF, - 0x11, 0x02, 0xB8, 0xF1, 0x27, 0x60, 0x9E, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, - 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, - 0x00, 0x75, 0x88, 0xFF, 0x32, 0x44, 0x01, 0x2A, 0x03, 0x00, 0x07, 0x60, 0x02, 0x64, 0x04, 0x00, - 0x02, 0x2A, 0x06, 0x00, 0x00, 0x60, 0x02, 0x64, 0x23, 0xFA, 0xC5, 0x60, 0x67, 0x78, 0xFF, 0xFF, - 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0xB0, 0x3A, 0x06, 0x00, 0x00, 0x60, 0x02, 0x64, 0x23, 0xFA, - 0xC1, 0x60, 0x11, 0x78, 0xFF, 0xFF, 0xC5, 0x60, 0x5B, 0x78, 0xFF, 0xFF, 0x32, 0x44, 0x01, 0x2A, - 0x4A, 0x00, 0x28, 0x60, 0xE2, 0x63, 0xBF, 0xD3, 0x00, 0x65, 0xB4, 0x81, 0xDB, 0x83, 0x3D, 0x03, - 0xBF, 0xD3, 0xA3, 0xD3, 0x40, 0x48, 0xBE, 0xD3, 0x40, 0x4A, 0x2E, 0xF0, 0x40, 0x4C, 0xD0, 0x80, - 0x2D, 0xF0, 0x08, 0x02, 0x2A, 0x44, 0xD0, 0x80, 0x2C, 0xF0, 0x04, 0x02, 0x28, 0x44, 0xD0, 0x80, - 0xFF, 0xFF, 0x2B, 0x03, 0x31, 0xF0, 0x2C, 0x44, 0xD0, 0x80, 0x30, 0xF0, 0x08, 0x02, 0x2A, 0x44, - 0xD0, 0x80, 0x2F, 0xF0, 0x04, 0x02, 0x28, 0x44, 0xD0, 0x80, 0xFF, 0xFF, 0x1E, 0x03, 0x34, 0xF0, - 0x2C, 0x44, 0xD0, 0x80, 0x33, 0xF0, 0x08, 0x02, 0x2A, 0x44, 0xD0, 0x80, 0x32, 0xF0, 0x04, 0x02, - 0x28, 0x44, 0xD0, 0x80, 0xFF, 0xFF, 0x11, 0x03, 0x38, 0xF0, 0x2C, 0x44, 0xD0, 0x80, 0x37, 0xF0, - 0x08, 0x02, 0x2A, 0x44, 0xD0, 0x80, 0x36, 0xF0, 0x04, 0x02, 0x28, 0x44, 0xD0, 0x80, 0xFF, 0xFF, - 0x04, 0x03, 0xFA, 0xA1, 0x06, 0xA3, 0xB7, 0x03, 0xC3, 0x01, 0x07, 0x60, 0x00, 0x64, 0x23, 0xFA, - 0xC5, 0x60, 0x67, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x0F, 0xF0, 0x60, 0x45, 0xA4, 0x36, 0x08, 0x00, - 0x0C, 0xB4, 0x04, 0x36, 0x02, 0x00, 0x0C, 0x3A, 0x06, 0x00, 0xC5, 0x60, 0x5B, 0x78, 0xFF, 0xFF, - 0xC2, 0x60, 0xDD, 0x78, 0xFF, 0xFF, 0x0F, 0xF0, 0x65, 0x40, 0x40, 0x2B, 0x22, 0x00, 0x32, 0x40, - 0x08, 0x26, 0x1F, 0x00, 0x07, 0xF4, 0x36, 0xF2, 0xFF, 0xFF, 0x37, 0xB4, 0x26, 0x46, 0x19, 0x02, - 0x2C, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x26, 0x11, 0x00, 0xB8, 0xF1, 0x27, 0x60, 0x98, 0x64, - 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, - 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0xC5, 0x60, 0x5B, 0x78, - 0xFF, 0xFF, 0x2A, 0xF2, 0x64, 0x40, 0x60, 0x26, 0x03, 0x00, 0xC2, 0x60, 0xAF, 0x78, 0xFF, 0xFF, - 0x60, 0x41, 0xA9, 0xF3, 0x07, 0xFA, 0x61, 0x44, 0x80, 0x3A, 0x06, 0x00, 0xE5, 0x60, 0x58, 0x4F, - 0xE7, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x10, 0x00, 0x60, 0x40, 0x40, 0x3A, 0x0D, 0x00, 0xDC, 0xF3, - 0xFF, 0xFF, 0x07, 0xB4, 0x03, 0x3A, 0xE2, 0x01, 0xC6, 0x60, 0x58, 0x4D, 0x4F, 0x78, 0xFF, 0xFF, - 0xDD, 0x02, 0xA9, 0xF3, 0x07, 0xFA, 0xD1, 0x00, 0x5E, 0x63, 0x60, 0x40, 0x02, 0x2B, 0x64, 0x63, - 0x50, 0xFE, 0xBD, 0xD2, 0x81, 0xF1, 0xBD, 0xD2, 0xD0, 0x80, 0x82, 0xF1, 0xBD, 0xD2, 0xD0, 0x80, - 0x83, 0xF1, 0x2A, 0xF2, 0xD0, 0x80, 0x60, 0x40, 0x08, 0x3A, 0x07, 0x00, 0x01, 0x0C, 0xC6, 0x01, - 0xDE, 0x60, 0x58, 0x4F, 0xFE, 0x78, 0xFF, 0xFF, 0xB8, 0x00, 0x26, 0x0C, 0xC6, 0x60, 0x58, 0x4D, - 0x4F, 0x78, 0xFF, 0xFF, 0xBB, 0x02, 0x1F, 0x60, 0x52, 0x61, 0x02, 0x64, 0xA1, 0xDB, 0x1F, 0x60, - 0x5A, 0x61, 0x00, 0x64, 0xA1, 0xDB, 0x22, 0x60, 0x58, 0x4E, 0x3E, 0x78, 0xFF, 0xFF, 0x1F, 0x60, - 0x04, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x27, 0x08, 0x00, 0x0F, 0x60, 0xEA, 0x62, - 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x1F, 0x60, 0x52, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x9B, 0x01, 0x91, 0x00, 0xC6, 0x60, 0x58, 0x4D, 0x4F, 0x78, 0xFF, 0xFF, - 0xFA, 0x02, 0x0F, 0x60, 0xCE, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x36, 0x07, 0x00, - 0x01, 0x64, 0xA1, 0xDB, 0x01, 0x65, 0xE9, 0x60, 0x58, 0x4E, 0x7B, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0x31, 0xF2, 0x1C, 0x60, 0xBA, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, - 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x31, 0xF0, 0x63, 0x46, 0xD0, 0x80, - 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x30, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, - 0x61, 0x46, 0x2F, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, - 0x63, 0x46, 0xE8, 0x1B, 0xA9, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0xA9, 0xF1, 0x43, 0x43, - 0xD3, 0x80, 0xFF, 0xFF, 0x04, 0x02, 0xC5, 0x60, 0x58, 0x4F, 0xA5, 0x78, 0xFF, 0xFF, 0x32, 0x40, - 0x08, 0x2A, 0x05, 0x00, 0x63, 0x46, 0x80, 0x60, 0x02, 0x64, 0x06, 0xFA, 0x26, 0x46, 0xD8, 0xF3, - 0x63, 0x45, 0x66, 0x41, 0x65, 0x46, 0x8C, 0xFA, 0x60, 0x40, 0x01, 0x36, 0x06, 0x00, 0x02, 0x36, - 0x04, 0x00, 0x04, 0x36, 0x02, 0x00, 0x05, 0x3A, 0x02, 0x00, 0x00, 0x64, 0x01, 0x00, 0x01, 0x64, - 0x6F, 0xFA, 0x79, 0xF3, 0x7A, 0xF1, 0xFF, 0xFF, 0xA0, 0x84, 0x65, 0x43, 0x02, 0x02, 0x79, 0xF3, - 0xFF, 0xFF, 0x60, 0x41, 0x0F, 0x60, 0xAE, 0x65, 0xD8, 0xF3, 0xFF, 0xFF, 0xE0, 0x84, 0x44, 0xD3, - 0x61, 0x45, 0xA4, 0x80, 0xFF, 0xFF, 0x04, 0x02, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0xFC, 0x03, - 0xA4, 0x84, 0x7B, 0xFB, 0x6F, 0xF0, 0x60, 0x47, 0x90, 0x84, 0x6F, 0xFA, 0x60, 0x47, 0x60, 0x45, - 0x80, 0x64, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0xFC, 0x03, 0xA4, 0x84, 0x70, 0xF0, 0x70, 0xFA, - 0x00, 0x61, 0xE8, 0x84, 0xFF, 0xFF, 0x02, 0x05, 0xDD, 0x81, 0xFB, 0x01, 0xE1, 0x81, 0x0F, 0x60, - 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, 0x66, 0x43, 0x0C, 0xF4, 0xB8, 0xF1, 0x27, 0x60, 0x8C, 0x64, - 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, - 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x27, 0xF2, 0xFF, 0xFF, - 0x60, 0x40, 0x01, 0x3B, 0x12, 0x00, 0xB8, 0xF1, 0x27, 0x60, 0x9A, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, - 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, - 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x13, 0x00, 0x02, 0x3B, 0x11, 0x00, 0xB8, 0xF1, - 0x27, 0x60, 0x9C, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, - 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, - 0x1B, 0xF2, 0xFF, 0xFF, 0xE4, 0xA4, 0x3E, 0xFA, 0x2A, 0xF2, 0x28, 0x41, 0x40, 0xA8, 0x01, 0xB1, - 0x02, 0x02, 0x62, 0x02, 0x92, 0x00, 0x60, 0x40, 0x08, 0x2A, 0x2B, 0x00, 0xB8, 0xF1, 0x27, 0x60, - 0x8A, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, - 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x1B, 0xF2, - 0xFF, 0xFF, 0x60, 0x45, 0xB8, 0xF1, 0x27, 0x60, 0x90, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xD8, 0x80, - 0xC4, 0x84, 0x0B, 0x03, 0x07, 0x05, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x09, 0x04, - 0xC6, 0xFE, 0x07, 0x00, 0x00, 0x64, 0xB8, 0x84, 0xA2, 0xDB, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, - 0x88, 0xFF, 0x0F, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x26, 0x28, 0x00, 0x32, 0x44, 0x02, 0x26, - 0x25, 0x00, 0x10, 0x2B, 0x29, 0x00, 0x28, 0x60, 0xE2, 0x63, 0xBF, 0xD3, 0x2C, 0xF0, 0x00, 0xA8, - 0x60, 0x41, 0x0D, 0x03, 0x50, 0xFE, 0xBD, 0xD3, 0x2D, 0xF0, 0xD0, 0x80, 0xBD, 0xD3, 0x2E, 0xF0, - 0xD0, 0x80, 0xBD, 0xD3, 0x2C, 0xF0, 0xD0, 0x80, 0xFA, 0xA1, 0x10, 0x0C, 0xF3, 0x02, 0x50, 0xFE, - 0x60, 0x60, 0x01, 0x64, 0xD0, 0x80, 0x2D, 0xF0, 0x1D, 0x64, 0xD0, 0x80, 0x2E, 0xF0, 0x01, 0x64, - 0xD0, 0x80, 0xFF, 0xFF, 0x03, 0x0C, 0xC5, 0x60, 0x5B, 0x78, 0xFF, 0xFF, 0x32, 0x40, 0x40, 0x2A, - 0x03, 0x00, 0x19, 0x60, 0x22, 0x78, 0xFF, 0xFF, 0xC5, 0x60, 0x55, 0x78, 0xFF, 0xFF, 0x32, 0x40, - 0x40, 0x26, 0xF7, 0x01, 0x2A, 0xF0, 0xFF, 0xFF, 0x64, 0x40, 0x08, 0x2A, 0x2A, 0x00, 0xDC, 0xF3, - 0xFF, 0xFF, 0x07, 0xB4, 0x03, 0xA8, 0xFF, 0xFF, 0x03, 0x03, 0x32, 0x40, 0x02, 0x2A, 0x1D, 0x00, - 0x03, 0x67, 0xA0, 0x84, 0x00, 0x37, 0x64, 0x63, 0x60, 0x40, 0x02, 0x37, 0x5E, 0x63, 0x60, 0x40, - 0x01, 0x37, 0x58, 0x63, 0x60, 0x40, 0x03, 0x37, 0x0D, 0x00, 0xBD, 0xD2, 0x81, 0xF1, 0xBD, 0xD2, - 0xD0, 0x80, 0x82, 0xF1, 0x07, 0x02, 0xD0, 0x80, 0xBD, 0xD2, 0x83, 0xF1, 0x03, 0x02, 0xD0, 0x80, - 0xFF, 0xFF, 0x03, 0x03, 0xC5, 0x60, 0x5B, 0x78, 0xFF, 0xFF, 0xDE, 0x60, 0x58, 0x4F, 0xFE, 0x78, - 0xFF, 0xFF, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x26, 0x06, 0x00, 0x20, 0x40, 0x10, 0x2B, - 0x03, 0x00, 0xC5, 0x60, 0x55, 0x78, 0xFF, 0xFF, 0x87, 0xF4, 0xA9, 0xF1, 0x27, 0x1B, 0x31, 0xF2, - 0x1C, 0x60, 0xBA, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, - 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x31, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, - 0x0C, 0x02, 0x61, 0x46, 0x30, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, - 0x2F, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, - 0xE8, 0x1B, 0xA9, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x03, 0x00, 0xD3, 0x80, 0xFF, 0xFF, - 0xD6, 0x03, 0x43, 0x43, 0xDC, 0xF3, 0x32, 0x40, 0x02, 0x26, 0x04, 0x00, 0x07, 0xB4, 0x03, 0xA8, - 0x2A, 0xF2, 0x5F, 0x02, 0xA9, 0xF1, 0x23, 0x43, 0xD3, 0x80, 0xFF, 0xFF, 0x5A, 0x02, 0xC5, 0x60, - 0x58, 0x4F, 0xA5, 0x78, 0xFF, 0xFF, 0x32, 0x40, 0x02, 0x2A, 0x05, 0x00, 0x63, 0x46, 0x02, 0x64, - 0x06, 0xFA, 0x26, 0x46, 0x4E, 0x00, 0x32, 0x40, 0x08, 0x2A, 0x05, 0x00, 0x63, 0x46, 0x80, 0x60, - 0x02, 0x64, 0x06, 0xFA, 0x26, 0x46, 0xD8, 0xF3, 0x63, 0x45, 0x66, 0x41, 0x65, 0x46, 0x8C, 0xFA, - 0x60, 0x40, 0x01, 0x36, 0x06, 0x00, 0x02, 0x36, 0x04, 0x00, 0x04, 0x36, 0x02, 0x00, 0x05, 0x3A, - 0x02, 0x00, 0x00, 0x64, 0x01, 0x00, 0x01, 0x64, 0x6F, 0xFA, 0x79, 0xF3, 0x7A, 0xF1, 0xFF, 0xFF, - 0xA0, 0x84, 0x65, 0x43, 0x02, 0x02, 0x79, 0xF3, 0xFF, 0xFF, 0x60, 0x41, 0x0F, 0x60, 0xAE, 0x65, - 0xD8, 0xF3, 0xFF, 0xFF, 0xE0, 0x84, 0x44, 0xD3, 0x61, 0x45, 0xA4, 0x80, 0xFF, 0xFF, 0x04, 0x02, - 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0xFC, 0x03, 0xA4, 0x84, 0x7B, 0xFB, 0x6F, 0xF0, 0x60, 0x47, - 0x90, 0x84, 0x6F, 0xFA, 0x60, 0x47, 0x60, 0x45, 0x80, 0x64, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, - 0xFC, 0x03, 0xA4, 0x84, 0x70, 0xF0, 0x70, 0xFA, 0x00, 0x61, 0xE8, 0x84, 0xFF, 0xFF, 0x02, 0x05, - 0xDD, 0x81, 0xFB, 0x01, 0xE1, 0x81, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, 0x66, 0x43, - 0x0C, 0xF4, 0x07, 0xFC, 0x43, 0x43, 0x02, 0xFE, 0x1D, 0xF0, 0x1C, 0x60, 0x9A, 0x62, 0xC0, 0x64, - 0xC0, 0x84, 0xA2, 0xD1, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xC0, 0x84, - 0xA2, 0xDB, 0x2A, 0xF2, 0x63, 0x45, 0x0C, 0xB4, 0x08, 0x3A, 0x0A, 0x00, 0xDC, 0xF3, 0x23, 0x46, - 0x07, 0xB4, 0xFD, 0xA0, 0x06, 0xF2, 0x26, 0x46, 0x03, 0x03, 0x60, 0x40, 0x02, 0x2A, 0x0D, 0x00, - 0x2A, 0xF2, 0x35, 0xF0, 0x60, 0x40, 0xA4, 0x36, 0x0B, 0x00, 0x08, 0x2B, 0x0C, 0x00, 0x23, 0x46, - 0x22, 0xF2, 0x26, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x06, 0x02, 0xC5, 0x60, 0x5B, 0x78, 0xFF, 0xFF, - 0xC5, 0x60, 0x55, 0x78, 0xFF, 0xFF, 0x23, 0x46, 0x1E, 0xF2, 0x26, 0x46, 0x44, 0x4C, 0x0F, 0x26, - 0x1D, 0x00, 0x00, 0xBC, 0x40, 0x45, 0x0B, 0x03, 0x00, 0x64, 0x23, 0x46, 0x1E, 0xFA, 0x26, 0x46, - 0xA2, 0xFF, 0xAF, 0x60, 0x58, 0x4E, 0x95, 0x78, 0xFF, 0xFF, 0xA3, 0xFF, 0x26, 0x46, 0x2A, 0xF0, - 0x2C, 0x44, 0x64, 0x40, 0x04, 0x27, 0x0A, 0x00, 0x23, 0x46, 0x22, 0xFA, 0x26, 0x46, 0x1B, 0xF2, - 0xFF, 0xFF, 0xE4, 0xA4, 0x3E, 0xFA, 0xC4, 0x60, 0xAD, 0x78, 0xFF, 0xFF, 0x3F, 0xF2, 0x02, 0xFA, - 0xA2, 0xFF, 0x16, 0xF0, 0xFF, 0xFF, 0x64, 0x44, 0x01, 0x26, 0xDC, 0x9C, 0xB3, 0xF3, 0x2A, 0xF2, - 0xDC, 0x83, 0xB3, 0xFD, 0x06, 0xF4, 0x01, 0xF8, 0x26, 0x46, 0x60, 0x40, 0x40, 0x2B, 0x18, 0x00, - 0x64, 0x44, 0x00, 0x65, 0xFF, 0xB4, 0xFC, 0xA4, 0x06, 0xF0, 0x03, 0x03, 0x64, 0x46, 0x0C, 0x0D, - 0x02, 0x65, 0x26, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x02, 0x03, 0x60, 0x46, - 0xF9, 0x01, 0x01, 0xF2, 0xFF, 0xFF, 0xD4, 0x84, 0x01, 0xFA, 0x66, 0x44, 0x26, 0x46, 0x06, 0xFA, - 0x06, 0xF4, 0x00, 0xF2, 0x80, 0xFC, 0x40, 0x45, 0xAF, 0x60, 0x58, 0x4E, 0x95, 0x78, 0xFF, 0xFF, - 0xA3, 0xFF, 0x26, 0x46, 0x2C, 0x44, 0x0F, 0x26, 0x14, 0x00, 0x23, 0x46, 0x22, 0xFA, 0x26, 0x44, - 0x1E, 0xFA, 0x26, 0x46, 0x1B, 0xF2, 0xFF, 0xFF, 0xE4, 0xA4, 0x3E, 0xFA, 0x24, 0x60, 0x74, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0x6F, 0x00, 0xA3, 0x46, 0x22, 0xF2, 0x60, 0x45, 0xDC, 0x84, 0xD4, 0x80, 0x22, 0xFA, 0xA3, 0x46, - 0x6C, 0x02, 0x2A, 0xF0, 0xA3, 0x46, 0x1E, 0xF2, 0xA3, 0x46, 0x00, 0xBC, 0x00, 0xF2, 0x01, 0x02, - 0x64, 0x00, 0x44, 0x4C, 0x3F, 0xF0, 0x60, 0x43, 0x23, 0x46, 0x1E, 0xF4, 0x09, 0x60, 0x00, 0x65, - 0x3F, 0xF2, 0x26, 0x46, 0xC0, 0x84, 0xD4, 0x80, 0x60, 0x45, 0x57, 0x07, 0x80, 0xFC, 0x1B, 0xF2, - 0x06, 0xF2, 0x60, 0x41, 0x23, 0x46, 0x1E, 0xF4, 0x1B, 0xF0, 0x06, 0xF0, 0xC1, 0x81, 0x06, 0xFA, - 0x05, 0xFA, 0x9B, 0xFA, 0x65, 0x44, 0x3F, 0xFA, 0x64, 0x46, 0x00, 0xFC, 0x63, 0x46, 0x01, 0xF2, - 0x10, 0x61, 0xF2, 0xA4, 0x01, 0xFA, 0xC8, 0x83, 0x02, 0x64, 0x59, 0xD0, 0x58, 0xD8, 0xFD, 0x1F, - 0x06, 0x45, 0x24, 0x60, 0x74, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x25, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xA2, 0xFF, 0x00, 0xF4, 0x01, 0xF0, 0x0A, 0x18, 0x70, 0x67, - 0xA0, 0x80, 0xF0, 0x67, 0x06, 0x03, 0xC0, 0x84, 0x01, 0xFA, 0x25, 0x46, 0x25, 0x44, 0x80, 0xFC, - 0x05, 0xFA, 0xAF, 0x60, 0x58, 0x4E, 0x95, 0x78, 0xFF, 0xFF, 0xD4, 0xFE, 0xA3, 0xFF, 0x2C, 0x44, - 0x04, 0x27, 0x16, 0x00, 0x23, 0x46, 0x1E, 0xF2, 0x9E, 0xFC, 0x60, 0x46, 0x46, 0x46, 0x3F, 0xF2, - 0x00, 0xF4, 0x60, 0x47, 0x08, 0xFA, 0x26, 0x46, 0x2C, 0x43, 0x2A, 0xFC, 0x06, 0xF4, 0x00, 0x64, - 0x00, 0xFA, 0x01, 0xF0, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0x01, 0xFA, 0x26, 0x46, 0x1D, 0x00, - 0x00, 0x66, 0x46, 0x46, 0xBF, 0x60, 0xEB, 0x78, 0xFF, 0xFF, 0xA3, 0x46, 0x1E, 0xF0, 0x9E, 0xFC, - 0x00, 0x63, 0x33, 0x85, 0xA3, 0x46, 0x0D, 0x03, 0xA3, 0x46, 0x22, 0xF2, 0x0F, 0x65, 0xA4, 0x85, - 0xD4, 0x84, 0x22, 0xFA, 0xA3, 0x46, 0xA2, 0xFF, 0xAF, 0x60, 0x58, 0x4E, 0x95, 0x78, 0xFF, 0xFF, - 0xA3, 0xFF, 0x26, 0x46, 0xC5, 0x60, 0x5B, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x32, 0xF0, 0x60, 0x40, - 0x08, 0x2A, 0x5C, 0x00, 0x01, 0x2B, 0x2F, 0x00, 0x64, 0x40, 0x01, 0x2A, 0x2C, 0x00, 0xB8, 0xF1, - 0x27, 0x60, 0x8A, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, - 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, - 0x1B, 0xF2, 0xFF, 0xFF, 0x60, 0x45, 0xB8, 0xF1, 0x27, 0x60, 0x90, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, - 0xD8, 0x80, 0xC4, 0x84, 0x0B, 0x03, 0x07, 0x05, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, - 0x09, 0x04, 0xC6, 0xFE, 0x07, 0x00, 0x00, 0x64, 0xB8, 0x84, 0xA2, 0xDB, 0x8A, 0xFF, 0x20, 0x60, - 0x00, 0x75, 0x88, 0xFF, 0x2B, 0x00, 0xB8, 0xF1, 0x27, 0x60, 0x88, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, - 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, - 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x1B, 0xF2, 0xFF, 0xFF, 0x60, 0x45, 0xB8, 0xF1, - 0x27, 0x60, 0x8E, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xD8, 0x80, 0xC4, 0x84, 0x0B, 0x03, 0x07, 0x05, - 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x09, 0x04, 0xC6, 0xFE, 0x07, 0x00, 0x00, 0x64, - 0xB8, 0x84, 0xA2, 0xDB, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x07, 0xF4, 0xFF, 0xFF, - 0x22, 0xF2, 0x26, 0x46, 0x0F, 0xB4, 0xDC, 0x85, 0xB8, 0xF1, 0x27, 0x60, 0x8C, 0x64, 0xA0, 0xD3, - 0xFF, 0xFF, 0xD8, 0x80, 0xC4, 0x84, 0x0B, 0x03, 0x07, 0x05, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, - 0xA2, 0xDB, 0x09, 0x04, 0xC6, 0xFE, 0x07, 0x00, 0x00, 0x64, 0xB8, 0x84, 0xA2, 0xDB, 0x8A, 0xFF, - 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x27, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x3B, 0x12, 0x00, - 0xB8, 0xF1, 0x27, 0x60, 0x9A, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, - 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, - 0x88, 0xFF, 0x13, 0x00, 0x02, 0x3B, 0x11, 0x00, 0xB8, 0xF1, 0x27, 0x60, 0x9C, 0x64, 0xA0, 0xD3, - 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, - 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0xC6, 0x60, 0x85, 0x78, 0xFF, 0xFF, - 0xBF, 0x60, 0xEB, 0x78, 0xFF, 0xFF, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, - 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xBF, 0x60, 0xEB, 0x78, 0xFF, 0xFF, 0x24, 0x60, - 0x74, 0x62, 0x24, 0x60, 0x58, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xF8, 0xFE, 0x00, 0x66, 0x46, 0x46, 0xBF, 0x60, 0xEB, 0x78, 0xFF, 0xFF, - 0x2A, 0xF2, 0x58, 0x63, 0x60, 0x47, 0x01, 0x27, 0x64, 0x63, 0x31, 0x60, 0x28, 0x62, 0x61, 0x5C, - 0xA2, 0xD9, 0xBD, 0xD0, 0xBD, 0xD0, 0x64, 0x45, 0x64, 0x41, 0xBD, 0xD0, 0x00, 0xF4, 0x04, 0xF8, - 0x83, 0xFA, 0x82, 0xF8, 0xA6, 0x46, 0x02, 0xB0, 0x5E, 0x63, 0x04, 0x03, 0x64, 0x63, 0x03, 0xB0, - 0x02, 0x3A, 0x6C, 0x63, 0x3F, 0xF2, 0xBD, 0xD0, 0xBD, 0xD0, 0x64, 0x45, 0x64, 0x41, 0xBD, 0xD0, - 0xA6, 0x46, 0x07, 0xF8, 0x86, 0xFA, 0x85, 0xF8, 0x60, 0x47, 0x08, 0xFA, 0x31, 0x60, 0x28, 0x62, - 0xA2, 0xD1, 0x26, 0x46, 0x64, 0x41, 0x2F, 0x58, 0xFF, 0xFF, 0xA9, 0xF5, 0x00, 0xF2, 0x26, 0x46, - 0x31, 0xF0, 0x39, 0x18, 0x66, 0x41, 0x1C, 0x60, 0xBA, 0x65, 0x64, 0x47, 0x00, 0x7F, 0xA9, 0xF1, - 0xE0, 0x84, 0x44, 0xD3, 0x64, 0x43, 0x11, 0x18, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xFC, 0x1B, - 0x66, 0x44, 0x64, 0x46, 0x80, 0xF0, 0x60, 0x46, 0x80, 0xF8, 0x65, 0x46, 0x65, 0x43, 0x80, 0xF0, - 0x01, 0xFA, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x0B, 0x00, 0x64, 0x46, 0x62, 0x43, 0x00, 0xF2, - 0xA3, 0xDB, 0x60, 0x46, 0x80, 0xF0, 0x81, 0xFC, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x60, 0x43, - 0x61, 0x46, 0x1E, 0x60, 0xBC, 0x61, 0xA1, 0xD3, 0x1E, 0x60, 0xFE, 0x7C, 0xD0, 0x80, 0xFF, 0xFF, - 0x07, 0x03, 0xA0, 0xDD, 0xDA, 0x9C, 0xA1, 0xD9, 0x49, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xA1, 0xDB, - 0xC6, 0x60, 0x40, 0x78, 0xFF, 0xFF, 0x20, 0x7C, 0x72, 0x44, 0xFF, 0xB4, 0xD0, 0x80, 0xFF, 0xFF, - 0x02, 0x04, 0xD0, 0x84, 0xFB, 0x01, 0xE0, 0x83, 0xA9, 0xF3, 0x02, 0xA3, 0x43, 0x93, 0xA9, 0xF3, - 0xFF, 0xFF, 0x02, 0xA5, 0xD7, 0x80, 0x04, 0xA5, 0x08, 0x24, 0x65, 0x43, 0x66, 0x41, 0x63, 0x46, - 0x05, 0xF2, 0x00, 0xF0, 0x81, 0xF0, 0x02, 0x18, 0x64, 0x46, 0x81, 0xF8, 0x07, 0x1B, 0x1C, 0x60, - 0xBA, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD9, 0x02, 0x00, 0x65, 0x46, 0x00, 0xF8, - 0xA9, 0xF3, 0x63, 0x45, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x18, 0xFA, 0x04, - 0x80, 0xF8, 0x65, 0x46, 0x00, 0xFA, 0x06, 0xF2, 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, 0x61, 0x46, - 0x31, 0xF0, 0x66, 0x41, 0x1C, 0x60, 0xBA, 0x65, 0x64, 0x47, 0x00, 0x7F, 0xA9, 0xF1, 0xE0, 0x84, - 0x44, 0xD3, 0x64, 0x43, 0x11, 0x18, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xFC, 0x1B, 0x66, 0x44, - 0x64, 0x46, 0x80, 0xF0, 0x60, 0x46, 0x80, 0xF8, 0x65, 0x46, 0x65, 0x43, 0x80, 0xF0, 0x01, 0xFA, - 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x0B, 0x00, 0x64, 0x46, 0x62, 0x43, 0x00, 0xF2, 0xA3, 0xDB, - 0x60, 0x46, 0x80, 0xF0, 0x81, 0xFC, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x60, 0x43, 0x61, 0x46, - 0x2F, 0xF2, 0x30, 0xF0, 0x31, 0xF0, 0x64, 0x45, 0x46, 0x43, 0x63, 0x46, 0x03, 0xFA, 0x06, 0xF2, - 0x84, 0xF8, 0x00, 0x7E, 0x06, 0xFA, 0x05, 0xF8, 0xA3, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0xDC, 0xF3, - 0x2A, 0xF2, 0x07, 0xB0, 0x03, 0x3A, 0x2A, 0x00, 0x00, 0xF4, 0x09, 0xF2, 0x60, 0x45, 0x80, 0x3A, - 0x05, 0x00, 0x0E, 0xF2, 0xFF, 0xFF, 0x02, 0xB0, 0x0F, 0xF2, 0x20, 0x03, 0x60, 0x47, 0x00, 0x3A, - 0x1D, 0x00, 0x60, 0x41, 0x00, 0x36, 0x13, 0x00, 0xDA, 0x85, 0x2D, 0x60, 0x7A, 0x63, 0xBD, 0xD1, - 0xFF, 0xFF, 0xD1, 0x80, 0xFF, 0xFF, 0x12, 0x02, 0x60, 0xFE, 0xBD, 0xD3, 0xA5, 0xD0, 0xDE, 0x85, - 0xD0, 0x80, 0xCD, 0x81, 0x0B, 0x02, 0xF9, 0x02, 0x20, 0xFE, 0x00, 0x64, 0x0A, 0x00, 0x26, 0x46, - 0x48, 0xFE, 0x65, 0x40, 0x40, 0x3A, 0x02, 0x00, 0x01, 0x64, 0x03, 0x00, 0x08, 0xFE, 0x20, 0xFE, - 0x00, 0x64, 0x40, 0x48, 0x26, 0x46, 0x2D, 0x58, 0xFF, 0xFF, 0x2D, 0x60, 0x52, 0x62, 0xA2, 0xD3, - 0x18, 0xF2, 0x60, 0x40, 0x01, 0x26, 0x2A, 0xFA, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x26, - 0x03, 0x00, 0xC7, 0x60, 0x6D, 0x78, 0xFF, 0xFF, 0x3F, 0xF0, 0x32, 0x40, 0x10, 0x2A, 0x20, 0x00, - 0x2C, 0xF0, 0x64, 0x41, 0x60, 0x40, 0x40, 0x27, 0x1B, 0x00, 0xCD, 0x81, 0xDD, 0x81, 0x18, 0x03, - 0x17, 0x03, 0x64, 0x40, 0x01, 0x26, 0x14, 0x00, 0x01, 0x61, 0x13, 0x00, 0xB8, 0xF1, 0x27, 0x60, - 0xA0, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, - 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x23, 0x00, - 0x00, 0x61, 0x60, 0x40, 0x18, 0x36, 0x1F, 0x00, 0xC5, 0x60, 0x58, 0x4F, 0x78, 0x78, 0xFF, 0xFF, - 0x0F, 0xF0, 0xEB, 0xF1, 0x64, 0x44, 0x60, 0x22, 0x19, 0x00, 0xDC, 0xF3, 0xFF, 0xFF, 0x07, 0xB4, - 0xFD, 0xA0, 0x2A, 0xF2, 0x03, 0x02, 0x08, 0xB0, 0xFF, 0xFF, 0x10, 0x02, 0x32, 0xF2, 0x33, 0xF2, - 0xD0, 0x80, 0xEC, 0xF1, 0x0B, 0x02, 0xD0, 0x80, 0x34, 0xF2, 0x08, 0x02, 0xED, 0xF1, 0xFF, 0xFF, - 0xD0, 0x80, 0x0F, 0xF0, 0x03, 0x02, 0xC7, 0x60, 0xB9, 0x78, 0xFF, 0xFF, 0x00, 0xF4, 0xAA, 0x60, - 0xAA, 0x65, 0x09, 0xF2, 0x5A, 0xD0, 0xD4, 0x80, 0x03, 0x64, 0x4F, 0x02, 0xD0, 0x80, 0x00, 0x64, - 0x5A, 0xD0, 0x4B, 0x02, 0x64, 0x45, 0xD4, 0x80, 0xF8, 0x7F, 0x08, 0x02, 0x5A, 0xD0, 0x26, 0x46, - 0x64, 0x45, 0x23, 0xF0, 0x20, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0x0B, 0x00, 0xD4, 0x80, 0x1D, 0x60, - 0x60, 0x64, 0x16, 0x02, 0x5A, 0xD0, 0x26, 0x46, 0x64, 0x45, 0x23, 0xF0, 0x40, 0x67, 0xB0, 0x84, - 0xA2, 0xDA, 0x65, 0x44, 0x88, 0x3A, 0x07, 0x00, 0x77, 0x37, 0x08, 0x00, 0x78, 0x37, 0x06, 0x00, - 0x8E, 0x37, 0x04, 0x00, 0x2A, 0x00, 0x81, 0x3A, 0x28, 0x00, 0x80, 0x37, 0x00, 0x61, 0x25, 0x00, - 0xD4, 0x80, 0x01, 0x60, 0x00, 0x64, 0x5A, 0xD0, 0x20, 0x02, 0xD0, 0x80, 0x5A, 0xD0, 0x1D, 0x02, - 0x26, 0x46, 0x64, 0x47, 0x7F, 0xB4, 0xFD, 0xA0, 0x09, 0x03, 0x17, 0x07, 0x32, 0x40, 0x02, 0x26, - 0x47, 0x00, 0x23, 0xF0, 0x60, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0x42, 0x00, 0x0F, 0xF2, 0x32, 0x40, - 0x02, 0x26, 0x3E, 0x00, 0xF2, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0xF2, 0xFB, 0xEB, 0x60, 0x58, 0x4F, - 0xA5, 0x78, 0xFF, 0xFF, 0xC7, 0x60, 0xC3, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x61, 0x40, 0x01, 0x2A, - 0x12, 0x00, 0xB8, 0xF1, 0x27, 0x60, 0xA0, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, - 0xD0, 0x80, 0x04, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0x04, 0x00, 0x8A, 0xFF, 0x20, 0x60, - 0x00, 0x75, 0x88, 0xFF, 0x6E, 0x00, 0x0F, 0xF2, 0x81, 0xF1, 0x2A, 0xF2, 0x60, 0x40, 0x20, 0x2A, - 0x12, 0x00, 0x5E, 0x63, 0x60, 0x40, 0x02, 0x2B, 0x64, 0x63, 0xBD, 0xD2, 0xBD, 0xD2, 0xD0, 0x80, - 0x82, 0xF1, 0x08, 0x02, 0xD0, 0x80, 0xA3, 0xD2, 0x83, 0xF1, 0x04, 0x02, 0xD0, 0x80, 0xFF, 0xFF, - 0x01, 0x02, 0x06, 0x00, 0x56, 0x00, 0x2A, 0xF2, 0xFF, 0xFF, 0xFF, 0xFF, 0x48, 0x36, 0x51, 0x00, - 0xF2, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0xF2, 0xFB, 0x59, 0x00, 0x26, 0x46, 0x2A, 0xF2, 0xFF, 0xFF, - 0xFF, 0xFF, 0x0C, 0x26, 0x46, 0x00, 0xB0, 0x36, 0x15, 0x00, 0x10, 0x36, 0x13, 0x00, 0x30, 0x36, - 0x11, 0x00, 0xC0, 0x36, 0x02, 0x00, 0xA0, 0x3A, 0x12, 0x00, 0x81, 0xF1, 0x32, 0xF2, 0x33, 0xF2, - 0xD0, 0x80, 0x82, 0xF1, 0x36, 0x02, 0xD0, 0x80, 0x34, 0xF2, 0x83, 0xF1, 0x32, 0x02, 0xD0, 0x80, - 0xFF, 0xFF, 0x2F, 0x02, 0xDB, 0x60, 0x58, 0x4F, 0xD2, 0x78, 0xFF, 0xFF, 0x26, 0x00, 0x50, 0x3A, - 0x05, 0x00, 0xEF, 0x60, 0x58, 0x4F, 0xE3, 0x78, 0xFF, 0xFF, 0x1F, 0x00, 0x40, 0x3A, 0x05, 0x00, - 0xE8, 0x60, 0x58, 0x4F, 0x60, 0x78, 0xFF, 0xFF, 0x18, 0x00, 0x80, 0x3A, 0x15, 0x00, 0x81, 0xF1, - 0x32, 0xF2, 0x33, 0xF2, 0xD0, 0x80, 0x82, 0xF1, 0x14, 0x02, 0xD0, 0x80, 0x34, 0xF2, 0x83, 0xF1, - 0x10, 0x02, 0xD0, 0x80, 0xFF, 0xFF, 0x0D, 0x02, 0xDF, 0x60, 0x58, 0x4F, 0x28, 0x78, 0xFF, 0xFF, - 0x20, 0x60, 0x58, 0x4F, 0xBF, 0x78, 0xFF, 0xFF, 0x04, 0x00, 0x66, 0x44, 0x00, 0xA8, 0xFF, 0xFF, - 0x0A, 0x03, 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, 0xD8, 0x78, - 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xC5, 0x60, 0x58, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x3B, 0xF0, - 0x60, 0x40, 0x40, 0x2B, 0x1E, 0x00, 0xC0, 0x60, 0x00, 0x64, 0x64, 0x40, 0x20, 0x2B, 0x19, 0x00, - 0x22, 0xF2, 0xFF, 0xFF, 0x04, 0xB4, 0xFF, 0xFF, 0x14, 0x03, 0xC0, 0x60, 0x00, 0x64, 0x26, 0x46, - 0xA0, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x23, 0xF2, 0x10, 0xBD, 0xB4, 0x9C, 0x3F, 0xF2, - 0x23, 0xF8, 0x3F, 0xF2, 0xFF, 0xFF, 0xF8, 0xA4, 0x3F, 0xFA, 0x00, 0xF4, 0x60, 0x47, 0x08, 0xFA, - 0x26, 0x46, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x58, 0x64, 0xA2, 0xDB, 0x26, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF8, 0xFE, 0xCB, 0x01, 0x00, 0x60, 0x30, 0x61, - 0xAE, 0x60, 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x60, 0xFB, 0x00, 0x60, 0x30, 0x61, - 0xAE, 0x60, 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x5F, 0xFB, 0x00, 0x60, 0x02, 0x61, - 0xAE, 0x60, 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x66, 0xFB, 0x10, 0x60, 0x26, 0x62, - 0xC9, 0x60, 0xC7, 0x64, 0xA2, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x01, 0x64, 0xDC, 0xFB, 0xF2, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0xF2, 0xFB, 0x0F, 0x60, 0xF0, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x60, 0x14, 0x63, 0x01, 0x60, 0xC4, 0x61, 0x28, 0x60, 0x3E, 0x64, - 0x58, 0xD1, 0x59, 0xD9, 0xFD, 0x1F, 0x00, 0x60, 0x88, 0x63, 0x27, 0x60, 0xB4, 0x61, 0x28, 0x60, - 0x54, 0x64, 0x58, 0xD1, 0x59, 0xD9, 0xFD, 0x1F, 0x28, 0x60, 0x2C, 0x62, 0xA2, 0xD1, 0xFF, 0xFF, - 0x64, 0x45, 0xA9, 0xF1, 0x66, 0x41, 0x64, 0x46, 0x36, 0xF2, 0xFF, 0xFF, 0x65, 0x40, 0x01, 0x36, - 0x22, 0x64, 0x36, 0xFA, 0x61, 0x46, 0x32, 0x45, 0x28, 0x60, 0x3C, 0x62, 0xA2, 0xD1, 0x10, 0x67, - 0xB4, 0x85, 0x64, 0x40, 0x01, 0x2A, 0x94, 0x85, 0x45, 0x52, 0xFF, 0x60, 0xE7, 0x65, 0x32, 0x41, - 0xA5, 0x81, 0x2D, 0x60, 0x1A, 0x62, 0xA2, 0xD1, 0x28, 0x60, 0x2C, 0x62, 0xA2, 0xD3, 0x64, 0x40, - 0x01, 0x2A, 0x0D, 0x00, 0x08, 0x65, 0xFF, 0xA0, 0xFF, 0xFF, 0x01, 0x03, 0x08, 0x00, 0x28, 0x60, - 0x30, 0x62, 0xA2, 0xD3, 0xB5, 0x81, 0x10, 0x65, 0x60, 0x40, 0x01, 0x26, 0xB5, 0x81, 0x41, 0x52, - 0x2D, 0x60, 0x1A, 0x62, 0xA2, 0xD3, 0x31, 0x60, 0x18, 0x63, 0xF0, 0x84, 0xF0, 0x84, 0xF0, 0x84, - 0x01, 0xB5, 0xF0, 0x84, 0xF0, 0x84, 0x03, 0xB4, 0x65, 0x5C, 0xA3, 0xD9, 0x31, 0x60, 0x1A, 0x63, - 0x02, 0xA8, 0xA3, 0xDB, 0x1B, 0x02, 0x07, 0x60, 0xD0, 0x64, 0x31, 0x60, 0x1C, 0x63, 0xA3, 0xDB, - 0x31, 0x60, 0x24, 0x63, 0xA3, 0xDB, 0x00, 0x60, 0xC8, 0x64, 0x31, 0x60, 0x1E, 0x63, 0xA3, 0xDB, - 0x31, 0x60, 0x26, 0x63, 0xA3, 0xDB, 0x00, 0x60, 0x64, 0x64, 0x31, 0x60, 0x20, 0x63, 0xA3, 0xDB, - 0x01, 0x60, 0x90, 0x64, 0x31, 0x60, 0x22, 0x63, 0xA3, 0xDB, 0x08, 0x00, 0x0A, 0x64, 0x31, 0x60, - 0x20, 0x63, 0xA3, 0xDB, 0x01, 0x64, 0x31, 0x60, 0x22, 0x63, 0xA3, 0xDB, 0x2D, 0x60, 0x1A, 0x62, - 0xA2, 0xD1, 0x01, 0x64, 0x64, 0x40, 0x40, 0x2A, 0x03, 0x00, 0x31, 0x60, 0x0E, 0x7C, 0xA4, 0xDB, - 0x12, 0x60, 0x28, 0x63, 0xBA, 0xF3, 0x0E, 0x61, 0x60, 0x45, 0x65, 0x44, 0xE8, 0x85, 0x05, 0x64, - 0xCD, 0x81, 0x02, 0x28, 0x00, 0x64, 0xBD, 0xDB, 0xF8, 0x02, 0x2D, 0x60, 0x78, 0x61, 0x27, 0x60, - 0xB6, 0x64, 0x20, 0x63, 0x58, 0xD1, 0x59, 0xD9, 0xFD, 0x1F, 0xBD, 0xF1, 0x80, 0xF9, 0x1A, 0x63, - 0x01, 0x60, 0x00, 0x61, 0x00, 0x64, 0x59, 0xDB, 0xFE, 0x1F, 0x40, 0x40, 0x01, 0x64, 0x87, 0xFB, - 0x28, 0x60, 0xCC, 0x61, 0xA1, 0xD3, 0x2E, 0x60, 0x96, 0x61, 0xFE, 0xA4, 0xE0, 0x84, 0x04, 0x24, - 0x0F, 0x00, 0xE0, 0x84, 0x41, 0x91, 0x2D, 0x60, 0xCC, 0x62, 0xA2, 0xD3, 0xA1, 0xD1, 0x2D, 0x60, - 0xC4, 0x62, 0xA0, 0x83, 0xA2, 0xDD, 0x59, 0xD1, 0x2D, 0x60, 0xC2, 0x62, 0xA0, 0x83, 0xA2, 0xDD, - 0xE5, 0xF3, 0x7F, 0xFB, 0x1B, 0x60, 0xC6, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0x00, 0xB8, 0x10, 0x60, - 0x5C, 0x65, 0x0D, 0x03, 0x1B, 0x60, 0xCE, 0x63, 0xE5, 0xF3, 0xA3, 0xD1, 0xE0, 0x84, 0xC4, 0x84, - 0xA0, 0xD3, 0xFF, 0xFF, 0x01, 0xB0, 0xFF, 0xFF, 0x02, 0x02, 0xE5, 0xF9, 0x7F, 0xF9, 0xE5, 0xF3, - 0x01, 0x61, 0xCC, 0x84, 0xFF, 0xFF, 0x02, 0x03, 0xE1, 0x81, 0xFB, 0x01, 0xBA, 0xF3, 0x61, 0x45, - 0xA4, 0x80, 0xFF, 0xFF, 0x0B, 0x02, 0x00, 0xB8, 0x01, 0x63, 0x08, 0x03, 0xE8, 0x84, 0xFF, 0xFF, - 0x02, 0x24, 0x02, 0x00, 0xDF, 0x83, 0xFA, 0x01, 0xE5, 0xFD, 0x7F, 0xFD, 0x0F, 0x60, 0xF0, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, 0xF2, 0x62, 0x40, 0x60, 0x00, 0x64, - 0xA2, 0xDB, 0xC8, 0x60, 0xF7, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x7F, 0xF1, - 0x24, 0x60, 0x9A, 0x62, 0xA2, 0xD9, 0x0C, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x07, 0x64, - 0xD0, 0xFB, 0x0F, 0x60, 0xF2, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xC9, 0x60, 0x34, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xF0, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x01, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0xE3, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x05, 0x3A, - 0x03, 0x00, 0x68, 0x60, 0xBA, 0x61, 0x11, 0x00, 0x04, 0x3A, 0x03, 0x00, 0x68, 0x60, 0xAE, 0x61, - 0x0C, 0x00, 0x03, 0x3A, 0x03, 0x00, 0x68, 0x60, 0xA2, 0x61, 0x07, 0x00, 0x02, 0x3A, 0x03, 0x00, - 0x68, 0x60, 0x96, 0x61, 0x02, 0x00, 0x68, 0x60, 0x8A, 0x61, 0x3C, 0x60, 0x00, 0x66, 0x01, 0x60, - 0xB8, 0x64, 0x0A, 0x63, 0x59, 0xD0, 0x58, 0xD9, 0xFD, 0x1F, 0x01, 0x60, 0xBE, 0x61, 0xE4, 0xF3, - 0x00, 0x66, 0x00, 0xA8, 0x04, 0x65, 0x01, 0x03, 0xA1, 0xDB, 0x1F, 0x60, 0x08, 0x63, 0x55, 0xD3, - 0xFF, 0xFF, 0x20, 0x7F, 0xBD, 0xDB, 0x59, 0xD3, 0xFF, 0xFF, 0x21, 0x7F, 0xBD, 0xDB, 0x59, 0xD3, - 0xFF, 0xFF, 0x22, 0x7F, 0xA3, 0xDB, 0x0F, 0x60, 0xF0, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, - 0x0B, 0x04, 0x0F, 0x60, 0xF2, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xC9, 0x60, 0x7B, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x24, 0x60, 0x9A, 0x62, 0x1F, 0x60, 0x06, 0x64, - 0xA2, 0xDB, 0x20, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xF2, 0x62, 0x20, 0x60, - 0x00, 0x64, 0xA2, 0xDB, 0xC9, 0x60, 0xA0, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0xC5, 0xFE, 0x20, 0x40, 0x20, 0x2A, 0x08, 0x00, 0x10, 0x60, 0x02, 0x62, 0xA2, 0xD1, - 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, - 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, 0xF0, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x5A, 0xDB, 0x0E, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x64, - 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, 0xF0, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x8B, 0xFB, - 0xFF, 0xFF, 0xC1, 0xFE, 0x10, 0x60, 0x1A, 0x62, 0xA2, 0xD1, 0x01, 0x60, 0xDF, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x24, 0x60, 0xA8, 0x63, 0x01, 0x64, 0xBD, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0x0F, 0x60, 0xF0, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x08, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x0F, 0x60, 0xF2, 0x62, 0x00, 0x60, 0x08, 0x64, 0xA2, 0xDB, 0xC9, 0x60, 0xF3, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, 0xF0, 0x62, - 0xA2, 0xD1, 0x7F, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x8B, 0xF3, 0x00, 0x65, 0xD4, 0x80, - 0xFF, 0xFF, 0x0B, 0x03, 0x0F, 0x60, 0xF2, 0x62, 0x80, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xC9, 0x60, - 0xF3, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xDE, 0xFE, 0x0E, 0x04, 0x09, 0x64, - 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, 0xF2, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xCA, 0x60, - 0x1D, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0A, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x24, 0x60, 0x9A, 0x62, 0x06, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xF0, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, 0xBE, 0xFE, 0xDA, 0xFE, 0x24, 0x60, 0x34, 0x61, 0xCA, 0x60, - 0x58, 0x4E, 0x57, 0x78, 0xFF, 0xFF, 0x24, 0x60, 0x22, 0x61, 0xCA, 0x60, 0x58, 0x4E, 0x57, 0x78, - 0xFF, 0xFF, 0x24, 0x60, 0x28, 0x61, 0xCA, 0x60, 0x58, 0x4E, 0x57, 0x78, 0xFF, 0xFF, 0x24, 0x60, - 0x46, 0x61, 0xCA, 0x60, 0x58, 0x4E, 0x57, 0x78, 0xFF, 0xFF, 0x24, 0x60, 0x4C, 0x61, 0xCA, 0x60, - 0x58, 0x4E, 0x57, 0x78, 0xFF, 0xFF, 0x24, 0x60, 0x58, 0x61, 0xCA, 0x60, 0x58, 0x4E, 0x57, 0x78, - 0xFF, 0xFF, 0xC5, 0xFE, 0x0E, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0xA1, 0xD3, - 0x0E, 0x57, 0x24, 0x00, 0x0E, 0xF2, 0x44, 0x4C, 0x80, 0xB0, 0x10, 0xB0, 0x0B, 0x03, 0x24, 0x60, - 0x74, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0x13, 0x00, 0x12, 0x02, 0xF0, 0x37, 0x09, 0x00, 0x02, 0xF0, 0x09, 0x60, 0x08, 0x64, - 0xD0, 0x80, 0xA2, 0xFF, 0xB0, 0xF3, 0x02, 0x02, 0xCC, 0x84, 0xB0, 0xFB, 0x24, 0x60, 0x74, 0x64, - 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0x2C, 0x44, 0xAC, 0x86, 0x09, 0xF0, - 0xD9, 0x02, 0x37, 0x58, 0xFF, 0xFF, 0x1A, 0x60, 0x66, 0x63, 0x00, 0x64, 0xA3, 0xDB, 0x06, 0xA3, - 0x10, 0x60, 0x4C, 0x64, 0xBD, 0xDB, 0xBD, 0xDB, 0x06, 0x64, 0xA3, 0xDB, 0x00, 0x63, 0x10, 0x60, - 0x9E, 0x62, 0xA2, 0xDD, 0x10, 0x60, 0x4A, 0x62, 0xCF, 0x60, 0x16, 0x64, 0xA2, 0xDB, 0x10, 0x60, - 0x24, 0x62, 0xCE, 0x60, 0xE2, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xEC, 0x62, 0x00, 0x60, 0x02, 0x64, - 0xA2, 0xDB, 0xCA, 0x60, 0xFB, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x68, 0x60, - 0x7E, 0x61, 0x3C, 0x60, 0x00, 0x66, 0x01, 0x60, 0xB8, 0x64, 0x0A, 0x63, 0x59, 0xD0, 0x58, 0xD9, - 0xFD, 0x1F, 0x01, 0x60, 0xBE, 0x61, 0xE4, 0xF3, 0x00, 0x66, 0x00, 0xA8, 0x04, 0x65, 0x01, 0x03, - 0xA1, 0xDB, 0x1F, 0x60, 0x08, 0x63, 0x55, 0xD3, 0xFF, 0xFF, 0x20, 0x7F, 0xBD, 0xDB, 0x59, 0xD3, - 0xFF, 0xFF, 0x21, 0x7F, 0xBD, 0xDB, 0x59, 0xD3, 0xFF, 0xFF, 0x22, 0x7F, 0xA3, 0xDB, 0x0F, 0x60, - 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, 0xEC, 0x62, 0x40, 0x60, - 0x00, 0x64, 0xA2, 0xDB, 0xCA, 0x60, 0xC7, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x24, 0x60, 0x9A, 0x62, 0x1F, 0x60, 0x06, 0x64, 0xA2, 0xDB, 0x20, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x2D, 0xFF, 0x0F, 0x60, 0xEC, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xCA, 0x60, 0xEC, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x2E, 0x58, 0xFF, 0xFF, 0x10, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, 0xEA, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0xBA, 0xFE, 0x27, 0x60, 0xB6, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x03, 0xA8, - 0x02, 0xA8, 0x04, 0x03, 0x0F, 0x02, 0xCE, 0x60, 0xB3, 0x78, 0xFF, 0xFF, 0xCD, 0x60, 0xEF, 0x78, - 0xFF, 0xFF, 0x1F, 0x60, 0x80, 0x65, 0xA5, 0xD3, 0xFF, 0xFF, 0xF3, 0xB4, 0xA5, 0xDB, 0xCB, 0x60, - 0x22, 0x78, 0xFF, 0xFF, 0x01, 0x63, 0x1A, 0x60, 0x40, 0x64, 0xA0, 0xDD, 0x1F, 0x60, 0x80, 0x64, - 0x00, 0x63, 0xA0, 0xDD, 0x11, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0xBA, 0xFE, 0x02, 0x64, 0xDC, 0xFB, 0xF2, 0xF3, 0xFF, 0xFF, 0x01, 0xBC, 0xF2, 0xFB, - 0x44, 0x60, 0x44, 0x64, 0x81, 0xFB, 0x82, 0xFB, 0x83, 0xFB, 0xFF, 0xFF, 0x20, 0x40, 0x04, 0x2B, - 0x19, 0x00, 0x9B, 0xFE, 0x09, 0x04, 0xBB, 0xFE, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x80, 0x60, - 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x12, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, - 0xEC, 0x62, 0x80, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xCB, 0x60, 0x36, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x0D, 0x64, 0x53, 0xFB, - 0x29, 0x60, 0xA4, 0x64, 0x54, 0xFB, 0x13, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, 0xCE, 0x61, - 0xA1, 0xD1, 0x02, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x64, 0x40, 0x01, 0x2A, 0x07, 0x00, - 0x00, 0x64, 0xA1, 0xDB, 0x02, 0x65, 0xE9, 0x60, 0x58, 0x4E, 0x7B, 0x78, 0xFF, 0xFF, 0xCA, 0x60, - 0x58, 0x4E, 0xA7, 0x78, 0xFF, 0xFF, 0x1F, 0x60, 0x80, 0x62, 0x1A, 0x60, 0x40, 0x65, 0xA2, 0xD3, - 0xA5, 0xD1, 0x60, 0x40, 0x0C, 0x22, 0x04, 0x00, 0x04, 0x61, 0xD1, 0x80, 0xFF, 0xFF, 0x2D, 0x05, - 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x4E, 0xE4, 0x60, 0x58, 0x4F, 0xFB, 0x78, - 0xFF, 0xFF, 0x0E, 0x4F, 0x0F, 0x60, 0xEC, 0x62, 0x10, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xCB, 0x60, - 0x95, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x1F, 0x60, 0x80, 0x64, 0xA0, 0xD3, - 0xFF, 0xFF, 0x60, 0x40, 0x0C, 0x26, 0x11, 0x00, 0xFD, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, - 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x38, 0x00, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x0F, 0x4E, 0xEC, 0x60, 0x58, 0x4F, 0xB9, 0x78, 0xFF, 0xFF, 0x0E, 0x4F, 0x0F, 0x60, - 0xEC, 0x62, 0x10, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xCB, 0x60, 0xC2, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x14, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0xFD, 0x60, 0xFF, 0x65, 0x20, 0x44, - 0x24, 0x80, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x88, 0xF1, 0x19, 0x60, 0x86, 0x63, - 0xD3, 0x80, 0x20, 0x44, 0x05, 0x03, 0x10, 0xBC, 0x40, 0x40, 0xCD, 0x60, 0xE8, 0x78, 0xFF, 0xFF, - 0x89, 0xF3, 0xFF, 0xFF, 0xD0, 0x80, 0x20, 0x44, 0x06, 0x02, 0xD4, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, - 0xFF, 0xFF, 0x1E, 0x02, 0x72, 0x00, 0x10, 0xBC, 0x40, 0x40, 0x64, 0x42, 0x5A, 0xD1, 0x06, 0x63, - 0xA4, 0xD1, 0xC3, 0x83, 0x7F, 0xF9, 0xBD, 0xD1, 0x81, 0xF9, 0xBD, 0xD1, 0xFF, 0xFF, 0x82, 0xF9, - 0xBD, 0xD1, 0x83, 0xF9, 0x04, 0xA3, 0xBD, 0xD1, 0x2D, 0x60, 0x7A, 0x64, 0x64, 0x41, 0xDD, 0x81, - 0xFE, 0xB1, 0xA0, 0xD9, 0x04, 0x03, 0xBD, 0xD1, 0xC9, 0x81, 0x58, 0xD9, 0xFC, 0x02, 0x1E, 0x00, - 0xE5, 0xF3, 0x7F, 0xFB, 0x29, 0x60, 0xA4, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x2D, 0x60, - 0x7A, 0x63, 0x02, 0x02, 0x27, 0x60, 0xB8, 0x61, 0xA1, 0xD3, 0xBD, 0xDB, 0xDC, 0x84, 0xFE, 0xB4, - 0x59, 0xD1, 0xC8, 0x84, 0xBD, 0xD9, 0xFC, 0x02, 0xED, 0xF3, 0x72, 0x45, 0xEC, 0xF3, 0x94, 0x83, - 0x83, 0xFD, 0x94, 0x83, 0x82, 0xFD, 0x65, 0x5F, 0x02, 0x64, 0x81, 0xFB, 0x0F, 0x60, 0xEA, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, 0xEC, 0x62, 0x40, 0x60, 0x00, 0x64, - 0xA2, 0xDB, 0xCC, 0x60, 0x26, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x18, 0x64, - 0x3B, 0x42, 0x5A, 0xDB, 0x7F, 0xF1, 0x24, 0x60, 0x9A, 0x62, 0xA2, 0xD9, 0x1E, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xEC, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xCC, 0x60, - 0x4D, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0xCC, 0x60, 0xAD, 0x78, 0xFF, 0xFF, 0x16, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0xFF, 0x60, 0xEF, 0x65, 0x20, 0x44, 0x24, 0x80, 0xCA, 0x60, 0x58, 0x4E, 0xA7, 0x78, 0xFF, 0xFF, - 0x17, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x02, 0x64, 0xDC, 0xFB, 0xF2, 0xF3, 0xFF, 0xFF, 0x01, 0xBC, - 0xF2, 0xFB, 0xF7, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, - 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0xDA, 0xFE, 0xC1, 0xFE, 0x1A, 0x60, 0x40, 0x62, 0xA2, 0xD1, 0x1A, 0x60, 0x6A, 0x62, - 0xA2, 0xD9, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0x0F, 0x60, 0xEC, 0x62, 0x00, 0x60, 0x06, 0x64, 0xA2, 0xDB, 0xCB, 0x60, - 0x22, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x1A, 0x60, 0x40, 0x61, 0x75, 0x60, 0x30, 0x65, 0xA1, 0xD3, - 0xFF, 0xFF, 0xFF, 0xA0, 0xE0, 0x84, 0x02, 0x02, 0x03, 0x60, 0xE8, 0x64, 0xD4, 0x80, 0xFF, 0xFF, - 0x01, 0x04, 0x65, 0x44, 0xA1, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x79, 0xF3, 0x7A, 0xFB, 0x1F, 0x60, - 0x52, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xFF, 0x60, 0xDF, 0x65, 0x20, 0x44, 0x24, 0x80, 0xBF, 0xF1, - 0x1A, 0x60, 0x6A, 0x62, 0xA2, 0xD9, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, - 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0xF7, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, - 0x10, 0x26, 0x67, 0x00, 0x00, 0x64, 0xB5, 0xFB, 0xB6, 0xFB, 0xB7, 0xFB, 0x00, 0x75, 0x00, 0x72, - 0xBD, 0xF1, 0x80, 0xF9, 0x64, 0x44, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x93, 0xE6, 0xF1, - 0x86, 0xF9, 0x28, 0x60, 0xD2, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x01, 0xA8, 0xFF, 0xFF, 0x08, 0x02, - 0x01, 0x60, 0xB0, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x01, 0xA8, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x64, - 0x60, 0x41, 0x2D, 0x60, 0x28, 0x63, 0xBD, 0xD3, 0xA3, 0xD3, 0xFF, 0xB5, 0x65, 0x5C, 0xCD, 0x81, - 0x80, 0xBF, 0x0E, 0x03, 0x80, 0xBF, 0xBD, 0xDB, 0x65, 0x44, 0xC8, 0x84, 0xFF, 0xFF, 0x0B, 0x03, - 0x60, 0x45, 0xCD, 0x81, 0xA3, 0xD3, 0x07, 0x03, 0xCD, 0x81, 0x80, 0xBF, 0x01, 0x03, 0x80, 0xBC, - 0x60, 0x47, 0xBD, 0xDB, 0x00, 0x65, 0x64, 0x41, 0x2D, 0x60, 0x2A, 0x63, 0xBD, 0xD3, 0xFF, 0xFF, - 0x80, 0xB0, 0xFF, 0xFF, 0x01, 0x03, 0x60, 0x45, 0x60, 0x47, 0x80, 0xB0, 0xFF, 0xFF, 0x01, 0x03, - 0x60, 0x45, 0xC9, 0x81, 0xFF, 0xFF, 0xF2, 0x02, 0x65, 0x44, 0x7F, 0xB4, 0x02, 0x3A, 0x02, 0x00, - 0x0A, 0x64, 0x15, 0x00, 0x04, 0x3A, 0x02, 0x00, 0x14, 0x64, 0x11, 0x00, 0x0A, 0x3A, 0x02, 0x00, - 0x32, 0x64, 0x0D, 0x00, 0x0B, 0x3A, 0x02, 0x00, 0x37, 0x64, 0x09, 0x00, 0x10, 0x3A, 0x02, 0x00, - 0x50, 0x64, 0x05, 0x00, 0x16, 0x3A, 0x02, 0x00, 0x6E, 0x64, 0x01, 0x00, 0x14, 0x64, 0x7C, 0xFB, - 0x28, 0x00, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xEC, 0x62, 0x00, 0x60, - 0x84, 0x64, 0xA2, 0xDB, 0xCD, 0x60, 0x40, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x80, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0D, 0x03, - 0xA0, 0x84, 0xA2, 0xDB, 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, 0xFF, 0x60, 0x7F, 0x61, 0xA1, 0x84, - 0x5A, 0xD1, 0x4A, 0xDB, 0xA1, 0x84, 0x5A, 0xDB, 0x04, 0x00, 0xBB, 0xFE, 0xCB, 0x60, 0x22, 0x78, - 0xFF, 0xFF, 0x28, 0x60, 0x2C, 0x62, 0xA2, 0xD1, 0x00, 0x65, 0x64, 0x40, 0x01, 0x36, 0x22, 0x65, - 0x64, 0x40, 0x07, 0x36, 0x01, 0x65, 0xA9, 0xF3, 0x66, 0x5C, 0x60, 0x46, 0x1F, 0x63, 0xE3, 0x83, - 0xB6, 0xF8, 0x02, 0xA6, 0x66, 0x44, 0xFC, 0x1F, 0x28, 0x60, 0x2C, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, - 0x60, 0x40, 0x07, 0x3A, 0x04, 0x00, 0xA9, 0xF3, 0x04, 0x65, 0x60, 0x46, 0xB6, 0xF8, 0x64, 0x46, - 0xA9, 0xF3, 0x32, 0x41, 0x60, 0x45, 0x08, 0xB1, 0x66, 0x41, 0x17, 0x03, 0x65, 0x46, 0x29, 0x60, - 0xA2, 0x62, 0xA2, 0xD3, 0x06, 0xF0, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0x80, 0xBF, - 0xB0, 0x84, 0x06, 0xFA, 0x66, 0x43, 0x02, 0xA3, 0x63, 0x46, 0x06, 0xF0, 0xFF, 0xFF, 0xB0, 0x84, - 0x06, 0xFA, 0x61, 0x46, 0x32, 0x44, 0x10, 0xBC, 0x40, 0x52, 0x1F, 0x60, 0x52, 0x62, 0x01, 0x64, - 0xA2, 0xDB, 0x0F, 0x4E, 0xE7, 0x60, 0x58, 0x4F, 0x51, 0x78, 0xFF, 0xFF, 0x0E, 0x4F, 0x0F, 0x60, - 0xEA, 0x62, 0xA2, 0xD1, 0xFF, 0x60, 0xFB, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x0F, 0x60, 0xEC, 0x62, - 0x00, 0x60, 0x04, 0x64, 0xA2, 0xDB, 0xCB, 0x60, 0x11, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x24, 0x60, - 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0xBB, 0xFE, 0x20, 0x44, 0x04, 0x27, 0x12, 0x00, 0x10, 0x26, 0x02, 0x00, 0xDB, 0xFE, 0x16, 0x00, - 0x0F, 0x60, 0xCE, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x36, 0x07, 0x00, 0x01, 0x64, - 0xA1, 0xDB, 0x01, 0x65, 0xE9, 0x60, 0x58, 0x4E, 0x7B, 0x78, 0xFF, 0xFF, 0x0F, 0x60, 0xD0, 0x62, - 0xA2, 0xD1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x01, 0x64, 0x8C, 0xFB, - 0xFF, 0x60, 0xEF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x03, 0x64, 0xDC, 0xFB, 0xF2, 0xF3, 0xFF, 0xFF, - 0xFE, 0xB4, 0xF2, 0xFB, 0xC1, 0xFE, 0x1E, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, - 0x15, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0xBB, 0xFE, 0xCF, 0x60, 0xD6, 0x78, 0xFF, 0xFF, 0x28, 0x60, - 0x2C, 0x62, 0xA2, 0xD1, 0x00, 0x65, 0x64, 0x40, 0x01, 0x36, 0x22, 0x65, 0xA9, 0xF3, 0x66, 0x5C, - 0x60, 0x46, 0x1F, 0x63, 0xE3, 0x83, 0xB6, 0xF8, 0x02, 0xA6, 0x66, 0x44, 0xFC, 0x1F, 0x64, 0x46, - 0x79, 0xF1, 0xA9, 0xF3, 0x7A, 0xF9, 0x02, 0xA4, 0xD8, 0xF3, 0x60, 0x45, 0x66, 0x41, 0x65, 0x46, - 0x8C, 0xFA, 0x60, 0x40, 0x01, 0x36, 0x06, 0x00, 0x02, 0x36, 0x04, 0x00, 0x04, 0x36, 0x02, 0x00, - 0x05, 0x3A, 0x02, 0x00, 0x00, 0x64, 0x01, 0x00, 0x01, 0x64, 0x6F, 0xFA, 0x79, 0xF3, 0x7A, 0xF1, - 0xFF, 0xFF, 0xA0, 0x84, 0x65, 0x43, 0x02, 0x02, 0x79, 0xF3, 0xFF, 0xFF, 0x60, 0x41, 0x0F, 0x60, - 0xAE, 0x65, 0xD8, 0xF3, 0xFF, 0xFF, 0xE0, 0x84, 0x44, 0xD3, 0x61, 0x45, 0xA4, 0x80, 0xFF, 0xFF, - 0x04, 0x02, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0xFC, 0x03, 0xA4, 0x84, 0x7B, 0xFB, 0x6F, 0xF0, - 0x60, 0x47, 0x90, 0x84, 0x6F, 0xFA, 0x60, 0x47, 0x60, 0x45, 0x80, 0x64, 0xE8, 0x84, 0xA4, 0x80, - 0xFF, 0xFF, 0xFC, 0x03, 0xA4, 0x84, 0x70, 0xF0, 0x70, 0xFA, 0x00, 0x61, 0xE8, 0x84, 0xFF, 0xFF, - 0x02, 0x05, 0xDD, 0x81, 0xFB, 0x01, 0xE1, 0x81, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, - 0x66, 0x43, 0x0C, 0xF4, 0xA9, 0xF1, 0x02, 0x64, 0xC0, 0x85, 0x0C, 0x61, 0x32, 0x40, 0x08, 0x2A, - 0x15, 0x00, 0x29, 0x60, 0xA2, 0x62, 0xA2, 0xD3, 0x66, 0x41, 0x65, 0x46, 0x06, 0xF0, 0xE0, 0x84, - 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0x80, 0xBF, 0xB0, 0x83, 0x06, 0xFC, 0x66, 0x42, 0xFE, 0xA2, - 0x62, 0x46, 0x06, 0xF0, 0xFF, 0xFF, 0xB0, 0x84, 0x06, 0xFA, 0x61, 0x46, 0x1D, 0x64, 0x3B, 0x42, - 0x5A, 0xDB, 0x0B, 0x64, 0xDC, 0xFB, 0xF2, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0xF2, 0xFB, 0x01, 0x65, - 0xE9, 0x60, 0x58, 0x4E, 0x7B, 0x78, 0xFF, 0xFF, 0xE5, 0xF1, 0x7F, 0xF9, 0x0F, 0x60, 0xEA, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, 0xEC, 0x62, 0x40, 0x60, 0x00, 0x64, - 0xA2, 0xDB, 0xCE, 0x60, 0x76, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x7F, 0xF1, - 0x24, 0x60, 0x9A, 0x62, 0xA2, 0xD9, 0x1E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, - 0xEC, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xCE, 0x60, 0x9A, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, 0xBE, 0xFE, - 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x01, 0x64, 0x8C, 0xFB, 0xFF, 0x60, 0xDF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x1E, 0x64, 0x3B, 0x42, - 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x1C, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x06, 0x64, 0xDC, 0xFB, - 0xF2, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0xF2, 0xFB, 0xE5, 0xF1, 0x7F, 0xF9, 0x0F, 0x60, 0xEA, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x01, 0x64, 0x8C, 0xFB, 0xFF, 0x60, 0xDF, 0x65, 0x20, 0x44, 0x24, 0x80, - 0xA9, 0xF1, 0x66, 0x45, 0x64, 0x46, 0x66, 0x43, 0x02, 0xA3, 0x63, 0x46, 0x02, 0x64, 0x06, 0xFA, - 0x04, 0x63, 0x04, 0x61, 0x01, 0x60, 0xCE, 0x64, 0x58, 0xD1, 0x59, 0xD8, 0xFD, 0x1F, 0x65, 0x46, - 0x01, 0x65, 0xE9, 0x60, 0x58, 0x4E, 0x7B, 0x78, 0xFF, 0xFF, 0x1E, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x2F, 0x58, 0xFF, 0xFF, 0x1F, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x00, 0x64, 0x68, 0xFB, 0x69, 0xFB, - 0xA9, 0xF1, 0x0E, 0x64, 0x66, 0x41, 0x64, 0x42, 0x02, 0xA2, 0x62, 0x46, 0x06, 0xF0, 0xFF, 0x60, - 0xFC, 0x64, 0xA0, 0x84, 0x06, 0xFA, 0x61, 0x46, 0xDC, 0xF3, 0xFF, 0xFF, 0x04, 0xA8, 0x0F, 0x60, - 0xCE, 0x64, 0x07, 0x03, 0xA0, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x2A, 0x02, 0x00, 0x00, 0x63, - 0xA0, 0xDD, 0x01, 0x64, 0xDC, 0xFB, 0xF2, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0xF2, 0xFB, 0x0F, 0x60, - 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xEC, 0x62, 0x00, 0x60, 0x02, 0x64, 0xA2, 0xDB, - 0xCA, 0x60, 0xFB, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xEA, 0x62, - 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x28, 0x60, 0x3A, 0x64, 0xA0, 0xD3, 0x00, 0xF4, 0x60, 0x40, 0x01, 0x3A, 0x42, 0x00, 0x18, 0x65, - 0x22, 0x61, 0x02, 0x60, 0x00, 0x63, 0xA5, 0xD0, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, - 0x04, 0x65, 0x64, 0x44, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, 0x05, 0x03, 0x64, 0x47, 0x00, 0x7F, - 0xCD, 0x81, 0xBD, 0xDB, 0xF0, 0x02, 0x02, 0x60, 0x00, 0x63, 0xBD, 0xD3, 0xBD, 0xD3, 0x01, 0xA8, - 0xE0, 0x85, 0x27, 0x02, 0xC7, 0x83, 0xBD, 0xD3, 0xBD, 0xD3, 0x81, 0xA8, 0x0D, 0xA8, 0x21, 0x02, - 0x20, 0x02, 0xBD, 0xD3, 0xBD, 0xD3, 0x00, 0xA8, 0x60, 0xA8, 0x1B, 0x02, 0xBD, 0xD3, 0x19, 0x02, - 0x1D, 0xA8, 0xA3, 0xD1, 0x16, 0x02, 0xE3, 0xF9, 0x01, 0x60, 0xB8, 0x64, 0x63, 0x41, 0x0A, 0x63, - 0x59, 0xD1, 0x58, 0xD9, 0xFD, 0x1F, 0x59, 0xD1, 0x59, 0xD3, 0xFF, 0xFF, 0x60, 0x47, 0x64, 0x5E, - 0xD6, 0xFB, 0x59, 0xD1, 0x28, 0x60, 0x36, 0x64, 0xA0, 0xD9, 0x28, 0x60, 0xD6, 0x64, 0xA0, 0xD9, - 0x23, 0x00, 0x28, 0x60, 0x40, 0x64, 0xA0, 0xD3, 0xE3, 0xFB, 0x60, 0x40, 0x05, 0x3A, 0x03, 0x00, - 0x68, 0x60, 0xBA, 0x61, 0x11, 0x00, 0x04, 0x3A, 0x03, 0x00, 0x68, 0x60, 0xAE, 0x61, 0x0C, 0x00, - 0x03, 0x3A, 0x03, 0x00, 0x68, 0x60, 0xA2, 0x61, 0x07, 0x00, 0x02, 0x3A, 0x03, 0x00, 0x68, 0x60, - 0x96, 0x61, 0x02, 0x00, 0x68, 0x60, 0x8A, 0x61, 0x3C, 0x60, 0x00, 0x66, 0x01, 0x60, 0xB8, 0x64, - 0x0A, 0x63, 0x59, 0xD0, 0x58, 0xD9, 0xFD, 0x1F, 0x01, 0x60, 0xBE, 0x61, 0xE4, 0xF3, 0x00, 0x66, - 0x00, 0xA8, 0x04, 0x65, 0x01, 0x03, 0xA1, 0xDB, 0x1F, 0x60, 0x08, 0x63, 0x55, 0xD3, 0xFF, 0xFF, - 0x20, 0x7F, 0xBD, 0xDB, 0x59, 0xD3, 0xFF, 0xFF, 0x21, 0x7F, 0xBD, 0xDB, 0x59, 0xD3, 0xFF, 0xFF, - 0x22, 0x7F, 0xA3, 0xDB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, - 0x0F, 0x60, 0xEC, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xCF, 0x60, 0xA2, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x24, 0x60, 0x9A, 0x62, 0x1F, 0x60, 0x06, 0x64, 0xA2, 0xDB, - 0x20, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xEC, 0x62, 0x20, 0x60, 0x00, 0x64, - 0xA2, 0xDB, 0xCF, 0x60, 0xC7, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, - 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x40, 0x60, - 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2E, 0x58, 0xFF, 0xFF, 0x40, 0x64, 0x3B, 0x42, - 0x5A, 0xDB, 0xBC, 0xF1, 0x1A, 0x60, 0x6A, 0x62, 0xA2, 0xD9, 0x60, 0xF5, 0xEB, 0xF1, 0x2F, 0xF8, - 0xEC, 0xF1, 0x30, 0xF8, 0xED, 0xF1, 0x31, 0xF8, 0xBC, 0xF1, 0x19, 0xF8, 0xF8, 0x60, 0x80, 0x64, - 0x0E, 0xFA, 0x00, 0x64, 0x3E, 0xFA, 0xA9, 0xF1, 0x07, 0xF8, 0x00, 0x60, 0xD0, 0x63, 0x19, 0x60, - 0x84, 0x64, 0xA3, 0xDB, 0x44, 0x60, 0x44, 0x64, 0x81, 0xFB, 0x82, 0xFB, 0x83, 0xFB, 0x31, 0x44, - 0xF9, 0xB4, 0x40, 0x51, 0x00, 0x60, 0xD0, 0x63, 0x01, 0x60, 0x10, 0x65, 0xA3, 0xD3, 0xA5, 0xD1, - 0x04, 0xA4, 0xA3, 0xDB, 0xD0, 0x80, 0xA0, 0xD1, 0x0A, 0x06, 0x41, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xCC, 0x60, 0x5D, 0x78, 0xFF, 0xFF, 0x44, 0x47, - 0x28, 0x60, 0x2C, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xFF, 0xA4, 0xFF, 0xFF, 0x08, 0x07, 0x0E, 0x61, - 0x41, 0xD3, 0x32, 0x40, 0x08, 0x26, 0x03, 0x00, 0x10, 0xB0, 0xFF, 0xFF, 0xD3, 0x02, 0x42, 0x64, - 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, - 0x0F, 0x60, 0xEC, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xD0, 0x60, 0x22, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x27, 0xD1, 0x7F, 0xF9, 0x24, 0x60, 0x9A, 0x62, 0xA2, 0xD9, - 0x1E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xEC, 0x62, 0x20, 0x60, 0x00, 0x64, - 0xA2, 0xDB, 0xD0, 0x60, 0x47, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, - 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x40, 0x60, - 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x1A, 0x60, 0x6A, 0x62, 0x07, 0x60, 0xD0, 0x64, - 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0x27, 0x43, 0x06, 0xA3, 0xBD, 0xD3, 0x81, 0xFB, 0xBD, 0xD3, 0x82, 0xFB, - 0xA3, 0xD3, 0x83, 0xFB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xEC, 0x62, - 0x01, 0x60, 0x04, 0x64, 0xA2, 0xDB, 0xD0, 0x60, 0x79, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0xBC, 0xF1, 0x1A, 0x60, 0x6A, 0x62, 0xA2, 0xD9, 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, - 0xFE, 0x60, 0xFF, 0x61, 0xA1, 0x84, 0x5A, 0xD1, 0x4A, 0xDB, 0xA1, 0x84, 0x5A, 0xDB, 0x0F, 0x60, - 0xEA, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0xCF, 0x60, 0xF2, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x08, 0x65, 0x20, 0x44, 0x34, 0x80, - 0x5F, 0xF5, 0xEB, 0xF1, 0x2F, 0xF8, 0xEC, 0xF1, 0x30, 0xF8, 0xED, 0xF1, 0x31, 0xF8, 0xBC, 0xF1, - 0x19, 0xF8, 0x80, 0x7E, 0xF8, 0x7F, 0x0E, 0xFA, 0x00, 0x64, 0x3E, 0xFA, 0xA9, 0xF1, 0x07, 0xF8, - 0x2B, 0xFA, 0xB0, 0x64, 0x2A, 0xFA, 0x27, 0x43, 0x06, 0xA3, 0xBD, 0xD1, 0x2C, 0xF8, 0x32, 0xF8, - 0xBD, 0xD1, 0x2D, 0xF8, 0x33, 0xF8, 0xA3, 0xD1, 0x2E, 0xF8, 0x34, 0xF8, 0x06, 0x63, 0x3F, 0xFC, - 0x1F, 0x60, 0x54, 0x61, 0xDC, 0xF3, 0xA1, 0xD3, 0x03, 0xA8, 0xAC, 0x83, 0x0F, 0x02, 0x0E, 0x03, - 0x1F, 0x60, 0x56, 0x61, 0xA1, 0xD1, 0x66, 0x45, 0x00, 0xF4, 0x09, 0xFC, 0x01, 0x64, 0x0A, 0xFA, - 0x0B, 0xF8, 0x1F, 0x60, 0x54, 0x61, 0x00, 0x64, 0xA1, 0xDB, 0x28, 0x00, 0x28, 0x60, 0x2E, 0x64, - 0xA0, 0xD3, 0x66, 0x45, 0x00, 0xF4, 0x60, 0x40, 0x01, 0x36, 0x16, 0x00, 0x02, 0x36, 0xC7, 0x00, - 0x03, 0x36, 0x07, 0x00, 0x04, 0x36, 0x10, 0x00, 0x05, 0x36, 0xC1, 0x00, 0x06, 0x36, 0x01, 0x00, - 0x0B, 0x00, 0x80, 0x64, 0x09, 0xFA, 0x01, 0x63, 0x0A, 0xFC, 0x00, 0x64, 0x0B, 0xFA, 0x2D, 0x60, - 0x54, 0x62, 0x03, 0x64, 0xA2, 0xDB, 0x0A, 0x00, 0x00, 0x64, 0x09, 0xFA, 0x01, 0x63, 0x0A, 0xFC, - 0x00, 0x64, 0x0B, 0xFA, 0x2D, 0x60, 0x54, 0x62, 0x01, 0x64, 0xA2, 0xDB, 0x24, 0x60, 0x74, 0x62, - 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, 0x65, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0x00, 0x66, 0xDC, 0xF3, 0x46, 0x46, 0xFD, 0xA0, 0xC1, 0xFE, 0x02, 0x02, 0x2F, 0x58, - 0xFF, 0xFF, 0x01, 0x64, 0x69, 0xFB, 0x43, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x1A, 0x60, 0x44, 0x62, - 0xA2, 0xD3, 0xFF, 0xFF, 0x64, 0xA4, 0xA2, 0xDB, 0x1A, 0x60, 0x44, 0x62, 0xA2, 0xD1, 0x1A, 0x60, - 0x6A, 0x62, 0xA2, 0xD9, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x02, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x0F, 0x60, 0xEC, 0x62, 0x00, 0x60, 0x0C, 0x64, 0xA2, 0xDB, - 0xD1, 0x60, 0x2E, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xEA, 0x62, - 0xA2, 0xD1, 0x00, 0x60, 0x08, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x56, 0x03, 0xA0, 0x84, 0xA2, 0xDB, - 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0x00, 0x64, 0x69, 0xFB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x26, 0x46, - 0x00, 0xF4, 0x09, 0xF2, 0x0A, 0xF2, 0x00, 0xA8, 0x0B, 0xF2, 0x02, 0xA8, 0x16, 0x02, 0x00, 0xA8, - 0x1A, 0x02, 0x19, 0x02, 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, - 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x20, 0x40, 0x08, 0x2A, 0x03, 0x00, 0xD3, 0x60, - 0x48, 0x78, 0xFF, 0xFF, 0xD9, 0x60, 0x68, 0x78, 0xFF, 0xFF, 0x09, 0xF2, 0x0A, 0xF2, 0x80, 0xA8, - 0x0B, 0xF2, 0x02, 0xA8, 0xE4, 0x03, 0x44, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0B, 0xF2, 0x26, 0x46, - 0x40, 0x59, 0x02, 0x60, 0x00, 0x61, 0x2F, 0xF2, 0xA1, 0xDB, 0x30, 0xF2, 0x41, 0x58, 0x59, 0xDB, - 0x31, 0xF2, 0x59, 0xDB, 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, - 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x03, 0x65, 0xE9, 0x60, 0x58, 0x4E, 0x4C, 0x78, - 0xFF, 0xFF, 0xDC, 0x60, 0xAA, 0x78, 0xFF, 0xFF, 0xFF, 0x60, 0xFB, 0x64, 0xA0, 0x84, 0xA2, 0xDB, - 0x00, 0x64, 0x69, 0xFB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x20, 0x40, 0x08, 0x2A, - 0x03, 0x00, 0xCF, 0x60, 0xF2, 0x78, 0xFF, 0xFF, 0xD7, 0x60, 0xDD, 0x78, 0xFF, 0xFF, 0x01, 0x63, - 0x09, 0xFC, 0x32, 0x40, 0x08, 0x26, 0x1A, 0x00, 0x28, 0x60, 0x2C, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, - 0x60, 0x40, 0x0B, 0x36, 0x03, 0x00, 0xD0, 0x60, 0xEC, 0x78, 0xFF, 0xFF, 0x01, 0x64, 0xA2, 0xDB, - 0x2D, 0x60, 0x56, 0x62, 0x0B, 0x64, 0xA2, 0xDB, 0x2D, 0x60, 0x54, 0x62, 0x02, 0x64, 0xA2, 0xDB, - 0xA9, 0xF1, 0x66, 0x41, 0x64, 0x46, 0x22, 0x64, 0x36, 0xFA, 0x61, 0x46, 0x01, 0x64, 0x0A, 0xFA, - 0x00, 0x64, 0x0B, 0xFA, 0x01, 0x64, 0x69, 0xFB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, 0x65, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x00, 0x66, 0xDC, 0xF3, 0x46, 0x46, 0xFD, 0xA0, 0xC1, 0xFE, - 0x02, 0x02, 0x2F, 0x58, 0xFF, 0xFF, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, - 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x0F, 0x60, 0xEC, 0x62, 0x00, 0x60, 0x0C, 0x64, - 0xA2, 0xDB, 0xD1, 0x60, 0xEF, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, - 0xEA, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x08, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x3B, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x64, 0x69, 0xFB, 0x26, 0x46, 0x00, 0xF4, 0x09, 0xF2, 0x0A, 0xF2, - 0x01, 0xA8, 0x0B, 0xF2, 0x02, 0xA8, 0x04, 0x02, 0x00, 0xA8, 0x02, 0x02, 0x01, 0x02, 0x31, 0x00, - 0xD2, 0x60, 0x58, 0x4D, 0xF6, 0x78, 0xFF, 0xFF, 0x0B, 0xF2, 0x26, 0x46, 0x40, 0x59, 0x02, 0x60, - 0x00, 0x61, 0x2F, 0xF2, 0xA1, 0xDB, 0x30, 0xF2, 0x41, 0x58, 0x59, 0xDB, 0x31, 0xF2, 0x59, 0xDB, - 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, - 0x00, 0x66, 0x46, 0x46, 0x03, 0x65, 0xE9, 0x60, 0x58, 0x4E, 0x4C, 0x78, 0xFF, 0xFF, 0xDC, 0x60, - 0xAA, 0x78, 0xFF, 0xFF, 0xD2, 0x60, 0x58, 0x4D, 0xF6, 0x78, 0xFF, 0xFF, 0x00, 0x64, 0x69, 0xFB, - 0x20, 0x40, 0x08, 0x2A, 0x03, 0x00, 0xCF, 0x60, 0xF2, 0x78, 0xFF, 0xFF, 0xD7, 0x60, 0xDD, 0x78, - 0xFF, 0xFF, 0x26, 0x46, 0x40, 0x60, 0x00, 0x65, 0x2A, 0xF2, 0x2F, 0xF0, 0xB4, 0x84, 0x2A, 0xFA, - 0x2C, 0xF8, 0x32, 0xF8, 0x30, 0xF2, 0x2D, 0xFA, 0x33, 0xFA, 0x31, 0xF2, 0x2E, 0xFA, 0x34, 0xFA, - 0xEB, 0xF3, 0x2F, 0xFA, 0xEC, 0xF3, 0x30, 0xFA, 0xED, 0xF3, 0x31, 0xFA, 0xCC, 0xF1, 0x19, 0xF8, - 0x1C, 0xF0, 0x13, 0xF8, 0x00, 0x64, 0x3E, 0xFA, 0x00, 0xF4, 0x03, 0x64, 0x0A, 0xFA, 0x00, 0x64, - 0x0B, 0xFA, 0x01, 0x63, 0x69, 0xFD, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x24, 0x60, - 0x74, 0x62, 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0x00, 0x66, 0xDC, 0xF3, 0x46, 0x46, 0xFD, 0xA0, 0xC1, 0xFE, 0x02, 0x02, - 0x2F, 0x58, 0xFF, 0xFF, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x02, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x0F, 0x60, 0xEC, 0x62, 0x00, 0x60, 0x0C, 0x64, 0xA2, 0xDB, - 0xD2, 0x60, 0x8E, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xEA, 0x62, - 0xA2, 0xD1, 0x00, 0x60, 0x08, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x51, 0x03, 0xA0, 0x84, 0xA2, 0xDB, - 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0x00, 0x64, 0x69, 0xFB, 0x26, 0x46, 0x00, 0xF4, 0x09, 0xF2, 0x0A, 0xF2, 0x01, 0xA8, - 0x0B, 0xF2, 0x04, 0xA8, 0x1A, 0x02, 0x00, 0xA8, 0x18, 0x02, 0x17, 0x02, 0xD2, 0x60, 0x58, 0x4D, - 0xF6, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, - 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x20, 0x40, 0x08, 0x2A, 0x03, 0x00, 0xD3, 0x60, - 0x48, 0x78, 0xFF, 0xFF, 0xD9, 0x60, 0x68, 0x78, 0xFF, 0xFF, 0xD2, 0x60, 0x58, 0x4D, 0xF6, 0x78, - 0xFF, 0xFF, 0x0B, 0xF2, 0x26, 0x46, 0x40, 0x59, 0x02, 0x60, 0x00, 0x61, 0x2F, 0xF2, 0xA1, 0xDB, - 0x30, 0xF2, 0x41, 0x58, 0x59, 0xDB, 0x31, 0xF2, 0x59, 0xDB, 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, - 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x03, 0x65, - 0xE9, 0x60, 0x58, 0x4E, 0x4C, 0x78, 0xFF, 0xFF, 0xDC, 0x60, 0xAA, 0x78, 0xFF, 0xFF, 0xD2, 0x60, - 0x58, 0x4D, 0xF6, 0x78, 0xFF, 0xFF, 0x00, 0x64, 0x69, 0xFB, 0x20, 0x40, 0x08, 0x2A, 0x03, 0x00, - 0xCF, 0x60, 0xF2, 0x78, 0xFF, 0xFF, 0xD7, 0x60, 0xDD, 0x78, 0xFF, 0xFF, 0x2D, 0x60, 0x56, 0x62, - 0xA2, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x0B, 0x3A, 0x07, 0x00, 0x28, 0x60, 0x2C, 0x62, 0x0B, 0x64, - 0xA2, 0xDB, 0x2D, 0x60, 0x56, 0x62, 0xA2, 0xDF, 0x2D, 0x58, 0xFF, 0xFF, 0x28, 0x60, 0x2C, 0x62, - 0xA2, 0xD3, 0x61, 0x43, 0xA5, 0xD2, 0x60, 0x40, 0x0B, 0x2A, 0x30, 0x00, 0x85, 0x3A, 0x30, 0x00, - 0x60, 0x41, 0x65, 0x44, 0x0A, 0xA4, 0xA0, 0xD0, 0x2D, 0x60, 0x52, 0x62, 0x64, 0x40, 0x18, 0x26, - 0x06, 0x00, 0xA2, 0xDF, 0x28, 0x60, 0x2C, 0x62, 0x01, 0x64, 0xA2, 0xDB, 0x02, 0x00, 0x01, 0x64, - 0xA2, 0xDB, 0x61, 0x44, 0x60, 0x47, 0xFF, 0xB4, 0x02, 0xA4, 0x2E, 0x60, 0x62, 0x61, 0xA1, 0xD1, - 0xDF, 0x83, 0xC0, 0x84, 0xA1, 0xDB, 0xD0, 0x81, 0xCD, 0x84, 0x4C, 0x91, 0x60, 0x43, 0x60, 0xFE, - 0xA5, 0xD2, 0xDE, 0x85, 0x7F, 0x26, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x5D, 0x93, 0xA3, 0xDB, - 0x5D, 0x93, 0xA5, 0xD2, 0xF6, 0x1F, 0x5D, 0x93, 0x20, 0xFE, 0xDF, 0x83, 0x2D, 0x58, 0xFF, 0xFF, - 0x2D, 0x60, 0x52, 0x62, 0xA2, 0xDF, 0x28, 0x60, 0x2C, 0x62, 0x01, 0x64, 0xA2, 0xDB, 0xF6, 0x01, - 0x45, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x2E, 0x60, 0xEA, 0x7C, 0x2E, 0x60, 0xDE, 0x63, 0xA3, 0xD9, - 0x64, 0x41, 0x29, 0x60, 0xA4, 0x63, 0xBD, 0xD3, 0x00, 0x7C, 0x03, 0x1B, 0x27, 0x43, 0x10, 0xA3, - 0xBD, 0xD3, 0xFF, 0xFF, 0x60, 0x45, 0x64, 0x5F, 0xA1, 0xDB, 0x65, 0x44, 0xBD, 0xD1, 0xC8, 0x84, - 0x59, 0xD8, 0xFC, 0x05, 0x27, 0x41, 0x10, 0xA1, 0xA1, 0xD1, 0xFF, 0xFF, 0xC1, 0x81, 0x01, 0x26, - 0xDD, 0x81, 0x41, 0x4C, 0x59, 0xD1, 0x7C, 0x44, 0xB0, 0x84, 0x59, 0xD1, 0x59, 0xD1, 0xB0, 0x84, - 0xB0, 0x84, 0xFF, 0xFF, 0x02, 0x02, 0x67, 0x44, 0x5D, 0x00, 0x2D, 0x60, 0xE6, 0x63, 0xDD, 0x60, - 0x18, 0x64, 0xBD, 0xDA, 0x50, 0x60, 0x00, 0x64, 0xBD, 0xDA, 0x01, 0x60, 0xF2, 0x64, 0xBD, 0xDA, - 0x00, 0x60, 0x01, 0x64, 0xBD, 0xDA, 0x2C, 0x41, 0x59, 0xD3, 0x50, 0x60, 0x00, 0x7C, 0x60, 0x40, - 0x02, 0x2A, 0x03, 0x00, 0x01, 0x60, 0xF2, 0x64, 0x0E, 0x00, 0x04, 0x2A, 0x03, 0x00, 0x02, 0x60, - 0xF2, 0x64, 0x09, 0x00, 0x10, 0x2A, 0x03, 0x00, 0x04, 0x60, 0xF2, 0x64, 0x04, 0x00, 0x20, 0x2A, - 0x04, 0x00, 0x05, 0x60, 0xF2, 0x64, 0xBD, 0xD9, 0xBD, 0xDB, 0x01, 0x64, 0xBD, 0xDB, 0x59, 0xD3, - 0x50, 0x60, 0x00, 0x7C, 0x60, 0x40, 0x02, 0x2A, 0x03, 0x00, 0x01, 0x60, 0xF2, 0x64, 0x0E, 0x00, - 0x04, 0x2A, 0x03, 0x00, 0x02, 0x60, 0xF2, 0x64, 0x09, 0x00, 0x10, 0x2A, 0x03, 0x00, 0x04, 0x60, - 0xF2, 0x64, 0x04, 0x00, 0x20, 0x2A, 0x04, 0x00, 0x05, 0x60, 0xF2, 0x64, 0xBD, 0xD9, 0xBD, 0xDB, - 0x01, 0x64, 0xBD, 0xDB, 0x59, 0xD3, 0x50, 0x60, 0x00, 0x7C, 0x60, 0x40, 0x01, 0x2A, 0x03, 0x00, - 0x00, 0x60, 0xF2, 0x64, 0x09, 0x00, 0x02, 0x2A, 0x03, 0x00, 0x01, 0x60, 0xF2, 0x64, 0x04, 0x00, - 0x04, 0x2A, 0x02, 0x00, 0x02, 0x60, 0xF2, 0x64, 0xBD, 0xD9, 0xBD, 0xDB, 0x59, 0xD3, 0xBD, 0xDA, - 0x2D, 0x60, 0xE6, 0x64, 0x2E, 0x60, 0xE4, 0x62, 0xA2, 0xDB, 0x60, 0xF5, 0x00, 0x64, 0x2B, 0xFA, - 0x00, 0x64, 0x2A, 0xFA, 0x27, 0x43, 0x06, 0xA3, 0xBD, 0xD1, 0x2C, 0xF8, 0x32, 0xF8, 0xBD, 0xD1, - 0x2D, 0xF8, 0x33, 0xF8, 0xA3, 0xD1, 0x2E, 0xF8, 0x34, 0xF8, 0x00, 0xF4, 0x01, 0x63, 0x32, 0x40, - 0x08, 0x26, 0x10, 0xBB, 0x28, 0x60, 0x2C, 0x62, 0xA2, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0xFE, 0x26, - 0x10, 0xBB, 0x09, 0xFC, 0x27, 0x42, 0x0C, 0xA2, 0x28, 0x60, 0x02, 0x63, 0xA2, 0xD3, 0xA3, 0xD3, - 0x00, 0xBD, 0x01, 0x63, 0xAC, 0x81, 0x09, 0x03, 0x08, 0x03, 0xB0, 0x60, 0x58, 0x4D, 0xB6, 0x78, - 0xFF, 0xFF, 0x00, 0xB8, 0x01, 0x63, 0x01, 0x03, 0x60, 0x43, 0x1A, 0x60, 0x3E, 0x64, 0xA0, 0xDD, - 0x12, 0x61, 0x59, 0xDC, 0x28, 0x60, 0x2C, 0x62, 0xA2, 0xD3, 0xFF, 0x60, 0xFF, 0x7C, 0x60, 0x40, - 0x0B, 0x2A, 0x02, 0x00, 0x2D, 0x60, 0x32, 0x7C, 0x2E, 0x60, 0xE6, 0x62, 0xA2, 0xD9, 0x2E, 0x60, - 0xDE, 0x64, 0x40, 0x48, 0xD9, 0x81, 0xFF, 0x60, 0xF2, 0x64, 0xE8, 0x60, 0x58, 0x4D, 0xE8, 0x78, - 0xFF, 0xFF, 0x60, 0xF5, 0x3F, 0xFC, 0xDB, 0x83, 0x2E, 0x60, 0x08, 0x62, 0xA2, 0xDD, 0x00, 0x7C, - 0x5A, 0xD9, 0x63, 0x41, 0x2E, 0x60, 0x0C, 0x63, 0x12, 0x65, 0x00, 0xF4, 0xCD, 0x84, 0x4C, 0x91, - 0x60, 0x43, 0x60, 0xFE, 0xA5, 0xD2, 0xDE, 0x85, 0x7F, 0x26, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, - 0x5D, 0x93, 0xA3, 0xDB, 0x5D, 0x93, 0xA5, 0xD2, 0xF6, 0x1F, 0x5D, 0x93, 0x20, 0xFE, 0xDF, 0x83, - 0x60, 0xF5, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xC1, 0xFE, 0x06, 0x64, - 0x69, 0xFB, 0x46, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, - 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x0F, 0x60, 0xEC, 0x62, 0x00, 0x60, - 0x1C, 0x64, 0xA2, 0xDB, 0xD4, 0x60, 0x68, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x08, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x3A, 0x03, - 0xA0, 0x84, 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x03, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x26, 0x46, - 0x00, 0xF4, 0x0A, 0xF2, 0x00, 0x63, 0x00, 0xA8, 0x69, 0xFD, 0x5A, 0x03, 0x0A, 0xF2, 0x26, 0x46, - 0x40, 0x59, 0x02, 0x60, 0x00, 0x61, 0x2F, 0xF2, 0xA1, 0xDB, 0x30, 0xF2, 0x41, 0x58, 0x59, 0xDB, - 0x31, 0xF2, 0x59, 0xDB, 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, - 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x05, 0x65, 0xE9, 0x60, 0x58, 0x4E, 0x4C, 0x78, - 0xFF, 0xFF, 0xDC, 0x60, 0xAA, 0x78, 0xFF, 0xFF, 0x47, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0xCF, 0x60, - 0xF2, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x21, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, - 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x00, 0x64, 0x69, 0xFB, 0x0F, 0x60, 0xEA, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x49, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0xD0, 0x60, 0x94, 0x78, 0xFF, 0xFF, - 0xFF, 0x60, 0xFB, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x00, 0x64, 0x69, 0xFB, 0x0F, 0x60, 0xEA, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x4A, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0xCF, 0x60, 0xF2, 0x78, 0xFF, 0xFF, - 0x48, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x09, 0xF0, 0x2E, 0x60, 0x64, 0x63, 0x10, 0x64, 0xBD, 0xDB, - 0xBD, 0xD9, 0x0A, 0xF0, 0xBD, 0xD9, 0x0B, 0xF0, 0xBD, 0xD9, 0x0C, 0xF2, 0xBD, 0xDB, 0x60, 0x47, - 0xFF, 0xB4, 0x0A, 0xA5, 0x2E, 0x60, 0x62, 0x61, 0x65, 0x5C, 0xA1, 0xD9, 0x60, 0x41, 0x1A, 0x65, - 0xCD, 0x84, 0x4C, 0x91, 0x60, 0x43, 0x60, 0xFE, 0xA5, 0xD2, 0xDE, 0x85, 0x7F, 0x26, 0x02, 0x00, - 0x00, 0xF4, 0x04, 0x65, 0x5D, 0x93, 0xA3, 0xDB, 0x5D, 0x93, 0xA5, 0xD2, 0xF6, 0x1F, 0x5D, 0x93, - 0x20, 0xFE, 0xDF, 0x83, 0xD3, 0x60, 0x58, 0x4D, 0x06, 0x78, 0xFF, 0xFF, 0x0B, 0xF2, 0xFF, 0xFF, - 0x07, 0xB4, 0x01, 0x61, 0x03, 0x03, 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x02, 0x61, 0x44, 0x96, 0xFB, - 0x27, 0x45, 0x02, 0x62, 0x46, 0xD3, 0x5A, 0xD1, 0x60, 0x47, 0x56, 0xFB, 0x64, 0x47, 0x55, 0xFB, - 0x00, 0x64, 0x5C, 0xFB, 0x0C, 0x62, 0x46, 0xD3, 0x80, 0xFB, 0x0B, 0xF0, 0x0F, 0x60, 0xFF, 0x64, - 0xA0, 0x84, 0x85, 0xFB, 0x26, 0x46, 0x32, 0xF0, 0x81, 0xF9, 0x33, 0xF0, 0x0E, 0x63, 0xC7, 0x81, - 0x82, 0xF9, 0x34, 0xF0, 0x83, 0xF9, 0x59, 0xD1, 0xFF, 0xFF, 0x64, 0x44, 0x01, 0x2A, 0xC8, 0x84, - 0x60, 0x43, 0x2D, 0x60, 0x78, 0x64, 0x58, 0xD9, 0x59, 0xD1, 0x58, 0xD9, 0xFD, 0x1F, 0x28, 0x60, - 0x2C, 0x62, 0xA2, 0xD1, 0x59, 0xD3, 0x64, 0x40, 0x01, 0x36, 0x22, 0x64, 0x64, 0x40, 0x00, 0x36, - 0x50, 0x94, 0xA9, 0xF1, 0xFF, 0xFF, 0x44, 0x47, 0xA7, 0x46, 0x36, 0xFA, 0xB7, 0xFC, 0xA7, 0x46, - 0x1A, 0x60, 0x3E, 0x62, 0xA2, 0xD3, 0x87, 0xFB, 0x31, 0xF2, 0x1C, 0x60, 0xBA, 0x65, 0x60, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, - 0x61, 0x46, 0x31, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x30, 0xF0, - 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x2F, 0xF0, 0x63, 0x46, 0xD0, 0x80, - 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0xA9, 0xF3, 0x08, 0xFE, - 0x60, 0x43, 0x61, 0x46, 0xA9, 0xF1, 0xFF, 0xFF, 0xD3, 0x80, 0x31, 0xF2, 0x27, 0x02, 0x66, 0x41, - 0x1C, 0x60, 0xBA, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xA9, 0xF1, 0xE0, 0x84, 0x44, 0xD3, 0x64, 0x43, - 0x11, 0x18, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xFC, 0x1B, 0x66, 0x44, 0x64, 0x46, 0x80, 0xF0, - 0x60, 0x46, 0x80, 0xF8, 0x65, 0x46, 0x65, 0x43, 0x80, 0xF0, 0x01, 0xFA, 0x80, 0xFC, 0x64, 0x46, - 0x80, 0xF8, 0x0B, 0x00, 0x64, 0x46, 0x62, 0x43, 0x00, 0xF2, 0xA3, 0xDB, 0x60, 0x46, 0x80, 0xF0, - 0x81, 0xFC, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x60, 0x43, 0x61, 0x46, 0x43, 0x47, 0x00, 0xF4, - 0x18, 0x65, 0x0C, 0x61, 0x02, 0x60, 0x00, 0x63, 0xA5, 0xD0, 0xDA, 0x85, 0x64, 0x44, 0x00, 0x7F, - 0xCD, 0x81, 0xBD, 0xDB, 0x05, 0x03, 0x64, 0x47, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, 0xF4, 0x02, - 0x02, 0x60, 0x02, 0x61, 0xA1, 0xD3, 0x00, 0x65, 0x60, 0x43, 0x59, 0xD3, 0xFF, 0xFF, 0x7F, 0xB4, - 0x02, 0x3A, 0x02, 0x00, 0x01, 0x64, 0x15, 0x00, 0x04, 0x3A, 0x02, 0x00, 0x02, 0x64, 0x11, 0x00, - 0x0A, 0x3A, 0x02, 0x00, 0x04, 0x64, 0x0D, 0x00, 0x0B, 0x3A, 0x02, 0x00, 0x08, 0x64, 0x09, 0x00, - 0x10, 0x3A, 0x02, 0x00, 0x10, 0x64, 0x05, 0x00, 0x16, 0x3A, 0x02, 0x00, 0x20, 0x64, 0x01, 0x00, - 0x00, 0x64, 0xCF, 0x83, 0xB4, 0x85, 0xE1, 0x02, 0x65, 0x44, 0x7A, 0xFB, 0x02, 0x60, 0x02, 0x61, - 0xA1, 0xD3, 0x00, 0x65, 0x60, 0x43, 0x59, 0xD3, 0xFF, 0xFF, 0x80, 0xB0, 0xFF, 0xFF, 0x01, 0x03, - 0x60, 0x45, 0xCF, 0x83, 0x65, 0x44, 0xF7, 0x02, 0x7F, 0xB4, 0x02, 0x3A, 0x02, 0x00, 0x0A, 0x64, - 0x15, 0x00, 0x04, 0x3A, 0x02, 0x00, 0x14, 0x64, 0x11, 0x00, 0x0A, 0x3A, 0x02, 0x00, 0x32, 0x64, - 0x0D, 0x00, 0x0B, 0x3A, 0x02, 0x00, 0x37, 0x64, 0x09, 0x00, 0x10, 0x3A, 0x02, 0x00, 0x50, 0x64, - 0x05, 0x00, 0x16, 0x3A, 0x02, 0x00, 0x6E, 0x64, 0x01, 0x00, 0x14, 0x64, 0x7C, 0xFB, 0x27, 0x44, - 0xD8, 0xF3, 0x60, 0x45, 0x66, 0x41, 0x65, 0x46, 0x8C, 0xFA, 0x60, 0x40, 0x01, 0x36, 0x06, 0x00, - 0x02, 0x36, 0x04, 0x00, 0x04, 0x36, 0x02, 0x00, 0x05, 0x3A, 0x02, 0x00, 0x00, 0x64, 0x01, 0x00, - 0x01, 0x64, 0x6F, 0xFA, 0x79, 0xF3, 0x7A, 0xF1, 0xFF, 0xFF, 0xA0, 0x84, 0x65, 0x43, 0x02, 0x02, - 0x79, 0xF3, 0xFF, 0xFF, 0x60, 0x41, 0x0F, 0x60, 0xAE, 0x65, 0xD8, 0xF3, 0xFF, 0xFF, 0xE0, 0x84, - 0x44, 0xD3, 0x61, 0x45, 0xA4, 0x80, 0xFF, 0xFF, 0x04, 0x02, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, - 0xFC, 0x03, 0xA4, 0x84, 0x7B, 0xFB, 0x6F, 0xF0, 0x60, 0x47, 0x90, 0x84, 0x6F, 0xFA, 0x60, 0x47, - 0x60, 0x45, 0x80, 0x64, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0xFC, 0x03, 0xA4, 0x84, 0x70, 0xF0, - 0x70, 0xFA, 0x00, 0x61, 0xE8, 0x84, 0xFF, 0xFF, 0x02, 0x05, 0xDD, 0x81, 0xFB, 0x01, 0xE1, 0x81, - 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, 0x66, 0x43, 0x0C, 0xF4, 0x2D, 0x60, 0xD2, 0x62, - 0xA2, 0xD3, 0x2D, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x60, 0x47, 0x28, 0x60, 0x2C, 0x62, 0xA2, 0xD1, - 0xB0, 0x84, 0x64, 0x40, 0x01, 0x36, 0x22, 0x64, 0x64, 0x40, 0x00, 0x36, 0x50, 0x94, 0xA7, 0x46, - 0x36, 0xFA, 0xB7, 0xFC, 0xA7, 0x46, 0x80, 0x60, 0x03, 0x65, 0x32, 0x40, 0x08, 0x2A, 0x03, 0x65, - 0xA7, 0x46, 0x06, 0xF0, 0x7F, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xB4, 0x84, 0x06, 0xFA, 0xB7, 0xFC, - 0xA7, 0x46, 0x26, 0x46, 0x2F, 0xF0, 0x30, 0xF0, 0x64, 0x43, 0x31, 0xF2, 0x27, 0x46, 0x03, 0xFC, - 0x04, 0xF8, 0x05, 0xFA, 0x26, 0x46, 0xCF, 0x60, 0x58, 0x4E, 0x20, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x66, - 0x46, 0x46, 0x01, 0x64, 0x8C, 0xFB, 0x28, 0x60, 0x38, 0x62, 0xA2, 0xD3, 0x20, 0x41, 0x00, 0xBC, - 0x20, 0xB9, 0x01, 0x03, 0x41, 0x40, 0x1F, 0x60, 0x52, 0x61, 0x00, 0x64, 0xA1, 0xDB, 0x04, 0x64, - 0xC1, 0xFE, 0xDC, 0xFB, 0xF2, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0xF2, 0xFB, 0xF7, 0x60, 0xFF, 0x65, - 0x20, 0x44, 0x24, 0x80, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x01, 0x65, 0xE9, 0x60, 0x58, 0x4E, 0x7B, 0x78, 0xFF, 0xFF, 0x0F, 0x60, - 0xD8, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x0C, 0x64, - 0x69, 0xFB, 0x0F, 0x60, 0xEC, 0x62, 0x00, 0x60, 0x31, 0x64, 0xA2, 0xDB, 0xD6, 0x60, 0xC4, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x0E, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x5A, 0xDB, 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x01, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x10, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x31, 0x60, 0x2C, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0x03, 0x1B, - 0xDC, 0x60, 0xD0, 0x78, 0xFF, 0xFF, 0xDC, 0x60, 0xD0, 0x78, 0xFF, 0xFF, 0xD7, 0x60, 0x67, 0x78, - 0xFF, 0xFF, 0x00, 0x60, 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0xF8, 0x03, 0xA0, 0x84, 0xA2, 0xDB, - 0xA9, 0xF3, 0xFF, 0xFF, 0x02, 0xA4, 0x60, 0x43, 0x66, 0x41, 0x63, 0x46, 0x05, 0xF2, 0x00, 0xF0, - 0x81, 0xF0, 0x02, 0x18, 0x64, 0x46, 0x81, 0xF8, 0x07, 0x1B, 0x1C, 0x60, 0xBA, 0x65, 0x60, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD9, 0x02, 0x00, 0x65, 0x46, 0x00, 0xF8, 0xA9, 0xF3, 0x63, 0x45, - 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x18, 0xFA, 0x04, 0x80, 0xF8, 0x65, 0x46, - 0x00, 0xFA, 0x06, 0xF2, 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, 0x61, 0x46, 0x4B, 0x64, 0x3B, 0x42, - 0x5A, 0xDB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x01, 0x60, 0x2E, 0x62, 0xA2, 0xD3, - 0xFF, 0xFF, 0x10, 0xB0, 0xFF, 0xFF, 0x13, 0x03, 0x0F, 0x60, 0xEC, 0x62, 0x04, 0x60, 0x00, 0x64, - 0xA2, 0xDB, 0xD7, 0x60, 0x2F, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, - 0x01, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x6A, 0xF3, - 0xFF, 0xFF, 0x01, 0xB0, 0xFF, 0xFF, 0x13, 0x03, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0x00, 0x60, - 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, 0xEC, 0x62, 0x02, 0x60, 0x00, 0x64, - 0xA2, 0xDB, 0xD7, 0x60, 0x47, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, - 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x64, 0x69, 0xFB, 0xD7, 0x60, 0x58, 0x4E, 0x77, 0x78, - 0xFF, 0xFF, 0x02, 0x64, 0x8C, 0xFB, 0x02, 0x64, 0xC1, 0xFE, 0xDC, 0xFB, 0xF2, 0xF3, 0xFF, 0xFF, - 0x01, 0xBC, 0xF2, 0xFB, 0x02, 0x65, 0xE9, 0x60, 0x58, 0x4E, 0x7B, 0x78, 0xFF, 0xFF, 0x03, 0x60, - 0xE8, 0x63, 0x1A, 0x60, 0x40, 0x64, 0xA0, 0xDD, 0xCB, 0x60, 0x1A, 0x78, 0xFF, 0xFF, 0x00, 0x60, - 0x20, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0xFF, 0xFF, 0x08, 0x24, 0x54, 0x01, 0xA0, 0x84, 0xA2, 0xDB, - 0x00, 0x63, 0x69, 0xFD, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x15, 0x00, 0x24, 0x60, - 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0x00, 0x64, 0x69, 0xFB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x01, 0x64, 0x8C, 0xFB, - 0xFF, 0xFF, 0xC1, 0xFE, 0x2E, 0x58, 0xFF, 0xFF, 0x50, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, - 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x01, 0x60, 0x2E, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x10, 0xB0, - 0xFF, 0xFF, 0x13, 0x03, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, 0x01, 0x60, 0x00, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, 0xEC, 0x62, 0x04, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xD7, 0x60, - 0x8F, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xBC, 0xF1, 0x1A, 0x60, 0x6A, 0x62, - 0xA2, 0xD9, 0x7F, 0xF1, 0x7E, 0xF9, 0x02, 0x64, 0x8C, 0xFB, 0xFF, 0xFF, 0xC1, 0xFE, 0x8C, 0xF3, - 0x00, 0x65, 0xD4, 0x80, 0xFF, 0xFF, 0x0F, 0x03, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x0F, 0x60, 0xEC, 0x62, 0x80, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xD7, 0x60, 0xB3, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x51, 0x64, - 0x3B, 0x42, 0x5A, 0xDB, 0x19, 0x60, 0x84, 0x64, 0x68, 0xFB, 0x1A, 0x60, 0x46, 0x63, 0x81, 0xF3, - 0xBD, 0xDB, 0x82, 0xF3, 0xBD, 0xDB, 0x83, 0xF3, 0xA3, 0xDB, 0x01, 0x60, 0x10, 0x65, 0x68, 0xF3, - 0xA5, 0xD1, 0x04, 0xA4, 0x68, 0xFB, 0xD0, 0x80, 0xA0, 0xD3, 0x20, 0x07, 0x40, 0x47, 0x60, 0x41, - 0x0E, 0x65, 0x45, 0xD3, 0x28, 0x60, 0x2C, 0x62, 0xA2, 0xD1, 0xFF, 0xFF, 0x03, 0x1B, 0x10, 0xB0, - 0xFF, 0xFF, 0xEB, 0x02, 0x27, 0x44, 0x06, 0xA4, 0x60, 0x41, 0xA1, 0xD1, 0x81, 0xF3, 0x82, 0xF1, - 0xD0, 0x80, 0x59, 0xD3, 0x08, 0x02, 0xD0, 0x80, 0x83, 0xF3, 0x59, 0xD1, 0x04, 0x02, 0xD0, 0x80, - 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x00, 0xD8, 0x60, 0x99, 0x78, 0xFF, 0xFF, 0x1A, 0x60, 0x46, 0x63, - 0xBD, 0xD3, 0x81, 0xFB, 0xBD, 0xD3, 0x82, 0xFB, 0xA3, 0xD3, 0x83, 0xFB, 0x53, 0x64, 0x3B, 0x42, - 0x5A, 0xDB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, - 0xEC, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xD8, 0x60, 0x06, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x7E, 0xF1, 0x7F, 0xF9, 0x24, 0x60, 0x9A, 0x62, 0xA2, 0xD9, 0x1E, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xEC, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, - 0xD8, 0x60, 0x36, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xEA, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x01, 0x63, 0x8C, 0xFD, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, - 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xC1, 0xFE, 0x54, 0x64, 0x3B, 0x42, - 0x5A, 0xDB, 0x31, 0x44, 0xF9, 0xB4, 0x40, 0x51, 0x01, 0x60, 0xBA, 0x61, 0x1F, 0x60, 0x08, 0x63, - 0xA1, 0xD3, 0xFF, 0xFF, 0x20, 0x7F, 0xBD, 0xDB, 0x59, 0xD3, 0xFF, 0xFF, 0x21, 0x7F, 0xBD, 0xDB, - 0x59, 0xD3, 0xFF, 0xFF, 0x22, 0x7F, 0xA3, 0xDB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, 0xEC, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xD8, 0x60, - 0x64, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x24, 0x60, 0x9A, 0x62, 0x1F, 0x60, - 0x06, 0x64, 0xA2, 0xDB, 0x20, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xEC, 0x62, - 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xD8, 0x60, 0x89, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, - 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xD6, 0x60, 0xB7, 0x78, - 0xFF, 0xFF, 0x27, 0x43, 0x2D, 0x60, 0x7A, 0x65, 0xA5, 0xD3, 0x65, 0x41, 0x10, 0xA3, 0x01, 0xA4, - 0xFE, 0xB4, 0xC4, 0x85, 0xFE, 0xA1, 0xBD, 0xD3, 0x59, 0xD1, 0xFF, 0xFF, 0xD0, 0x80, 0xD5, 0x80, - 0x02, 0x02, 0x04, 0x03, 0xF8, 0x01, 0xD7, 0x60, 0xDD, 0x78, 0xFF, 0xFF, 0x55, 0x64, 0x3B, 0x42, - 0x5A, 0xDB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, - 0xEC, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xD8, 0x60, 0xB1, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x27, 0xD1, 0x7F, 0xF9, 0x24, 0x60, 0x9A, 0x62, 0xA2, 0xD9, 0x1E, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xEC, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, - 0xD8, 0x60, 0xD6, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xEA, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x01, 0x60, 0xBA, 0x61, 0x1F, 0x60, 0x08, 0x63, 0xA1, 0xD3, - 0xFF, 0xFF, 0x20, 0x7F, 0xBD, 0xDB, 0x21, 0x60, 0x32, 0x64, 0xBD, 0xDB, 0x04, 0xA1, 0xA1, 0xD3, - 0xFF, 0xFF, 0x22, 0x7F, 0xA3, 0xDB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, - 0x0B, 0x04, 0x0F, 0x60, 0xEC, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xD8, 0x60, 0xF3, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x24, 0x60, 0x9A, 0x62, 0x1F, 0x60, 0x06, 0x64, - 0xA2, 0xDB, 0x20, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xEC, 0x62, 0x20, 0x60, - 0x00, 0x64, 0xA2, 0xDB, 0xD9, 0x60, 0x18, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, - 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x1A, 0x60, 0x6A, 0x62, 0x07, 0x60, - 0xD0, 0x64, 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x02, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x27, 0x43, 0x06, 0xA3, 0xBD, 0xD3, 0x81, 0xFB, 0xBD, 0xD3, - 0x82, 0xFB, 0xA3, 0xD3, 0x83, 0xFB, 0x31, 0x44, 0xF9, 0xB4, 0x40, 0x51, 0x0F, 0x60, 0xEA, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xEC, 0x62, 0x01, 0x60, 0x04, 0x64, 0xA2, 0xDB, 0xD9, 0x60, - 0x4D, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xBC, 0xF1, 0x1A, 0x60, 0x6A, 0x62, - 0xA2, 0xD9, 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, 0xFE, 0x60, 0xFF, 0x61, 0xA1, 0x84, 0x5A, 0xD1, - 0x4A, 0xDB, 0xA1, 0x84, 0x5A, 0xDB, 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xD7, 0x60, 0xDD, 0x78, 0xFF, 0xFF, - 0x27, 0x42, 0x0C, 0xA2, 0x28, 0x60, 0x02, 0x63, 0xA2, 0xD3, 0xA3, 0xD3, 0x00, 0xBD, 0x01, 0x63, - 0xAC, 0x81, 0x09, 0x03, 0x08, 0x03, 0xB0, 0x60, 0x58, 0x4D, 0xB6, 0x78, 0xFF, 0xFF, 0x00, 0xB8, - 0x01, 0x63, 0x01, 0x03, 0x60, 0x43, 0x1A, 0x60, 0x3E, 0x64, 0xA0, 0xDD, 0x60, 0xF5, 0x00, 0x64, - 0x2B, 0xFA, 0x20, 0x64, 0x2A, 0xFA, 0x27, 0x43, 0x06, 0xA3, 0xBD, 0xD1, 0x2C, 0xF8, 0x32, 0xF8, - 0xBD, 0xD1, 0x2D, 0xF8, 0x33, 0xF8, 0xA3, 0xD1, 0x2E, 0xF8, 0x34, 0xF8, 0xEB, 0xF1, 0x2F, 0xF8, - 0xEC, 0xF1, 0x30, 0xF8, 0xED, 0xF1, 0x31, 0xF8, 0xBC, 0xF1, 0x19, 0xF8, 0xF8, 0x60, 0x80, 0x64, - 0x0E, 0xFA, 0x00, 0xF4, 0x01, 0x63, 0x32, 0x40, 0x08, 0x26, 0x10, 0xBB, 0x28, 0x60, 0x2C, 0x62, - 0xA2, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0xFE, 0x26, 0x10, 0xBB, 0x09, 0xFC, 0x1A, 0x60, 0x3E, 0x64, - 0xA0, 0xD3, 0x12, 0x61, 0x59, 0xDA, 0x1A, 0x60, 0x46, 0x63, 0xBD, 0xD1, 0x59, 0xD8, 0xBD, 0xD1, - 0x59, 0xD8, 0xA3, 0xD1, 0x59, 0xD8, 0x2E, 0x60, 0xDE, 0x64, 0x40, 0x48, 0xD9, 0x81, 0xFF, 0x60, - 0xF2, 0x64, 0xE8, 0x60, 0x58, 0x4D, 0xE8, 0x78, 0xFF, 0xFF, 0x60, 0xF5, 0x3F, 0xFC, 0xDB, 0x83, - 0x2E, 0x60, 0x08, 0x62, 0xA2, 0xDD, 0x20, 0x7C, 0x5A, 0xD9, 0x63, 0x41, 0x2E, 0x60, 0x0C, 0x63, - 0x12, 0x65, 0x00, 0xF4, 0xCD, 0x84, 0x4C, 0x91, 0x60, 0x43, 0x60, 0xFE, 0xA5, 0xD2, 0xDE, 0x85, - 0x7F, 0x26, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x5D, 0x93, 0xA3, 0xDB, 0x5D, 0x93, 0xA5, 0xD2, - 0xF6, 0x1F, 0x5D, 0x93, 0x20, 0xFE, 0xDF, 0x83, 0x60, 0xF5, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, - 0x28, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0x00, 0x66, 0x46, 0x46, 0xC1, 0xFE, 0x14, 0x64, 0x69, 0xFB, 0x56, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x1A, 0x60, 0x44, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x64, 0xA4, 0xA2, 0xDB, 0x1A, 0x60, 0x44, 0x62, - 0xA2, 0xD1, 0x1A, 0x60, 0x6A, 0x62, 0xA2, 0xD9, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, - 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x0F, 0x60, 0xEC, 0x62, 0x00, 0x60, - 0x1C, 0x64, 0xA2, 0xDB, 0xDA, 0x60, 0x10, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0E, 0x03, - 0xA0, 0x84, 0xA2, 0xDB, 0x57, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x00, 0x64, 0x69, 0xFB, 0x0F, 0x60, - 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xD7, 0x60, 0xDD, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x10, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x17, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, - 0x66, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x58, 0x64, 0x3B, 0x42, - 0x5A, 0xDB, 0x00, 0x64, 0x69, 0xFB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDB, 0x60, - 0xCB, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x08, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x3A, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x66, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x64, 0x69, 0xFB, 0x0F, 0x60, 0xEA, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x26, 0x46, 0x00, 0xF4, 0x0A, 0xF2, 0xFF, 0xFF, 0x2C, 0x18, 0x59, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x0A, 0xF2, 0x26, 0x46, 0x40, 0x59, 0x02, 0x60, 0x00, 0x61, 0x2F, 0xF2, 0xA1, 0xDB, 0x30, 0xF2, - 0x41, 0x58, 0x59, 0xDB, 0x31, 0xF2, 0x59, 0xDB, 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, - 0x2C, 0x60, 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x05, 0x65, 0xE9, 0x60, - 0x58, 0x4E, 0x4C, 0x78, 0xFF, 0xFF, 0xDC, 0x60, 0xAA, 0x78, 0xFF, 0xFF, 0xD7, 0x60, 0xDD, 0x78, - 0xFF, 0xFF, 0x5A, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x78, 0x43, 0x02, 0x61, 0x24, 0x60, 0xDD, 0x78, - 0xFF, 0xFF, 0x5B, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x09, 0xF0, 0x2E, 0x60, 0x64, 0x63, 0x30, 0x64, - 0xBD, 0xDB, 0xBD, 0xD9, 0x0A, 0xF0, 0xBD, 0xD9, 0x0B, 0xF0, 0xBD, 0xD9, 0x0C, 0xF2, 0xBD, 0xDB, - 0x60, 0x47, 0xFF, 0xB4, 0x0A, 0xA5, 0x2E, 0x60, 0x62, 0x62, 0x65, 0x5C, 0xA2, 0xD9, 0x60, 0x41, - 0x1A, 0x65, 0xCD, 0x84, 0x4C, 0x91, 0x60, 0x43, 0x60, 0xFE, 0xA5, 0xD2, 0xDE, 0x85, 0x7F, 0x26, - 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x5D, 0x93, 0xA3, 0xDB, 0x5D, 0x93, 0xA5, 0xD2, 0xF6, 0x1F, - 0x5D, 0x93, 0x20, 0xFE, 0xDF, 0x83, 0xD3, 0x60, 0x58, 0x4D, 0x06, 0x78, 0xFF, 0xFF, 0x0B, 0xF2, - 0xFF, 0xFF, 0x07, 0xB4, 0x01, 0x61, 0x03, 0x03, 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x02, 0x61, 0x44, - 0x96, 0xFB, 0x27, 0x45, 0x02, 0x62, 0x46, 0xD3, 0x5A, 0xD1, 0x60, 0x47, 0x56, 0xFB, 0x64, 0x47, - 0x55, 0xFB, 0x00, 0x64, 0x5C, 0xFB, 0x0C, 0x62, 0x46, 0xD3, 0x80, 0xFB, 0x0B, 0xF0, 0x0F, 0x60, - 0xFF, 0x64, 0xA0, 0x84, 0x85, 0xFB, 0x1A, 0x60, 0x3E, 0x62, 0xA2, 0xD3, 0x87, 0xFB, 0x26, 0x46, - 0x32, 0xF0, 0x81, 0xF9, 0x33, 0xF0, 0x82, 0xF9, 0x34, 0xF0, 0x83, 0xF9, 0x00, 0xF4, 0x18, 0x65, - 0x0C, 0x61, 0x02, 0x60, 0x00, 0x63, 0xA5, 0xD0, 0xDA, 0x85, 0x64, 0x44, 0x00, 0x7F, 0xCD, 0x81, - 0xBD, 0xDB, 0x05, 0x03, 0x64, 0x47, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, 0xF4, 0x02, 0x02, 0x60, - 0x02, 0x61, 0xA1, 0xD3, 0x00, 0x65, 0x60, 0x43, 0x59, 0xD3, 0xFF, 0xFF, 0x7F, 0xB4, 0x02, 0x3A, - 0x02, 0x00, 0x01, 0x64, 0x15, 0x00, 0x04, 0x3A, 0x02, 0x00, 0x02, 0x64, 0x11, 0x00, 0x0A, 0x3A, - 0x02, 0x00, 0x04, 0x64, 0x0D, 0x00, 0x0B, 0x3A, 0x02, 0x00, 0x08, 0x64, 0x09, 0x00, 0x10, 0x3A, - 0x02, 0x00, 0x10, 0x64, 0x05, 0x00, 0x16, 0x3A, 0x02, 0x00, 0x20, 0x64, 0x01, 0x00, 0x00, 0x64, - 0xCF, 0x83, 0xB4, 0x85, 0xE1, 0x02, 0x65, 0x44, 0x7A, 0xFB, 0x02, 0x60, 0x02, 0x61, 0xA1, 0xD3, - 0x00, 0x65, 0x60, 0x43, 0x59, 0xD3, 0xFF, 0xFF, 0x80, 0xB0, 0xFF, 0xFF, 0x01, 0x03, 0x60, 0x45, - 0xCF, 0x83, 0x65, 0x44, 0xF7, 0x02, 0x7F, 0xB4, 0x02, 0x3A, 0x02, 0x00, 0x0A, 0x64, 0x15, 0x00, - 0x04, 0x3A, 0x02, 0x00, 0x14, 0x64, 0x11, 0x00, 0x0A, 0x3A, 0x02, 0x00, 0x32, 0x64, 0x0D, 0x00, - 0x0B, 0x3A, 0x02, 0x00, 0x37, 0x64, 0x09, 0x00, 0x10, 0x3A, 0x02, 0x00, 0x50, 0x64, 0x05, 0x00, - 0x16, 0x3A, 0x02, 0x00, 0x6E, 0x64, 0x01, 0x00, 0x14, 0x64, 0x7C, 0xFB, 0xA9, 0xF3, 0xFF, 0xFF, - 0x02, 0xA4, 0xD8, 0xF3, 0x60, 0x45, 0x66, 0x41, 0x65, 0x46, 0x8C, 0xFA, 0x60, 0x40, 0x01, 0x36, - 0x06, 0x00, 0x02, 0x36, 0x04, 0x00, 0x04, 0x36, 0x02, 0x00, 0x05, 0x3A, 0x02, 0x00, 0x00, 0x64, - 0x01, 0x00, 0x01, 0x64, 0x6F, 0xFA, 0x79, 0xF3, 0x7A, 0xF1, 0xFF, 0xFF, 0xA0, 0x84, 0x65, 0x43, - 0x02, 0x02, 0x79, 0xF3, 0xFF, 0xFF, 0x60, 0x41, 0x0F, 0x60, 0xAE, 0x65, 0xD8, 0xF3, 0xFF, 0xFF, - 0xE0, 0x84, 0x44, 0xD3, 0x61, 0x45, 0xA4, 0x80, 0xFF, 0xFF, 0x04, 0x02, 0xE8, 0x84, 0xA4, 0x80, - 0xFF, 0xFF, 0xFC, 0x03, 0xA4, 0x84, 0x7B, 0xFB, 0x6F, 0xF0, 0x60, 0x47, 0x90, 0x84, 0x6F, 0xFA, - 0x60, 0x47, 0x60, 0x45, 0x80, 0x64, 0xE8, 0x84, 0xA4, 0x80, 0xFF, 0xFF, 0xFC, 0x03, 0xA4, 0x84, - 0x70, 0xF0, 0x70, 0xFA, 0x00, 0x61, 0xE8, 0x84, 0xFF, 0xFF, 0x02, 0x05, 0xDD, 0x81, 0xFB, 0x01, - 0xE1, 0x81, 0x0F, 0x60, 0xA2, 0x65, 0x45, 0xD3, 0x0E, 0xFA, 0x66, 0x43, 0x0C, 0xF4, 0xA9, 0xF3, - 0x1C, 0x60, 0xBA, 0x65, 0x02, 0xA4, 0x60, 0x46, 0x05, 0xF0, 0x60, 0x41, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x00, 0x7C, 0x44, 0xD9, 0x26, 0x46, 0x31, 0xF2, 0x61, 0x5C, 0x60, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD9, 0x26, 0x46, 0x2F, 0xF0, 0x61, 0x46, 0x03, 0xF8, 0x26, 0x46, 0x30, 0xF0, - 0x61, 0x46, 0x04, 0xF8, 0x26, 0x46, 0x31, 0xF0, 0x61, 0x46, 0x05, 0xF8, 0x26, 0x46, 0xCF, 0x60, - 0x58, 0x4E, 0x20, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, - 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x03, 0x65, 0xE9, 0x60, 0x58, 0x4E, - 0x7B, 0x78, 0xFF, 0xFF, 0x01, 0x63, 0x8C, 0xFD, 0x0F, 0x60, 0xD8, 0x62, 0xA2, 0xD1, 0x00, 0x60, - 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xC1, 0xFE, 0x5C, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0xD6, 0x60, 0xB7, 0x78, 0xFF, 0xFF, 0xFF, 0x60, 0xF7, 0x65, 0x20, 0x44, 0x24, 0x80, 0xD0, 0x60, - 0x98, 0x78, 0xFF, 0xFF, 0xDC, 0xF3, 0xFF, 0xFF, 0xFD, 0xA0, 0x2A, 0xF2, 0x03, 0x03, 0xDC, 0x60, - 0x7B, 0x78, 0xFF, 0xFF, 0x60, 0x40, 0xB0, 0x36, 0x11, 0x00, 0xC0, 0x36, 0x02, 0x00, 0x2F, 0x58, - 0xFF, 0xFF, 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, 0xD8, 0x78, - 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xD0, 0x60, 0x98, 0x78, 0xFF, 0xFF, 0x66, 0x45, 0x00, 0xF4, - 0x0A, 0xF2, 0x0B, 0xF2, 0xFE, 0xA0, 0xF3, 0xA0, 0x6F, 0x02, 0x60, 0x41, 0x09, 0xF2, 0x20, 0x03, - 0x00, 0xA0, 0xFF, 0xA0, 0x53, 0x03, 0x65, 0x03, 0x00, 0xA0, 0xFF, 0xFF, 0x4F, 0x03, 0x1F, 0x60, - 0x54, 0x61, 0x01, 0x64, 0xA1, 0xDB, 0x1F, 0x60, 0x56, 0x61, 0x0D, 0x64, 0xA1, 0xDB, 0x1F, 0x60, - 0x58, 0x61, 0x03, 0x64, 0xA1, 0xDB, 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, - 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xD0, 0x60, 0x98, 0x78, 0xFF, 0xFF, - 0x28, 0x60, 0x2E, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0xFE, 0xA0, 0x1F, 0x60, 0x54, 0x61, 0x17, 0x02, - 0x01, 0x64, 0xA1, 0xDB, 0x1F, 0x60, 0x56, 0x61, 0x00, 0x64, 0xA1, 0xDB, 0x1F, 0x60, 0x58, 0x61, - 0x01, 0x64, 0xA1, 0xDB, 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, - 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xD0, 0x60, 0x98, 0x78, 0xFF, 0xFF, 0x02, 0x64, - 0xA1, 0xDB, 0x1F, 0x60, 0x56, 0x61, 0x00, 0x64, 0xA1, 0xDB, 0x1F, 0x60, 0x58, 0x61, 0x01, 0x64, - 0xA1, 0xDB, 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, 0xD8, 0x78, - 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xD0, 0x60, 0x98, 0x78, 0xFF, 0xFF, 0x65, 0x46, 0x07, 0xF4, - 0x06, 0xF2, 0xFF, 0xFF, 0x01, 0x7E, 0x06, 0xFA, 0x65, 0x46, 0x26, 0x46, 0x24, 0x60, 0x74, 0x64, - 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, - 0xFF, 0xFF, 0xD2, 0x60, 0x41, 0x78, 0xFF, 0xFF, 0x0A, 0xF2, 0x09, 0xF2, 0xFC, 0xA0, 0xFF, 0xA0, - 0x11, 0x02, 0x0A, 0x02, 0x0B, 0xF2, 0x65, 0x46, 0x0A, 0x1B, 0x66, 0x41, 0x07, 0xF4, 0x06, 0xF2, - 0xFF, 0xFF, 0x01, 0x7E, 0x06, 0xFA, 0x61, 0x46, 0xD0, 0x60, 0x98, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0x2F, 0x58, 0xFF, 0xFF, 0x65, 0x46, 0x69, 0xF1, 0x2A, 0xF2, 0x64, 0x41, 0x60, 0x40, 0xA0, 0x3A, - 0x02, 0x00, 0x08, 0xB1, 0x04, 0x00, 0xC0, 0x3A, 0x0C, 0x00, 0x04, 0xB1, 0xFF, 0xFF, 0x20, 0x03, - 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x10, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x17, 0x00, 0xB0, 0x3A, 0x02, 0x00, 0x01, 0x65, 0x07, 0x00, 0x10, 0x3A, 0x02, 0x00, 0x02, 0x65, - 0x03, 0x00, 0x30, 0x3A, 0x0D, 0x00, 0x10, 0x65, 0xA5, 0x80, 0xFF, 0xFF, 0x09, 0x03, 0x0F, 0x60, - 0xEA, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x08, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x00, 0x66, - 0x2F, 0x58, 0xFF, 0xFF, 0x28, 0x60, 0x2E, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xFC, 0xA0, 0xFF, 0xFF, - 0x16, 0x04, 0x0F, 0x60, 0xEC, 0x62, 0x00, 0x60, 0x02, 0x64, 0xA2, 0xDB, 0xDC, 0x60, 0xBC, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x2D, 0x60, 0x58, 0x65, 0xA5, 0xD1, 0x01, 0x60, - 0x00, 0x64, 0xA0, 0x80, 0xFF, 0xFF, 0x03, 0x03, 0xD0, 0x60, 0x98, 0x78, 0xFF, 0xFF, 0x20, 0x40, - 0x08, 0x2A, 0x03, 0x00, 0xCF, 0x60, 0xF2, 0x78, 0xFF, 0xFF, 0xD7, 0x60, 0xDD, 0x78, 0xFF, 0xFF, - 0x4E, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x2E, 0xF5, 0xFF, 0xFF, 0x27, 0xF2, 0x1C, 0x60, 0xBA, 0x65, - 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, - 0x16, 0x18, 0x61, 0x46, 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, - 0x26, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x25, 0xF0, 0x63, 0x46, - 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0xA9, 0xF3, - 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x25, 0xF2, 0x26, 0xF0, 0xA7, 0xF2, 0xA8, 0xF0, 0x66, 0xF5, - 0xFF, 0xFF, 0x00, 0xF4, 0xFF, 0xFF, 0x89, 0xF8, 0x66, 0xF5, 0xFF, 0xFF, 0x07, 0xFC, 0x2C, 0xFA, - 0x2D, 0xF8, 0xAE, 0xFA, 0xEB, 0xF3, 0x2F, 0xFA, 0xEC, 0xF3, 0x30, 0xFA, 0xED, 0xF3, 0x31, 0xFA, - 0x81, 0xF3, 0x32, 0xFA, 0x82, 0xF3, 0x33, 0xFA, 0x83, 0xF3, 0x34, 0xFA, 0x31, 0x60, 0x2C, 0x61, - 0xA1, 0xD3, 0xFF, 0xFF, 0x03, 0x1B, 0x00, 0x60, 0xA0, 0x64, 0x02, 0x00, 0x00, 0x60, 0xC0, 0x64, - 0x2A, 0xFA, 0x02, 0x63, 0x3F, 0xFC, 0xAB, 0xFC, 0x00, 0x64, 0x3E, 0xFA, 0xCC, 0xF1, 0x19, 0xF8, - 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xC1, 0xFE, 0x0F, 0x60, 0xEA, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0xD6, 0x60, 0xC2, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x3A, 0x61, 0xAE, 0x60, - 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x62, 0xFB, 0xA9, 0xF3, 0x07, 0xFA, 0x0C, 0x60, - 0x80, 0x64, 0xBC, 0xF1, 0x19, 0xF8, 0x0E, 0xFA, 0x00, 0x64, 0x3E, 0xFA, 0x3F, 0xFA, 0x00, 0x60, - 0x3A, 0x61, 0xAE, 0x60, 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x61, 0xFB, 0xA9, 0xF3, - 0x07, 0xFA, 0x0C, 0x60, 0x80, 0x64, 0x0E, 0xFA, 0xBC, 0xF1, 0x19, 0xF8, 0x00, 0x64, 0x3E, 0xFA, - 0x3F, 0xFA, 0x10, 0x60, 0x20, 0x62, 0xDE, 0x60, 0xDC, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xE0, 0x62, - 0x00, 0x60, 0x80, 0x64, 0xA2, 0xDB, 0xDD, 0x60, 0x71, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x20, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x27, 0x60, 0xB6, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, - 0x01, 0xA8, 0x03, 0xA8, 0x04, 0x03, 0x03, 0x03, 0xDE, 0x60, 0xCA, 0x78, 0xFF, 0xFF, 0x04, 0x60, - 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x0F, 0x60, 0xDE, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x9B, 0xFE, - 0x03, 0x05, 0x20, 0x40, 0x4B, 0x23, 0x0E, 0x00, 0x0F, 0x60, 0xE0, 0x62, 0x80, 0x60, 0x00, 0x64, - 0xA2, 0xDB, 0xDD, 0x60, 0x83, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x21, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x2F, 0x58, 0xFF, 0xFF, 0x1F, 0x60, 0x86, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, - 0x07, 0x00, 0x90, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x00, 0x64, 0xA1, 0xDB, 0x04, 0x00, - 0x10, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x8C, 0xF3, 0x58, 0xFB, 0x84, 0xF1, 0xBA, 0xFE, - 0x01, 0xA8, 0x59, 0xF9, 0x04, 0x02, 0x02, 0x64, 0x8C, 0xFB, 0xFF, 0xFF, 0xC1, 0xFE, 0x64, 0x47, - 0xDC, 0xF3, 0x10, 0xB0, 0x04, 0xA8, 0x33, 0x02, 0x32, 0x02, 0x62, 0xF5, 0xEB, 0xF1, 0x2F, 0xF8, - 0xEC, 0xF1, 0x30, 0xF8, 0xED, 0xF1, 0x31, 0xF8, 0x81, 0xF1, 0x2C, 0xF8, 0x32, 0xF8, 0x82, 0xF1, - 0x2D, 0xF8, 0x33, 0xF8, 0x83, 0xF1, 0x2E, 0xF8, 0x34, 0xF8, 0x10, 0x60, 0x48, 0x64, 0x2A, 0xFA, - 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x22, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, - 0xE0, 0x62, 0x00, 0x60, 0x01, 0x64, 0xA2, 0xDB, 0xDD, 0x60, 0xEA, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x23, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x10, 0x67, 0x84, 0xFB, 0x8C, 0xF3, - 0xFF, 0xFF, 0x00, 0xA8, 0xFF, 0xFF, 0x0B, 0x03, 0x0F, 0x60, 0xE0, 0x62, 0x80, 0x60, 0x00, 0x64, - 0xA2, 0xDB, 0xDD, 0x60, 0xEF, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, - 0xDE, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x1B, 0x60, 0xC6, 0x65, 0x1F, 0x60, 0x80, 0x64, 0xA0, 0xD3, - 0x05, 0x7C, 0x08, 0xB0, 0xA5, 0xD3, 0x05, 0x02, 0x00, 0xB8, 0xFF, 0xFF, 0x02, 0x03, 0x15, 0x7C, - 0x0B, 0x00, 0xDC, 0xF3, 0x12, 0x60, 0x26, 0x63, 0x03, 0xA8, 0x7F, 0xF3, 0x05, 0x02, 0xE0, 0x85, - 0x47, 0xD3, 0xFF, 0xFF, 0x07, 0xBC, 0xA2, 0xDB, 0x53, 0xF9, 0x29, 0x60, 0xC6, 0x64, 0x54, 0xFB, - 0x24, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x4E, 0xEC, 0x60, 0x58, 0x4F, 0xB9, 0x78, 0xFF, 0xFF, - 0x0E, 0x4F, 0x0F, 0x60, 0xE0, 0x62, 0x10, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0x60, 0x34, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x25, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0xFF, 0xFF, - 0x59, 0xF3, 0x84, 0xFB, 0x60, 0x40, 0x10, 0x27, 0xDA, 0xFE, 0xDC, 0xF3, 0x00, 0xA8, 0x04, 0xA8, - 0x27, 0x02, 0x26, 0x02, 0x61, 0xF5, 0xEB, 0xF1, 0x2F, 0xF8, 0xEC, 0xF1, 0x30, 0xF8, 0xED, 0xF1, - 0x31, 0xF8, 0x81, 0xF1, 0x2C, 0xF8, 0x82, 0xF1, 0x2D, 0xF8, 0x83, 0xF1, 0x2E, 0xF8, 0xA4, 0x64, - 0x2A, 0xFA, 0x85, 0xF1, 0xC0, 0x67, 0xB0, 0x84, 0x2B, 0xFA, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, - 0x28, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xC1, 0xFE, 0x20, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x26, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x9E, 0xF5, 0xFF, 0xFF, 0x07, 0x1B, 0x20, 0x40, 0x80, 0x2B, 0x5C, 0x00, 0x7F, 0x60, 0xFF, 0x65, - 0x20, 0x44, 0x24, 0x80, 0x00, 0x64, 0x41, 0xFB, 0xF1, 0x60, 0x01, 0x64, 0x24, 0xFA, 0xDA, 0x85, - 0x19, 0x60, 0x86, 0x63, 0x89, 0xF1, 0x43, 0x4C, 0xD3, 0x80, 0xBE, 0xD1, 0x14, 0x05, 0x65, 0x40, - 0x80, 0x2A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x64, 0x43, 0x32, 0x61, 0x0F, 0x4E, 0x2F, 0x60, - 0x58, 0x4F, 0x01, 0x78, 0xFF, 0xFF, 0x0E, 0x4F, 0x2C, 0x43, 0x04, 0xA3, 0x41, 0xF3, 0xFF, 0xFF, - 0x32, 0xA4, 0x41, 0xFB, 0xE7, 0x01, 0x20, 0x47, 0x20, 0xB0, 0x20, 0xAF, 0x0F, 0x03, 0x40, 0x40, - 0x0F, 0x60, 0xE0, 0x62, 0x00, 0x60, 0x01, 0x64, 0xA2, 0xDB, 0xDE, 0x60, 0xA3, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x27, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x9E, 0xF1, 0x41, 0xF3, - 0xFF, 0xFF, 0x02, 0xA4, 0xE8, 0x84, 0x64, 0x46, 0x23, 0xFA, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, - 0x64, 0x64, 0xA2, 0xDB, 0x5A, 0xD9, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x00, 0x64, - 0x9E, 0xFB, 0xFA, 0xFE, 0xEB, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x0F, 0x60, 0xD0, 0x62, - 0xA2, 0xD1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x58, 0xF3, 0x8C, 0xFB, - 0xFF, 0xFF, 0xC1, 0xFE, 0x0F, 0x60, 0xDE, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xE0, 0x62, - 0x00, 0x60, 0x80, 0x64, 0xA2, 0xDB, 0xDD, 0x60, 0x71, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2E, 0x64, - 0x3B, 0x42, 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x2F, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x9E, 0xF1, - 0x00, 0x64, 0xB0, 0x86, 0x9E, 0xFB, 0x07, 0x03, 0x24, 0x60, 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, - 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0xEB, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x0F, 0x60, - 0xDE, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xE0, 0x62, 0x00, 0x60, 0x80, 0x64, 0xA2, 0xDB, - 0xDD, 0x60, 0x71, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x97, 0xF3, 0x26, 0x46, - 0x60, 0x43, 0x01, 0x2A, 0x22, 0x00, 0x0F, 0xF2, 0x2A, 0xF0, 0x60, 0x40, 0x10, 0x2A, 0x10, 0x00, - 0x64, 0x40, 0x04, 0x27, 0x1A, 0x00, 0xFD, 0xB3, 0x64, 0x40, 0x20, 0x27, 0x02, 0xBB, 0x0F, 0x60, - 0xF6, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x08, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x0C, 0x00, - 0xFB, 0xB3, 0x64, 0x40, 0x20, 0x27, 0x04, 0xBB, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, 0x00, 0x60, - 0x10, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x97, 0xFD, 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, - 0xDC, 0xF3, 0x3F, 0xF2, 0x04, 0xA8, 0x57, 0xFB, 0x02, 0x03, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0xF4, - 0x1E, 0x63, 0x08, 0x64, 0x40, 0x48, 0xBD, 0xD2, 0xFF, 0xFF, 0x60, 0x47, 0x05, 0x36, 0x0B, 0x00, - 0xFF, 0xB5, 0xC7, 0x83, 0x01, 0x2A, 0xF7, 0x01, 0x4F, 0xD2, 0x5B, 0xD2, 0x60, 0x40, 0x05, 0x37, - 0x08, 0x00, 0xDF, 0x83, 0xF5, 0x01, 0xFF, 0xB5, 0x65, 0x41, 0x47, 0x8A, 0x5B, 0xD2, 0xDF, 0x83, - 0x07, 0x00, 0x00, 0x7F, 0xDC, 0x85, 0x47, 0x8A, 0x60, 0x41, 0x5B, 0xD2, 0xDB, 0x83, 0x60, 0x47, - 0x01, 0xB0, 0xFE, 0xB5, 0x02, 0x03, 0x02, 0x64, 0x40, 0x48, 0x85, 0xF1, 0x65, 0x44, 0xE0, 0x84, - 0xE0, 0x84, 0xE0, 0x84, 0xFD, 0xA1, 0xE1, 0x81, 0xE1, 0x81, 0xE1, 0x85, 0xC4, 0x81, 0xD0, 0x84, - 0xD1, 0x80, 0x2A, 0x07, 0x29, 0x06, 0x9C, 0x84, 0xDC, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x85, - 0x96, 0xF3, 0xC7, 0x83, 0x01, 0x26, 0x60, 0x47, 0xAB, 0x83, 0xFC, 0xA3, 0x02, 0x00, 0x03, 0x04, - 0x00, 0xF4, 0x84, 0xA3, 0xFC, 0x01, 0x80, 0x65, 0x47, 0xD0, 0x28, 0x41, 0xA0, 0x80, 0xFE, 0xA1, - 0x16, 0x03, 0x09, 0x02, 0x10, 0x60, 0x14, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x10, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x1E, 0x00, 0x10, 0x60, 0x14, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x15, 0x00, 0x28, 0x41, 0xFE, 0xA1, 0xFF, 0xFF, 0x09, 0x03, - 0x10, 0x60, 0x14, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x08, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x08, 0x00, 0x10, 0x60, 0x14, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x20, 0x40, 0x20, 0x2A, 0x58, 0x00, 0x26, 0x46, 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x43, - 0xF4, 0xA3, 0x00, 0x60, 0x1D, 0x61, 0x00, 0x60, 0x80, 0x65, 0x60, 0xFE, 0x81, 0xA1, 0x7F, 0xA1, - 0x02, 0x06, 0x00, 0xF4, 0x03, 0x61, 0xDD, 0x81, 0xA1, 0xD2, 0xCF, 0x83, 0xD4, 0x80, 0x2D, 0x03, - 0x17, 0x03, 0xCF, 0x83, 0x61, 0x44, 0x80, 0xA0, 0x28, 0x03, 0x02, 0x02, 0x00, 0xF4, 0x03, 0x61, - 0xDD, 0x81, 0xA1, 0xD2, 0xCF, 0x83, 0x81, 0xA1, 0x20, 0x03, 0x05, 0x07, 0x7F, 0xA1, 0xCC, 0x84, - 0xDD, 0x81, 0xE4, 0x03, 0xF7, 0x01, 0x00, 0xF4, 0x00, 0xB8, 0x04, 0x61, 0xE4, 0x03, 0xF2, 0x01, - 0x01, 0x60, 0xFF, 0x63, 0x46, 0x48, 0x41, 0x4A, 0xDD, 0x81, 0xA1, 0xD0, 0xDF, 0x83, 0xA3, 0xD9, - 0x64, 0x44, 0xDD, 0x81, 0xA1, 0xD0, 0xDF, 0x83, 0xA3, 0xD9, 0xCC, 0x84, 0x81, 0xA1, 0x05, 0x03, - 0x7F, 0xA1, 0xF7, 0x04, 0x00, 0xF4, 0x03, 0x61, 0xF4, 0x01, 0x20, 0xFE, 0x00, 0xBB, 0x02, 0x60, - 0x00, 0x63, 0x08, 0x24, 0x11, 0x00, 0xBD, 0xD3, 0x06, 0x65, 0xD4, 0x80, 0xBD, 0xD3, 0x0C, 0x02, - 0x60, 0x40, 0x60, 0x3A, 0x09, 0x00, 0x1D, 0x3B, 0x07, 0x00, 0xBD, 0xD3, 0xFF, 0xFF, 0xFF, 0xB5, - 0x00, 0x7E, 0x5C, 0xFB, 0x65, 0x44, 0x5B, 0xFB, 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, - 0xF6, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, 0x02, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x63, 0x97, 0xFD, 0x1A, 0x60, 0x72, 0x63, 0x00, 0x64, - 0xA3, 0xDB, 0x06, 0xA3, 0x10, 0x60, 0x50, 0x64, 0xBD, 0xDB, 0xBD, 0xDB, 0x06, 0x64, 0xA3, 0xDB, - 0x10, 0x60, 0x4E, 0x62, 0xE0, 0x60, 0x07, 0x64, 0xA2, 0xDB, 0xD2, 0xF1, 0x1A, 0x60, 0x76, 0x62, - 0xA2, 0xD9, 0x1A, 0x60, 0x7E, 0x63, 0x00, 0x64, 0xA3, 0xDB, 0x06, 0xA3, 0x10, 0x60, 0x54, 0x64, - 0xBD, 0xDB, 0xBD, 0xDB, 0x06, 0x64, 0xA3, 0xDB, 0x10, 0x60, 0x52, 0x62, 0xE0, 0x60, 0x11, 0x64, - 0xA2, 0xDB, 0x28, 0x60, 0x04, 0x62, 0xA2, 0xD1, 0x1A, 0x60, 0x82, 0x62, 0xA2, 0xD9, 0x00, 0x60, - 0x3A, 0x61, 0xAE, 0x60, 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x64, 0xFB, 0xA9, 0xF3, - 0x07, 0xFA, 0xBC, 0xF3, 0x19, 0xFA, 0xF8, 0x60, 0x80, 0x64, 0x0E, 0xFA, 0x00, 0x64, 0x3E, 0xFA, - 0x3F, 0xFA, 0x00, 0x60, 0x3A, 0x61, 0xAE, 0x60, 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, 0x66, 0x44, - 0x65, 0xFB, 0xA9, 0xF3, 0x07, 0xFA, 0xBC, 0xF3, 0x19, 0xFA, 0x24, 0x60, 0x80, 0x64, 0x0E, 0xFA, - 0x00, 0x64, 0x3E, 0xFA, 0x3F, 0xFA, 0x10, 0x60, 0x14, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, - 0x10, 0x60, 0x28, 0x62, 0xE0, 0x60, 0x77, 0x64, 0xA2, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x63, - 0x97, 0xFD, 0xBA, 0xFE, 0xFE, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x84, 0xFD, 0x0F, 0x60, - 0xEA, 0x62, 0xA2, 0xD1, 0x04, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, - 0xF6, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x28, 0x60, 0x04, 0x62, - 0xA2, 0xD1, 0x1A, 0x60, 0x82, 0x62, 0xA2, 0xD9, 0x27, 0x60, 0xFE, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, - 0x0A, 0x1B, 0x00, 0x64, 0x84, 0xFB, 0xBA, 0xFE, 0x0F, 0x60, 0xF6, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0xBA, 0xFE, 0x97, 0xF3, 0x00, 0x63, 0x84, 0xFD, 0x10, 0xBC, - 0x97, 0xFB, 0xFE, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, - 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x00, 0x60, 0x64, 0x63, 0x1A, 0x60, - 0x42, 0x64, 0xA0, 0xDD, 0x0F, 0x60, 0xF6, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xF8, 0x62, - 0x01, 0x60, 0x04, 0x64, 0xA2, 0xDB, 0xE0, 0x60, 0xC9, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, 0x01, 0x60, 0x00, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xA3, 0x01, 0x31, 0x40, 0x04, 0x2A, 0xE3, 0x01, 0x20, 0x40, - 0x52, 0x23, 0x12, 0x00, 0x0F, 0x60, 0xF6, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x10, 0x60, 0x14, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xF8, 0x62, 0x81, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xE0, 0x60, - 0xC9, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0xDB, 0x01, 0x0F, 0x60, 0xF6, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x01, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x65, 0xF5, 0xBC, 0xF1, 0x19, 0xF8, 0x81, 0xF1, - 0x2C, 0xF8, 0x32, 0xF8, 0x82, 0xF1, 0x2D, 0xF8, 0x33, 0xF8, 0x83, 0xF1, 0x2E, 0xF8, 0x34, 0xF8, - 0xEB, 0xF1, 0x2F, 0xF8, 0xEC, 0xF1, 0x30, 0xF8, 0xED, 0xF1, 0x31, 0xF8, 0x11, 0x60, 0x48, 0x64, - 0x2A, 0xFA, 0x00, 0x64, 0x2B, 0xFA, 0x23, 0xFA, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x28, 0x64, - 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, - 0x0F, 0x60, 0xF8, 0x62, 0x00, 0x60, 0x01, 0x64, 0xA2, 0xDB, 0xE1, 0x60, 0x23, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x65, 0xF5, 0x23, 0xF2, 0xFF, 0xFF, 0x01, 0x18, 0x7B, 0x01, - 0x10, 0x67, 0x84, 0xFB, 0x03, 0x64, 0x98, 0xFB, 0xFE, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, - 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x0F, 0x60, 0xF6, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xF8, 0x62, 0x81, 0x60, 0x00, 0x64, - 0xA2, 0xDB, 0xE1, 0x60, 0x46, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x0D, 0x00, 0x0F, 0x60, 0xF6, 0x62, - 0xA2, 0xD1, 0x01, 0x60, 0x00, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, - 0xE0, 0x60, 0x77, 0x78, 0xFF, 0xFF, 0x46, 0x60, 0x00, 0x65, 0x20, 0x41, 0x8E, 0xF3, 0xA5, 0x80, - 0x01, 0xB0, 0x01, 0x02, 0x06, 0x00, 0x0F, 0x60, 0xF6, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x2F, 0x58, - 0xFF, 0xFF, 0x1A, 0x60, 0x42, 0x65, 0xA5, 0xD3, 0x01, 0x63, 0x8C, 0xFD, 0x27, 0x1B, 0x00, 0x60, - 0x64, 0x64, 0xA5, 0xDB, 0x65, 0xF5, 0xBC, 0xF1, 0x19, 0xF8, 0x81, 0xF1, 0x2C, 0xF8, 0x32, 0xF8, - 0x82, 0xF1, 0x2D, 0xF8, 0x33, 0xF8, 0x83, 0xF1, 0x2E, 0xF8, 0x34, 0xF8, 0xEB, 0xF1, 0x2F, 0xF8, - 0xEC, 0xF1, 0x30, 0xF8, 0xED, 0xF1, 0x31, 0xF8, 0x11, 0x60, 0x48, 0x64, 0x2A, 0xFA, 0x00, 0x64, - 0x2B, 0xFA, 0x23, 0xFA, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x06, 0x00, 0x97, 0xF3, 0x32, 0x40, - 0x02, 0x26, 0x02, 0x00, 0x40, 0x2A, 0xDA, 0xFE, 0xC1, 0xFE, 0x0F, 0x60, 0xF6, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x0F, 0x60, 0xF8, 0x62, 0x01, 0x60, 0x82, 0x64, 0xA2, 0xDB, 0xE1, 0x60, 0xA4, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, 0x01, 0x60, - 0x00, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xE0, 0x60, 0x77, 0x78, - 0xFF, 0xFF, 0x00, 0x60, 0x02, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x06, 0x03, 0xA0, 0x84, 0xA2, 0xDB, - 0xBA, 0xFE, 0xE3, 0x60, 0xC8, 0x78, 0xFF, 0xFF, 0x02, 0x64, 0x8C, 0xFB, 0x01, 0x60, 0x00, 0x65, - 0x20, 0x44, 0x34, 0x80, 0xBA, 0xFE, 0xC1, 0xFE, 0x0F, 0x60, 0xF6, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x10, 0x60, 0x14, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xF8, 0x62, 0x01, 0x60, 0x46, 0x64, - 0xA2, 0xDB, 0xE1, 0x60, 0xD7, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, - 0xF6, 0x62, 0xA2, 0xD1, 0x01, 0x60, 0x00, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0xE0, 0x60, 0x77, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x3C, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x10, 0x60, 0x14, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x08, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x34, 0x01, 0x00, 0x60, 0x02, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x0C, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x28, 0x60, 0x00, 0x62, 0xA2, 0xD1, - 0x97, 0xF3, 0x00, 0x61, 0xD1, 0x80, 0xF7, 0xB4, 0xF0, 0x03, 0x97, 0xFB, 0x35, 0x00, 0x00, 0x60, - 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0F, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x28, 0x60, 0x00, 0x62, - 0xA2, 0xD1, 0x97, 0xF3, 0x00, 0x61, 0xD1, 0x80, 0x08, 0xBC, 0x03, 0x02, 0xE2, 0x60, 0xE8, 0x78, - 0xFF, 0xFF, 0x97, 0xFB, 0x21, 0x00, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, - 0xA0, 0x84, 0xA2, 0xDB, 0xE2, 0x60, 0xE8, 0x78, 0xFF, 0xFF, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, - 0x00, 0x60, 0x40, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xC5, 0x01, - 0x00, 0x60, 0x02, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xE3, 0x60, - 0xC8, 0x78, 0xFF, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x02, 0x63, 0x97, 0xF3, 0x8C, 0xFD, 0x01, 0xBC, - 0xC1, 0xFE, 0x97, 0xFB, 0xD2, 0xF1, 0x1A, 0x60, 0x76, 0x62, 0xA2, 0xD9, 0x0F, 0x60, 0xF6, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x10, 0x60, 0x14, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xF8, 0x62, - 0x01, 0x60, 0x34, 0x64, 0xA2, 0xDB, 0xE2, 0x60, 0x62, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x24, 0x60, - 0xAA, 0x62, 0x1A, 0x60, 0x72, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, 0x01, 0x60, 0x00, 0x64, 0xA0, 0x80, - 0x9C, 0x84, 0x0E, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x72, 0x64, - 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0xE0, 0x60, 0x77, 0x78, 0xFF, 0xFF, - 0x00, 0x60, 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x17, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x97, 0xF3, - 0xFF, 0xFF, 0x60, 0x40, 0x04, 0x2A, 0x01, 0x00, 0xD2, 0x01, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, - 0x72, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x97, 0xF3, 0xFF, 0xFF, - 0x60, 0x40, 0x08, 0x2A, 0x4D, 0x00, 0x54, 0x00, 0x10, 0x60, 0x14, 0x62, 0xA2, 0xD1, 0x00, 0x60, - 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x08, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x97, 0xF3, 0xFF, 0xFF, - 0x08, 0xBC, 0x97, 0xFB, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x60, 0x02, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xAB, 0x01, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x0C, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x72, 0x64, 0xA2, 0xDB, - 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x2B, 0x00, 0x00, 0x60, 0x08, 0x64, 0xA0, 0x80, - 0x9C, 0x84, 0x0C, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x72, 0x64, - 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x13, 0x00, 0x0F, 0x60, 0xF6, 0x62, - 0xA2, 0xD1, 0x00, 0x60, 0x20, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x08, 0x03, 0xA0, 0x84, 0xA2, 0xDB, - 0x97, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x2A, 0x04, 0x00, 0x0A, 0x00, 0x2F, 0x58, 0xFF, 0xFF, - 0x00, 0x00, 0x97, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0x97, 0xFB, 0xE1, 0x60, 0x2A, 0x78, 0xFF, 0xFF, - 0x27, 0x60, 0xFE, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x01, 0xA8, 0xFF, 0xFF, 0x03, 0x02, 0xE3, 0x60, - 0xD1, 0x78, 0xFF, 0xFF, 0x97, 0xF3, 0x01, 0x63, 0x8C, 0xFD, 0x21, 0xBC, 0x97, 0xFB, 0x64, 0xF5, - 0x81, 0xF1, 0x2C, 0xF8, 0x82, 0xF1, 0x2D, 0xF8, 0x83, 0xF1, 0x2E, 0xF8, 0x85, 0xF1, 0xC0, 0x67, - 0xB0, 0x84, 0x2B, 0xFA, 0xBC, 0xF1, 0x19, 0xF8, 0xEB, 0xF1, 0x2F, 0xF8, 0xEC, 0xF1, 0x30, 0xF8, - 0xED, 0xF1, 0x31, 0xF8, 0x10, 0x60, 0xA4, 0x64, 0x2A, 0xFA, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, - 0x28, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xC1, 0xFE, 0x1A, 0x60, 0x76, 0x62, 0x00, 0x60, 0x50, 0x64, 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, - 0x1A, 0x60, 0x72, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x0F, 0x60, - 0xF6, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x10, 0x60, 0x14, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, - 0xF8, 0x62, 0x01, 0x60, 0x2C, 0x64, 0xA2, 0xDB, 0xE3, 0x60, 0x3A, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, 0x01, 0x60, 0x00, 0x64, 0xA0, 0x80, - 0x9C, 0x84, 0x0E, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x72, 0x64, - 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0xE0, 0x60, 0x77, 0x78, 0xFF, 0xFF, - 0x10, 0x60, 0x14, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, - 0xA0, 0x84, 0xA2, 0xDB, 0x8D, 0x01, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x08, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x08, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x97, 0xF3, 0xFF, 0xFF, 0x02, 0xB0, - 0xFF, 0xFF, 0x4E, 0x03, 0x7D, 0x01, 0x00, 0x60, 0x08, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, - 0xA0, 0x84, 0xA2, 0xDB, 0x45, 0x00, 0x00, 0x60, 0x02, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x16, 0x03, - 0xA0, 0x84, 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x72, 0x64, 0xA2, 0xDB, 0x03, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x28, 0x60, 0x00, 0x62, 0xA2, 0xD3, 0x97, 0xF3, 0x00, 0xA8, - 0xF7, 0xB4, 0x2E, 0x03, 0x97, 0xFB, 0xE2, 0x60, 0x3C, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x10, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x17, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, - 0x72, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x28, 0x60, 0x00, 0x62, - 0xA2, 0xD3, 0x97, 0xF3, 0x00, 0xA8, 0x08, 0xBC, 0x01, 0x02, 0x42, 0x01, 0x97, 0xFB, 0xE2, 0x60, - 0x3C, 0x78, 0xFF, 0xFF, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x20, 0x64, 0xA0, 0x80, - 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x02, 0x00, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x00, - 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x72, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0x97, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0x97, 0xFB, 0xE1, 0x60, 0x2A, 0x78, 0xFF, 0xFF, - 0x97, 0xF3, 0x01, 0x63, 0x8C, 0xFD, 0x01, 0xBC, 0x97, 0xFB, 0x00, 0x64, 0x84, 0xFB, 0xC1, 0xFE, - 0x29, 0x00, 0x97, 0xF3, 0x01, 0x63, 0x8C, 0xFD, 0x01, 0xBC, 0x97, 0xFB, 0x00, 0x64, 0x84, 0xFB, - 0x64, 0xF5, 0x81, 0xF1, 0x2C, 0xF8, 0x82, 0xF1, 0x2D, 0xF8, 0x83, 0xF1, 0x2E, 0xF8, 0x85, 0xF1, - 0xC0, 0x67, 0xB0, 0x84, 0x2B, 0xFA, 0xBC, 0xF1, 0x19, 0xF8, 0xEB, 0xF1, 0x2F, 0xF8, 0xEC, 0xF1, - 0x30, 0xF8, 0xED, 0xF1, 0x31, 0xF8, 0x00, 0x60, 0xA4, 0x64, 0x2A, 0xFA, 0x24, 0x60, 0x74, 0x62, - 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xC1, 0xFE, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x7E, 0x64, 0xA2, 0xDB, 0x02, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x0F, 0x60, 0xF6, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x10, 0x60, - 0x14, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x0F, 0x60, 0xF8, 0x62, 0x03, 0x60, 0x0E, 0x64, 0xA2, 0xDB, - 0xE4, 0x60, 0x16, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xF6, 0x62, - 0xA2, 0xD1, 0x01, 0x60, 0x00, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0E, 0x03, 0xA0, 0x84, 0xA2, 0xDB, - 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x7E, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0xE0, 0x60, 0x77, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x0A, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xC6, 0x01, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x15, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x10, 0x60, 0x14, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x8B, 0x01, 0x00, 0x60, 0x12, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xAC, 0x01, 0x0F, 0x60, 0xF6, 0x62, - 0xA2, 0xD1, 0x02, 0x60, 0x00, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0xAD, 0x03, 0xA0, 0x84, 0xA2, 0xDB, - 0x10, 0x67, 0x84, 0xFB, 0x0F, 0x60, 0xF6, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x10, 0x60, 0x14, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x65, 0xF5, 0xBC, 0xF1, 0x19, 0xF8, 0x81, 0xF1, 0x2C, 0xF8, 0x32, 0xF8, - 0x82, 0xF1, 0x2D, 0xF8, 0x33, 0xF8, 0x83, 0xF1, 0x2E, 0xF8, 0x34, 0xF8, 0xEB, 0xF1, 0x2F, 0xF8, - 0xEC, 0xF1, 0x30, 0xF8, 0xED, 0xF1, 0x31, 0xF8, 0x11, 0x60, 0x48, 0x64, 0x2A, 0xFA, 0x00, 0x64, - 0x2B, 0xFA, 0x23, 0xFA, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x97, 0xF3, 0xC1, 0xFE, 0xFE, 0xB4, - 0x97, 0xFB, 0x0F, 0x60, 0xF8, 0x62, 0x00, 0x60, 0x03, 0x64, 0xA2, 0xDB, 0xE4, 0x60, 0x94, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, 0x00, 0x60, - 0x02, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x29, 0x01, 0x65, 0xF5, - 0x23, 0xF2, 0x98, 0xF3, 0x04, 0x18, 0xCC, 0x84, 0x98, 0xFB, 0x01, 0x03, 0x21, 0x01, 0xE1, 0x60, - 0x2A, 0x78, 0xFF, 0xFF, 0x27, 0x60, 0xFE, 0x62, 0xA2, 0xD3, 0x84, 0xF1, 0x02, 0xA8, 0x2A, 0xF2, - 0x03, 0x02, 0xB0, 0x84, 0x2A, 0xFA, 0x08, 0x00, 0x0F, 0x60, 0xF6, 0x62, 0xA2, 0xD1, 0x00, 0x60, - 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x22, 0x64, - 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, - 0x24, 0x60, 0x34, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0xDB, 0x02, 0xBF, 0x60, - 0xE7, 0x78, 0xFF, 0xFF, 0x0F, 0x60, 0xFC, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x1A, 0x60, 0xAE, 0x63, 0x00, 0x64, 0xA3, 0xDB, - 0x06, 0xA3, 0x10, 0x60, 0x5C, 0x64, 0xBD, 0xDB, 0xBD, 0xDB, 0x06, 0x64, 0xA3, 0xDB, 0x10, 0x60, - 0x5A, 0x62, 0xE4, 0x60, 0xD2, 0x64, 0xA2, 0xDB, 0x1F, 0x60, 0x5C, 0x62, 0xA2, 0xD1, 0x1A, 0x60, - 0xB2, 0x62, 0xA2, 0xD9, 0x10, 0x60, 0x2A, 0x62, 0xE4, 0x60, 0xF9, 0x64, 0xA2, 0xDB, 0x2F, 0x58, - 0xFF, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x1F, 0x60, 0x80, 0x65, 0xA5, 0xD3, 0xFF, 0xFF, 0x02, 0xBC, - 0xF3, 0xB4, 0x01, 0xB0, 0xA5, 0xDB, 0x0C, 0x02, 0x12, 0x60, 0x26, 0x61, 0x00, 0x64, 0x1A, 0x63, - 0x59, 0xDB, 0xFE, 0x1F, 0x1F, 0x60, 0x5C, 0x61, 0x0A, 0x64, 0x1A, 0x63, 0x59, 0xDB, 0xFE, 0x1F, - 0x7F, 0xF3, 0x7E, 0xFB, 0x01, 0x64, 0x7F, 0xFB, 0x01, 0x61, 0xCC, 0x84, 0xFF, 0xFF, 0x02, 0x03, - 0xE1, 0x81, 0xFB, 0x01, 0xBA, 0xF3, 0x61, 0x45, 0xA4, 0x80, 0xFF, 0xFF, 0x69, 0x03, 0x0F, 0x60, - 0xFC, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, 0xFE, 0x62, 0x40, 0x60, - 0x00, 0x64, 0xA2, 0xDB, 0xE5, 0x60, 0x1F, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x7F, 0xF1, 0x24, 0x60, 0x9A, 0x62, 0xA2, 0xD9, 0x1E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, - 0x0F, 0x60, 0xFE, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xE5, 0x60, 0x43, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x40, 0x60, - 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, 0xFC, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x0F, 0x60, 0xFE, 0x62, 0x00, 0x60, 0x1A, 0x64, 0xA2, 0xDB, 0xE5, 0x60, 0x64, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0xAE, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xFC, 0x62, 0xA2, 0xD1, 0x00, 0x60, - 0x08, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0C, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, - 0x1A, 0x60, 0xAE, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x26, 0x00, - 0x00, 0x60, 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0B, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x24, 0x60, - 0xAA, 0x62, 0x1A, 0x60, 0xAE, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0x12, 0x60, 0x26, 0x65, 0x7F, 0xF3, 0xFF, 0xFF, 0x04, 0xA4, 0xF2, 0xA0, 0xFF, 0xFF, 0x01, 0x06, - 0xF1, 0xA4, 0x01, 0x36, 0x0B, 0x00, 0x00, 0x36, 0x04, 0xA4, 0x60, 0x41, 0xE0, 0x84, 0xC4, 0x84, - 0xA0, 0xD3, 0xFF, 0xFF, 0x00, 0xB8, 0x61, 0x44, 0xEF, 0x02, 0x75, 0x01, 0x1F, 0x60, 0x80, 0x65, - 0xA5, 0xD3, 0x7E, 0xF1, 0xFC, 0xB4, 0xA5, 0xDB, 0x7F, 0xF9, 0x0F, 0x60, 0xFC, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, 0xFE, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, - 0xE5, 0x60, 0xA5, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x7F, 0xF1, 0x24, 0x60, - 0x9A, 0x62, 0xA2, 0xD9, 0x1E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xFE, 0x62, - 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xE5, 0x60, 0xC9, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, 0xFC, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, 0x0F, 0x60, - 0xD0, 0x62, 0xA2, 0xD1, 0x10, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0xE6, 0x60, 0xE9, 0x78, 0xFF, 0xFF, 0xE6, 0x60, 0xED, 0x78, 0xFF, 0xFF, 0x1F, 0x60, - 0x80, 0x63, 0xA3, 0xD3, 0x26, 0x46, 0x02, 0xB0, 0x3F, 0xF2, 0xF6, 0x03, 0x02, 0x60, 0x00, 0x63, - 0x01, 0x60, 0x00, 0x65, 0xD4, 0x80, 0x00, 0xF4, 0x02, 0x24, 0x65, 0x44, 0x12, 0x65, 0x60, 0x41, - 0xA5, 0xD0, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x64, 0x44, 0x00, 0x7F, - 0xCD, 0x81, 0xBD, 0xDB, 0x05, 0x03, 0x64, 0x47, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, 0xF0, 0x02, - 0x02, 0x60, 0x14, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0x01, 0xB4, 0xFF, 0xFF, 0x37, 0x02, 0x29, 0x60, - 0xA4, 0x64, 0xA0, 0xD1, 0x1F, 0x60, 0x0E, 0x63, 0x31, 0x18, 0x64, 0x41, 0x44, 0x4B, 0x29, 0x60, - 0xA6, 0x65, 0xA5, 0xD1, 0xDA, 0x85, 0x64, 0x44, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, 0x05, 0x03, - 0x64, 0x47, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, 0xF4, 0x02, 0x02, 0x60, 0x1A, 0x61, 0xA1, 0xD3, - 0x2B, 0x45, 0x60, 0x40, 0x00, 0x36, 0x1A, 0x00, 0x01, 0x36, 0x18, 0x00, 0xD4, 0x80, 0x65, 0x43, - 0xB0, 0x02, 0x1F, 0x60, 0x0C, 0x64, 0xE3, 0x83, 0xFE, 0xA3, 0x59, 0xD1, 0x58, 0xD3, 0x40, 0x4B, - 0xD0, 0x80, 0x2B, 0x44, 0x02, 0x02, 0xF9, 0x1F, 0x09, 0x00, 0x02, 0x60, 0x1A, 0x61, 0x65, 0x43, - 0xE3, 0x83, 0xFE, 0xA3, 0x59, 0xD3, 0xFF, 0xFF, 0x9C, 0x1B, 0xFC, 0x1F, 0x26, 0x46, 0x3F, 0xF0, - 0x01, 0x60, 0x00, 0x64, 0xD0, 0x80, 0x64, 0x41, 0x01, 0x05, 0x60, 0x41, 0xF4, 0xA1, 0x02, 0x60, - 0x18, 0x63, 0xBD, 0xD3, 0xBD, 0xD1, 0xFD, 0xA0, 0xF9, 0xA0, 0x08, 0x03, 0x35, 0x03, 0xFE, 0xA1, - 0x64, 0x42, 0xE2, 0x85, 0xD1, 0x81, 0xC7, 0x83, 0x84, 0x06, 0xF3, 0x01, 0x12, 0x60, 0x26, 0x65, - 0xBD, 0xD3, 0xFD, 0xA1, 0xE0, 0x84, 0xC4, 0x85, 0x05, 0x64, 0xA5, 0xDB, 0x1F, 0x60, 0x80, 0x65, - 0xA5, 0xD3, 0x41, 0x48, 0x04, 0xBC, 0xA5, 0xDB, 0x12, 0x60, 0x28, 0x65, 0x12, 0x60, 0x44, 0x61, - 0x49, 0xD3, 0xD6, 0x80, 0x00, 0xB8, 0x0E, 0x03, 0xFB, 0x03, 0x62, 0x45, 0x12, 0x60, 0x26, 0x61, - 0x59, 0xD3, 0xD6, 0x80, 0x00, 0xB8, 0x06, 0x03, 0xFB, 0x03, 0x05, 0x64, 0xA2, 0xDB, 0xD6, 0x80, - 0x02, 0xA2, 0xFC, 0x02, 0x0F, 0x60, 0xFC, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x10, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x28, 0x41, 0xC5, 0x01, 0x63, 0x45, 0x04, 0x60, 0x00, 0x63, 0xD7, 0x83, - 0xEB, 0x83, 0xD3, 0x80, 0x65, 0x43, 0x01, 0x05, 0x54, 0x00, 0xFE, 0xA3, 0x43, 0x4B, 0xA3, 0xD3, - 0x63, 0x41, 0x60, 0x43, 0x1B, 0x60, 0xC6, 0x64, 0xA0, 0xDD, 0xE3, 0x83, 0xFE, 0xA3, 0x59, 0xD1, - 0x58, 0xD9, 0xFD, 0x1F, 0x00, 0x63, 0x58, 0xDD, 0x2B, 0x43, 0xBD, 0xD1, 0x1F, 0x60, 0x78, 0x64, - 0x64, 0x41, 0xBD, 0xD1, 0x58, 0xD9, 0xBD, 0xD1, 0xFC, 0xA1, 0x41, 0x4B, 0x58, 0xD9, 0xBD, 0xD1, - 0xA0, 0xD9, 0x12, 0x60, 0x26, 0x61, 0x12, 0x60, 0x42, 0x65, 0x00, 0x64, 0xD5, 0x80, 0x59, 0xDB, - 0xFD, 0x02, 0x12, 0x60, 0x24, 0x65, 0xBD, 0xD3, 0xA3, 0xD1, 0xE0, 0x84, 0xC4, 0x82, 0x12, 0x60, - 0x44, 0x65, 0x05, 0x64, 0x64, 0x41, 0x5A, 0xDB, 0xD6, 0x80, 0xCD, 0x81, 0x22, 0x03, 0xFB, 0x02, - 0x1F, 0x60, 0x5A, 0x61, 0x4B, 0xD1, 0x04, 0xA3, 0xBD, 0xD3, 0xFF, 0xFF, 0xF6, 0xA0, 0xC1, 0x82, - 0x05, 0x05, 0x64, 0x41, 0x5A, 0xDB, 0xCD, 0x81, 0xFF, 0xFF, 0xFC, 0x02, 0x2B, 0x41, 0xFD, 0xA1, - 0x41, 0x4B, 0xDF, 0x07, 0x0F, 0x60, 0xFC, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x08, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x1F, 0x60, 0x80, 0x65, 0xA5, 0xD3, 0xFF, 0xFF, 0x08, 0xBC, 0xA5, 0xDB, - 0xFF, 0xFF, 0x20, 0xFE, 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x20, 0xFE, 0x9A, 0xFF, 0x5C, 0x61, - 0x3F, 0xF2, 0xFF, 0xFF, 0x83, 0xA0, 0xFF, 0xFF, 0x04, 0x28, 0x39, 0x00, 0xF4, 0xA4, 0x60, 0x43, - 0x00, 0xF4, 0x1E, 0x62, 0x60, 0xFE, 0xA2, 0xD2, 0xFF, 0xFF, 0x60, 0x40, 0x85, 0x36, 0x10, 0x00, - 0xDE, 0x82, 0xA2, 0xD2, 0xFF, 0xFF, 0x20, 0xFE, 0xFF, 0xB4, 0x02, 0xA4, 0x53, 0x93, 0x51, 0x91, - 0x05, 0x0E, 0xFF, 0xA4, 0x42, 0x92, 0x63, 0x40, 0x61, 0x40, 0xEC, 0x1C, 0x98, 0xFF, 0xD9, 0x01, - 0x20, 0xFE, 0x05, 0x64, 0x00, 0x7C, 0x42, 0x92, 0x60, 0xFE, 0xDE, 0x82, 0xA2, 0xD2, 0xDE, 0x82, - 0xA2, 0xD0, 0xFF, 0xFF, 0x20, 0xFE, 0x64, 0x5F, 0x60, 0x43, 0x60, 0xFE, 0xDE, 0x82, 0xA2, 0xD2, - 0xDE, 0x82, 0xA2, 0xD0, 0xFF, 0xFF, 0x20, 0xFE, 0x64, 0x5F, 0x98, 0xFF, 0x01, 0xA3, 0x01, 0xA4, - 0x2D, 0x60, 0x5A, 0x62, 0xA2, 0xDD, 0x2D, 0x60, 0x5E, 0x62, 0xA2, 0xDB, 0xBA, 0x01, 0x98, 0xFF, - 0xB8, 0x01, 0x00, 0x60, 0xA0, 0x61, 0xAE, 0x60, 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, 0x66, 0x44, - 0x5D, 0xFB, 0x04, 0x64, 0x03, 0xFA, 0x80, 0x64, 0x2A, 0xFA, 0xCC, 0xF1, 0x19, 0xF8, 0x00, 0x64, - 0x3E, 0xFA, 0x00, 0x60, 0x80, 0x64, 0x0E, 0xFA, 0xA9, 0xF1, 0x07, 0xF8, 0x67, 0x44, 0x2C, 0xFA, - 0x2D, 0xFA, 0x2E, 0xFA, 0x10, 0x60, 0x1C, 0x62, 0xE8, 0x60, 0xDF, 0x64, 0xA2, 0xDB, 0x2F, 0x58, - 0xFF, 0xFF, 0x5D, 0xF5, 0xEB, 0xF1, 0x2F, 0xF8, 0xEC, 0xF1, 0x30, 0xF8, 0xED, 0xF1, 0x31, 0xF8, - 0x81, 0xF1, 0x32, 0xF8, 0x82, 0xF1, 0x33, 0xF8, 0x83, 0xF1, 0x34, 0xF8, 0x28, 0x60, 0x2C, 0x62, - 0xA2, 0xD1, 0x02, 0x64, 0x64, 0x40, 0xFE, 0x26, 0x10, 0xBC, 0x32, 0x40, 0x08, 0x26, 0x10, 0xBC, - 0x2F, 0x60, 0x44, 0x62, 0xA2, 0xDB, 0x28, 0x60, 0x2A, 0x62, 0xA2, 0xD1, 0x2D, 0x60, 0x7A, 0x64, - 0x02, 0x18, 0x27, 0x60, 0xDA, 0x64, 0x2E, 0x60, 0xAE, 0x62, 0xA2, 0xDB, 0x2E, 0x60, 0xCA, 0x62, - 0xA2, 0xDB, 0x2D, 0x60, 0xA6, 0x61, 0x28, 0x60, 0xCC, 0x62, 0xA2, 0xD3, 0x2E, 0x60, 0x96, 0x65, - 0xFE, 0xA4, 0xE0, 0x84, 0x02, 0x05, 0x67, 0x44, 0x99, 0x00, 0xE0, 0x84, 0xC4, 0x85, 0x2D, 0x60, - 0xCC, 0x62, 0xA2, 0xD3, 0xA5, 0xD1, 0xDA, 0x85, 0x2D, 0x60, 0xC4, 0x62, 0xA0, 0x83, 0xA2, 0xDD, - 0xA5, 0xD1, 0x2D, 0x60, 0xC2, 0x62, 0xA0, 0x83, 0xA2, 0xDD, 0x2D, 0x60, 0xA0, 0x61, 0xDD, 0x60, - 0x06, 0x64, 0xA1, 0xDB, 0x06, 0xA1, 0x2D, 0x60, 0xCA, 0x62, 0xA2, 0xD3, 0x2D, 0x60, 0xC2, 0x62, - 0x60, 0x40, 0xFD, 0xA0, 0xA2, 0xD3, 0x74, 0x03, 0x50, 0x60, 0x00, 0x7C, 0x60, 0x40, 0x02, 0x2A, - 0x03, 0x00, 0x01, 0x60, 0xF2, 0x63, 0x0E, 0x00, 0x04, 0x2A, 0x03, 0x00, 0x02, 0x60, 0xF2, 0x63, - 0x09, 0x00, 0x10, 0x2A, 0x03, 0x00, 0x04, 0x60, 0xF2, 0x63, 0x04, 0x00, 0x20, 0x2A, 0x04, 0x00, - 0x05, 0x60, 0xF2, 0x63, 0x59, 0xD9, 0x59, 0xDD, 0x2D, 0x60, 0xCA, 0x62, 0xA2, 0xD3, 0x2D, 0x60, - 0xC4, 0x62, 0xFE, 0xA0, 0xA2, 0xD3, 0x54, 0x03, 0x00, 0x60, 0x00, 0x63, 0x59, 0xDD, 0x61, 0x45, - 0x60, 0x40, 0x01, 0x2A, 0x04, 0x00, 0x00, 0x60, 0xF2, 0x63, 0x59, 0xD9, 0x59, 0xDD, 0x60, 0x40, - 0x02, 0x2A, 0x04, 0x00, 0x01, 0x60, 0xF2, 0x63, 0x59, 0xD9, 0x59, 0xDD, 0x60, 0x40, 0x04, 0x2A, - 0x04, 0x00, 0x02, 0x60, 0xF2, 0x63, 0x59, 0xD9, 0x59, 0xDD, 0x60, 0x40, 0x10, 0x2A, 0x04, 0x00, - 0x04, 0x60, 0xF2, 0x63, 0x59, 0xD9, 0x59, 0xDD, 0x60, 0x40, 0x20, 0x2A, 0x04, 0x00, 0x05, 0x60, - 0xF2, 0x63, 0x59, 0xD9, 0x59, 0xDD, 0xD5, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0xA5, 0xDD, 0x2D, 0x60, - 0xCA, 0x62, 0xA2, 0xD3, 0x2D, 0x60, 0xC6, 0x62, 0xFF, 0xA0, 0xA2, 0xD3, 0x21, 0x03, 0x00, 0x60, - 0x00, 0x63, 0x59, 0xDD, 0x61, 0x45, 0x60, 0x40, 0x01, 0x2A, 0x04, 0x00, 0x00, 0x60, 0xF2, 0x63, - 0x59, 0xD9, 0x59, 0xDD, 0x60, 0x40, 0x02, 0x2A, 0x04, 0x00, 0x01, 0x60, 0xF2, 0x63, 0x59, 0xD9, - 0x59, 0xDD, 0x60, 0x40, 0x04, 0x2A, 0x04, 0x00, 0x02, 0x60, 0xF2, 0x63, 0x59, 0xD9, 0x59, 0xDD, - 0xD5, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0xA5, 0xDD, 0x2D, 0x60, 0xC8, 0x62, 0xA2, 0xD1, 0x59, 0xD9, - 0x2D, 0x60, 0xA0, 0x65, 0xD5, 0x84, 0xDD, 0x7F, 0xA5, 0xDB, 0x65, 0x44, 0x2E, 0x60, 0xB8, 0x62, - 0xA2, 0xDB, 0x2E, 0x60, 0xD4, 0x62, 0xA2, 0xDB, 0x0F, 0x60, 0xD4, 0x62, 0x00, 0x60, 0x04, 0x64, - 0xA2, 0xDB, 0xE8, 0x60, 0x2F, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, - 0xD2, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x7F, 0xF1, 0x2F, 0x60, 0x0E, 0x62, 0xA2, 0xD9, 0x2E, 0x60, - 0xB6, 0x65, 0xE9, 0x60, 0x58, 0x4D, 0x32, 0x78, 0xFF, 0xFF, 0x5D, 0xF5, 0x00, 0xF4, 0x80, 0xF1, - 0x06, 0xF8, 0x2F, 0x60, 0x44, 0x62, 0xA2, 0xD3, 0x07, 0xFA, 0x2E, 0x60, 0xAE, 0x64, 0x40, 0x48, - 0x10, 0x61, 0x00, 0x60, 0x00, 0x64, 0xE8, 0x60, 0x58, 0x4D, 0xE8, 0x78, 0xFF, 0xFF, 0x5D, 0xF5, - 0x3F, 0xFC, 0xDB, 0xFE, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, 0x66, 0x44, - 0x5A, 0xDB, 0x04, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0xDC, 0xF3, 0x9B, 0xFE, 0xFD, 0xA0, 0x25, 0x04, 0x24, 0x02, 0x04, 0x64, 0x03, 0xFA, 0x00, 0xF4, - 0x09, 0xF2, 0xFF, 0xFF, 0x60, 0x47, 0x00, 0x3A, 0x1C, 0x00, 0x60, 0x43, 0x00, 0x36, 0x1C, 0x00, - 0xE0, 0xA0, 0xDA, 0x85, 0x16, 0x07, 0x2D, 0x60, 0x7A, 0x61, 0xA1, 0xD1, 0xFF, 0xFF, 0xD3, 0x80, - 0xCB, 0x83, 0x0F, 0x02, 0x07, 0x0E, 0x59, 0xD3, 0xA5, 0xD0, 0xDA, 0x85, 0xD0, 0x80, 0xFF, 0xFF, - 0x08, 0x02, 0xF9, 0x1F, 0x13, 0x1E, 0xA5, 0xD0, 0x59, 0xD3, 0xFF, 0xFF, 0x90, 0x80, 0xFF, 0x22, - 0x0D, 0x00, 0xE8, 0x60, 0xDD, 0x78, 0xFF, 0xFF, 0x28, 0x60, 0x2A, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, - 0x60, 0x40, 0x01, 0x2A, 0x03, 0x00, 0x27, 0x60, 0xDA, 0x64, 0x02, 0x00, 0x2D, 0x60, 0x7A, 0x64, - 0x2E, 0x60, 0xCA, 0x62, 0xA2, 0xDB, 0x26, 0x46, 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, - 0x31, 0xF2, 0x2E, 0xFA, 0xEB, 0xF1, 0x2F, 0xF8, 0xEC, 0xF1, 0x30, 0xF8, 0xED, 0xF1, 0x31, 0xF8, - 0x81, 0xF1, 0x32, 0xF8, 0x82, 0xF1, 0x33, 0xF8, 0x83, 0xF1, 0x34, 0xF8, 0x50, 0x63, 0x2A, 0xFC, - 0xCC, 0xF3, 0x19, 0xFA, 0x00, 0x64, 0x3E, 0xFA, 0xA9, 0xF3, 0x07, 0xFA, 0x00, 0xF4, 0x80, 0xF1, - 0x06, 0xF8, 0x2F, 0x60, 0x44, 0x62, 0xA2, 0xD3, 0x07, 0xFA, 0x2E, 0x60, 0xD2, 0x65, 0xE9, 0x60, - 0x58, 0x4D, 0x32, 0x78, 0xFF, 0xFF, 0x2E, 0x60, 0xCA, 0x64, 0x40, 0x48, 0x10, 0x61, 0x00, 0x60, - 0x00, 0x64, 0xE8, 0x60, 0x58, 0x4D, 0xE8, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x3F, 0xFC, 0x24, 0x60, - 0x74, 0x62, 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, - 0xD2, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, 0x00, 0x64, 0x94, 0xFB, 0x2F, 0x58, 0xFF, 0xFF, - 0x2F, 0x60, 0x46, 0x62, 0xA2, 0xDB, 0xCD, 0x81, 0x28, 0xD3, 0x5A, 0x88, 0xDC, 0x83, 0x39, 0x18, - 0xFB, 0x03, 0x61, 0x40, 0x7F, 0x3A, 0x07, 0x00, 0x2F, 0x60, 0x46, 0x62, 0xA2, 0xD3, 0x03, 0x61, - 0x7C, 0xA4, 0xA2, 0xDB, 0x00, 0xF4, 0x60, 0xFE, 0xA3, 0xD1, 0xDD, 0x81, 0xA1, 0xD8, 0x61, 0x40, - 0x7F, 0x3A, 0x09, 0x00, 0x20, 0xFE, 0x2F, 0x60, 0x46, 0x62, 0xA2, 0xD3, 0x03, 0x61, 0x7C, 0xA4, - 0xA2, 0xDB, 0x00, 0xF4, 0x60, 0xFE, 0xCF, 0x83, 0xA3, 0xD3, 0xDD, 0x81, 0xA1, 0xDA, 0xFF, 0xB4, - 0x00, 0x7F, 0x15, 0x03, 0xDB, 0x83, 0x61, 0x40, 0x7F, 0x3A, 0x0B, 0x00, 0x20, 0xFE, 0x60, 0x45, - 0x2F, 0x60, 0x46, 0x62, 0xA2, 0xD3, 0x03, 0x61, 0x7C, 0xA4, 0xA2, 0xDB, 0x65, 0x44, 0x00, 0xF4, - 0x60, 0xFE, 0xA3, 0xD1, 0xDF, 0x83, 0xDD, 0x81, 0xCC, 0x84, 0xA1, 0xD8, 0xEC, 0x02, 0x20, 0xFE, - 0xC3, 0x01, 0x2F, 0x60, 0x46, 0x62, 0xA2, 0xD1, 0xFD, 0xA1, 0xFF, 0xB1, 0xC1, 0x83, 0xA2, 0xDD, - 0x2D, 0x58, 0xFF, 0xFF, 0x67, 0x5C, 0x1B, 0x60, 0xC6, 0x61, 0xA1, 0xD3, 0xA5, 0xD9, 0x12, 0x18, - 0x60, 0x43, 0x2F, 0x60, 0x14, 0x64, 0xA5, 0xDB, 0x60, 0xFE, 0xA0, 0xDD, 0xFF, 0xFF, 0x20, 0xFE, - 0xDC, 0x84, 0xCF, 0x83, 0xE3, 0x83, 0x59, 0xD1, 0xDC, 0x84, 0x60, 0xFE, 0xA0, 0xD9, 0xFF, 0xFF, - 0x20, 0xFE, 0xF9, 0x1F, 0x2D, 0x58, 0xFF, 0xFF, 0x0E, 0x57, 0x32, 0x40, 0x40, 0x26, 0x29, 0x00, - 0x45, 0x48, 0x00, 0x60, 0x10, 0x61, 0xAE, 0x60, 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, 0x21, 0x03, - 0xF2, 0x60, 0x02, 0x64, 0x24, 0xFA, 0x00, 0x60, 0x48, 0x61, 0x28, 0x44, 0x59, 0xDA, 0x03, 0x64, - 0x38, 0x43, 0xBD, 0xD1, 0xCC, 0x84, 0x59, 0xD8, 0xFC, 0x02, 0x39, 0x44, 0x59, 0xDA, 0x28, 0x60, - 0x2E, 0x64, 0xA0, 0xD3, 0x59, 0xDA, 0x07, 0x64, 0x23, 0xFA, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, - 0x64, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xFA, 0xFE, 0x37, 0x58, 0xFF, 0xFF, 0x0E, 0x57, 0x32, 0x40, 0x40, 0x26, 0x1C, 0x00, 0x45, 0x48, - 0x00, 0x60, 0x06, 0x61, 0xAE, 0x60, 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, 0x14, 0x03, 0x02, 0x64, - 0x23, 0xFA, 0xF2, 0x60, 0x00, 0x64, 0x5A, 0xDA, 0x28, 0x44, 0x5A, 0xDA, 0xFF, 0xFF, 0x24, 0x60, - 0x74, 0x62, 0x24, 0x60, 0x64, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0x37, 0x58, 0xFF, 0xFF, 0xA2, 0xFF, 0x32, 0x40, 0x40, 0x26, - 0x3E, 0x00, 0x9D, 0xF3, 0x67, 0x43, 0xDC, 0x84, 0xCC, 0x84, 0x39, 0x03, 0x60, 0x46, 0x0A, 0x02, - 0x9D, 0xFD, 0x00, 0x60, 0x46, 0x61, 0xAE, 0x60, 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, 0x66, 0x44, - 0x9D, 0xFB, 0x2E, 0x03, 0x46, 0x4B, 0x27, 0x60, 0x72, 0x61, 0x18, 0x64, 0x23, 0xFA, 0xF1, 0x60, - 0x00, 0x64, 0x24, 0xFA, 0x4A, 0x65, 0xA2, 0xFF, 0x2C, 0x63, 0x00, 0x64, 0x59, 0xD1, 0xA2, 0xDB, - 0xA5, 0xD8, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF7, 0x1F, 0x12, 0x63, - 0x59, 0xD1, 0xA5, 0xD8, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF8, 0x1F, - 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x64, 0x64, 0xA2, 0xDB, 0x2B, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0xA6, 0xFE, 0x00, 0x64, 0x9D, 0xFB, 0xA3, 0xFF, - 0xBF, 0x60, 0xE7, 0x78, 0xFF, 0xFF, 0xA6, 0xFE, 0xB8, 0x05, 0xA7, 0xFE, 0x12, 0x05, 0xA5, 0xFE, - 0x03, 0x04, 0xEA, 0x60, 0xC5, 0x78, 0xFF, 0xFF, 0xA4, 0xFE, 0xF2, 0x04, 0x0F, 0x60, 0xDE, 0x62, - 0xA2, 0xD1, 0x00, 0x60, 0x80, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xBF, 0x60, 0xE7, 0x78, - 0xFF, 0xFF, 0x36, 0x45, 0x20, 0x60, 0x08, 0x64, 0x44, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xF3, - 0xFF, 0xFF, 0x01, 0xB0, 0x00, 0x64, 0x41, 0x03, 0x9F, 0xFB, 0x31, 0x44, 0xE8, 0xB4, 0x40, 0x51, - 0x6A, 0x44, 0xFF, 0xFF, 0x80, 0x26, 0xFC, 0x01, 0x61, 0xFF, 0x62, 0xFF, 0x10, 0x60, 0x1A, 0x62, - 0xA2, 0xD1, 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x34, 0x60, 0x58, 0x4E, - 0x64, 0x78, 0xFF, 0xFF, 0x1E, 0x60, 0xBC, 0x62, 0x1E, 0x60, 0xBE, 0x64, 0xA2, 0xDB, 0x00, 0x64, - 0x4A, 0xDB, 0x01, 0x60, 0xFE, 0x63, 0x1C, 0x60, 0xB8, 0x61, 0x00, 0x64, 0x59, 0xDB, 0xFE, 0x1F, - 0x1C, 0x63, 0x10, 0x60, 0x5C, 0x64, 0x58, 0xD1, 0xFF, 0xFF, 0x08, 0x1B, 0xFC, 0x1F, 0x00, 0x60, - 0x62, 0x63, 0x1B, 0x60, 0xC4, 0x64, 0x00, 0x7C, 0x58, 0xD9, 0xFE, 0x1F, 0x1C, 0x60, 0xB4, 0x63, - 0xA3, 0xD3, 0xFF, 0xFF, 0x04, 0xB0, 0xFF, 0xFF, 0x05, 0x03, 0x02, 0x65, 0xE9, 0x60, 0x58, 0x4E, - 0x7B, 0x78, 0xFF, 0xFF, 0xBF, 0x60, 0xE7, 0x78, 0xFF, 0xFF, 0xEA, 0x60, 0xC5, 0x78, 0xFF, 0xFF, - 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x01, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x74, 0x00, 0x28, 0x60, 0x50, 0x63, 0xBD, 0xD3, 0xBD, 0xD1, 0xBD, 0xD1, 0xB0, 0x84, 0xB0, 0x84, - 0xFF, 0xFF, 0x07, 0x02, 0x8C, 0xFB, 0x31, 0x44, 0xFE, 0xB4, 0x40, 0x51, 0x0D, 0x64, 0x05, 0xFB, - 0x64, 0x00, 0x28, 0xF3, 0x9F, 0xF1, 0x60, 0x47, 0x64, 0x41, 0x07, 0xB1, 0x07, 0xB4, 0x08, 0x24, - 0x67, 0x4C, 0x50, 0xFB, 0x01, 0x61, 0x03, 0x03, 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x02, 0xA1, 0x80, - 0xB1, 0x83, 0x53, 0x02, 0x9F, 0xFD, 0x28, 0x60, 0x44, 0x62, 0xA2, 0xD3, 0xE5, 0xFB, 0x7F, 0xFB, - 0x24, 0x60, 0x5E, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x46, 0x5E, 0x31, 0x44, - 0x01, 0xBC, 0x40, 0x51, 0xD8, 0xF3, 0x01, 0x63, 0x03, 0xA8, 0x4E, 0xFD, 0x05, 0x02, 0x02, 0x63, - 0x14, 0x60, 0x00, 0x64, 0xDB, 0xFB, 0x0C, 0x00, 0x02, 0xA8, 0x01, 0x63, 0x03, 0x03, 0x0A, 0x60, - 0x00, 0x64, 0x03, 0x00, 0x02, 0x63, 0x14, 0x60, 0x00, 0x64, 0xDB, 0xFB, 0x00, 0x64, 0x4E, 0xFB, - 0x4B, 0xFD, 0xA9, 0xF5, 0xFF, 0xFF, 0x0E, 0xF0, 0x0F, 0x60, 0xA2, 0x65, 0x28, 0x60, 0xD2, 0x62, - 0xA2, 0xD3, 0xFF, 0xFF, 0xFE, 0xA0, 0x03, 0xA8, 0x11, 0x06, 0x79, 0xF1, 0x06, 0x02, 0x64, 0x44, - 0x08, 0x2A, 0x09, 0x00, 0x06, 0x64, 0x44, 0xD3, 0x0D, 0x00, 0x64, 0x44, 0x20, 0x2A, 0x03, 0x00, - 0x0A, 0x64, 0x44, 0xD3, 0x07, 0x00, 0x01, 0x64, 0x44, 0xD3, 0x04, 0x00, 0xE8, 0x84, 0xE0, 0x84, - 0x44, 0xD3, 0x00, 0x00, 0x0E, 0xFA, 0xED, 0xE2, 0x0F, 0x4E, 0xC8, 0x60, 0x58, 0x4F, 0x15, 0x78, - 0xFF, 0xFF, 0x0E, 0x4F, 0xBF, 0x60, 0xE7, 0x78, 0xFF, 0xFF, 0xD7, 0xFE, 0xBF, 0x60, 0xE7, 0x78, - 0xFF, 0xFF, 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0xF3, 0x01, 0x24, 0x60, 0x46, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, - 0x0E, 0xF2, 0x4D, 0x03, 0x60, 0x40, 0xF0, 0x37, 0x3A, 0x00, 0xFF, 0x37, 0x2F, 0x00, 0xFD, 0x37, - 0x27, 0x00, 0xF8, 0x37, 0x0A, 0x00, 0x60, 0x47, 0xFF, 0xB5, 0x0F, 0x60, 0xD2, 0x62, 0x46, 0xD1, - 0x00, 0x60, 0x01, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x24, 0x60, 0x74, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xDA, 0x01, - 0x06, 0xB4, 0xFD, 0x7F, 0x0E, 0xFA, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x4C, 0x64, 0xA2, 0xDB, - 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF9, 0xFE, 0xCA, 0x01, - 0x23, 0xF0, 0x60, 0x40, 0x04, 0x26, 0xEC, 0x1B, 0x02, 0x26, 0xEA, 0x18, 0xA2, 0xFF, 0x02, 0xF0, - 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, 0xB0, 0xF3, 0x02, 0x02, 0xCC, 0x84, 0xB0, 0xFB, 0x24, 0x60, - 0x74, 0x64, 0x40, 0x4B, 0x2C, 0x60, 0x58, 0x4D, 0xD8, 0x78, 0xFF, 0xFF, 0xB3, 0x01, 0xAC, 0xFE, - 0x09, 0x05, 0xAD, 0xFE, 0x10, 0x05, 0xAE, 0xFE, 0xAD, 0x05, 0xAF, 0xFE, 0x3A, 0x05, 0xBF, 0x60, - 0xE7, 0x78, 0xFF, 0xFF, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x20, 0x60, 0x00, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0xF4, 0x01, 0x10, 0x60, 0x32, 0x65, 0x0B, 0x61, 0x07, 0x00, 0xA2, 0xDD, - 0x58, 0x4F, 0x64, 0x58, 0xFF, 0xFF, 0x00, 0xB9, 0xFF, 0xFF, 0x08, 0x03, 0x00, 0x63, 0xA5, 0xD1, - 0x5A, 0xD3, 0xDA, 0x85, 0x00, 0xA8, 0xCD, 0x81, 0xF2, 0x02, 0xF8, 0x02, 0xE0, 0x01, 0x0F, 0x60, - 0xCE, 0x62, 0x10, 0x60, 0x12, 0x65, 0xEB, 0x60, 0x5F, 0x63, 0x00, 0x64, 0x5A, 0xDB, 0xD6, 0x80, - 0xFF, 0xFF, 0x04, 0x03, 0x5A, 0xDB, 0x5A, 0xDB, 0x5A, 0xDD, 0xF9, 0x01, 0x10, 0x60, 0x30, 0x65, - 0x00, 0x64, 0x5A, 0xDB, 0xD6, 0x80, 0xFF, 0xFF, 0x02, 0x03, 0x5A, 0xDD, 0xFB, 0x01, 0x2F, 0x58, - 0xFF, 0xFF, 0x0F, 0x60, 0xD2, 0x64, 0x40, 0x41, 0x0F, 0x60, 0xD0, 0x63, 0xA3, 0xD1, 0x00, 0x64, - 0xD0, 0x80, 0x0B, 0x61, 0x08, 0x03, 0xBD, 0xDB, 0xA3, 0xD3, 0xFF, 0xFF, 0xB0, 0x84, 0xCD, 0x81, - 0xA3, 0xDB, 0x06, 0xA3, 0xF9, 0x02, 0x10, 0x60, 0x1A, 0x63, 0xA3, 0xD1, 0x00, 0x64, 0xD0, 0x80, - 0x0C, 0x61, 0x19, 0x03, 0xBD, 0xDB, 0x64, 0x44, 0xFE, 0xA3, 0x02, 0xA3, 0xCD, 0x81, 0xE8, 0x84, - 0xE3, 0x03, 0x02, 0x05, 0xE1, 0x03, 0xF9, 0x01, 0x99, 0xFB, 0x9B, 0xFD, 0x61, 0x5C, 0xA3, 0xD3, - 0x9A, 0xF9, 0x03, 0x18, 0x58, 0x4F, 0x60, 0x58, 0xFF, 0xFF, 0x9B, 0xF3, 0x9A, 0xF1, 0x60, 0x43, - 0x99, 0xF3, 0x64, 0x41, 0xEA, 0x01, 0x21, 0x43, 0x10, 0x60, 0x14, 0x65, 0xD7, 0x80, 0xBD, 0xD1, - 0xBD, 0xD3, 0x03, 0x02, 0xBF, 0x60, 0xE7, 0x78, 0xFF, 0xFF, 0xA0, 0x84, 0xBD, 0xD1, 0x43, 0x41, - 0xF5, 0x03, 0xEB, 0x60, 0x64, 0x64, 0x64, 0x58, 0x40, 0x4F, 0x2A, 0xF0, 0x83, 0x60, 0xFF, 0x65, - 0x64, 0x47, 0x03, 0x2B, 0x01, 0x00, 0x14, 0x00, 0x03, 0x26, 0x03, 0xAC, 0x60, 0x47, 0xA4, 0x84, - 0x2A, 0xFA, 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, 0x31, 0xF2, 0x2E, 0xFA, 0x64, 0x41, - 0xEB, 0xF3, 0x2F, 0xFA, 0x60, 0x43, 0xEC, 0xF3, 0x30, 0xFA, 0xED, 0xF1, 0x31, 0xF8, 0x19, 0x00, - 0x60, 0x47, 0xA4, 0x84, 0x2A, 0xFA, 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, 0x31, 0xF2, - 0x2E, 0xFA, 0x36, 0xF2, 0x32, 0xFA, 0x37, 0xF2, 0x33, 0xFA, 0x38, 0xF2, 0x34, 0xFA, 0xEB, 0xF3, - 0x2F, 0xFA, 0x36, 0xFA, 0xEC, 0xF3, 0x30, 0xFA, 0x37, 0xFA, 0xED, 0xF3, 0x31, 0xFA, 0x38, 0xFA, - 0x64, 0x41, 0x1C, 0xF2, 0x13, 0xFA, 0x00, 0xF4, 0x0D, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x2B, - 0x18, 0x00, 0x81, 0x67, 0xA2, 0xDA, 0xEC, 0x60, 0x58, 0x4E, 0x5A, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0x3F, 0xFC, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, 0x26, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, - 0xFF, 0xFF, 0x26, 0x46, 0x3F, 0xF0, 0x42, 0x64, 0xD0, 0x80, 0xFF, 0xFF, 0x01, 0x04, 0x3F, 0xFA, - 0x07, 0xF2, 0xA9, 0xF1, 0x01, 0x1B, 0x07, 0xF8, 0x1C, 0xF2, 0x13, 0xFA, 0x26, 0xF2, 0x27, 0xF0, - 0x60, 0x47, 0x00, 0xF4, 0x1F, 0xFA, 0x64, 0x47, 0x20, 0xFA, 0x61, 0x44, 0x21, 0xFA, 0x01, 0x67, - 0x0D, 0xFA, 0x10, 0x61, 0x28, 0x60, 0x06, 0x64, 0x1E, 0x63, 0x58, 0xD1, 0xCD, 0x81, 0xBD, 0xD8, - 0xFC, 0x02, 0xBB, 0xF1, 0xD8, 0xF1, 0x64, 0x5E, 0x64, 0x5F, 0x44, 0x63, 0xBD, 0xDA, 0x28, 0x60, - 0x00, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0x4A, 0xD3, 0x60, 0x45, - 0x60, 0x40, 0x01, 0x36, 0x03, 0x64, 0x02, 0x36, 0x01, 0x64, 0xB4, 0x84, 0x06, 0xA2, 0xA2, 0xD1, - 0xBD, 0xDA, 0x64, 0x47, 0xBD, 0xDA, 0xD5, 0xF3, 0xD6, 0xF1, 0x60, 0x47, 0xBD, 0xDA, 0x64, 0x47, - 0xE3, 0xF1, 0xBD, 0xDA, 0x64, 0x44, 0xBD, 0xDA, 0x26, 0x46, 0x00, 0x64, 0x23, 0xF0, 0x3B, 0xF0, - 0x64, 0x40, 0x10, 0x2A, 0x06, 0x00, 0xC0, 0x67, 0xA0, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, - 0x10, 0xBC, 0x3E, 0xFA, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x34, 0x64, 0xA2, 0xDB, 0x26, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC8, 0xFE, 0x00, 0x66, 0x46, 0x46, - 0x2F, 0x58, 0xFF, 0xFF, 0xB4, 0xF3, 0x1F, 0xFA, 0x32, 0x47, 0x07, 0xFA, 0x24, 0x7E, 0x02, 0x7F, - 0x08, 0xFA, 0xD8, 0xF1, 0x09, 0xF8, 0x01, 0x60, 0x01, 0x64, 0x0A, 0xFA, 0x01, 0x64, 0x0B, 0xFA, - 0x24, 0x60, 0x74, 0x62, 0x18, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x0A, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0x52, 0x63, 0x2E, 0x58, 0xFF, 0xFF, 0x00, 0x60, 0x2A, 0x61, 0xAE, 0x60, - 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x5E, 0xFB, 0x04, 0x64, 0x03, 0xFA, 0x67, 0x44, - 0x2C, 0xFA, 0x2D, 0xFA, 0x2E, 0xFA, 0x32, 0xFA, 0x33, 0xFA, 0x34, 0xFA, 0x12, 0x60, 0x80, 0x64, - 0xA9, 0xF1, 0x0E, 0xFA, 0x07, 0xF8, 0x00, 0x64, 0x3E, 0xFA, 0x1A, 0x60, 0x4E, 0x63, 0xA3, 0xDB, - 0x06, 0xA3, 0x10, 0x60, 0x38, 0x64, 0xBD, 0xDB, 0x04, 0x64, 0xBD, 0xDB, 0x06, 0x64, 0xA3, 0xDB, - 0x10, 0x60, 0x36, 0x62, 0xEF, 0x60, 0xA9, 0x64, 0xA2, 0xDB, 0x1A, 0x60, 0x5A, 0x63, 0x00, 0x64, - 0xA3, 0xDB, 0x06, 0xA3, 0x10, 0x60, 0x3C, 0x64, 0xBD, 0xDB, 0x08, 0x64, 0xBD, 0xDB, 0x06, 0x64, - 0xA3, 0xDB, 0x10, 0x60, 0x3A, 0x62, 0xEF, 0x60, 0xB3, 0x64, 0xA2, 0xDB, 0x10, 0x60, 0x22, 0x62, - 0xEF, 0x60, 0x93, 0x64, 0xA2, 0xDB, 0x00, 0x64, 0x31, 0x60, 0x2A, 0x62, 0xA2, 0xDB, 0x2F, 0x58, - 0xFF, 0xFF, 0x5E, 0xF5, 0xEB, 0xF1, 0x2F, 0xF8, 0xEC, 0xF1, 0x30, 0xF8, 0xED, 0xF1, 0x31, 0xF8, - 0xCC, 0xF1, 0x19, 0xF8, 0x30, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, 0xE4, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x00, 0x63, 0x8A, 0xFD, 0x1C, 0x60, 0x96, 0x65, 0xA5, 0xDD, 0x19, 0x60, 0x86, 0x63, - 0x88, 0xFD, 0x89, 0xFD, 0x20, 0x40, 0x10, 0x2B, 0x05, 0x00, 0x1F, 0x60, 0x82, 0x61, 0xA1, 0xD3, - 0xFF, 0xFF, 0x59, 0x18, 0x5E, 0xF5, 0x40, 0x64, 0x2A, 0xFA, 0x54, 0xF3, 0x00, 0xF4, 0x60, 0x43, - 0xBD, 0xD1, 0x04, 0x65, 0x64, 0x47, 0xA5, 0xDA, 0x64, 0x41, 0xDD, 0x81, 0xE9, 0x81, 0x62, 0x44, - 0x04, 0x03, 0xBD, 0xD1, 0xCD, 0x81, 0x58, 0xD8, 0xFC, 0x02, 0x58, 0x8B, 0x2D, 0x60, 0x28, 0x63, - 0xA3, 0xD1, 0x2B, 0x44, 0xC8, 0x84, 0x64, 0x41, 0xFF, 0xB1, 0x61, 0x45, 0x03, 0xA1, 0xE9, 0x81, - 0x41, 0x4C, 0xBD, 0xD1, 0xCD, 0x81, 0x58, 0xD8, 0xFC, 0x02, 0x2B, 0xD2, 0x2B, 0x43, 0x60, 0x47, - 0x01, 0x7E, 0x54, 0xF1, 0xA3, 0xDA, 0xA4, 0xD3, 0xCB, 0x83, 0x44, 0x8B, 0xF8, 0x84, 0x2C, 0x41, - 0x0C, 0x04, 0xBE, 0xD2, 0xFF, 0xFF, 0x60, 0x47, 0xBE, 0xDA, 0x00, 0x7E, 0xA3, 0xD2, 0x60, 0x45, - 0x00, 0x7F, 0xB4, 0x84, 0xCD, 0x81, 0xBD, 0xDA, 0xF4, 0x02, 0x5E, 0xF5, 0x2B, 0x44, 0x04, 0xA4, - 0x3F, 0xFA, 0x7F, 0xF3, 0x7E, 0xFB, 0x1F, 0x60, 0x84, 0x61, 0x01, 0x64, 0x54, 0xF1, 0xA1, 0xDB, - 0x7F, 0xFB, 0xA4, 0xD3, 0x04, 0x65, 0x53, 0xF3, 0x01, 0x18, 0x0C, 0x65, 0xF3, 0xB4, 0xB4, 0x84, - 0x53, 0xFB, 0x02, 0xB0, 0xFF, 0xFF, 0x16, 0x03, 0x7F, 0xF3, 0xFF, 0xFF, 0x60, 0x47, 0x0F, 0xB4, - 0x7F, 0xFB, 0x01, 0x03, 0x0F, 0x00, 0xEE, 0x60, 0x4F, 0x78, 0xFF, 0xFF, 0x53, 0xF1, 0x7F, 0xF3, - 0x64, 0x40, 0x02, 0x26, 0xF8, 0x01, 0xF3, 0xA0, 0x04, 0xA4, 0x01, 0x04, 0xF1, 0xA4, 0x10, 0x36, - 0xF2, 0x01, 0x7F, 0xFB, 0x20, 0x40, 0x10, 0x2B, 0x12, 0x00, 0x7F, 0xF3, 0x1F, 0x60, 0x82, 0x61, - 0xA1, 0xD1, 0xCC, 0x84, 0x01, 0x61, 0x08, 0x24, 0x03, 0x00, 0xE1, 0x81, 0xCC, 0x84, 0xFB, 0x01, - 0xA1, 0x84, 0x53, 0xF1, 0xE4, 0x03, 0x1F, 0x60, 0x84, 0x61, 0xA1, 0xDB, 0x19, 0x00, 0x53, 0xF3, - 0xFF, 0xFF, 0x10, 0xB0, 0x12, 0x60, 0x26, 0x63, 0x02, 0x03, 0x10, 0x60, 0x5C, 0x63, 0x31, 0x60, - 0x2A, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0x0C, 0x1B, 0x7F, 0xF3, 0xFF, 0xFF, 0xE0, 0x85, 0x47, 0xD3, - 0x53, 0xF1, 0x01, 0xB0, 0x06, 0xB0, 0xCB, 0x03, 0x64, 0x40, 0x03, 0x26, 0x01, 0x00, 0xC7, 0x03, - 0x7F, 0xF3, 0x01, 0x61, 0xCC, 0x84, 0xFF, 0xFF, 0x02, 0x03, 0xE1, 0x81, 0xFB, 0x01, 0xBA, 0xF3, - 0x61, 0x45, 0xA4, 0x80, 0xFF, 0xFF, 0xBB, 0x03, 0x31, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, - 0xE4, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0B, 0x04, 0x0F, 0x60, 0xE6, 0x62, 0x40, 0x60, - 0x00, 0x64, 0xA2, 0xDB, 0xED, 0x60, 0x70, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x7F, 0xF1, 0x24, 0x60, 0x9A, 0x62, 0xA2, 0xD9, 0x1E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, - 0x0F, 0x60, 0xE6, 0x62, 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xED, 0x60, 0xA3, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x40, 0x60, - 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x0F, 0x60, 0xE4, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x5E, 0xF5, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x28, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x00, 0x64, 0x51, 0xFB, 0x0F, 0x60, 0xE6, 0x62, - 0x00, 0x60, 0x01, 0x64, 0xA2, 0xDB, 0xED, 0x60, 0xCD, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0xC1, 0xFE, - 0x33, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x34, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x0F, 0x60, 0xE4, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xC6, 0xF1, 0x1A, 0x60, 0x52, 0x62, 0xA2, 0xD9, - 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x4E, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0xC7, 0xF1, 0x1A, 0x60, 0x5E, 0x62, 0xA2, 0xD9, 0x24, 0x60, 0xA8, 0x62, 0xA2, 0xD3, - 0xFF, 0xFF, 0xFD, 0x1B, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x5A, 0x64, 0xA2, 0xDB, 0x02, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x0F, 0x60, 0xE6, 0x62, 0x00, 0x60, 0x08, 0x64, 0xA2, 0xDB, - 0xED, 0x60, 0xFE, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x51, 0xF1, 0x0F, 0x60, - 0xE4, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x64, 0x40, 0xFF, 0x26, 0x03, 0x00, 0xED, 0x60, 0x36, 0x78, - 0xFF, 0xFF, 0x02, 0x0A, 0x00, 0x64, 0x51, 0xFB, 0xC8, 0xF1, 0x1A, 0x60, 0x5E, 0x62, 0xA2, 0xD9, - 0x0F, 0x60, 0xE6, 0x62, 0x00, 0x60, 0x0C, 0x64, 0xA2, 0xDB, 0xEE, 0x60, 0x24, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x5A, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xE4, 0x62, 0xA2, 0xD1, 0x00, 0x60, - 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0C, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x24, 0x60, 0xAA, 0x62, - 0x1A, 0x60, 0x5A, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x14, 0x00, - 0xFF, 0x60, 0xF7, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x51, 0xF3, 0xDB, 0x0A, 0x00, 0xA0, 0x00, 0x64, - 0x02, 0x03, 0x51, 0xFB, 0xD6, 0x01, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x4E, 0x64, 0xA2, 0xDB, - 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0xED, 0x60, 0x36, 0x78, 0xFF, 0xFF, 0x35, 0x64, - 0x3B, 0x42, 0x5A, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0x4E, 0x64, 0xA2, 0xDB, 0x03, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x53, 0xF3, 0xFF, 0xFF, 0xE3, 0xB4, 0x53, 0xFB, 0x1F, 0x60, - 0x80, 0x64, 0xA0, 0xD3, 0xFF, 0xFF, 0xFE, 0xB4, 0xA2, 0xDB, 0x00, 0x64, 0x31, 0x60, 0x2A, 0x62, - 0xA2, 0xDB, 0x0F, 0x60, 0xE4, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0E, 0x04, 0x32, 0x64, - 0x3B, 0x42, 0x5A, 0xDB, 0x0F, 0x60, 0xE6, 0x62, 0x40, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xEE, 0x60, - 0x69, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x7E, 0xF1, 0x7F, 0xF9, 0x24, 0x60, - 0x9A, 0x62, 0xA2, 0xD9, 0x1E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x0F, 0x60, 0xE6, 0x62, - 0x20, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xEE, 0x60, 0x91, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0xBE, 0xFE, 0x0F, 0x60, 0xD0, 0x62, 0xA2, 0xD1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x1A, 0x60, 0x06, 0x63, 0x1C, 0x61, 0x00, 0x64, 0xCD, 0x81, 0xBD, 0xDB, - 0xFD, 0x02, 0x12, 0x60, 0x46, 0x61, 0x8A, 0xF3, 0x61, 0x43, 0xC6, 0xA5, 0x47, 0xD1, 0x0F, 0x04, - 0xBE, 0xD5, 0x1A, 0x60, 0x02, 0x63, 0xC3, 0x83, 0xC3, 0x83, 0xC3, 0x83, 0x43, 0xD3, 0xBE, 0xD1, - 0xDC, 0x84, 0xA3, 0xDB, 0x66, 0x44, 0xC0, 0x84, 0xBE, 0xDB, 0x65, 0x44, 0xED, 0x01, 0x1A, 0x60, - 0x06, 0x63, 0x0E, 0x61, 0x41, 0x4B, 0xBD, 0xD3, 0xBD, 0xD1, 0x00, 0xBD, 0x64, 0x41, 0x19, 0x03, - 0x01, 0xA8, 0x61, 0x44, 0x02, 0xA8, 0x15, 0x03, 0x02, 0x02, 0xE9, 0x84, 0x12, 0x00, 0x65, 0x47, - 0x60, 0x45, 0x61, 0x44, 0x09, 0x61, 0xCD, 0x81, 0xE0, 0x84, 0xFF, 0x23, 0xFC, 0x01, 0x02, 0x24, - 0xC4, 0x84, 0x02, 0x28, 0xD4, 0x84, 0xCD, 0x81, 0x01, 0x0E, 0x01, 0xBC, 0x02, 0x03, 0xE0, 0x84, - 0xF6, 0x01, 0x00, 0x7F, 0x2B, 0x41, 0x4D, 0x8B, 0xBF, 0xDB, 0xDD, 0x02, 0x12, 0x60, 0x46, 0x61, - 0x8A, 0xF3, 0x61, 0x43, 0xC6, 0xA5, 0x47, 0xD1, 0x0A, 0x04, 0xDA, 0x86, 0x1A, 0x60, 0x04, 0x63, - 0xC3, 0x83, 0xC3, 0x83, 0xC3, 0x83, 0x43, 0xD1, 0xA6, 0xD9, 0x65, 0x44, 0xF2, 0x01, 0x36, 0x64, - 0x3B, 0x42, 0x5A, 0xDB, 0x53, 0xF3, 0x8A, 0xF1, 0xF3, 0xB4, 0x53, 0xFB, 0x12, 0x60, 0x46, 0x63, - 0xC3, 0x85, 0x45, 0x4A, 0x19, 0x60, 0x86, 0x65, 0x89, 0xF3, 0x45, 0x4C, 0x40, 0x48, 0x20, 0x40, - 0x20, 0x2A, 0x02, 0x00, 0x00, 0x65, 0x45, 0x4B, 0x2A, 0x45, 0xD7, 0x80, 0x02, 0x65, 0x23, 0x05, - 0x47, 0xD1, 0x02, 0x65, 0x47, 0xD3, 0x0A, 0x65, 0xD0, 0x81, 0x47, 0xD3, 0x01, 0x05, 0x00, 0x61, - 0xF2, 0xA3, 0x01, 0xB0, 0x61, 0x44, 0x11, 0x03, 0x20, 0x40, 0x20, 0x2A, 0x08, 0x00, 0xF3, 0x60, - 0x58, 0x4E, 0x3E, 0x78, 0xFF, 0xFF, 0x2B, 0x44, 0x02, 0xA4, 0x40, 0x4B, 0x61, 0x44, 0x2C, 0x42, - 0xA2, 0xDB, 0x5A, 0xDD, 0x5A, 0x8C, 0x3A, 0xA3, 0xDF, 0x01, 0x28, 0x42, 0x4A, 0xDD, 0x4A, 0xDB, - 0x42, 0x48, 0x3A, 0xA3, 0xD9, 0x01, 0x28, 0x44, 0x88, 0xFB, 0x88, 0xF1, 0x19, 0x60, 0x86, 0x63, - 0x44, 0x48, 0x28, 0x45, 0xD7, 0x80, 0xA3, 0xD1, 0x15, 0x05, 0x04, 0x65, 0x46, 0xD3, 0x28, 0x45, - 0xD6, 0x80, 0xD0, 0x80, 0x02, 0x04, 0x04, 0xA3, 0xF5, 0x01, 0xF7, 0x06, 0x62, 0x46, 0xA2, 0xD9, - 0xA3, 0xDB, 0x5B, 0xD3, 0x66, 0x42, 0x5A, 0xD1, 0xA2, 0xDB, 0xA3, 0xD9, 0xFE, 0xA3, 0xA3, 0xD1, - 0x66, 0x42, 0xEB, 0x01, 0x88, 0xF3, 0x89, 0xF1, 0x60, 0x43, 0x44, 0x48, 0x28, 0x45, 0xD7, 0x80, - 0xA3, 0xD1, 0x15, 0x05, 0x04, 0x65, 0x46, 0xD3, 0x28, 0x45, 0xD6, 0x80, 0xD0, 0x80, 0x02, 0x04, - 0x04, 0xA3, 0xF5, 0x01, 0xF7, 0x06, 0x62, 0x46, 0xA2, 0xD9, 0xA3, 0xDB, 0x5B, 0xD3, 0x66, 0x42, - 0x5A, 0xD1, 0xA2, 0xDB, 0xA3, 0xD9, 0xFE, 0xA3, 0xA3, 0xD1, 0x66, 0x42, 0xEB, 0x01, 0x0F, 0x60, - 0xD0, 0x62, 0xA2, 0xD1, 0x10, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x20, 0x40, - 0x80, 0x2B, 0x17, 0x00, 0x00, 0x60, 0x04, 0x61, 0xAE, 0x60, 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, - 0x01, 0x64, 0x23, 0xFA, 0xF1, 0x60, 0x02, 0x64, 0x24, 0xFA, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, - 0x64, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xFA, 0xFE, 0x0F, 0x60, 0xE4, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, 0x3E, 0x64, 0x3B, 0x42, - 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x3F, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x24, 0x60, 0xAA, 0x62, - 0x1A, 0x60, 0x4E, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x64, - 0x53, 0xFB, 0x0F, 0x60, 0xE4, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, 0xBE, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x0F, 0x60, 0xE4, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0F, 0x60, 0xE4, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x08, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x79, 0xFB, 0xAC, 0x85, 0x60, 0x41, - 0x20, 0x03, 0x01, 0x60, 0x00, 0x63, 0x08, 0x64, 0xE9, 0x81, 0xCC, 0x84, 0x02, 0x24, 0xDF, 0x83, - 0xFB, 0x02, 0x2D, 0x60, 0x28, 0x64, 0xA0, 0xDD, 0x65, 0x41, 0x2D, 0x60, 0x2A, 0x63, 0x0F, 0x60, - 0xC0, 0x64, 0xE9, 0x81, 0x58, 0xD1, 0xFD, 0x04, 0xA3, 0xD9, 0x0B, 0x03, 0x58, 0xD1, 0xE9, 0x81, - 0x60, 0x45, 0xFC, 0x04, 0xA3, 0xD1, 0x64, 0x47, 0xB0, 0x84, 0xBD, 0xDB, 0x00, 0xB9, 0x65, 0x44, - 0xF0, 0x02, 0x2E, 0x58, 0xFF, 0xFF, 0x3C, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x20, 0x40, 0x90, 0x2B, - 0x03, 0x00, 0xF2, 0x60, 0xE5, 0x78, 0xFF, 0xFF, 0x53, 0xF3, 0x8A, 0xF1, 0x04, 0xB0, 0x07, 0x60, - 0x40, 0x64, 0xD0, 0x80, 0x21, 0x03, 0x20, 0x06, 0x26, 0x46, 0x8A, 0xF1, 0x12, 0x60, 0x46, 0x63, - 0xC3, 0x83, 0x7F, 0xF3, 0x26, 0xF0, 0xBD, 0xDB, 0x64, 0x44, 0x00, 0x7F, 0xBD, 0xDB, 0x64, 0x47, - 0x00, 0x7F, 0xBD, 0xDB, 0x32, 0xF0, 0xBD, 0xD9, 0x33, 0xF0, 0xBD, 0xD9, 0x34, 0xF0, 0xBD, 0xD9, - 0x00, 0xF4, 0x0D, 0xF0, 0xBD, 0xD9, 0x0E, 0xF0, 0xBD, 0xD9, 0x00, 0x64, 0x0F, 0xF0, 0xA3, 0xDB, - 0x64, 0x47, 0x60, 0x45, 0x00, 0x37, 0x03, 0x00, 0xF2, 0x60, 0xDF, 0x78, 0xFF, 0xFF, 0xBD, 0xDB, - 0xE0, 0xA0, 0x1F, 0x61, 0x00, 0xB8, 0xF8, 0x07, 0xF7, 0x03, 0x60, 0xFE, 0xDD, 0x81, 0xA1, 0xD0, - 0xCC, 0x84, 0xBD, 0xD9, 0xFB, 0x02, 0x65, 0x40, 0x01, 0x26, 0xDF, 0x83, 0x20, 0xFE, 0x2D, 0x60, - 0xE4, 0x62, 0xA2, 0xDD, 0x60, 0xFE, 0xDD, 0x81, 0xA1, 0xD0, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x3A, - 0x04, 0x00, 0xDD, 0x81, 0xA1, 0xD0, 0xFF, 0xFF, 0xC1, 0x81, 0xDD, 0x81, 0xA1, 0xD0, 0xFF, 0xFF, - 0x64, 0x40, 0x03, 0x36, 0x03, 0x00, 0xF2, 0x60, 0xDF, 0x78, 0xFF, 0xFF, 0xD9, 0x81, 0xA1, 0xD0, - 0x7F, 0xF3, 0xFF, 0xFF, 0xD0, 0x80, 0x20, 0xFE, 0x08, 0x24, 0x03, 0x00, 0xF2, 0x60, 0xDF, 0x78, - 0xFF, 0xFF, 0x26, 0x46, 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x43, 0xF4, 0xA3, 0x00, 0x60, 0x1D, 0x61, - 0x00, 0x60, 0x80, 0x65, 0x60, 0xFE, 0x81, 0xA1, 0x7F, 0xA1, 0x02, 0x06, 0x00, 0xF4, 0x03, 0x61, - 0xDD, 0x81, 0xA1, 0xD2, 0xCF, 0x83, 0xD4, 0x80, 0x2D, 0x03, 0x17, 0x03, 0xCF, 0x83, 0x61, 0x44, - 0x80, 0xA0, 0x28, 0x03, 0x02, 0x02, 0x00, 0xF4, 0x03, 0x61, 0xDD, 0x81, 0xA1, 0xD2, 0xCF, 0x83, - 0x81, 0xA1, 0x20, 0x03, 0x05, 0x07, 0x7F, 0xA1, 0xCC, 0x84, 0xDD, 0x81, 0xE4, 0x03, 0xF7, 0x01, - 0x00, 0xF4, 0x00, 0xB8, 0x04, 0x61, 0xE4, 0x03, 0xF2, 0x01, 0x01, 0x60, 0xFF, 0x63, 0x46, 0x48, - 0x41, 0x4A, 0xDD, 0x81, 0xA1, 0xD0, 0xDF, 0x83, 0xA3, 0xD9, 0x64, 0x44, 0xDD, 0x81, 0xA1, 0xD0, - 0xDF, 0x83, 0xA3, 0xD9, 0xCC, 0x84, 0x81, 0xA1, 0x05, 0x03, 0x7F, 0xA1, 0xF7, 0x04, 0x00, 0xF4, - 0x03, 0x61, 0xF4, 0x01, 0x20, 0xFE, 0x00, 0xBB, 0x02, 0x60, 0x00, 0x61, 0x45, 0x03, 0x60, 0xFE, - 0xDD, 0x81, 0xA1, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x00, 0x3A, 0x3E, 0x00, 0xDD, 0x81, 0xA1, 0xD1, - 0xFF, 0xFF, 0x64, 0x40, 0x60, 0x3A, 0x38, 0x00, 0xDD, 0x81, 0xA1, 0xD1, 0xFF, 0xFF, 0x64, 0x40, - 0x1D, 0x3A, 0x32, 0x00, 0xDD, 0x81, 0xA1, 0xD3, 0xFF, 0xFF, 0x20, 0xFE, 0xFF, 0xB4, 0x1C, 0x60, - 0x96, 0x65, 0xA5, 0xD3, 0x60, 0x5C, 0x02, 0xA4, 0xA5, 0xDB, 0xFE, 0xA5, 0x1A, 0x60, 0xC6, 0x64, - 0x44, 0xD9, 0x00, 0x7C, 0x60, 0xFE, 0xDD, 0x81, 0xA1, 0xD1, 0xFF, 0xFF, 0x20, 0xFE, 0x1B, 0x60, - 0x06, 0x64, 0xC4, 0x82, 0x64, 0x44, 0xFF, 0xB4, 0xA2, 0xDB, 0x12, 0x60, 0x48, 0x65, 0x8A, 0xF3, - 0xFF, 0xFF, 0xC4, 0x82, 0x64, 0x44, 0xA2, 0xD3, 0xFF, 0xB5, 0xD4, 0x80, 0xFF, 0xFF, 0x02, 0x05, - 0x65, 0x44, 0xA2, 0xDB, 0x09, 0x00, 0x20, 0xFE, 0x28, 0x46, 0x2A, 0x41, 0xFF, 0xB1, 0x60, 0xFE, - 0x82, 0x64, 0xA1, 0xDA, 0xFF, 0xFF, 0x20, 0xFE, 0x26, 0x46, 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x43, - 0xF4, 0xA3, 0x00, 0x60, 0x1D, 0x61, 0x00, 0x60, 0xDD, 0x65, 0x60, 0xFE, 0x81, 0xA1, 0x7F, 0xA1, - 0x02, 0x06, 0x00, 0xF4, 0x03, 0x61, 0xDD, 0x81, 0xA1, 0xD2, 0xCF, 0x83, 0xD4, 0x80, 0x2D, 0x03, - 0x17, 0x03, 0xCF, 0x83, 0x61, 0x44, 0x80, 0xA0, 0x28, 0x03, 0x02, 0x02, 0x00, 0xF4, 0x03, 0x61, - 0xDD, 0x81, 0xA1, 0xD2, 0xCF, 0x83, 0x81, 0xA1, 0x20, 0x03, 0x05, 0x07, 0x7F, 0xA1, 0xCC, 0x84, - 0xDD, 0x81, 0xE4, 0x03, 0xF7, 0x01, 0x00, 0xF4, 0x00, 0xB8, 0x04, 0x61, 0xE4, 0x03, 0xF2, 0x01, - 0x02, 0x60, 0x00, 0x63, 0x46, 0x48, 0x41, 0x4A, 0xDD, 0x81, 0xA1, 0xD0, 0xDF, 0x83, 0xA3, 0xD9, - 0x64, 0x44, 0xDD, 0x81, 0xA1, 0xD0, 0xDF, 0x83, 0xA3, 0xD9, 0xCC, 0x84, 0x81, 0xA1, 0x05, 0x03, - 0x7F, 0xA1, 0xF7, 0x04, 0x00, 0xF4, 0x03, 0x61, 0xF4, 0x01, 0x20, 0xFE, 0x00, 0xBB, 0x02, 0x60, - 0x00, 0x61, 0x08, 0x24, 0xA6, 0x00, 0x2D, 0x60, 0xD6, 0x62, 0xA2, 0xDF, 0x2D, 0x60, 0xD8, 0x62, - 0xA2, 0xDF, 0x2D, 0x60, 0xDA, 0x62, 0xA2, 0xDF, 0x2D, 0x60, 0xDC, 0x62, 0xA2, 0xDF, 0x60, 0xFE, - 0xDD, 0x64, 0xA1, 0xDB, 0xDD, 0x81, 0xA1, 0xD3, 0xFF, 0xFF, 0xFA, 0xA4, 0xFF, 0xFF, 0x04, 0x34, - 0x9A, 0x01, 0xDD, 0x81, 0xA1, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x00, 0x3A, 0x94, 0x01, 0xDD, 0x81, - 0xA1, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x50, 0x3A, 0x8E, 0x01, 0xDD, 0x81, 0xA1, 0xD1, 0xFF, 0xFF, - 0x64, 0x40, 0xF2, 0x3A, 0x88, 0x01, 0xDD, 0x81, 0xA1, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x3A, - 0xDC, 0x00, 0xDD, 0x81, 0xA1, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x3A, 0xD6, 0x00, 0xDD, 0x81, - 0xA1, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x00, 0x3A, 0xD0, 0x00, 0x60, 0x5C, 0x00, 0x36, 0x39, 0x00, - 0x00, 0x64, 0xF2, 0x60, 0x58, 0x4E, 0x57, 0x78, 0xFF, 0xFF, 0x65, 0x40, 0x08, 0x26, 0xF7, 0x01, - 0x2D, 0x60, 0xD6, 0x62, 0xA2, 0xDB, 0x64, 0x40, 0x00, 0x36, 0x31, 0x00, 0xDD, 0x81, 0xA1, 0xD3, - 0xDD, 0x81, 0xF2, 0x60, 0x58, 0x4E, 0x57, 0x78, 0xFF, 0xFF, 0x65, 0x40, 0x08, 0x26, 0xF5, 0x01, - 0x2D, 0x60, 0xD8, 0x62, 0xA2, 0xDB, 0x64, 0x40, 0x00, 0x36, 0x27, 0x00, 0xDD, 0x81, 0xA1, 0xD3, - 0xDD, 0x81, 0xF2, 0x60, 0x58, 0x4E, 0x57, 0x78, 0xFF, 0xFF, 0x65, 0x40, 0x08, 0x26, 0xF5, 0x01, - 0x2D, 0x60, 0xDA, 0x62, 0xA2, 0xDB, 0x64, 0x40, 0x00, 0x36, 0x1D, 0x00, 0xDD, 0x81, 0xA1, 0xD1, - 0x2D, 0x60, 0xDC, 0x62, 0xA2, 0xD9, 0xDD, 0x81, 0xA1, 0xD1, 0x2D, 0x60, 0xDD, 0x62, 0xA2, 0xD9, - 0x18, 0x00, 0x20, 0xFE, 0x2D, 0x60, 0xD6, 0x62, 0x00, 0x60, 0x04, 0x64, 0xA2, 0xDB, 0x20, 0xFE, - 0x2D, 0x60, 0xD8, 0x62, 0x00, 0x60, 0x04, 0x64, 0xA2, 0xDB, 0x20, 0xFE, 0x2D, 0x60, 0xDA, 0x62, - 0x00, 0x60, 0x02, 0x64, 0xA2, 0xDB, 0x20, 0xFE, 0x2D, 0x60, 0xDC, 0x62, 0x00, 0x60, 0x00, 0x64, - 0xA2, 0xDB, 0x20, 0xFE, 0x02, 0x60, 0x00, 0x65, 0x2D, 0x60, 0x9E, 0x63, 0xD5, 0x84, 0xDC, 0x84, - 0xBD, 0xDB, 0x60, 0x41, 0x66, 0x44, 0x63, 0x46, 0xCD, 0x83, 0xC7, 0x81, 0x60, 0x45, 0x60, 0xFE, - 0x5D, 0x93, 0xA3, 0xD3, 0x5D, 0x93, 0xA6, 0xDB, 0xDE, 0x86, 0xFA, 0x1F, 0x66, 0x43, 0x65, 0x46, - 0x20, 0xFE, 0x20, 0xFE, 0x2D, 0x60, 0xE4, 0x62, 0xA2, 0xD1, 0xFF, 0xFF, 0x64, 0x43, 0x00, 0x64, - 0x2D, 0x60, 0xCE, 0x61, 0xA1, 0xDB, 0x2D, 0x60, 0xC2, 0x62, 0xA2, 0xD1, 0x2D, 0x60, 0xD6, 0x62, - 0xA2, 0xD3, 0xFF, 0xFF, 0xA0, 0x84, 0xFF, 0xFF, 0x10, 0x26, 0x07, 0x00, 0x04, 0x26, 0x07, 0x00, - 0x20, 0x26, 0x07, 0x00, 0x02, 0x26, 0x07, 0x00, 0x48, 0x00, 0x10, 0x7C, 0x05, 0x00, 0x04, 0x7C, - 0x03, 0x00, 0x20, 0x7C, 0x01, 0x00, 0x02, 0x7C, 0x2D, 0x60, 0xCE, 0x61, 0xA1, 0xD9, 0x50, 0x94, - 0x2D, 0x60, 0xD0, 0x61, 0xA1, 0xDB, 0x2D, 0x60, 0xC4, 0x61, 0xA1, 0xD1, 0x2D, 0x60, 0xD8, 0x61, - 0xA1, 0xD3, 0x2D, 0x60, 0xCE, 0x61, 0xA0, 0x84, 0xA1, 0xD1, 0xFF, 0xFF, 0x10, 0x26, 0x05, 0x00, - 0x04, 0x26, 0x05, 0x00, 0x01, 0x26, 0x08, 0x00, 0x28, 0x00, 0x10, 0x7C, 0x06, 0x00, 0x64, 0x40, - 0x10, 0x26, 0x23, 0x00, 0x04, 0x7C, 0x01, 0x00, 0x01, 0x7C, 0x2D, 0x60, 0xD0, 0x61, 0xA1, 0xD9, - 0x50, 0x94, 0x2D, 0x60, 0xD2, 0x61, 0xA1, 0xDB, 0x2D, 0x60, 0xC6, 0x61, 0xA1, 0xD1, 0x2D, 0x60, - 0xDA, 0x61, 0xA1, 0xD3, 0xFF, 0xFF, 0xA0, 0x84, 0x60, 0x40, 0x02, 0x26, 0x05, 0x00, 0x04, 0x26, - 0x05, 0x00, 0x01, 0x26, 0x05, 0x00, 0x09, 0x00, 0x02, 0x7C, 0x03, 0x00, 0x04, 0x7C, 0x01, 0x00, - 0x20, 0x7C, 0x2D, 0x60, 0xD2, 0x61, 0xA1, 0xD9, 0x0D, 0x00, 0x50, 0x94, 0x2D, 0x60, 0xCE, 0x62, - 0xA2, 0xDB, 0x2D, 0x60, 0xD0, 0x62, 0xA2, 0xDB, 0x2D, 0x60, 0xD2, 0x62, 0xA2, 0xDB, 0x2D, 0x60, - 0xD4, 0x62, 0xA2, 0xDB, 0x7C, 0x44, 0x2D, 0x60, 0xCE, 0x61, 0xA1, 0xD1, 0xBD, 0xD9, 0x2D, 0x60, - 0xD0, 0x61, 0xA1, 0xD1, 0xB0, 0x84, 0xBD, 0xD9, 0x2D, 0x60, 0xD2, 0x61, 0xA1, 0xD1, 0xB0, 0x84, - 0xBD, 0xD9, 0x2D, 0x60, 0xC8, 0x61, 0xA1, 0xD1, 0xB0, 0x84, 0xBD, 0xD9, 0x08, 0x28, 0x68, 0x00, - 0x28, 0x60, 0x2C, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xFF, 0xA0, 0xFF, 0xFF, 0x0C, 0x24, 0x60, 0x00, - 0x60, 0x40, 0x0B, 0x36, 0x5D, 0x00, 0x20, 0x40, 0x10, 0x27, 0x5A, 0x00, 0x88, 0x00, 0x20, 0xFE, - 0x00, 0x65, 0x60, 0xFE, 0x2D, 0x60, 0xDE, 0x62, 0xA2, 0xDB, 0xE0, 0x84, 0xE0, 0x84, 0x08, 0x20, - 0x03, 0x00, 0x01, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x02, 0xA5, 0x64, 0x44, 0xD4, 0x9C, 0xD4, 0x80, - 0x2D, 0x60, 0xE0, 0x62, 0x02, 0x05, 0x08, 0x65, 0x41, 0x00, 0xA2, 0xD9, 0x7C, 0x44, 0x2D, 0x60, - 0xE2, 0x62, 0xA2, 0xDB, 0xDD, 0x81, 0xA1, 0xD1, 0x00, 0x65, 0x64, 0x40, 0x00, 0x3A, 0x01, 0x65, - 0xDD, 0x81, 0xA1, 0xD1, 0xFF, 0xFF, 0x64, 0x40, 0x50, 0x3A, 0x01, 0x65, 0xDD, 0x81, 0xA1, 0xD1, - 0xFF, 0xFF, 0x64, 0x40, 0xF2, 0x3A, 0x01, 0x65, 0xDD, 0x81, 0xA1, 0xD1, 0x65, 0x40, 0x00, 0x3A, - 0x18, 0x00, 0x00, 0x60, 0x00, 0x65, 0x64, 0x40, 0x00, 0x36, 0x01, 0x65, 0x64, 0x40, 0x01, 0x36, - 0x02, 0x65, 0x64, 0x40, 0x02, 0x36, 0x04, 0x65, 0x64, 0x40, 0x04, 0x36, 0x10, 0x65, 0x64, 0x40, - 0x05, 0x36, 0x20, 0x65, 0x65, 0x5C, 0x2D, 0x60, 0xE2, 0x62, 0xA2, 0xD3, 0xFF, 0xFF, 0xB0, 0x84, - 0xA2, 0xDB, 0x2D, 0x60, 0xDE, 0x62, 0xA2, 0xD3, 0x00, 0x65, 0xFF, 0xA4, 0xA2, 0xDB, 0xCA, 0x02, - 0x2D, 0x60, 0xE2, 0x62, 0xA2, 0xD3, 0x2D, 0x60, 0xE0, 0x62, 0xA2, 0xD1, 0x2E, 0x58, 0xFF, 0xFF, - 0x20, 0xFE, 0x8A, 0xF3, 0xFF, 0xFF, 0x3A, 0xA4, 0x8A, 0xFB, 0x3D, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x89, 0xF3, 0x7F, 0xF1, 0x04, 0xA4, 0x89, 0xFB, 0x12, 0x60, 0x22, 0x63, 0x53, 0xF3, 0x64, 0x41, - 0x08, 0xB0, 0xE1, 0x85, 0x1C, 0x03, 0xFE, 0xA1, 0x47, 0xD3, 0x02, 0x06, 0xFB, 0xB4, 0xA3, 0xDB, - 0xDD, 0x81, 0x5B, 0xD3, 0x0C, 0x24, 0x02, 0x00, 0xFB, 0xB4, 0xA3, 0xDB, 0x5B, 0xD3, 0xDD, 0x81, - 0x02, 0xBC, 0xA3, 0xDB, 0x0E, 0x65, 0xDD, 0x81, 0xD5, 0x80, 0x5B, 0xD3, 0x08, 0x05, 0xFB, 0xB4, - 0xA3, 0xDB, 0xDD, 0x81, 0xD5, 0x80, 0x5B, 0xD3, 0x02, 0x03, 0xFB, 0xB4, 0xA3, 0xDB, 0xFF, 0xFF, - 0x20, 0xFE, 0x26, 0x46, 0x31, 0x40, 0x20, 0x2A, 0x18, 0x00, 0x3F, 0xF2, 0x47, 0x65, 0xC4, 0x84, - 0xE8, 0x84, 0x23, 0xFA, 0xF1, 0x60, 0x02, 0x64, 0x24, 0xFA, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, - 0x64, 0x64, 0xA2, 0xDB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xFA, 0xFE, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, - 0x16, 0x63, 0x1C, 0x60, 0x8C, 0x62, 0x00, 0x64, 0x5A, 0xDB, 0xFE, 0x1F, 0x5B, 0xFB, 0x5C, 0xFB, - 0x1C, 0x60, 0x92, 0x63, 0x02, 0x64, 0xA3, 0xDB, 0x1A, 0x60, 0xC6, 0x62, 0x3E, 0x63, 0x00, 0x64, - 0x5A, 0xDB, 0xFE, 0x1F, 0x2E, 0x58, 0xFF, 0xFF, 0x1C, 0x60, 0x98, 0x62, 0xA2, 0xD3, 0x00, 0x63, - 0xF8, 0xA0, 0x01, 0xA4, 0x03, 0x03, 0xA2, 0xDB, 0x2E, 0x58, 0xFF, 0xFF, 0xA2, 0xDD, 0x1C, 0x60, - 0x9A, 0x62, 0xA2, 0xD1, 0xA2, 0xDD, 0x5A, 0xD3, 0xA2, 0xDD, 0xC0, 0x81, 0x61, 0x44, 0x02, 0x24, - 0xFF, 0xFF, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0x5A, 0xD3, 0xE9, 0x81, 0xE8, 0x83, - 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x85, 0xD4, 0x85, 0xC5, 0x83, 0xA2, 0xDD, 0x1C, 0x60, - 0x8E, 0x62, 0x63, 0x47, 0x00, 0x7F, 0xA2, 0xDB, 0x2E, 0x58, 0xFF, 0xFF, 0x1C, 0x60, 0xA0, 0x65, - 0xA5, 0xDD, 0x1B, 0x60, 0x46, 0x65, 0x61, 0x44, 0x2B, 0x41, 0x45, 0xDB, 0x60, 0x41, 0x1B, 0x60, - 0x86, 0x65, 0x0A, 0xA3, 0xA3, 0xD1, 0x2B, 0x44, 0x44, 0xD9, 0x1C, 0x60, 0xA0, 0x65, 0xA5, 0xD3, - 0xFF, 0xFF, 0x60, 0x43, 0x00, 0xB9, 0xFF, 0xFF, 0x4C, 0x03, 0x06, 0xA3, 0xBD, 0xD1, 0x81, 0xF3, - 0x82, 0xF1, 0xD0, 0x80, 0xBD, 0xD3, 0x22, 0x02, 0x83, 0xF3, 0xD0, 0x80, 0xA3, 0xD1, 0x1E, 0x02, - 0xD0, 0x80, 0xFF, 0xFF, 0x1B, 0x02, 0x8A, 0xF3, 0x12, 0x60, 0x46, 0x63, 0xC6, 0xA5, 0x47, 0xD1, - 0x7F, 0xF3, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x08, 0x28, 0xFF, 0x61, 0x61, 0x43, 0x1A, 0x60, - 0xC6, 0x65, 0x2B, 0x44, 0x44, 0xD1, 0x1C, 0x60, 0x8E, 0x65, 0xA5, 0xD1, 0x64, 0x44, 0xD0, 0x81, - 0x1C, 0x60, 0x92, 0x65, 0x01, 0x05, 0x00, 0x61, 0xA5, 0xD3, 0x15, 0x00, 0x1A, 0x60, 0xC6, 0x65, - 0x2B, 0x44, 0x44, 0xD1, 0x1C, 0x60, 0x8E, 0x65, 0x64, 0x43, 0xA5, 0xD1, 0x64, 0x65, 0x63, 0x44, - 0xC0, 0x84, 0xD4, 0x80, 0xFF, 0xFF, 0x02, 0x06, 0x00, 0x61, 0x13, 0x00, 0x61, 0x43, 0xD0, 0x81, - 0x1C, 0x60, 0x92, 0x65, 0xA5, 0xD3, 0xE9, 0x81, 0xE9, 0x81, 0xCC, 0x84, 0xCC, 0x84, 0x02, 0x03, - 0x02, 0x03, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x85, 0xD7, 0x84, 0x60, 0x41, 0x01, 0x05, - 0x00, 0x61, 0x1C, 0x60, 0xA0, 0x65, 0xA5, 0xD3, 0xFF, 0xFF, 0x60, 0x43, 0x2E, 0x58, 0xFF, 0xFF, - 0x1C, 0x60, 0x94, 0x65, 0xA5, 0xD1, 0x5B, 0xF3, 0x64, 0x41, 0xCD, 0x81, 0xCD, 0x81, 0x02, 0x03, - 0x02, 0x03, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x85, 0x29, 0x44, 0x54, 0x89, 0x2E, 0x58, - 0xFF, 0xFF, 0xED, 0xF3, 0x1A, 0x60, 0xBE, 0x63, 0x0F, 0xB4, 0x01, 0xA4, 0xE0, 0x87, 0xE0, 0x84, - 0xE0, 0x84, 0xBD, 0xDB, 0x10, 0x60, 0x58, 0x64, 0xBD, 0xDB, 0x02, 0x64, 0xBD, 0xDB, 0x06, 0x64, - 0xA3, 0xDB, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0xBA, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0x2E, 0x58, 0xFF, 0xFF, 0x1A, 0x60, 0xBE, 0x63, 0xEA, 0x60, 0x60, 0x64, - 0xBD, 0xDB, 0x10, 0x60, 0x58, 0x64, 0xBD, 0xDB, 0x02, 0x64, 0xBD, 0xDB, 0x06, 0x64, 0xA3, 0xDB, - 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, 0xBA, 0x64, 0xA2, 0xDB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0x2E, 0x58, 0xFF, 0xFF, 0x16, 0x63, 0x1C, 0x60, 0x8C, 0x62, 0x00, 0x64, 0x5A, 0xDB, - 0xFE, 0x1F, 0x5B, 0xFB, 0x5C, 0xFB, 0x1C, 0x60, 0x92, 0x63, 0x02, 0x64, 0xA3, 0xDB, 0x1A, 0x60, - 0xC6, 0x62, 0x3E, 0x63, 0x00, 0x64, 0x5A, 0xDB, 0xFE, 0x1F, 0x10, 0x60, 0x56, 0x62, 0xF5, 0x60, - 0x29, 0x64, 0xA2, 0xDB, 0x10, 0x60, 0x2C, 0x62, 0xF5, 0x60, 0x15, 0x64, 0xA2, 0xDB, 0x10, 0x60, - 0x02, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x10, 0x60, 0x04, 0x62, 0x00, 0x60, 0x04, 0x64, 0xA2, 0xDB, - 0xF4, 0x60, 0x16, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x20, 0x44, 0x40, 0x26, - 0x03, 0x00, 0xF4, 0x60, 0xEA, 0x78, 0xFF, 0xFF, 0x20, 0x40, 0x52, 0x23, 0x07, 0x00, 0x5A, 0xF3, - 0xFF, 0xFF, 0x01, 0xA4, 0x5A, 0xFB, 0xF4, 0x60, 0xD7, 0x78, 0xFF, 0xFF, 0x40, 0x60, 0x00, 0x65, - 0x20, 0x44, 0x34, 0x80, 0x1C, 0x60, 0x92, 0x65, 0x02, 0x64, 0xA5, 0xDB, 0x1A, 0x60, 0xC4, 0x62, - 0x7E, 0x63, 0x00, 0x64, 0x5A, 0xDB, 0xFE, 0x1F, 0x1C, 0x60, 0x96, 0x62, 0xA2, 0xDD, 0x8C, 0xF3, - 0x58, 0xFB, 0x02, 0x64, 0x8C, 0xFB, 0xFF, 0xFF, 0xC1, 0xFE, 0x8C, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, - 0xFF, 0xFF, 0x0B, 0x03, 0x10, 0x60, 0x04, 0x62, 0x80, 0x60, 0x00, 0x64, 0xA2, 0xDB, 0xF4, 0x60, - 0x3D, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x04, 0x64, 0x53, 0xFB, 0x29, 0x60, - 0xA4, 0x64, 0x54, 0xFB, 0x0F, 0x4E, 0xEC, 0x60, 0x58, 0x4F, 0xB9, 0x78, 0xFF, 0xFF, 0x0E, 0x4F, - 0x10, 0x60, 0x02, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x10, 0x60, 0x04, 0x62, 0x10, 0x60, 0x00, 0x64, - 0xA2, 0xDB, 0xF4, 0x60, 0x67, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x58, 0xF3, - 0x8C, 0xFB, 0xCA, 0xFE, 0xC1, 0xFE, 0x1C, 0x60, 0xA2, 0x62, 0x66, 0x44, 0xA2, 0xDB, 0x5A, 0xDD, - 0x61, 0x44, 0x5A, 0xDB, 0x67, 0xF5, 0xCC, 0xF1, 0x19, 0xF8, 0xF8, 0x60, 0x80, 0x64, 0x0E, 0xFA, - 0xA9, 0xF1, 0x07, 0xF8, 0x01, 0x60, 0x60, 0x67, 0x2C, 0xFA, 0x1D, 0x64, 0x2D, 0xFA, 0x01, 0x64, - 0x2E, 0xFA, 0xEB, 0xF1, 0x2F, 0xF8, 0xEC, 0xF1, 0x30, 0xF8, 0xED, 0xF1, 0x31, 0xF8, 0x81, 0xF1, - 0x32, 0xF8, 0x82, 0xF1, 0x33, 0xF8, 0x83, 0xF1, 0x34, 0xF8, 0x08, 0x64, 0x2A, 0xFA, 0x40, 0x63, - 0x3F, 0xFC, 0x00, 0xF4, 0x02, 0x62, 0xCB, 0x83, 0x00, 0x64, 0x5A, 0xDA, 0xFE, 0x1F, 0x1C, 0x60, - 0x8E, 0x65, 0xA5, 0xD3, 0x02, 0xFA, 0x19, 0x60, 0x88, 0x64, 0xA0, 0xD1, 0x0A, 0x61, 0x41, 0xD3, - 0x03, 0xFA, 0x06, 0x61, 0x06, 0x63, 0x00, 0x65, 0x1B, 0x60, 0x86, 0x64, 0x44, 0xD1, 0x59, 0xD8, - 0x1B, 0x60, 0x46, 0x64, 0x44, 0xD1, 0x59, 0xD8, 0x1A, 0x60, 0xC6, 0x64, 0x44, 0xD1, 0x59, 0xD8, - 0x1B, 0x60, 0x06, 0x64, 0x44, 0xD1, 0x59, 0xD8, 0x65, 0x44, 0x02, 0xA4, 0x60, 0x45, 0xEC, 0x1F, - 0x67, 0xF5, 0x24, 0x60, 0x74, 0x62, 0x24, 0x60, 0x22, 0x64, 0xA2, 0xDB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x1C, 0x60, 0xA2, 0x62, 0xA2, 0xD5, 0x5A, 0xD3, - 0x5A, 0xD3, 0x60, 0x43, 0x60, 0x41, 0x0F, 0x60, 0xEA, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x20, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xBF, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0xF3, 0x60, - 0x58, 0x4E, 0xD4, 0x78, 0xFF, 0xFF, 0x10, 0x60, 0x02, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x10, 0x60, - 0x04, 0x62, 0x10, 0x60, 0x02, 0x64, 0xA2, 0xDB, 0xF4, 0x60, 0x16, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x1C, 0x60, 0xA4, 0x63, 0x66, 0x44, 0xA3, 0xDB, 0x00, 0x60, 0x40, 0x61, - 0xAE, 0x60, 0x58, 0x4D, 0xC4, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x67, 0xFB, 0x04, 0x64, 0x03, 0xFA, - 0x1C, 0x60, 0xA4, 0x63, 0xA3, 0xD1, 0x00, 0x64, 0x64, 0x46, 0xA3, 0xDB, 0x00, 0x60, 0x40, 0x65, - 0x20, 0x44, 0x34, 0x80, 0xF3, 0x60, 0x58, 0x4E, 0xB9, 0x78, 0xFF, 0xFF, 0x10, 0x60, 0x02, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x10, 0x60, 0x04, 0x62, 0x00, 0x60, 0x02, 0x64, 0xA2, 0xDB, 0xF4, 0x60, - 0x16, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x24, 0x60, 0xAA, 0x62, 0x1A, 0x60, - 0xBA, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x10, 0x60, 0x02, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x5A, 0xDB, 0xFF, 0x60, 0x9F, 0x65, 0x20, 0x44, 0x24, 0x80, 0x2F, 0x58, - 0xFF, 0xFF, 0x10, 0x60, 0x02, 0x62, 0xA2, 0xD1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - -}; /* fw_image_4_data */ - -static const CFG_IDENTITY_STRCT fw_image_infoidentity[] = { - { - sizeof(CFG_IDENTITY_STRCT) / sizeof(hcf_16) - 1, - CFG_FW_IDENTITY, - COMP_ID_FW_STA, - 3, /* Variant */ - 2, /* Major */ - 36 /* Minor */ - }, - { 0000, 0000, 0000, 0000, 0000, 0000 } /* endsentinel */ -}; - -static const CFG_PROG_STRCT fw_image_code[] = { - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, /* mode */ - 0x0186, /* sizeof(fw_image_1_data), */ - 0x00000060, /* Target address in NIC Memory */ - 0x0000, /* CRC: yes/no TYPE: primary/station/tertiary */ - (hcf_8 *)fw_image_1_data - }, - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, /* mode */ - 0x2518, /* sizeof(fw_image_2_data), */ - 0x00000C16, /* Target address in NIC Memory */ - 0x0000, /* CRC: yes/no TYPE: primary/station/tertiary */ - (hcf_8 *)fw_image_2_data - }, - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, /* mode */ - 0x3daa, /* sizeof(fw_image_3_data), */ - 0x001E312E, /* Target address in NIC Memory */ - 0x0000, /* CRC: yes/no TYPE: primary/station/tertiary */ - (hcf_8 *)fw_image_3_data - }, - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, /* mode */ - 0xaa66, /* sizeof(fw_image_4_data), */ - 0x001F4000, /* Target address in NIC Memory */ - 0x0000, /* CRC: yes/no TYPE: primary/station/tertiary */ - (hcf_8 *)fw_image_4_data - }, - { - 5, - CFG_PROG, - CFG_PROG_STOP, /* mode */ - 0000, - 0x000F368E, /* Start execution address */ - }, - { 0000, 0000, 0000, 0000, 00000000, 0000, NULL} -}; - -static const CFG_RANGE20_STRCT fw_image_infocompat[] = { - { 3 + ((20 * sizeof(CFG_RANGE_SPEC_STRCT)) / sizeof(hcf_16)), - CFG_FW_SUP_RANGE, - COMP_ROLE_SUPL, - COMP_ID_STA, - { - { 2, 2, 5 } /* variant, bottom, top */ - } - }, - { 3 + ((20 * sizeof(CFG_RANGE_SPEC_STRCT)) / sizeof(hcf_16)), - CFG_MFI_ACT_RANGES_STA, - COMP_ROLE_ACT, - COMP_ID_MFI, - { - { 4, 6, 7 }, /* variant, bottom, top */ - { 5, 6, 7 }, /* variant, bottom, top */ - { 6, 6, 7 } /* variant, bottom, top */ - } - }, - { 3 + ((20 * sizeof(CFG_RANGE_SPEC_STRCT)) / sizeof(hcf_16)), - CFG_CFI_ACT_RANGES_STA, - COMP_ROLE_ACT, - COMP_ID_CFI, - { - { 2, 1, 2 } /* variant, bottom, top */ - } - }, - { 0000, 0000, 0000, 0000, { { 0000, 0000, 0000 } } } /* endsentinel */ -}; - -memimage fw_image = { - "FUPU7D37dhfwci\001C", /* signature, , C/Bin type */ - (CFG_PROG_STRCT *) fw_image_code, - 0x000F368E, - NULL, /* (dummy) pdaplug */ - NULL, /* (dummy) priplug */ - (CFG_RANGE20_STRCT *) fw_image_infocompat, - (CFG_IDENTITY_STRCT *) fw_image_infoidentity, -}; - diff --git a/drivers/staging/wlags49_h2/sta_h25.c b/drivers/staging/wlags49_h2/sta_h25.c deleted file mode 100644 index eccd780ef135..000000000000 --- a/drivers/staging/wlags49_h2/sta_h25.c +++ /dev/null @@ -1,5255 +0,0 @@ -/* - * File: sta_h54.136 - * - * Abstract: This file contains memory image 'fw_image'. - * - * Contents: Total size of the memory image: 81742 bytes. - * Total number of blocks: 4 blocks. - * Block 1 : load address 00000060, 388 bytes. - * Block 2 : load address 00000C16, 11278 bytes. - * Block 3 : load address 001E3824, 21726 bytes. - * Block 4 : load address 001F4000, 48350 bytes. - * - * Identity: component id: 31 (variant 4) version 1.36 - * - * Compatibility: - * supplying interface 4 (variant 4) : 1 - 2 - * acting on interface 1 (variant 7) : 3 - 3 - * acting on interface 1 (variant 8) : 1 - 1 - * acting on interface 2 (variant 4) : 1 - 2 - * - * Generated: by g:\fw\fupu3.exe version 4.26 - * - * Commandline: g:\fw\fupu3.exe /f=4 /n=fw_image /i=r4013600.hex - */ - - -#include "hcfcfg.h" // to get hcf_16 etc defined as well as - // possible settings which influence mdd.h or dhf.h -#include "mdd.h" //to get COMP_ID_STA etc defined -#include "dhf.h" //used to be "fhfmem.h", to get memblock,plugrecord, - -static const hcf_8 fw_image_1_data[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDA, 0x0C, 0x00, 0x00, - 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x65, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 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, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB2, 0x1B, 0xB2, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x00, 0x00, 0xFF, 0x07, - 0x01, 0x00, 0x64, 0x00, 0x64, 0x00, 0x10, 0x27, 0x10, 0x27, 0x14, 0x00, 0xD0, 0x07, 0xD0, 0x07, - 0x10, 0x27, 0x2F, 0x00, 0x32, 0x00, 0x32, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, 0x10, 0x27, - 0x05, 0x00, 0x00, 0x02, 0x00, 0x02, 0x13, 0x00, 0x07, 0x00, 0x03, 0x00, 0x32, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x09, 0x2B, 0x09, 0x2B, 0x09, 0xFF, 0x0F, 0xF0, 0x0F, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x01, 0x00, 0x40, 0x00, 0x32, 0x00, 0x32, 0x00, 0x0A, 0x00, - 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - -}; /* fw_image_1_data */ - -static const hcf_8 fw_image_2_data[] = { - 0xF4, 0xA3, 0x00, 0x16, 0x08, 0x40, 0x0F, 0xD2, 0xE1, 0x28, 0xA5, 0x7C, 0x50, 0x30, 0xF1, 0x84, - 0x44, 0x08, 0xAB, 0xAE, 0xA5, 0xB8, 0xFC, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, - 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0xC6, 0x84, 0xF8, 0x99, 0xEE, - 0x8D, 0xF6, 0x0D, 0xFF, 0xBD, 0xD6, 0xB1, 0xDE, 0x54, 0x91, 0x50, 0x60, 0x03, 0x02, 0xA9, 0xCE, - 0x7D, 0x56, 0x19, 0xE7, 0x62, 0xB5, 0xE6, 0x4D, 0x9A, 0xEC, 0x45, 0x8F, 0x9D, 0x1F, 0x40, 0x89, - 0x87, 0xFA, 0x15, 0xEF, 0xEB, 0xB2, 0xC9, 0x8E, 0x0B, 0xFB, 0xEC, 0x41, 0x67, 0xB3, 0xFD, 0x5F, - 0xEA, 0x45, 0xBF, 0x23, 0xF7, 0x53, 0x96, 0xE4, 0x5B, 0x9B, 0xC2, 0x75, 0x1C, 0xE1, 0xAE, 0x3D, - 0x6A, 0x4C, 0x5A, 0x6C, 0x41, 0x7E, 0x02, 0xF5, 0x4F, 0x83, 0x5C, 0x68, 0xF4, 0x51, 0x34, 0xD1, - 0x08, 0xF9, 0x93, 0xE2, 0x73, 0xAB, 0x53, 0x62, 0x3F, 0x2A, 0x0C, 0x08, 0x52, 0x95, 0x65, 0x46, - 0x5E, 0x9D, 0x28, 0x30, 0xA1, 0x37, 0x0F, 0x0A, 0xB5, 0x2F, 0x09, 0x0E, 0x36, 0x24, 0x9B, 0x1B, - 0x3D, 0xDF, 0x26, 0xCD, 0x69, 0x4E, 0xCD, 0x7F, 0x9F, 0xEA, 0x1B, 0x12, 0x9E, 0x1D, 0x74, 0x58, - 0x2E, 0x34, 0x2D, 0x36, 0xB2, 0xDC, 0xEE, 0xB4, 0xFB, 0x5B, 0xF6, 0xA4, 0x4D, 0x76, 0x61, 0xB7, - 0xCE, 0x7D, 0x7B, 0x52, 0x3E, 0xDD, 0x71, 0x5E, 0x97, 0x13, 0xF5, 0xA6, 0x68, 0xB9, 0x00, 0x00, - 0x2C, 0xC1, 0x60, 0x40, 0x1F, 0xE3, 0xC8, 0x79, 0xED, 0xB6, 0xBE, 0xD4, 0x46, 0x8D, 0xD9, 0x67, - 0x4B, 0x72, 0xDE, 0x94, 0xD4, 0x98, 0xE8, 0xB0, 0x4A, 0x85, 0x6B, 0xBB, 0x2A, 0xC5, 0xE5, 0x4F, - 0x16, 0xED, 0xC5, 0x86, 0xD7, 0x9A, 0x55, 0x66, 0x94, 0x11, 0xCF, 0x8A, 0x10, 0xE9, 0x06, 0x04, - 0x81, 0xFE, 0xF0, 0xA0, 0x44, 0x78, 0xBA, 0x25, 0xE3, 0x4B, 0xF3, 0xA2, 0xFE, 0x5D, 0xC0, 0x80, - 0x8A, 0x05, 0xAD, 0x3F, 0xBC, 0x21, 0x48, 0x70, 0x04, 0xF1, 0xDF, 0x63, 0xC1, 0x77, 0x75, 0xAF, - 0x63, 0x42, 0x30, 0x20, 0x1A, 0xE5, 0x0E, 0xFD, 0x6D, 0xBF, 0x4C, 0x81, 0x14, 0x18, 0x35, 0x26, - 0x2F, 0xC3, 0xE1, 0xBE, 0xA2, 0x35, 0xCC, 0x88, 0x39, 0x2E, 0x57, 0x93, 0xF2, 0x55, 0x82, 0xFC, - 0x47, 0x7A, 0xAC, 0xC8, 0xE7, 0xBA, 0x2B, 0x32, 0x95, 0xE6, 0xA0, 0xC0, 0x98, 0x19, 0xD1, 0x9E, - 0x7F, 0xA3, 0x66, 0x44, 0x7E, 0x54, 0xAB, 0x3B, 0x83, 0x0B, 0xCA, 0x8C, 0x29, 0xC7, 0xD3, 0x6B, - 0x3C, 0x28, 0x79, 0xA7, 0xE2, 0xBC, 0x1D, 0x16, 0x76, 0xAD, 0x3B, 0xDB, 0x56, 0x64, 0x4E, 0x74, - 0x1E, 0x14, 0xDB, 0x92, 0x0A, 0x0C, 0x6C, 0x48, 0xE4, 0xB8, 0x5D, 0x9F, 0x6E, 0xBD, 0xEF, 0x43, - 0xA6, 0xC4, 0xA8, 0x39, 0xA4, 0x31, 0x37, 0xD3, 0x8B, 0xF2, 0x32, 0xD5, 0x43, 0x8B, 0x59, 0x6E, - 0xB7, 0xDA, 0x8C, 0x01, 0x64, 0xB1, 0xD2, 0x9C, 0xE0, 0x49, 0xB4, 0xD8, 0xFA, 0xAC, 0x07, 0xF3, - 0x25, 0xCF, 0xAF, 0xCA, 0x8E, 0xF4, 0xE9, 0x47, 0x18, 0x10, 0xD5, 0x6F, 0x88, 0xF0, 0x6F, 0x4A, - 0x72, 0x5C, 0x24, 0x38, 0xF1, 0x57, 0xC7, 0x73, 0x51, 0x97, 0x23, 0xCB, 0x7C, 0xA1, 0x9C, 0xE8, - 0x21, 0x3E, 0xDD, 0x96, 0xDC, 0x61, 0x86, 0x0D, 0x85, 0x0F, 0x90, 0xE0, 0x42, 0x7C, 0xC4, 0x71, - 0xAA, 0xCC, 0xD8, 0x90, 0x05, 0x06, 0x01, 0xF7, 0x12, 0x1C, 0xA3, 0xC2, 0x5F, 0x6A, 0xF9, 0xAE, - 0xD0, 0x69, 0x91, 0x17, 0x58, 0x99, 0x27, 0x3A, 0xB9, 0x27, 0x38, 0xD9, 0x13, 0xEB, 0xB3, 0x2B, - 0x33, 0x22, 0xBB, 0xD2, 0x70, 0xA9, 0x89, 0x07, 0xA7, 0x33, 0xB6, 0x2D, 0x22, 0x3C, 0x92, 0x15, - 0x20, 0xC9, 0x49, 0x87, 0xFF, 0xAA, 0x78, 0x50, 0x7A, 0xA5, 0x8F, 0x03, 0xF8, 0x59, 0x80, 0x09, - 0x17, 0x1A, 0xDA, 0x65, 0x31, 0xD7, 0xC6, 0x84, 0xB8, 0xD0, 0xC3, 0x82, 0xB0, 0x29, 0x77, 0x5A, - 0x11, 0x1E, 0xCB, 0x7B, 0xFC, 0xA8, 0xD6, 0x6D, 0x3A, 0x2C, 0x00, 0x30, 0x00, 0x31, 0x00, 0x33, - 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3A, 0x00, 0x3B, - 0x00, 0x3C, 0x00, 0x3D, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x3F, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x28, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x02, 0x14, 0x05, 0x32, 0x0B, 0x37, 0x08, 0x50, 0x0B, 0x6E, - 0x02, 0x00, 0x04, 0x00, 0x0B, 0x00, 0x16, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, - 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x39, 0x00, 0x20, 0x00, 0x39, 0x00, 0x39, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, - 0x3E, 0x11, 0xF6, 0x10, 0x38, 0x11, 0xFC, 0x10, 0x32, 0x11, 0x02, 0x11, 0x2C, 0x11, 0x08, 0x11, - 0x26, 0x11, 0x0E, 0x11, 0x20, 0x11, 0x14, 0x11, 0x1A, 0x11, 0x07, 0x01, 0x00, 0x00, 0x16, 0x22, - 0x00, 0x04, 0x08, 0x01, 0x00, 0x00, 0x16, 0x26, 0x00, 0x04, 0x09, 0x01, 0x00, 0x00, 0x16, 0x2A, - 0x00, 0x04, 0x0A, 0x01, 0x00, 0x00, 0x16, 0x2E, 0x00, 0x04, 0x0B, 0x01, 0x00, 0x00, 0x10, 0x24, - 0x04, 0x04, 0x0C, 0x01, 0x00, 0x00, 0x10, 0x28, 0x04, 0x04, 0x0D, 0x01, 0x00, 0x00, 0x10, 0x2C, - 0x04, 0x04, 0x0E, 0x01, 0x00, 0x00, 0x10, 0x30, 0x04, 0x04, 0x0F, 0x01, 0x00, 0x00, 0x14, 0x34, - 0x08, 0x84, 0x10, 0x01, 0x00, 0x00, 0x14, 0x38, 0x08, 0x84, 0x11, 0x01, 0x00, 0x00, 0x14, 0x3C, - 0x08, 0x84, 0x12, 0x01, 0x00, 0x00, 0x14, 0x40, 0x08, 0x84, 0x13, 0x01, 0x00, 0x00, 0x17, 0x64, - 0x0C, 0x8B, 0x14, 0x01, 0x00, 0x00, 0x17, 0x68, 0x0C, 0x8B, 0x15, 0x01, 0x00, 0x00, 0x17, 0x6C, - 0x0C, 0x8B, 0x16, 0x01, 0x00, 0x00, 0x17, 0x70, 0x0C, 0x8B, 0x17, 0x01, 0x00, 0x00, 0x17, 0x74, - 0x0C, 0x8B, 0x18, 0x01, 0x00, 0x00, 0x17, 0x78, 0x0C, 0x8B, 0x19, 0x01, 0x00, 0x00, 0x17, 0x7C, - 0x0C, 0x8B, 0x1A, 0x01, 0x00, 0x00, 0x17, 0x80, 0x0C, 0x8B, 0x1B, 0x01, 0x00, 0x00, 0x17, 0x84, - 0x0C, 0x8B, 0x1C, 0x01, 0x00, 0x00, 0x17, 0x88, 0x0C, 0x8B, 0x1D, 0x01, 0x00, 0x00, 0x17, 0x8C, - 0x0C, 0x8B, 0x1E, 0x01, 0x00, 0x00, 0x0E, 0x95, 0x17, 0x04, 0x1F, 0x01, 0x00, 0x00, 0x0E, 0x99, - 0x17, 0x04, 0x20, 0x01, 0x00, 0x00, 0x0E, 0x9D, 0x17, 0x04, 0x21, 0x01, 0x00, 0x00, 0x0E, 0xA1, - 0x17, 0x04, 0x22, 0x01, 0x00, 0x00, 0x0E, 0xA5, 0x00, 0x00, 0x60, 0x11, 0x80, 0x11, 0xA0, 0x11, - 0xC0, 0x11, 0x18, 0x12, 0x68, 0x11, 0x88, 0x11, 0xA8, 0x11, 0xC8, 0x11, 0x20, 0x12, 0x70, 0x11, - 0x90, 0x11, 0xB0, 0x11, 0xD0, 0x11, 0x28, 0x12, 0x78, 0x11, 0x98, 0x11, 0xB8, 0x11, 0xD8, 0x11, - 0x30, 0x12, 0xE0, 0x11, 0xE8, 0x11, 0xF0, 0x11, 0xF8, 0x11, 0x00, 0x12, 0x08, 0x12, 0x10, 0x12, - 0x38, 0x12, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x0A, 0x0A, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x1E, 0x1E, 0x1E, 0x1E, - 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x0A, 0x0A, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x10, 0x10, - 0x10, 0x10, 0x17, 0x17, 0x17, 0x17, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, - 0x14, 0x14, 0x14, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x11, 0x11, 0x11, 0x11, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x16, 0x16, - 0x16, 0x16, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x0A, - 0x0A, 0x0A, 0x0A, 0x7F, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, - 0x14, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x10, 0x10, 0x10, 0x10, 0x7F, 0x14, 0x14, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x0A, 0x0A, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x9D, 0x9D, 0xA1, 0xB4, - 0x10, 0x10, 0x00, 0x9D, 0x08, 0x02, 0x06, 0x00, 0xA5, 0xA5, 0xAA, 0xB4, 0x10, 0x10, 0x00, 0xA2, - 0x15, 0x05, 0x07, 0x00, 0xAA, 0xAA, 0xB4, 0xB4, 0x10, 0x10, 0x00, 0xA7, 0x1C, 0x0A, 0x08, 0x00, - 0xB7, 0xB7, 0xC1, 0xC1, 0x10, 0x10, 0x00, 0xB4, 0x29, 0x17, 0x08, 0x00, 0xBD, 0xBD, 0xC7, 0xC7, - 0x10, 0x10, 0x00, 0xBA, 0x2F, 0x1D, 0x08, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x1F, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x42, 0x2A, 0x5B, 0x2A, 0x7E, 0x2A, 0x71, 0x30, 0xEE, 0x29, 0x88, 0x30, 0xB8, 0x2A, - 0x9F, 0x30, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0x21, 0x35, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, - 0xEE, 0x29, 0xEE, 0x29, 0x93, 0x2C, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, - 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, - 0xEE, 0x29, 0xEE, 0x29, 0xDE, 0x2C, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, - 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, - 0xEE, 0x29, 0x61, 0x2C, 0x7C, 0x2C, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, 0xEE, 0x29, - 0xEE, 0x29, 0xE1, 0x27, 0xD7, 0x2A, 0xEA, 0x2A, 0x9A, 0x2B, 0x9E, 0x2B, 0xEE, 0x29, 0xEE, 0x29, - 0x4D, 0x2C, 0xA1, 0xF2, 0x62, 0xF2, 0x00, 0x00, 0x99, 0xF2, 0xEE, 0xF2, 0x12, 0xF3, 0x48, 0xF3, - 0x00, 0x00, 0x00, 0x00, 0x70, 0x2A, 0x94, 0x2A, 0x00, 0x00, 0x67, 0x30, 0x7E, 0x30, 0x95, 0x30, - 0xAF, 0x30, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0x45, 0x2D, 0xF7, 0x2F, 0x5A, 0x00, 0x02, 0x00, - 0xF9, 0xFF, 0x45, 0x2D, 0x5B, 0x2D, 0xFC, 0x00, 0x02, 0x00, 0xF7, 0xFF, 0x45, 0x2D, 0x5B, 0x2D, - 0xAA, 0x2D, 0x06, 0x00, 0xF0, 0xFF, 0x45, 0x2D, 0x22, 0x2D, 0x00, 0x00, 0x00, 0x02, 0xF6, 0xFF, - 0x45, 0x2D, 0x5B, 0x2D, 0x6C, 0x00, 0x02, 0x00, 0xF4, 0xFF, 0x45, 0x2D, 0x5B, 0x2D, 0xA6, 0x01, - 0x02, 0x00, 0xF5, 0xFF, 0x45, 0x2D, 0x00, 0x30, 0x9C, 0x2D, 0x02, 0x00, 0xED, 0xFF, 0x45, 0x2D, - 0x12, 0x30, 0x98, 0x32, 0x02, 0x00, 0xEC, 0xFF, 0x45, 0x2D, 0x40, 0x30, 0x9A, 0x32, 0x02, 0x00, - 0xEB, 0xFF, 0x45, 0x2D, 0x46, 0x30, 0x9C, 0x32, 0x02, 0x00, 0xEE, 0xFF, 0x45, 0x2D, 0x4C, 0x30, - 0x12, 0x33, 0x02, 0x00, 0xDA, 0xFF, 0x45, 0x2D, 0x5B, 0x2D, 0xF2, 0x13, 0x0C, 0x00, 0xEA, 0xFF, - 0x45, 0x2D, 0x22, 0x2D, 0x4C, 0x33, 0x06, 0x00, 0xE9, 0xFF, 0x45, 0x2D, 0x5B, 0x2D, 0x52, 0x33, - 0x02, 0x00, 0xE8, 0xFF, 0x45, 0x2D, 0x5B, 0x2D, 0x54, 0x33, 0x02, 0x00, 0xE7, 0xFF, 0x45, 0x2D, - 0x5B, 0x2D, 0x56, 0x33, 0x02, 0x00, 0xE6, 0xFF, 0x45, 0x2D, 0x5B, 0x2D, 0x58, 0x33, 0x02, 0x00, - 0xE5, 0xFF, 0x45, 0x2D, 0x5B, 0x2D, 0x5A, 0x33, 0x10, 0x00, 0xE4, 0xFF, 0x45, 0x2D, 0x5B, 0x2D, - 0x6A, 0x33, 0x18, 0x00, 0xDB, 0xFF, 0x45, 0x2D, 0x5B, 0x2D, 0x82, 0x33, 0x02, 0x00, 0xDC, 0xFF, - 0x45, 0x2D, 0x5B, 0x2D, 0x84, 0x33, 0x02, 0x00, 0xE1, 0xFF, 0x45, 0x2D, 0x5B, 0x2D, 0x5A, 0x34, - 0x02, 0x00, 0xE0, 0xFF, 0x45, 0x2D, 0x5B, 0x2D, 0x58, 0x34, 0x02, 0x00, 0xE3, 0xFF, 0x45, 0x2D, - 0x5B, 0x2D, 0x3C, 0x34, 0x02, 0x00, 0xE2, 0xFF, 0x93, 0x2D, 0x22, 0x2D, 0xF2, 0x33, 0x24, 0x00, - 0x03, 0xFC, 0x45, 0x2D, 0x01, 0x2F, 0x8C, 0x32, 0x02, 0x00, 0x04, 0xFC, 0x45, 0x2D, 0x55, 0x2D, - 0xB4, 0x2D, 0x22, 0x00, 0x06, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0x9A, 0x2D, 0x02, 0x00, 0x07, 0xFC, - 0x45, 0x2D, 0x5B, 0x2D, 0xF8, 0x2D, 0x02, 0x00, 0x0E, 0xFC, 0x45, 0x2D, 0x2A, 0x2F, 0x02, 0x2E, - 0x22, 0x00, 0xB1, 0xFC, 0x45, 0x2D, 0x39, 0x31, 0x00, 0x2F, 0x02, 0x00, 0x20, 0xFC, 0x45, 0x2D, - 0x5B, 0x2D, 0x28, 0x2E, 0x02, 0x00, 0x25, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0x34, 0x2E, 0x02, 0x00, - 0x26, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0x36, 0x2E, 0x02, 0x00, 0x27, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, - 0x38, 0x2E, 0x02, 0x00, 0xB2, 0xFC, 0x45, 0x2D, 0x55, 0x2D, 0x24, 0x2F, 0x22, 0x00, 0xC1, 0xFC, - 0x45, 0x2D, 0x5B, 0x2D, 0x9E, 0x33, 0x20, 0x00, 0xB0, 0xFC, 0x18, 0x2D, 0x3D, 0x31, 0x00, 0x00, - 0x00, 0x00, 0xC4, 0xFC, 0x18, 0x2D, 0x57, 0x30, 0x00, 0x00, 0x08, 0x00, 0xC8, 0xFC, 0x18, 0x2D, - 0x55, 0x30, 0x00, 0x00, 0x08, 0x00, 0xB4, 0xFC, 0x18, 0x2D, 0x71, 0x31, 0x00, 0x00, 0x00, 0x00, - 0xB6, 0xFC, 0x18, 0x2D, 0x19, 0x32, 0x00, 0x00, 0x00, 0x00, 0xB7, 0xFC, 0x18, 0x2D, 0x43, 0x32, - 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFC, 0x18, 0x2D, 0x99, 0x32, 0x00, 0x00, 0x00, 0x00, 0xBC, 0xFC, - 0x18, 0x2D, 0xD2, 0x32, 0x00, 0x00, 0x00, 0x00, 0xBD, 0xFC, 0x18, 0x2D, 0x58, 0x33, 0x00, 0x00, - 0x00, 0x00, 0xBE, 0xFC, 0x18, 0x2D, 0x82, 0x33, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFC, 0x18, 0x2D, - 0xCF, 0x33, 0x00, 0x00, 0x00, 0x00, 0xB3, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0xA0, 0x0F, 0x10, 0x00, - 0xB5, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0x38, 0x34, 0x02, 0x00, 0xB9, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, - 0x3A, 0x34, 0x02, 0x00, 0x90, 0xFD, 0x45, 0x2D, 0x22, 0x2D, 0x3E, 0x34, 0x02, 0x00, 0x88, 0xFC, - 0x45, 0x2D, 0x5B, 0x2D, 0x72, 0x32, 0x04, 0x00, 0x89, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0x76, 0x32, - 0x04, 0x00, 0xC5, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0x7A, 0x32, 0x04, 0x00, 0x23, 0xFC, 0x45, 0x2D, - 0x5B, 0x2D, 0x2E, 0x2E, 0x04, 0x00, 0x2A, 0xFC, 0x45, 0x2D, 0xE9, 0x2D, 0xB0, 0x2D, 0x02, 0x00, - 0xC7, 0xFD, 0x45, 0x2D, 0x22, 0x2D, 0xA0, 0x32, 0x0A, 0x00, 0x29, 0xFC, 0x3C, 0x2E, 0x00, 0x2E, - 0x00, 0x00, 0x00, 0x00, 0xC2, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0x80, 0x32, 0x08, 0x00, 0x32, 0xFC, - 0x45, 0x2D, 0x5B, 0x2D, 0x98, 0x01, 0x02, 0x00, 0x33, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0x9A, 0x01, - 0x02, 0x00, 0x35, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0x88, 0x32, 0x02, 0x00, 0xC7, 0xFC, 0x45, 0x2D, - 0xD3, 0x2F, 0x8A, 0x32, 0x02, 0x00, 0x00, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0xB2, 0x2D, 0x02, 0x00, - 0x01, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0xAA, 0x2D, 0x06, 0x00, 0x02, 0xFC, 0x45, 0x2D, 0xD5, 0x2D, - 0x02, 0x2F, 0x22, 0x00, 0x05, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0xA0, 0x2D, 0x02, 0x00, 0x08, 0xFC, - 0x45, 0x2D, 0x5B, 0x2D, 0xA4, 0x2D, 0x06, 0x00, 0x09, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0xFA, 0x2D, - 0x02, 0x00, 0x0B, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0xFC, 0x2D, 0x02, 0x00, 0x0C, 0xFC, 0x45, 0x2D, - 0x5B, 0x2D, 0xFE, 0x2D, 0x02, 0x00, 0x0D, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0x00, 0x2E, 0x02, 0x00, - 0x21, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0x2A, 0x2E, 0x02, 0x00, 0x80, 0xFC, 0xB1, 0x2D, 0xC1, 0x2D, - 0x40, 0x2E, 0xC0, 0x00, 0x81, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, 0xA4, 0x01, 0x02, 0x00, 0x83, 0xFC, - 0x45, 0x2D, 0x5B, 0x2D, 0xA8, 0x01, 0x02, 0x00, 0x85, 0xFC, 0x45, 0x2D, 0x4A, 0x2F, 0xA0, 0x01, - 0x02, 0x00, 0x86, 0xFC, 0x45, 0x2D, 0x6E, 0x2F, 0xB0, 0x01, 0x02, 0x00, 0x28, 0xFC, 0x45, 0x2D, - 0x5B, 0x2D, 0x3A, 0x2E, 0x02, 0x00, 0x90, 0xFC, 0x45, 0x2D, 0x5C, 0x2F, 0xA2, 0x01, 0x02, 0x00, - 0x87, 0xFC, 0x45, 0x2D, 0x8C, 0x2F, 0x50, 0x2F, 0x22, 0x03, 0x30, 0xFC, 0x45, 0x2D, 0x5B, 0x2D, - 0x3C, 0x2E, 0x02, 0x00, 0x84, 0xFC, 0x45, 0x2D, 0x92, 0x2F, 0xAC, 0x01, 0x04, 0x00, 0x2B, 0xFC, - 0x45, 0x2D, 0x5B, 0x2D, 0xE2, 0x37, 0x02, 0x00, 0xF8, 0xFF, 0x45, 0x2D, 0x5B, 0x2D, 0xDC, 0x37, - 0x02, 0x00, 0xF3, 0xFF, 0x45, 0x2D, 0x5B, 0x2D, 0xE4, 0x37, 0x02, 0x00, 0x20, 0xFD, 0x76, 0x2D, - 0x22, 0x2D, 0x5E, 0x40, 0x08, 0x00, 0x21, 0xFD, 0x76, 0x2D, 0x22, 0x2D, 0x62, 0x40, 0x0A, 0x00, - 0x22, 0xFD, 0x76, 0x2D, 0x22, 0x2D, 0x67, 0x40, 0x16, 0x00, 0x23, 0xFD, 0x76, 0x2D, 0x22, 0x2D, - 0x72, 0x40, 0x0A, 0x00, 0x45, 0xFD, 0x45, 0x2D, 0x22, 0x2D, 0xFC, 0x00, 0x02, 0x00, 0x47, 0xFD, - 0x45, 0x2D, 0x22, 0x2D, 0x72, 0x01, 0x02, 0x00, 0x48, 0xFD, 0x91, 0x2E, 0x22, 0x2D, 0x98, 0x01, - 0x02, 0x00, 0x49, 0xFD, 0x91, 0x2E, 0x22, 0x2D, 0x9A, 0x01, 0x02, 0x00, 0x4A, 0xFD, 0x45, 0x2D, - 0x22, 0x2D, 0x92, 0x01, 0x02, 0x00, 0x4B, 0xFD, 0x45, 0x2D, 0x22, 0x2D, 0x94, 0x01, 0x02, 0x00, - 0x4D, 0xFD, 0x76, 0x2D, 0x22, 0x2D, 0x77, 0x40, 0x0C, 0x00, 0x4F, 0xFD, 0xA5, 0x2E, 0x22, 0x2D, - 0x90, 0x32, 0x02, 0x00, 0xC2, 0xFD, 0x9B, 0x2E, 0x22, 0x2D, 0x00, 0x00, 0x02, 0x00, 0x40, 0xFD, - 0x6E, 0x2D, 0x22, 0x2D, 0xB6, 0x01, 0x02, 0x00, 0x24, 0xFD, 0xB5, 0x2E, 0x22, 0x2D, 0x00, 0x00, - 0x02, 0x00, 0x91, 0xFD, 0x45, 0x2D, 0x22, 0x2D, 0xC6, 0x25, 0x02, 0x00, 0x93, 0xFD, 0x45, 0x2D, - 0x22, 0x2D, 0xCC, 0x25, 0x02, 0x00, 0x8F, 0xFD, 0xD5, 0x2E, 0x22, 0x2D, 0x00, 0x00, 0x08, 0x00, - 0xC1, 0xFD, 0x00, 0x31, 0x22, 0x2D, 0xFA, 0x00, 0x02, 0x00, 0xC6, 0xFD, 0x45, 0x2D, 0x22, 0x2D, - 0xF8, 0x37, 0x04, 0x00, 0x25, 0xFD, 0x45, 0x2D, 0x22, 0x2D, 0x9E, 0x01, 0x02, 0x00, 0x89, 0xFD, - 0xB9, 0x30, 0x22, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x8A, 0xFD, 0x93, 0x2D, 0x22, 0x2D, 0x12, 0x34, - 0x24, 0x00, 0x41, 0xFD, 0x45, 0x2D, 0x22, 0x2D, 0xBE, 0x33, 0x22, 0x00, 0x42, 0xFD, 0x45, 0x2D, - 0x22, 0x2D, 0xFE, 0x00, 0x06, 0x00, 0x43, 0xFD, 0xC2, 0x2E, 0x22, 0x2D, 0x00, 0x00, 0x06, 0x00, - 0x44, 0xFD, 0xAC, 0x2E, 0x22, 0x2D, 0xB2, 0x01, 0x02, 0x00, 0x46, 0xFD, 0x21, 0x31, 0x22, 0x2D, - 0x00, 0x00, 0x00, 0x00, 0x4C, 0xFD, 0x45, 0x2D, 0x22, 0x2D, 0x46, 0x2F, 0x02, 0x00, 0x50, 0xFD, - 0x45, 0x2D, 0x22, 0x2D, 0xF2, 0x00, 0x02, 0x00, 0x51, 0xFD, 0x45, 0x2D, 0x22, 0x2D, 0xF4, 0x00, - 0x02, 0x00, 0x52, 0xFD, 0x45, 0x2D, 0x22, 0x2D, 0xC4, 0x01, 0x02, 0x00, 0x8C, 0xFD, 0x38, 0x2D, - 0x22, 0x2D, 0x98, 0x34, 0x56, 0x00, 0x8D, 0xFD, 0x38, 0x2D, 0x22, 0x2D, 0xF2, 0x34, 0x14, 0x00, - 0x00, 0xF1, 0x46, 0x00, 0xDC, 0x2C, 0x36, 0x01, 0x01, 0xF1, 0x84, 0x07, 0xDA, 0x2C, 0x38, 0x01, - 0x00, 0x03, 0xA0, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xFA, 0x00, 0xD4, 0x01, 0xFE, 0x00, 0x3A, 0x01, - 0xB6, 0x01, 0xCC, 0x2C, 0x54, 0x01, 0xC6, 0x25, 0x20, 0x00, 0x00, 0x00, 0xC0, 0x1D, 0x00, 0x00, - 0xC4, 0x1F, 0x4E, 0x01, 0x0B, 0x00, 0xB8, 0x00, 0xEC, 0x00, 0x44, 0x00, 0x46, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1C, 0x09, 0x08, 0x24, 0x28, 0x06, 0x0C, 0x18, 0x08, 0x30, 0x14, 0x0C, - 0x08, 0x36, 0x10, 0x12, 0x24, 0xB7, 0x97, 0xB6, 0xA3, 0xB7, 0xAC, 0xB7, 0xA8, 0xB6, 0x3E, 0xB7, - 0x16, 0xB7, 0x79, 0x3E, 0x57, 0x3D, 0x79, 0x3E, 0xF9, 0x3D, 0x5F, 0x3D, 0x52, 0x3D, 0x33, 0x3E, - 0x55, 0x3E, 0x6A, 0x3E, 0xAC, 0x3E, 0xD8, 0x3E, 0xF8, 0x3D, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, - 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, 0x22, 0x46, - 0x23, 0x46, 0x23, 0x46, 0x23, 0x46, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, - 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, 0x1C, 0x47, - 0x1D, 0x47, 0x9A, 0x48, 0xDA, 0x48, 0x1A, 0x48, 0x5A, 0x48, 0x9A, 0x48, 0xDA, 0x48, 0x1A, 0x48, - 0x5A, 0x48, 0x9A, 0x48, 0xDA, 0x48, 0x1A, 0x48, 0x5A, 0x48, 0x9A, 0x48, 0x33, 0x48, 0x78, 0x49, - 0x78, 0x49, 0x79, 0x49, 0x79, 0x49, 0x79, 0x49, 0x79, 0x49, 0x7A, 0x49, 0x7A, 0x49, 0x7A, 0x49, - 0x7A, 0x49, 0x7B, 0x49, 0x7B, 0x49, 0x7B, 0x49, 0x7C, 0x49, 0xD8, 0x03, 0xDC, 0x03, 0xE0, 0x03, - 0xE4, 0x03, 0xF0, 0x03, 0xF4, 0x03, 0xF8, 0x03, 0x0A, 0x04, 0x0E, 0x04, 0x12, 0x04, 0x16, 0x04, - 0x0C, 0x04, 0x10, 0x04, 0x14, 0x04, 0x18, 0x04, 0x1C, 0x04, 0x20, 0x04, 0x24, 0x04, 0x28, 0x04, - 0x4C, 0x04, 0x50, 0x04, 0x54, 0x04, 0x58, 0x04, 0x5C, 0x04, 0x60, 0x04, 0x64, 0x04, 0x68, 0x04, - 0x6C, 0x04, 0x70, 0x04, 0x74, 0x04, 0x7D, 0x04, 0x81, 0x04, 0x85, 0x04, 0x89, 0x04, 0x8D, 0x04, - 0x10, 0x00, 0x8E, 0x19, 0xAC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3C, 0x0C, 0x00, 0x00, - 0xFF, 0x3F, 0x44, 0x04, 0x00, 0x00, 0xD3, 0x22, 0x44, 0x04, 0x9C, 0x02, 0xCB, 0x54, 0x44, 0x04, - 0x00, 0x00, 0x01, 0x00, 0x44, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0C, 0x71, 0x00, 0x30, 0x50, - 0x20, 0x00, 0x80, 0xBF, 0x1F, 0xA6, 0x28, 0x00, 0x0B, 0x02, 0x60, 0x84, 0x4C, 0x00, 0x02, 0x00, - 0x4B, 0x1C, 0x98, 0x00, 0x00, 0x00, 0x20, 0x0B, 0x34, 0x04, 0xFD, 0x34, 0x34, 0x00, 0x38, 0x04, - 0xFD, 0x34, 0x34, 0x00, 0x3C, 0x04, 0x01, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x52, 0x14, 0x00, - 0x04, 0x08, 0x0E, 0x32, 0x00, 0xA6, 0x10, 0x08, 0xC4, 0x03, 0x50, 0x60, 0x18, 0x08, 0xF0, 0x3F, - 0xFC, 0x01, 0x10, 0x0C, 0x00, 0x00, 0x80, 0x04, 0x14, 0x0C, 0x00, 0x00, 0x00, 0x41, 0x20, 0x0C, - 0xB0, 0x00, 0xB0, 0xB8, 0x24, 0x0C, 0x00, 0x00, 0xAB, 0x05, 0x2C, 0x0C, 0x80, 0x05, 0x00, 0xFF, - 0x30, 0x0C, 0x00, 0x00, 0xB0, 0x04, 0x34, 0x0C, 0x03, 0x00, 0x00, 0xE8, 0x44, 0x0C, 0x04, 0x00, - 0xFF, 0x0F, 0x00, 0x10, 0x2E, 0x00, 0x0C, 0xE3, 0x44, 0x04, 0x00, 0x00, 0x01, 0x04, 0x44, 0x04, - 0x00, 0x00, 0x01, 0x01, 0x44, 0x04, 0x00, 0x00, 0x01, 0x00, 0x44, 0x04, 0x00, 0x00, 0x01, 0x04, - 0x44, 0x04, 0x00, 0x00, 0x80, 0x03, 0x48, 0x0C, 0x00, 0x00, 0x7F, 0x00, 0x04, 0x04, 0x08, 0x48, - 0x00, 0x00, 0x04, 0x04, 0x08, 0x40, 0x00, 0x00, 0x00, 0x0C, 0x71, 0x00, 0x30, 0x30, 0x00, 0x00, - 0x5E, 0x40, 0x01, 0x00, 0x18, 0x00, 0x36, 0xC0, 0xE8, 0x0E, 0x1C, 0x00, 0x78, 0xC8, 0xA5, 0x40, - 0x24, 0x00, 0x9E, 0xB0, 0xB9, 0x95, 0x08, 0x08, 0x00, 0xEA, 0x40, 0x01, 0x0C, 0x08, 0x00, 0xEA, - 0x00, 0x00, 0x1C, 0x08, 0x00, 0x00, 0x42, 0x07, 0x20, 0x08, 0x7B, 0x00, 0xD4, 0x09, 0x2C, 0x04, - 0x14, 0x00, 0x50, 0x14, 0x30, 0x04, 0x28, 0x0F, 0x28, 0x7F, 0x18, 0x08, 0x20, 0x00, 0xFC, 0x01, - 0x04, 0x10, 0x69, 0x00, 0xFD, 0xC3, 0x08, 0x10, 0x69, 0x00, 0xFD, 0xC3, 0x08, 0x0C, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x48, 0x0C, 0x00, 0x00, 0x7F, 0x00, 0x04, 0x04, - 0x08, 0x48, 0x02, 0x00, 0x00, 0x00, 0x5E, 0x48, 0x00, 0x00, 0x04, 0x04, 0x08, 0x40, 0x02, 0x00, - 0x00, 0x0C, 0x71, 0x00, 0x30, 0x50, 0x00, 0x00, 0x5E, 0x48, 0x01, 0x00, 0x18, 0x00, 0x3A, 0xC0, - 0xE8, 0x04, 0x1C, 0x00, 0x78, 0xD0, 0xA5, 0x40, 0x24, 0x00, 0x9E, 0xB0, 0xB9, 0x85, 0x2C, 0x04, - 0x14, 0x00, 0x50, 0x14, 0x30, 0x04, 0x28, 0x0F, 0x28, 0x7F, 0x08, 0x08, 0x00, 0xEA, 0x40, 0x01, - 0x0C, 0x08, 0x00, 0xEA, 0x00, 0x00, 0x1C, 0x08, 0x00, 0x00, 0x42, 0x07, 0x20, 0x08, 0x7B, 0x00, - 0xD4, 0x09, 0x18, 0x08, 0xF0, 0x3F, 0xFC, 0x01, 0x04, 0x10, 0x69, 0x00, 0xDD, 0xCD, 0x08, 0x10, - 0x69, 0x00, 0xDD, 0xCD, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x48, 0x0C, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x04, 0x40, 0x01, 0x41, 0x01, 0x0C, 0x04, 0x40, 0x04, 0x41, 0x04, 0x10, 0x04, 0xD6, 0x08, - 0x56, 0x0A, 0x14, 0x04, 0x42, 0x02, 0x56, 0x0A, 0x18, 0x04, 0x56, 0x0A, 0x40, 0x02, 0x1C, 0x04, - 0x42, 0x0A, 0x42, 0x2A, 0x20, 0x04, 0xC2, 0x00, 0xD6, 0x08, 0x24, 0x04, 0xD6, 0x08, 0xC0, 0x00, - 0x28, 0x04, 0xC2, 0x08, 0xC2, 0x28, 0x08, 0x04, 0x40, 0x01, 0x41, 0x01, 0x0C, 0x04, 0x00, 0x01, - 0x01, 0x01, 0x10, 0x04, 0x56, 0x0A, 0x56, 0x0A, 0x14, 0x04, 0x42, 0x02, 0x56, 0x0A, 0x18, 0x04, - 0x56, 0x0A, 0x40, 0x02, 0x1C, 0x04, 0x42, 0x0A, 0x42, 0x2A, 0x20, 0x04, 0x42, 0x02, 0x56, 0x0A, - 0x24, 0x04, 0x56, 0x0A, 0x40, 0x02, 0x28, 0x04, 0x42, 0x0A, 0x42, 0x2A, 0x08, 0x04, 0x40, 0x01, - 0x41, 0x01, 0x0C, 0x04, 0x40, 0x04, 0x41, 0x04, 0x10, 0x04, 0xCE, 0x08, 0x4E, 0x0A, 0x14, 0x04, - 0x42, 0x02, 0x4E, 0x0A, 0x18, 0x04, 0x4E, 0x0A, 0x40, 0x02, 0x1C, 0x04, 0x42, 0x0A, 0x42, 0x2A, - 0x20, 0x04, 0xC2, 0x00, 0xCE, 0x08, 0x24, 0x04, 0xCE, 0x08, 0xC0, 0x00, 0x28, 0x04, 0xC2, 0x08, - 0xC2, 0x28, 0x08, 0x04, 0x40, 0x01, 0x41, 0x01, 0x0C, 0x04, 0x00, 0x01, 0x01, 0x01, 0x10, 0x04, - 0x4E, 0x0A, 0x4E, 0x0A, 0x14, 0x04, 0x42, 0x02, 0x4E, 0x0A, 0x18, 0x04, 0x4E, 0x0A, 0x40, 0x02, - 0x1C, 0x04, 0x42, 0x0A, 0x42, 0x2A, 0x20, 0x04, 0x42, 0x02, 0x4E, 0x0A, 0x24, 0x04, 0x4E, 0x0A, - 0x40, 0x02, 0x28, 0x04, 0x42, 0x0A, 0x42, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x05, 0x00, 0xA0, 0x16, 0xA0, 0x16, - 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, - 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, - 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x16, - 0xA0, 0x16, 0xA0, 0x16, 0xA0, 0x17, 0xA0, 0x17, 0xA0, 0x17, 0xA0, 0x18, 0xFF, 0x06, 0xFF, 0x06, - 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, - 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, - 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, - 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0x00, 0x00, 0x65, 0x00, - 0x65, 0x00, 0x65, 0x00, 0x65, 0x00, 0x5D, 0x00, 0x52, 0x00, 0x48, 0x00, 0x40, 0x00, 0x38, 0x00, - 0x31, 0x00, 0x2C, 0x00, 0x27, 0x00, 0x23, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x65, 0x00, 0x65, 0x00, - 0x65, 0x00, 0x65, 0x00, 0x5D, 0x00, 0x52, 0x00, 0x48, 0x00, 0x40, 0x00, 0x38, 0x00, 0x31, 0x00, - 0x2C, 0x00, 0x27, 0x00, 0x23, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, - 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, - 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, - 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x15, 0x00, 0x6E, 0x6F, 0x6E, 0x2D, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x53, 0x53, 0x49, 0x44, 0x20, 0x21, - 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x00, 0x00, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x09, - 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0x64, 0x00, 0x00, 0x00, 0x48, 0x45, 0x52, 0x4D, 0x45, 0x53, - 0x20, 0x32, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x15, 0x00, - 0x6E, 0x6F, 0x6E, 0x2D, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x53, 0x53, - 0x49, 0x44, 0x20, 0x21, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x01, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x00, 0x09, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0x64, 0x00, 0x00, 0x00, 0x48, 0x45, - 0x52, 0x4D, 0x45, 0x53, 0x20, 0x32, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x69, - 0x72, 0x73, 0x74, 0x20, 0x57, 0x61, 0x76, 0x65, 0x4C, 0x41, 0x4E, 0x20, 0x49, 0x49, 0x20, 0x53, - 0x53, 0x49, 0x44, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0xF0, 0x0F, - 0x0F, 0x00, 0x50, 0x01, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, - 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x24, 0x00, 0xFF, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0A, 0x00, - 0x0B, 0x00, 0x0B, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x02, 0x01, - 0x02, 0x04, 0x0B, 0x16, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x82, 0x84, 0x8B, 0x96, 0x00, 0x00, - 0x00, 0x00, 0x1C, 0x85, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x20, 0x00, 0x1B, 0x00, 0x17, 0x00, 0x11, 0x00, 0x10, 0x00, 0x0B, 0x00, - 0x0B, 0x00, 0x09, 0x00, 0x17, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0D, 0x00, 0x0B, 0x00, 0x09, 0x00, - 0x08, 0x00, 0x07, 0x00, 0x0D, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x08, 0x00, 0x05, 0x00, 0x05, 0x00, - 0xD8, 0x0C, 0xC0, 0x08, 0x90, 0x0D, 0x60, 0x09, 0x48, 0x0E, 0x30, 0x0A, 0x24, 0x0F, 0x18, 0x0B, - 0x0B, 0x6E, 0x0B, 0x37, 0x02, 0x14, 0x01, 0x0A, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, - 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6E, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x53, 0x65, 0x74, 0x20, 0x49, - 0x64, 0x65, 0x6E, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xDD, 0x00, 0x50, - 0xF2, 0x01, 0x01, 0x00, 0x00, 0x50, 0xF2, 0x05, 0x02, 0x00, 0x00, 0x50, 0xF2, 0x02, 0x00, 0x50, - 0xF2, 0x04, 0x02, 0x00, 0x00, 0x50, 0xF2, 0x00, 0x00, 0x50, 0xF2, 0x01, 0x06, 0x00, 0x00, 0x00, - 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x00, 0x14, 0x00, 0x15, 0x00, 0x36, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x14, 0x00, - 0x11, 0x00, 0x36, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x10, 0x00, 0xBE, 0x33, 0x1E, 0x33, 0xCC, 0x35, 0xD0, 0x35, 0xD4, 0x35, 0x12, 0x34, - 0x04, 0x36, 0x08, 0x36, 0xF2, 0x33, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2F, 0x14, 0x33, 0x08, 0x36, - 0xFF, 0xFF, 0x00, 0x00, 0xBE, 0x33, 0x1E, 0x33, 0xCC, 0x35, 0xD0, 0x35, 0xD4, 0x35, 0x12, 0x34, - 0x04, 0x36, 0x08, 0x36, 0xF2, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0xBE, 0x33, 0x14, 0x33, 0x08, 0x36, 0x5C, 0x34, 0x2A, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00, 0x02, 0x06, 0x00, 0x00, 0x06, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2A, - 0x00, 0x00, 0x08, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0x00, 0x30, 0x00, 0xFF, 0xFF, 0x1D, 0xFA, - 0xF9, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x19, 0x0A, - 0x09, 0x46, 0x1C, 0x60, 0x18, 0x00, 0x19, 0x1D, 0x09, 0x42, 0x1C, 0x60, 0x00, 0x00, - -}; /* fw_image_2_data */ - -static const hcf_8 fw_image_3_data[] = { - 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x26, 0x1A, 0x00, 0x80, 0x3A, 0x15, 0x00, 0x7F, 0xF1, - 0x32, 0xF2, 0x33, 0xF2, 0xD0, 0x80, 0x80, 0xF1, 0x0F, 0x02, 0xD0, 0x80, 0x34, 0xF2, 0x81, 0xF1, - 0x0B, 0x02, 0xD0, 0x80, 0xFF, 0xFF, 0x08, 0x02, 0xE9, 0x60, 0x58, 0x4F, 0x30, 0x78, 0xFF, 0xFF, - 0x24, 0x60, 0x58, 0x4F, 0xE3, 0x78, 0xFF, 0xFF, 0x1C, 0x60, 0xD7, 0x78, 0xFF, 0xFF, 0x00, 0xF4, - 0xAA, 0x60, 0xAA, 0x65, 0x09, 0xF2, 0x5A, 0xD0, 0xD4, 0x80, 0x03, 0x64, 0x12, 0x02, 0xD0, 0x80, - 0x1D, 0x60, 0x60, 0x65, 0x0E, 0x02, 0x5A, 0xD2, 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x60, 0x00, 0x65, - 0x08, 0x02, 0x5A, 0xD2, 0xFF, 0xFF, 0xD4, 0x80, 0xFF, 0xFF, 0x03, 0x02, 0x1C, 0x60, 0xD7, 0x78, - 0xFF, 0xFF, 0x00, 0x60, 0xEA, 0xF1, 0x5A, 0xD1, 0x44, 0x48, 0x5A, 0xD1, 0x44, 0x4A, 0x26, 0x46, - 0x3F, 0xF2, 0x00, 0xF4, 0x44, 0x4C, 0xD8, 0x83, 0x70, 0x61, 0x68, 0x65, 0xD7, 0x80, 0xFF, 0xFF, - 0x07, 0x0E, 0x08, 0xF2, 0x08, 0x00, 0x68, 0x65, 0xD7, 0x80, 0xFF, 0xFF, 0x01, 0x0E, 0x03, 0x00, - 0x1C, 0x60, 0xED, 0x78, 0xFF, 0xFF, 0x58, 0x4F, 0x79, 0x00, 0x9C, 0x80, 0x01, 0x65, 0x02, 0x02, - 0x00, 0x65, 0x02, 0x00, 0xFF, 0x3B, 0xF7, 0x01, 0x58, 0x4F, 0x70, 0x00, 0x9C, 0x80, 0x45, 0x42, - 0xEA, 0x02, 0x58, 0x4F, 0x6B, 0x00, 0x9C, 0x80, 0xFF, 0xFF, 0xE5, 0x02, 0x58, 0x4F, 0x66, 0x00, - 0x9C, 0x80, 0xFF, 0xFF, 0x03, 0x02, 0x00, 0x65, 0x45, 0x42, 0xF8, 0x01, 0xFF, 0x3A, 0x29, 0x00, - 0x60, 0x47, 0xFF, 0xB5, 0x28, 0x44, 0xFF, 0xB4, 0x94, 0x80, 0xFF, 0xFF, 0xD4, 0x02, 0x60, 0x45, - 0x28, 0x47, 0x2A, 0x5F, 0x40, 0x48, 0x2A, 0x47, 0x2C, 0x5F, 0x40, 0x4A, 0x2C, 0x47, 0x65, 0x5F, - 0x40, 0x4C, 0x10, 0x64, 0x40, 0x42, 0x28, 0x45, 0x05, 0x00, 0x58, 0x4F, 0x47, 0x00, 0x94, 0x80, - 0x28, 0x45, 0x26, 0x02, 0x58, 0x4F, 0x42, 0x00, 0x94, 0x80, 0x2A, 0x45, 0x21, 0x02, 0x58, 0x4F, - 0x3D, 0x00, 0x94, 0x80, 0xFF, 0xFF, 0x1C, 0x02, 0x22, 0x44, 0x4C, 0x82, 0x2C, 0x45, 0x31, 0x03, - 0xEC, 0x01, 0x10, 0x65, 0x45, 0x42, 0x28, 0x45, 0x94, 0x80, 0x2A, 0x45, 0x21, 0x02, 0x58, 0x4F, - 0x2D, 0x00, 0x94, 0x80, 0x2C, 0x45, 0x1C, 0x02, 0x58, 0x4F, 0x28, 0x00, 0x94, 0x80, 0xFF, 0xFF, - 0x17, 0x02, 0x22, 0x44, 0x4C, 0x82, 0x28, 0x45, 0x1C, 0x03, 0x58, 0x4F, 0x1F, 0x00, 0xEC, 0x01, - 0x40, 0x4B, 0x28, 0x47, 0x40, 0x48, 0x2A, 0x47, 0x40, 0x4A, 0x2C, 0x47, 0x60, 0x45, 0x2A, 0x5E, - 0x40, 0x4C, 0x2A, 0x44, 0x28, 0x5E, 0x40, 0x4A, 0x28, 0x44, 0x65, 0x5E, 0x40, 0x48, 0x2B, 0x44, - 0x68, 0x65, 0xD7, 0x80, 0xFF, 0xFF, 0x17, 0x0E, 0x90, 0x01, 0x26, 0x46, 0xD0, 0x60, 0xB5, 0x78, - 0xFF, 0xFF, 0xB9, 0xFF, 0x26, 0x46, 0xD0, 0x60, 0xB5, 0x78, 0xFF, 0xFF, 0xC9, 0x81, 0xCB, 0x83, - 0x07, 0x1C, 0x01, 0x1D, 0x08, 0x00, 0x00, 0xF4, 0x01, 0xF2, 0xFF, 0xFF, 0xFF, 0xB4, 0xD8, 0x81, - 0x5A, 0xD2, 0x2F, 0x58, 0xFF, 0xFF, 0x26, 0x46, 0xD0, 0x60, 0x58, 0x4F, 0xD1, 0x78, 0xFF, 0xFF, - 0x01, 0x60, 0xFE, 0x61, 0x00, 0xF4, 0x12, 0x63, 0x6A, 0x64, 0x01, 0x65, 0xBD, 0xD0, 0xC8, 0x84, - 0x59, 0xD9, 0xFC, 0x02, 0x65, 0x40, 0x01, 0x3A, 0x05, 0x00, 0x00, 0xF4, 0x00, 0x65, 0x0E, 0x64, - 0x04, 0x63, 0xF4, 0x01, 0x2F, 0x60, 0x58, 0x64, 0x0E, 0x60, 0xD9, 0xFB, 0x1D, 0x60, 0xB0, 0x64, - 0xA0, 0xDF, 0x17, 0x60, 0xA8, 0xF3, 0x0E, 0x60, 0xDB, 0xFB, 0x0E, 0x60, 0xDB, 0xF3, 0x0E, 0x60, - 0xD8, 0xF3, 0x60, 0x45, 0xD4, 0x80, 0xFF, 0xFF, 0x03, 0x02, 0x1D, 0x60, 0x7B, 0x78, 0xFF, 0xFF, - 0x01, 0x64, 0x0E, 0x60, 0xD7, 0xFB, 0x0E, 0x60, 0xD9, 0xF3, 0x02, 0x60, 0x00, 0x61, 0x40, 0x48, - 0x40, 0x4A, 0xFA, 0xA4, 0xA0, 0xD3, 0x41, 0x4C, 0xDC, 0x84, 0xA8, 0x84, 0x0E, 0x60, 0xDC, 0xFB, - 0x28, 0x45, 0x44, 0x8B, 0x2B, 0xD3, 0x0E, 0x60, 0xDA, 0xFB, 0x28, 0x42, 0x4A, 0xD3, 0x2C, 0x45, - 0x44, 0x8C, 0x01, 0x64, 0x40, 0x48, 0x0E, 0x60, 0xDC, 0xF3, 0xFF, 0xFF, 0x36, 0x18, 0xCC, 0x84, - 0xA2, 0xDB, 0x0E, 0x60, 0xDA, 0xF3, 0x28, 0x45, 0xA4, 0x80, 0xFF, 0xFF, 0x08, 0x03, 0x60, 0xFE, - 0x2C, 0xD3, 0x2A, 0xD3, 0x60, 0x45, 0xD4, 0x80, 0x20, 0xFE, 0x01, 0x03, 0x12, 0x00, 0x28, 0x44, - 0xE0, 0x84, 0xFF, 0xFF, 0x02, 0x24, 0x01, 0x00, 0x06, 0x00, 0x2B, 0x44, 0x58, 0x8B, 0x2B, 0xD3, - 0x0E, 0x60, 0xDA, 0xFB, 0x01, 0x64, 0x40, 0x48, 0x2A, 0x44, 0x5C, 0x8A, 0x2C, 0x44, 0x5C, 0x8C, - 0xDA, 0x01, 0x00, 0x64, 0x0E, 0x60, 0xD7, 0xFB, 0x0E, 0x60, 0xD9, 0xF3, 0xFF, 0xFF, 0x60, 0x45, - 0xFA, 0xA4, 0xA0, 0xD3, 0xFF, 0xFF, 0xC4, 0x81, 0x65, 0x44, 0xFC, 0xA4, 0xA0, 0xD3, 0x06, 0xA1, - 0xDC, 0x84, 0xA8, 0x84, 0x44, 0x94, 0x0E, 0x60, 0xD9, 0xFB, 0x0E, 0x60, 0xD7, 0xF3, 0xFF, 0xFF, - 0x60, 0x40, 0x01, 0x26, 0x09, 0x00, 0x0E, 0x60, 0xD8, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, 0xA2, 0xDB, - 0x94, 0x01, 0x1C, 0x60, 0xD7, 0x78, 0xFF, 0xFF, 0x1C, 0x60, 0xDB, 0x78, 0xFF, 0xFF, 0x00, 0x60, - 0x2E, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x25, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x5F, 0xFB, 0x01, 0x60, - 0x05, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x25, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x5E, 0xFB, 0x00, 0x60, - 0x02, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x25, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x65, 0xFB, 0x1F, 0x60, - 0x6D, 0x64, 0x08, 0x60, 0x36, 0xFB, 0x2F, 0x58, 0xFF, 0xFF, 0x01, 0x64, 0xDB, 0xFB, 0xF1, 0xF3, - 0xFF, 0xFF, 0xFE, 0xB4, 0xF1, 0xFB, 0x10, 0x60, 0x30, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x60, - 0x14, 0x63, 0x01, 0x60, 0xC2, 0x61, 0x2D, 0x60, 0x98, 0x64, 0x58, 0xD1, 0x59, 0xD9, 0xFD, 0x1F, - 0x00, 0x60, 0x8A, 0x63, 0x2D, 0x60, 0x0C, 0x61, 0x2D, 0x60, 0xB0, 0x64, 0x58, 0xD1, 0x59, 0xD9, - 0xFD, 0x1F, 0x16, 0x60, 0xAB, 0xF3, 0x19, 0x60, 0x48, 0xF1, 0xFF, 0xB5, 0x64, 0x40, 0x02, 0x2B, - 0x0B, 0x00, 0x60, 0x40, 0x03, 0x2E, 0x08, 0x00, 0x80, 0x2B, 0x06, 0x00, 0x32, 0x44, 0x00, 0x60, - 0x80, 0x63, 0x3C, 0x94, 0x40, 0x52, 0x05, 0x00, 0x32, 0x44, 0xFF, 0x60, 0x7F, 0x63, 0x2C, 0x94, - 0x40, 0x52, 0x65, 0x43, 0x16, 0x60, 0xAB, 0xFD, 0x16, 0x60, 0xC2, 0xF1, 0x66, 0x41, 0xA6, 0xF5, - 0x3A, 0xF2, 0x64, 0x40, 0x01, 0x36, 0x22, 0x64, 0x3A, 0xFA, 0x61, 0x46, 0x32, 0x45, 0x16, 0x60, - 0xCB, 0xF1, 0x10, 0x67, 0xB4, 0x85, 0x64, 0x40, 0x01, 0x2A, 0x94, 0x85, 0x45, 0x52, 0xFF, 0x60, - 0xE7, 0x65, 0x32, 0x41, 0xA5, 0x81, 0x16, 0x60, 0xC2, 0xF3, 0x08, 0x65, 0xFF, 0xA0, 0xFF, 0xFF, - 0x01, 0x03, 0x07, 0x00, 0x16, 0x60, 0xC4, 0xF3, 0xB5, 0x81, 0x10, 0x65, 0x60, 0x40, 0x01, 0x26, - 0xB5, 0x81, 0x41, 0x52, 0x19, 0x60, 0x48, 0xF3, 0x37, 0x60, 0xE6, 0x63, 0xF0, 0x84, 0xF0, 0x84, - 0xF0, 0x84, 0x03, 0xB5, 0xF0, 0x84, 0xF0, 0x84, 0x03, 0xB4, 0x65, 0x5C, 0xA3, 0xD9, 0x37, 0x60, - 0xE8, 0x63, 0x02, 0xA8, 0xA3, 0xDB, 0x15, 0x02, 0x00, 0x60, 0xC8, 0x64, 0x1B, 0x60, 0xF5, 0xFB, - 0x1B, 0x60, 0xF9, 0xFB, 0x07, 0x60, 0xD0, 0x64, 0x1B, 0x60, 0xF6, 0xFB, 0x1B, 0x60, 0xFA, 0xFB, - 0x01, 0x60, 0x90, 0x64, 0x1B, 0x60, 0xF7, 0xFB, 0x00, 0x60, 0x64, 0x64, 0x1B, 0x60, 0xF8, 0xFB, - 0x06, 0x00, 0x64, 0x64, 0x1B, 0x60, 0xF7, 0xFB, 0x64, 0x64, 0x1B, 0x60, 0xF8, 0xFB, 0x19, 0x60, - 0x48, 0xF1, 0x01, 0x64, 0x64, 0x40, 0x40, 0x2A, 0x02, 0x00, 0x1B, 0x60, 0xEE, 0xFB, 0x33, 0x60, - 0xBC, 0x61, 0x2D, 0x60, 0x0E, 0x64, 0x20, 0x63, 0x58, 0xD1, 0x59, 0xD9, 0xFD, 0x1F, 0xBA, 0xF1, - 0x7E, 0xF9, 0x1A, 0x63, 0x00, 0x60, 0xFC, 0x61, 0x00, 0x64, 0x59, 0xDB, 0xFE, 0x1F, 0x40, 0x40, - 0x01, 0x64, 0x85, 0xFB, 0x17, 0x60, 0x14, 0xF3, 0x35, 0x60, 0x36, 0x61, 0xFE, 0xA4, 0xE0, 0x84, - 0x04, 0x24, 0x0C, 0x00, 0xE0, 0x84, 0x41, 0x91, 0x1A, 0x60, 0x1F, 0xF3, 0xA1, 0xD1, 0x59, 0xD1, - 0xA0, 0x83, 0x1A, 0x60, 0x1B, 0xFD, 0xA0, 0x83, 0x1A, 0x60, 0x1A, 0xFD, 0xE4, 0xF3, 0x7D, 0xFB, - 0xCF, 0xF1, 0x10, 0x60, 0xEC, 0x63, 0x2F, 0x18, 0x60, 0x40, 0x01, 0x27, 0x12, 0x00, 0xCC, 0x84, - 0x06, 0xA3, 0xFD, 0x02, 0xA3, 0xD3, 0x10, 0x60, 0xF2, 0x63, 0x25, 0x1B, 0x11, 0x60, 0x44, 0x65, - 0xA3, 0xD3, 0x06, 0xA3, 0xD7, 0x80, 0x02, 0x1B, 0xFB, 0x04, 0x1D, 0x00, 0xF8, 0xA3, 0xA3, 0xD3, - 0x18, 0x00, 0x11, 0x60, 0x60, 0x63, 0x12, 0x60, 0x40, 0x65, 0xA3, 0xD1, 0x08, 0xA3, 0xD0, 0x80, - 0xD7, 0x80, 0x02, 0x03, 0xFA, 0x04, 0x0F, 0x00, 0xFA, 0xA3, 0xA3, 0xD3, 0x11, 0x60, 0x62, 0x63, - 0x0A, 0x1B, 0xA3, 0xD3, 0x08, 0xA3, 0xD7, 0x80, 0x02, 0x1B, 0xFB, 0x04, 0x04, 0x00, 0xF6, 0xA3, - 0xA3, 0xD3, 0xE4, 0xFB, 0x7D, 0xFB, 0x2E, 0x60, 0x2E, 0x64, 0x2D, 0x60, 0x8A, 0x63, 0xA0, 0xD1, - 0xA3, 0xD9, 0x64, 0x41, 0x58, 0xD1, 0x5B, 0xD9, 0x7D, 0xF3, 0x66, 0x45, 0xA6, 0xF5, 0x60, 0x40, - 0x01, 0x27, 0x08, 0x00, 0x91, 0xFA, 0x61, 0x44, 0xFD, 0x60, 0x58, 0x4E, 0xAC, 0x78, 0xFF, 0xFF, - 0x12, 0xFA, 0x07, 0x00, 0x11, 0xF8, 0x64, 0x44, 0xFD, 0x60, 0x58, 0x4E, 0xAC, 0x78, 0xFF, 0xFF, - 0x12, 0xFA, 0x65, 0x46, 0x46, 0x48, 0xE2, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x05, 0x3A, 0x03, 0x00, - 0x14, 0x60, 0x22, 0x66, 0x11, 0x00, 0x04, 0x3A, 0x03, 0x00, 0x14, 0x60, 0x16, 0x66, 0x0C, 0x00, - 0x03, 0x3A, 0x03, 0x00, 0x14, 0x60, 0x0A, 0x66, 0x07, 0x00, 0x02, 0x3A, 0x03, 0x00, 0x13, 0x60, - 0xFE, 0x66, 0x02, 0x00, 0x13, 0x60, 0xF2, 0x66, 0x60, 0xFE, 0xA6, 0xD3, 0xDE, 0x86, 0x13, 0x60, - 0xDC, 0xFB, 0xA6, 0xD3, 0xDE, 0x86, 0x28, 0x60, 0x29, 0x63, 0xA3, 0xDB, 0x28, 0x60, 0xA1, 0x63, - 0xA3, 0xDB, 0xA6, 0xD3, 0xDE, 0x86, 0x13, 0x60, 0xDB, 0xFB, 0xA6, 0xD3, 0xDE, 0x86, 0x27, 0x60, - 0xB9, 0x63, 0xA3, 0xDB, 0x20, 0xFE, 0xA6, 0xD3, 0xDA, 0x86, 0x60, 0x43, 0x1F, 0xB3, 0x63, 0x5C, - 0x1F, 0x60, 0x00, 0xB4, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xB0, 0x85, 0x14, 0x60, 0x12, 0xF3, - 0xFF, 0xFF, 0xFC, 0x60, 0x00, 0xB4, 0xB4, 0x84, 0xA2, 0xDB, 0x14, 0x60, 0x4E, 0xFB, 0x28, 0x60, - 0xC4, 0x63, 0xA3, 0xD3, 0xA6, 0xD1, 0xDE, 0x86, 0x80, 0x60, 0x7F, 0xB5, 0x64, 0x44, 0x60, 0x47, - 0xE8, 0x84, 0x7F, 0x60, 0x80, 0xB4, 0xB4, 0x84, 0xA3, 0xDB, 0x60, 0xFE, 0xA6, 0xD3, 0xDE, 0x86, - 0x13, 0x60, 0xDF, 0xFB, 0xA6, 0xD3, 0xDE, 0x86, 0x00, 0x60, 0xDF, 0xFB, 0xA6, 0xD3, 0xDE, 0x86, - 0x00, 0x60, 0xE0, 0xFB, 0xA6, 0xD3, 0x00, 0x60, 0xE1, 0xFB, 0x20, 0xFE, 0x28, 0x46, 0x19, 0x60, - 0x4D, 0xF1, 0x00, 0x60, 0xCF, 0xF3, 0x64, 0x40, 0x00, 0x3A, 0x0F, 0x00, 0x60, 0x40, 0x01, 0x36, - 0x05, 0x00, 0x02, 0x36, 0x03, 0x00, 0x07, 0x36, 0x01, 0x00, 0x07, 0x00, 0x10, 0x60, 0xF0, 0x64, - 0x00, 0x7C, 0x44, 0xA4, 0xA0, 0xD9, 0x06, 0xA4, 0xA0, 0xD9, 0x36, 0x40, 0x08, 0x3A, 0x03, 0x00, - 0xF3, 0x60, 0x0A, 0x78, 0xFF, 0xFF, 0x00, 0x63, 0x10, 0x60, 0x10, 0xFD, 0x10, 0x60, 0x30, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0A, 0x04, 0x40, 0x60, 0x00, 0x64, 0x08, 0x60, 0x19, 0xFB, - 0x1E, 0x60, 0x8D, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x7D, 0xF1, 0x13, 0x60, - 0x1A, 0xF9, 0x0C, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x07, 0x64, 0xCC, 0xFB, 0x20, 0x60, - 0x00, 0x64, 0x08, 0x60, 0x19, 0xFB, 0x1F, 0x60, 0x53, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x10, 0x60, 0x30, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xBE, 0xFE, 0x08, 0x60, 0x08, 0xF1, - 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xC5, 0xFE, 0x08, 0x60, 0x15, 0xF1, - 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x00, 0x64, 0x08, 0x60, 0x18, 0xFB, - 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x30, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x02, 0x64, - 0x89, 0xFB, 0xFF, 0xFF, 0xC1, 0xFE, 0x08, 0x60, 0x30, 0xF1, 0x00, 0x60, 0xDF, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x01, 0x64, 0x13, 0x60, 0x21, 0xFB, 0xFF, 0xFF, 0x04, 0xFF, 0x08, 0x60, - 0x18, 0xF1, 0x00, 0x60, 0x08, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x00, 0x60, 0x08, 0x64, - 0x08, 0x60, 0x19, 0xFB, 0x1F, 0x60, 0x92, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x08, 0x60, 0x18, 0xF1, 0x7F, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x89, 0xF3, 0x00, 0x65, - 0xD4, 0x80, 0xFF, 0xFF, 0x0A, 0x03, 0x80, 0x60, 0x00, 0x64, 0x08, 0x60, 0x19, 0xFB, 0x1F, 0x60, - 0x92, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x95, 0xF3, 0xFF, 0xFF, 0x7F, 0xB4, - 0x95, 0xFB, 0xDE, 0xFE, 0x0A, 0x04, 0x20, 0x60, 0x00, 0x64, 0x08, 0x60, 0x19, 0xFB, 0x1F, 0x60, - 0xB7, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x26, 0x60, 0x34, 0x62, 0x06, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x00, 0x64, 0x08, 0x60, 0x18, 0xFB, 0x5A, 0xDB, 0xBE, 0xFE, - 0xDA, 0xFE, 0x25, 0x60, 0xDA, 0x61, 0x1F, 0x60, 0x58, 0x4E, 0xEA, 0x78, 0xFF, 0xFF, 0x25, 0x60, - 0xC8, 0x61, 0x1F, 0x60, 0x58, 0x4E, 0xEA, 0x78, 0xFF, 0xFF, 0x25, 0x60, 0xCE, 0x61, 0x1F, 0x60, - 0x58, 0x4E, 0xEA, 0x78, 0xFF, 0xFF, 0x25, 0x60, 0xEC, 0x61, 0x1F, 0x60, 0x58, 0x4E, 0xEA, 0x78, - 0xFF, 0xFF, 0x25, 0x60, 0xF2, 0x61, 0x1F, 0x60, 0x58, 0x4E, 0xEA, 0x78, 0xFF, 0xFF, 0x25, 0x60, - 0xFE, 0x61, 0x1F, 0x60, 0x58, 0x4E, 0xEA, 0x78, 0xFF, 0xFF, 0xC5, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0xA1, 0xD3, 0x0E, 0x57, 0x23, 0x00, 0x0E, 0xF2, 0x44, 0x4C, 0x80, 0xB0, 0x10, 0xB0, 0x0A, 0x03, - 0x00, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0x13, 0x00, 0x12, 0x02, 0xF0, 0x37, 0x09, 0x00, 0x02, 0xF0, 0x09, 0x60, 0x08, 0x64, - 0xD0, 0x80, 0xA2, 0xFF, 0xAD, 0xF3, 0x02, 0x02, 0xCC, 0x84, 0xAD, 0xFB, 0x26, 0x60, 0x1A, 0x64, - 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, 0x2C, 0x44, 0xAC, 0x86, 0x09, 0xF0, - 0xDA, 0x02, 0x37, 0x58, 0xFF, 0xFF, 0x2E, 0x58, 0xFF, 0xFF, 0x2E, 0x58, 0xFF, 0xFF, 0x23, 0x60, - 0x85, 0x64, 0x08, 0x60, 0x32, 0xFB, 0x1C, 0x60, 0xB6, 0x62, 0xA2, 0xDF, 0x06, 0xA2, 0x10, 0x60, - 0x88, 0x64, 0xA2, 0xDB, 0x06, 0x64, 0x5A, 0xDB, 0x5A, 0xDB, 0x1C, 0x60, 0xC2, 0x62, 0xA2, 0xDF, - 0x06, 0xA2, 0x10, 0x60, 0x8C, 0x64, 0xA2, 0xDB, 0x06, 0x64, 0x5A, 0xDB, 0x5A, 0xDB, 0x1C, 0x60, - 0xCE, 0x62, 0xA2, 0xDF, 0x06, 0xA2, 0x10, 0x60, 0x90, 0x64, 0xA2, 0xDB, 0x06, 0x64, 0x5A, 0xDB, - 0x5A, 0xDB, 0xBD, 0xF1, 0x0E, 0x60, 0x69, 0xF9, 0x24, 0x60, 0xC1, 0x64, 0x08, 0x60, 0x43, 0xFB, - 0x24, 0x60, 0xCA, 0x64, 0x08, 0x60, 0x45, 0xFB, 0x24, 0x60, 0xD3, 0x64, 0x08, 0x60, 0x47, 0xFB, - 0x00, 0x60, 0x3A, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x22, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x62, 0xFB, - 0x04, 0x64, 0x03, 0xFA, 0xA6, 0xF3, 0x07, 0xFA, 0x00, 0x64, 0x3E, 0xFA, 0x3F, 0xFA, 0x00, 0x60, - 0x02, 0x64, 0x08, 0x60, 0x0D, 0xFB, 0x20, 0x60, 0x63, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x10, 0x60, 0x18, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x03, 0x64, 0x69, 0xFB, 0x0F, 0x4E, - 0xEA, 0x60, 0x58, 0x4F, 0x34, 0x78, 0xFF, 0xFF, 0x0E, 0x4F, 0x00, 0x64, 0x6B, 0xFB, 0x62, 0xF5, - 0xEA, 0xF3, 0x2F, 0xFA, 0xEB, 0xF3, 0x30, 0xFA, 0xEC, 0xF3, 0x31, 0xFA, 0x7F, 0xF3, 0x2C, 0xFA, - 0x32, 0xFA, 0x80, 0xF3, 0x2D, 0xFA, 0x33, 0xFA, 0x81, 0xF3, 0x2E, 0xFA, 0x34, 0xFA, 0xB9, 0xF3, - 0x19, 0xFA, 0x06, 0x60, 0x80, 0x64, 0x0E, 0xFA, 0xF7, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, - 0x08, 0x60, 0x08, 0xF1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x08, 0x60, - 0x0C, 0xF1, 0xFF, 0x60, 0x8F, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0xBE, 0xF1, 0x0E, 0x60, 0x63, 0xF9, - 0x1C, 0x60, 0xC2, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0x00, 0x64, 0x6B, 0xFB, 0x00, 0x60, 0x74, 0x64, 0x08, 0x60, 0x0D, 0xFB, 0x20, 0x60, 0xAE, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x0C, 0xF1, 0x00, 0x60, 0x04, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x23, 0x60, 0x85, 0x78, 0xFF, 0xFF, - 0x00, 0x60, 0x40, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xE2, 0x01, - 0x00, 0x60, 0x20, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x11, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x20, 0x40, - 0x50, 0x27, 0xD8, 0x01, 0xAC, 0xF3, 0xFF, 0xFF, 0xFE, 0xA0, 0xFF, 0xFF, 0x0F, 0x06, 0x6B, 0xF3, - 0xFF, 0xFF, 0xEC, 0xA0, 0xDC, 0x84, 0x01, 0x05, 0xA2, 0xDB, 0xCC, 0x01, 0x00, 0x60, 0x10, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0xCF, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x01, 0x00, 0xC3, 0x01, 0x01, 0x64, - 0x19, 0x60, 0xF3, 0xFB, 0xDF, 0xF3, 0x29, 0x45, 0xD4, 0x80, 0x6B, 0xF3, 0x03, 0x04, 0x21, 0x60, - 0x28, 0x78, 0xFF, 0xFF, 0xEC, 0xA0, 0x00, 0x64, 0x04, 0x04, 0x40, 0x49, 0x21, 0x60, 0x28, 0x78, - 0xFF, 0xFF, 0x00, 0x60, 0x64, 0x64, 0x08, 0x60, 0x0D, 0xFB, 0x20, 0x60, 0xFD, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x0C, 0xF1, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, - 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x23, 0x60, 0x85, 0x78, 0xFF, 0xFF, 0x00, 0x60, - 0x40, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xD0, 0x01, 0x00, 0x60, - 0x20, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0xE5, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x20, 0x40, 0x50, 0x27, - 0xE0, 0x01, 0xAC, 0xF3, 0xFF, 0xFF, 0xFE, 0xA0, 0xFF, 0xFF, 0x07, 0x06, 0x6B, 0xF3, 0xFF, 0xFF, - 0xEC, 0xA0, 0xDC, 0x84, 0x01, 0x05, 0xA2, 0xDB, 0xBA, 0x01, 0xB9, 0x01, 0x33, 0x60, 0xE6, 0x65, - 0xA5, 0xDF, 0xBF, 0xF1, 0x0E, 0x60, 0x63, 0xF9, 0xE0, 0xF3, 0x29, 0x45, 0x03, 0xA4, 0xD4, 0x80, - 0x01, 0x63, 0x01, 0x05, 0x00, 0x63, 0x53, 0xFD, 0x7D, 0xF3, 0x01, 0x60, 0x00, 0x65, 0xA4, 0x80, - 0x24, 0x44, 0xFE, 0xB4, 0x01, 0x03, 0x01, 0xBC, 0x40, 0x44, 0x21, 0x60, 0x45, 0x64, 0x6A, 0xFB, - 0x23, 0x60, 0xF6, 0x78, 0xFF, 0xFF, 0x1C, 0x60, 0xCE, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x08, 0x60, 0x0C, 0xF1, 0xFF, 0x60, 0xDF, 0x64, 0xA0, 0x84, - 0xA2, 0xDB, 0x86, 0xF1, 0x1B, 0x60, 0xB2, 0x63, 0xD3, 0x80, 0x67, 0xFD, 0x43, 0x03, 0x67, 0xF3, - 0xE1, 0xF1, 0x60, 0x43, 0x29, 0x44, 0xA3, 0xD3, 0xC0, 0x85, 0xD4, 0x80, 0x5B, 0xD3, 0x3A, 0x06, - 0x60, 0x43, 0x08, 0xA3, 0xBE, 0xD3, 0x81, 0xF1, 0xA3, 0xD3, 0xD0, 0x80, 0x80, 0xF1, 0x05, 0x02, - 0xBF, 0xD3, 0xD0, 0x80, 0x7F, 0xF1, 0x01, 0x02, 0xD0, 0x80, 0xF8, 0xA3, 0x28, 0x02, 0x21, 0x60, - 0x77, 0x64, 0x6A, 0xFB, 0x23, 0x60, 0xB4, 0x78, 0xFF, 0xFF, 0x01, 0xB0, 0x82, 0xF3, 0x22, 0x03, - 0x62, 0xF5, 0x48, 0x7E, 0x2A, 0xFA, 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x60, 0x01, 0x64, - 0x08, 0x60, 0x0D, 0xFB, 0x21, 0x60, 0x92, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x08, 0x60, 0x0C, 0xF1, 0xFF, 0x60, 0xFE, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x03, 0x00, 0x23, 0x60, - 0x7A, 0x78, 0xFF, 0xFF, 0x6B, 0xF3, 0xFF, 0xFF, 0xEC, 0xA0, 0x00, 0x64, 0x02, 0x04, 0x40, 0x49, - 0x15, 0x00, 0xDF, 0xF3, 0x29, 0x45, 0xD4, 0x80, 0xFF, 0xFF, 0x0B, 0x07, 0x1C, 0x60, 0xC2, 0x64, - 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x20, 0x60, 0x86, 0x78, - 0xFF, 0xFF, 0xE0, 0xF3, 0x29, 0x45, 0xD4, 0x80, 0xFF, 0xFF, 0x16, 0x06, 0x04, 0x65, 0xF1, 0x60, - 0x58, 0x4E, 0xC3, 0x78, 0xFF, 0xFF, 0x05, 0x64, 0xDB, 0xFB, 0xF1, 0xF3, 0xFF, 0xFF, 0x01, 0xBC, - 0xF1, 0xFB, 0x1C, 0x60, 0xC2, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0x22, 0x60, 0x1B, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x74, 0x64, 0x08, 0x60, 0x0D, 0xFB, - 0x21, 0x60, 0xD8, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x0C, 0xF1, - 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x23, 0x60, - 0x85, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x40, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0xB0, 0x01, 0x00, 0x60, 0x20, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x15, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x20, 0x40, 0x50, 0x27, 0xA6, 0x01, 0xAC, 0xF3, 0x6B, 0xF3, 0xFE, 0xA0, 0xEC, 0xA0, - 0x0A, 0x06, 0x03, 0x04, 0x00, 0x64, 0x55, 0xFB, 0x40, 0x49, 0x6B, 0xF3, 0xFF, 0xFF, 0xEC, 0xA0, - 0xDC, 0x84, 0x01, 0x05, 0xA2, 0xDB, 0x96, 0x01, 0x00, 0x60, 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x0D, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1C, 0x60, 0xCE, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x21, 0x60, 0x28, 0x78, 0xFF, 0xFF, 0x21, 0x60, 0x9C, 0x78, - 0xFF, 0xFF, 0x7D, 0xF3, 0x01, 0x60, 0x00, 0x65, 0xA4, 0x80, 0x24, 0x44, 0xFE, 0xB4, 0x01, 0x03, - 0x01, 0xBC, 0x02, 0xB0, 0xFB, 0xB4, 0x01, 0x03, 0x04, 0xBC, 0x40, 0x44, 0xC0, 0xF1, 0x0E, 0x60, - 0x63, 0xF9, 0xCF, 0xF3, 0x20, 0x60, 0x20, 0x65, 0x30, 0x1B, 0xA5, 0xD3, 0x24, 0x40, 0x01, 0x26, - 0x16, 0x00, 0x60, 0x40, 0x20, 0x26, 0x29, 0x00, 0x01, 0xBC, 0xA5, 0xDB, 0x08, 0x60, 0x1E, 0xF1, - 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, 0x00, 0x64, 0x08, 0x60, - 0x0D, 0xFB, 0x22, 0x60, 0x5F, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x60, 0x40, - 0x10, 0x26, 0x13, 0x00, 0x01, 0xBC, 0xA5, 0xDB, 0x08, 0x60, 0x1E, 0xF1, 0x00, 0x60, 0x40, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, 0x00, 0x64, 0x08, 0x60, 0x0D, 0xFB, 0x22, 0x60, - 0x5F, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0D, 0x64, 0x53, 0xFB, 0x22, 0x60, - 0x67, 0x64, 0x6A, 0xFB, 0x23, 0x60, 0xF6, 0x78, 0xFF, 0xFF, 0x1C, 0x60, 0xCE, 0x64, 0x13, 0x60, - 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x08, 0x60, 0x0C, 0xF1, 0xFF, 0x60, - 0xDF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x86, 0xF1, 0x1B, 0x60, 0xB2, 0x63, 0xD3, 0x80, 0x67, 0xFD, - 0x07, 0x02, 0x24, 0x44, 0x04, 0xB0, 0xFF, 0xFF, 0x36, 0x03, 0x05, 0xAC, 0x40, 0x44, 0xA6, 0x01, - 0x67, 0xF3, 0x29, 0x41, 0xA0, 0xD1, 0x58, 0xD3, 0xD1, 0x80, 0x64, 0x45, 0x60, 0x43, 0x2B, 0x05, - 0x08, 0xA3, 0xBE, 0xD3, 0x81, 0xF1, 0xA3, 0xD3, 0xD0, 0x80, 0x80, 0xF1, 0x05, 0x02, 0xBF, 0xD3, - 0xD0, 0x80, 0x7F, 0xF1, 0x01, 0x02, 0xD0, 0x80, 0xF8, 0xA3, 0x07, 0x02, 0x45, 0x49, 0x22, 0x60, - 0xCD, 0x64, 0x6A, 0xFB, 0x23, 0x60, 0xB4, 0x78, 0xFF, 0xFF, 0x05, 0x65, 0xF1, 0x60, 0x58, 0x4E, - 0xC3, 0x78, 0xFF, 0xFF, 0x04, 0x64, 0xDB, 0xFB, 0xF1, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0xF1, 0xFB, - 0x23, 0x60, 0x7A, 0x78, 0xFF, 0xFF, 0x67, 0xF3, 0x86, 0xF1, 0x04, 0xA4, 0xD0, 0x80, 0xFF, 0xFF, - 0x02, 0x03, 0x67, 0xFB, 0xCD, 0x01, 0x6B, 0xF3, 0xFF, 0xFF, 0xEC, 0xA0, 0xFF, 0xFF, 0x01, 0x04, - 0x75, 0x00, 0xE0, 0xF3, 0x29, 0x45, 0xD4, 0x80, 0xFF, 0xFF, 0x70, 0x05, 0x7D, 0xF3, 0xFF, 0xFF, - 0x60, 0x40, 0x01, 0x27, 0x08, 0x00, 0x22, 0x60, 0xCD, 0x63, 0x6A, 0xFD, 0x1C, 0x60, 0x78, 0x63, - 0x23, 0x60, 0xB4, 0x78, 0xFF, 0xFF, 0x1C, 0x60, 0xC2, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x05, 0x65, 0xF1, 0x60, 0x58, 0x4E, 0xC3, 0x78, 0xFF, 0xFF, - 0x20, 0x60, 0x14, 0x61, 0xA1, 0xDF, 0x04, 0x64, 0xDB, 0xFB, 0xF1, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, - 0xF1, 0xFB, 0x82, 0xF3, 0x62, 0xF5, 0x48, 0x7E, 0x2A, 0xFA, 0x02, 0x60, 0x00, 0x65, 0x20, 0x44, - 0x34, 0x80, 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x60, 0x01, 0x64, 0x08, 0x60, 0x0D, 0xFB, - 0x23, 0x60, 0x00, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x0C, 0xF1, - 0xFF, 0x60, 0xFE, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x00, 0x60, 0x32, 0x64, 0x0E, 0x60, 0x63, 0xFB, - 0x1C, 0x60, 0xC2, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0x00, 0x60, 0x10, 0x64, 0x08, 0x60, 0x0D, 0xFB, 0x23, 0x60, 0x1C, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x0C, 0xF1, 0xFF, 0x60, 0xEF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, - 0xFD, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x08, 0x60, 0x08, 0xF1, 0x80, 0x60, 0x00, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x20, 0x60, 0x86, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x74, 0x64, - 0x08, 0x60, 0x0D, 0xFB, 0x23, 0x60, 0x3A, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x08, 0x60, 0x0C, 0xF1, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x23, 0x60, 0x85, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x40, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x67, 0x01, 0x00, 0x60, 0x20, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x15, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x20, 0x40, 0x50, 0x27, 0xE0, 0x01, 0xAC, 0xF3, 0x6B, 0xF3, - 0xFE, 0xA0, 0xEC, 0xA0, 0x0A, 0x06, 0x03, 0x04, 0x00, 0x64, 0x55, 0xFB, 0x40, 0x49, 0x6B, 0xF3, - 0xFF, 0xFF, 0xEC, 0xA0, 0xDC, 0x84, 0x01, 0x05, 0xA2, 0xDB, 0x4D, 0x01, 0x00, 0x60, 0x10, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0xCB, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1C, 0x60, 0xCE, 0x64, 0x13, 0x60, - 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x22, 0x60, 0x1B, 0x78, 0xFF, 0xFF, - 0x08, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x20, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x1C, 0x60, 0xB6, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x1C, 0x60, 0xC2, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x1C, 0x60, 0xCE, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x64, 0x08, 0x60, 0x0C, 0xFB, 0x5A, 0xDB, 0x00, 0x64, - 0x69, 0xFB, 0x08, 0x60, 0x08, 0xF1, 0x02, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x00, 0x60, 0x02, 0x64, 0x08, 0x60, 0x0D, 0xFB, 0x20, 0x60, 0x63, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0xA3, 0xD3, 0x7D, 0xF1, 0x7C, 0xFB, 0xD0, 0x80, 0x00, 0x64, 0x39, 0x03, - 0x08, 0x60, 0x0C, 0xF1, 0xBF, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0xDE, 0xFE, 0x0A, 0x04, - 0x40, 0x60, 0x00, 0x64, 0x08, 0x60, 0x0D, 0xFB, 0x23, 0x60, 0xBA, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x0C, 0xF1, 0xDF, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, - 0x7C, 0xF1, 0x7D, 0xF9, 0x13, 0x60, 0x1A, 0xF9, 0x0E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, - 0x20, 0x60, 0x00, 0x64, 0x08, 0x60, 0x0D, 0xFB, 0x23, 0x60, 0xE4, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0xBE, 0xFE, 0x08, 0x60, 0x0C, 0xF1, 0xDF, 0x60, 0xFF, 0x64, 0xA0, 0x84, - 0xA2, 0xDB, 0x08, 0x60, 0x08, 0xF1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x01, 0x64, 0x6A, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, - 0x08, 0x60, 0x0C, 0xF1, 0x7F, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x20, 0x40, 0x51, 0x23, - 0x0A, 0x00, 0x80, 0x60, 0x00, 0x64, 0x08, 0x60, 0x0D, 0xFB, 0x23, 0x60, 0xFA, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x0C, 0xF1, 0x7F, 0x60, 0xFF, 0x61, 0xA1, 0x84, - 0x5A, 0xD1, 0x4A, 0xDB, 0xA1, 0x84, 0x5A, 0xDB, 0x02, 0x64, 0x8A, 0xFB, 0xFF, 0xFF, 0xC1, 0xFE, - 0x8A, 0xF3, 0x00, 0x65, 0xD4, 0x80, 0xFF, 0xFF, 0x10, 0x03, 0x08, 0x60, 0x0C, 0xF1, 0x7F, 0x60, - 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x80, 0x60, 0x00, 0x64, 0x08, 0x60, 0x0D, 0xFB, 0x24, 0x60, - 0x16, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x33, 0x60, 0xBE, 0x64, 0x54, 0xFB, - 0x08, 0x60, 0x0C, 0xF1, 0xEF, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x24, 0x44, 0x01, 0xB0, - 0xFF, 0xFF, 0x08, 0x02, 0x08, 0x60, 0x12, 0xF1, 0x00, 0x60, 0x10, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x07, 0x00, 0x08, 0x60, 0x12, 0xF1, 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x10, 0x60, 0x00, 0x64, 0x08, 0x60, 0x0D, 0xFB, 0x24, 0x60, 0x55, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x1C, 0x60, 0xC2, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x08, 0x60, 0x0C, 0xF1, 0xEF, 0x60, 0xEF, 0x64, 0xA0, 0x84, - 0xA2, 0xDB, 0x01, 0x64, 0x8A, 0xFB, 0x6B, 0xF3, 0x00, 0x60, 0x95, 0xF3, 0xEC, 0xA0, 0x40, 0xBC, - 0x06, 0x04, 0xA2, 0xDB, 0x69, 0xF1, 0xFF, 0x60, 0xFB, 0x64, 0xA0, 0x84, 0x69, 0xFB, 0xFD, 0x60, - 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x08, 0x60, 0x08, 0xF1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0xC1, 0xFE, 0x6A, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0xF1, 0x28, 0x44, - 0xD0, 0x84, 0x03, 0xA4, 0x03, 0x0E, 0xE8, 0x84, 0xE8, 0x84, 0x04, 0x00, 0xFA, 0xA4, 0xE8, 0x84, - 0xE8, 0x87, 0xC0, 0xBF, 0xC0, 0x84, 0xA2, 0xDB, 0x2E, 0x58, 0xFF, 0xFF, 0x56, 0xF1, 0x28, 0x44, - 0xD0, 0x84, 0x1F, 0xA4, 0x06, 0x0E, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, - 0x07, 0x00, 0xC2, 0xA4, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x87, 0xF8, 0xBF, - 0xC0, 0x84, 0x5B, 0xF1, 0x56, 0xFB, 0xD0, 0x80, 0xFF, 0xFF, 0x01, 0x05, 0x64, 0x44, 0x52, 0xFB, - 0x2E, 0x58, 0xFF, 0xFF, 0x52, 0xF1, 0x2F, 0x67, 0xD0, 0x80, 0x60, 0x45, 0x02, 0x28, 0x64, 0x45, - 0x55, 0xF1, 0x8B, 0x67, 0xD0, 0x80, 0x60, 0x41, 0x02, 0x24, 0x64, 0x41, 0xD5, 0x84, 0x80, 0x65, - 0xC4, 0x87, 0x01, 0x05, 0x00, 0x64, 0xFF, 0xB4, 0x40, 0x49, 0x2E, 0x58, 0xFF, 0xFF, 0x08, 0x60, - 0x0C, 0xF1, 0x00, 0x60, 0x08, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x08, 0x60, 0x0C, 0xF1, 0x00, 0x60, 0x10, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x08, 0x60, 0x0C, 0xF1, 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x08, 0x60, 0x1B, 0xF1, 0x00, 0x60, 0x40, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x26, 0x46, 0x27, 0xF2, 0x70, 0x63, 0x60, 0x40, 0x0A, 0x36, 0x10, 0x00, 0x14, 0x36, - 0x14, 0x00, 0x37, 0x36, 0x0E, 0x00, 0x6E, 0x36, 0x0E, 0x00, 0x06, 0x36, 0x04, 0x00, 0x09, 0x36, - 0x04, 0x00, 0x18, 0x63, 0x0A, 0x00, 0x30, 0x63, 0x08, 0x00, 0x26, 0x63, 0x06, 0x00, 0xD0, 0x63, - 0x04, 0x00, 0x33, 0x63, 0x02, 0x00, 0x21, 0x63, 0x00, 0x00, 0x10, 0x60, 0x0E, 0xFD, 0x26, 0x46, - 0x3F, 0xF2, 0x87, 0xF0, 0x00, 0xF4, 0x45, 0x43, 0x03, 0x4B, 0x60, 0x43, 0xF4, 0xA3, 0x00, 0x60, - 0x1D, 0x61, 0x00, 0x60, 0x01, 0x65, 0x01, 0x60, 0xFF, 0x64, 0x40, 0x4C, 0xFD, 0x60, 0x58, 0x4E, - 0x7A, 0x78, 0xFF, 0xFF, 0x00, 0xBB, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x64, 0x40, 0x4A, 0x60, 0xFE, - 0x02, 0x60, 0x00, 0x63, 0xBD, 0xD3, 0xBD, 0xD3, 0x60, 0x41, 0xFE, 0x60, 0x58, 0x4E, 0x2C, 0x78, - 0xFF, 0xFF, 0x20, 0xFE, 0x26, 0x46, 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x43, 0xF4, 0xA3, 0x00, 0x60, - 0x1D, 0x61, 0x00, 0x60, 0x32, 0x65, 0x01, 0x60, 0xFF, 0x64, 0x40, 0x4C, 0xFD, 0x60, 0x58, 0x4E, - 0x7A, 0x78, 0xFF, 0xFF, 0x00, 0xBB, 0xFF, 0xFF, 0x0B, 0x03, 0x60, 0xFE, 0x02, 0x60, 0x00, 0x63, - 0xBD, 0xD3, 0xBD, 0xD3, 0x60, 0x41, 0xFE, 0x60, 0x58, 0x4E, 0x2C, 0x78, 0xFF, 0xFF, 0x20, 0xFE, - 0x2A, 0x44, 0xFC, 0x60, 0x58, 0x4E, 0x34, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x3F, 0xF2, 0x01, 0x60, - 0x00, 0x65, 0xF4, 0xA4, 0xD4, 0x80, 0x60, 0x41, 0x02, 0x24, 0x65, 0x41, 0x41, 0x48, 0x00, 0xF4, - 0x1E, 0x65, 0x02, 0x60, 0x00, 0x63, 0xA5, 0xD0, 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, - 0x04, 0x65, 0x64, 0x44, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, 0x05, 0x03, 0x64, 0x47, 0x00, 0x7F, - 0xCD, 0x81, 0xBD, 0xDB, 0xF0, 0x02, 0x02, 0x60, 0x00, 0x63, 0x28, 0x41, 0xBD, 0xD3, 0xBD, 0xD1, - 0xFD, 0xA0, 0xFE, 0xA1, 0x07, 0x03, 0x09, 0x06, 0x64, 0x44, 0xE0, 0x85, 0xD1, 0x81, 0xC7, 0x83, - 0xF5, 0x07, 0x03, 0x00, 0xA3, 0xD3, 0x0E, 0x60, 0x3C, 0xFB, 0x31, 0x40, 0x06, 0x26, 0x57, 0x00, - 0x00, 0x64, 0x6F, 0xFB, 0x02, 0x60, 0x00, 0x63, 0x28, 0x41, 0xBD, 0xD3, 0xBD, 0xD1, 0xFC, 0xA0, - 0xFB, 0xA0, 0x09, 0x03, 0x28, 0x03, 0x64, 0x44, 0xE0, 0x85, 0xC7, 0x83, 0xD1, 0x81, 0xFE, 0xA1, - 0x46, 0x06, 0xF3, 0x07, 0x44, 0x00, 0xBD, 0xD3, 0xBD, 0xD3, 0x00, 0xB8, 0x6F, 0xFB, 0x6E, 0xFB, - 0xBD, 0xD3, 0x3D, 0x02, 0xA3, 0xD3, 0x60, 0x45, 0x60, 0x47, 0xB4, 0x84, 0x60, 0x41, 0x3F, 0xB5, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x71, 0xFB, 0x65, 0x47, - 0xE0, 0x84, 0xE0, 0x84, 0x70, 0xFB, 0x64, 0x44, 0xE0, 0x85, 0xFA, 0xA3, 0xC7, 0x83, 0x61, 0x44, - 0x0E, 0x60, 0x38, 0xFB, 0xD2, 0x01, 0xBD, 0xD3, 0xA3, 0xD3, 0x00, 0xB8, 0x6D, 0xFB, 0x73, 0xFB, - 0x1E, 0x02, 0x85, 0xF1, 0x6F, 0xF3, 0x6C, 0xF9, 0x04, 0x65, 0x60, 0x40, 0x00, 0x3A, 0x06, 0x65, - 0x31, 0x44, 0xB4, 0x84, 0x40, 0x51, 0x02, 0x2A, 0x0B, 0x00, 0x08, 0xBC, 0x40, 0x51, 0x71, 0xF3, - 0x70, 0xF1, 0x00, 0xB8, 0x64, 0x45, 0x01, 0x03, 0x67, 0x45, 0x65, 0x50, 0xCC, 0x84, 0x72, 0xFB, - 0x08, 0x60, 0x15, 0xF1, 0x01, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x08, 0x60, - 0x16, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x2A, 0x3F, 0x00, 0x01, 0x64, 0x10, 0x60, 0x0A, 0xFB, - 0x26, 0x60, 0x58, 0x4E, 0x65, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x00, 0xF4, 0x0D, 0xF2, 0x7E, 0xFB, - 0x00, 0x64, 0x84, 0xFB, 0x26, 0x46, 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x43, 0xF4, 0xA3, 0x00, 0x60, - 0x1D, 0x61, 0x00, 0x60, 0x07, 0x65, 0x01, 0x60, 0xFF, 0x64, 0x40, 0x4C, 0xFD, 0x60, 0x58, 0x4E, - 0x7A, 0x78, 0xFF, 0xFF, 0x00, 0xBB, 0xFF, 0xFF, 0x14, 0x03, 0x02, 0x60, 0x00, 0x65, 0xA5, 0xD3, - 0x1C, 0x60, 0xE6, 0x63, 0xFF, 0xB4, 0x01, 0xA4, 0x60, 0x41, 0xA5, 0xD1, 0xDA, 0x85, 0x64, 0x44, - 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, 0x05, 0x03, 0x64, 0x47, 0x00, 0x7F, 0xCD, 0x81, 0xBD, 0xDB, - 0xF4, 0x02, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x80, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x32, 0x00, 0x27, 0x60, 0x57, 0x78, 0xFF, 0xFF, 0xDB, 0xF3, 0xFF, 0xFF, 0x03, 0xA8, 0x02, 0xA8, - 0x02, 0x03, 0x3E, 0x02, 0xF6, 0x01, 0x08, 0x60, 0x15, 0xF1, 0xFF, 0x60, 0xFB, 0x64, 0xA0, 0x84, - 0xA2, 0xDB, 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0x26, 0x46, 0x10, 0x60, 0x0E, 0xF3, 0x25, 0xF2, 0x60, 0x45, 0x24, 0xF0, 0x00, 0xF4, - 0x64, 0x43, 0xC7, 0x83, 0x60, 0x41, 0x02, 0x24, 0x01, 0xA1, 0x0A, 0xF0, 0x09, 0xF2, 0xD1, 0x80, - 0xFF, 0xFF, 0x09, 0x07, 0x04, 0x04, 0x63, 0x45, 0xD4, 0x80, 0xFF, 0xFF, 0x04, 0x06, 0x26, 0x60, - 0x58, 0x4E, 0x65, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x26, 0xF0, 0xFF, 0x67, 0x20, 0x88, 0x64, 0x5F, - 0x40, 0x4A, 0x24, 0x60, 0x58, 0x4E, 0x80, 0x78, 0xFF, 0xFF, 0x0A, 0x48, 0x24, 0x60, 0x58, 0x4E, - 0x90, 0x78, 0xFF, 0xFF, 0x24, 0x60, 0x58, 0x4E, 0xAC, 0x78, 0xFF, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, - 0x08, 0x60, 0x0D, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x22, 0xB3, 0x01, 0x00, 0x60, 0x95, 0xF3, - 0xFF, 0xFF, 0xBF, 0xB4, 0xA2, 0xDB, 0x10, 0x60, 0x0E, 0xF3, 0x26, 0x46, 0x60, 0x45, 0x20, 0x60, - 0x04, 0x63, 0x00, 0xF4, 0x09, 0xF2, 0xBD, 0xDB, 0xFF, 0xFF, 0x0A, 0xF2, 0xBD, 0xDB, 0x0B, 0xF2, - 0xFF, 0xFF, 0xBD, 0xDB, 0x0C, 0xF2, 0xA3, 0xDB, 0xFA, 0xA3, 0x26, 0x46, 0xA3, 0xD3, 0x24, 0xF0, - 0x00, 0x61, 0xD0, 0x84, 0xF1, 0x81, 0xD4, 0x84, 0xF1, 0x81, 0xBD, 0xDB, 0xA3, 0xD3, 0x03, 0xB1, - 0x03, 0xA9, 0x25, 0xF0, 0x42, 0xFE, 0x05, 0x03, 0xFD, 0xA1, 0xCC, 0x84, 0x01, 0x02, 0xCC, 0x84, - 0x00, 0x61, 0xF1, 0x81, 0xD0, 0x84, 0xF1, 0x81, 0xBD, 0xDB, 0xA3, 0xD3, 0x03, 0xB1, 0x03, 0xA9, - 0x28, 0xF0, 0x42, 0xFE, 0x01, 0x03, 0xCC, 0x84, 0xF1, 0x81, 0xD0, 0x84, 0xF1, 0x81, 0xBD, 0xDB, - 0xA3, 0xD3, 0x03, 0xB1, 0x03, 0xA9, 0x29, 0xF0, 0x01, 0x03, 0xCC, 0x84, 0xD0, 0x84, 0xA3, 0xDB, - 0x10, 0x60, 0x0A, 0xF3, 0xFF, 0xFF, 0x02, 0xA8, 0xFF, 0xFF, 0x02, 0x02, 0x2E, 0x58, 0xFF, 0xFF, - 0xF5, 0xFE, 0x10, 0x60, 0x02, 0xF1, 0x06, 0xA2, 0xA2, 0xD3, 0x64, 0x45, 0x60, 0x40, 0x80, 0x2B, - 0x03, 0x00, 0xFF, 0x60, 0xFF, 0x64, 0x94, 0x85, 0x00, 0x60, 0x96, 0x64, 0xD4, 0x80, 0xFF, 0xFF, - 0x0A, 0x06, 0x10, 0x60, 0x0A, 0xF3, 0x69, 0xF3, 0x00, 0xA8, 0x04, 0xB0, 0x04, 0x02, 0x03, 0x03, - 0x27, 0x60, 0x33, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x00, 0xF4, 0x09, 0xF2, 0x5A, 0xD2, 0x40, 0x48, - 0x40, 0x4A, 0x5A, 0xD2, 0x5A, 0xD2, 0x40, 0x4C, 0x60, 0x41, 0x5A, 0xD0, 0x7E, 0xF9, 0x40, 0x63, - 0xAD, 0x80, 0xF0, 0xA3, 0x09, 0x02, 0x3C, 0x03, 0x2C, 0x41, 0x2A, 0x44, 0x40, 0x4C, 0x28, 0x44, - 0x40, 0x4A, 0x00, 0x64, 0x40, 0x48, 0xF4, 0x01, 0xD1, 0x80, 0x01, 0x02, 0x31, 0x04, 0x10, 0xA3, - 0x80, 0x60, 0x00, 0x65, 0xA5, 0x80, 0xCF, 0x83, 0x08, 0x02, 0x28, 0x44, 0x60, 0x88, 0x2A, 0x44, - 0x70, 0x8A, 0x2C, 0x44, 0x70, 0x8C, 0xF1, 0x81, 0xF5, 0x01, 0xE7, 0xA3, 0x64, 0x44, 0x00, 0xA8, - 0x00, 0x62, 0x02, 0x02, 0x00, 0x61, 0x1C, 0x00, 0xE0, 0x84, 0xDE, 0x82, 0xFD, 0x04, 0x42, 0xFE, - 0xF8, 0x84, 0x62, 0x45, 0xC7, 0x83, 0x60, 0x45, 0x02, 0xFE, 0xD5, 0x84, 0x02, 0x05, 0x01, 0x05, - 0x61, 0x44, 0xCF, 0x83, 0x60, 0x41, 0x08, 0x03, 0x28, 0x44, 0x60, 0x88, 0x2A, 0x44, 0x70, 0x8A, - 0x2C, 0x44, 0x70, 0x8C, 0xF1, 0x81, 0xF1, 0x01, 0xCE, 0x82, 0xE9, 0x81, 0xFD, 0x02, 0xF1, 0x81, - 0x09, 0xF2, 0xFF, 0xFF, 0x60, 0x47, 0xE8, 0x84, 0xE8, 0x84, 0x5A, 0xD2, 0x3F, 0xB5, 0xE0, 0x84, - 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xB4, 0x84, 0x61, 0x45, 0xD4, 0x84, - 0xC0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x93, 0x10, 0x60, 0x0A, 0xF3, 0xFF, 0xFF, - 0x02, 0x18, 0x2E, 0x58, 0xFF, 0xFF, 0x16, 0x65, 0x32, 0x40, 0x80, 0x26, 0x16, 0x65, 0x73, 0x44, - 0xD4, 0x93, 0x69, 0xF3, 0x26, 0x46, 0x04, 0xBC, 0xA2, 0xDB, 0x26, 0xF0, 0xFF, 0x67, 0x20, 0x88, - 0x64, 0x5F, 0x40, 0x4A, 0x24, 0x60, 0x58, 0x4E, 0x80, 0x78, 0xFF, 0xFF, 0x0A, 0x48, 0x24, 0x60, - 0x58, 0x4E, 0x90, 0x78, 0xFF, 0xFF, 0x24, 0x60, 0x58, 0x4E, 0xAC, 0x78, 0xFF, 0xFF, 0x6B, 0xF3, - 0xFF, 0xFF, 0xC8, 0x84, 0xFF, 0xFF, 0x01, 0x05, 0x00, 0x64, 0x6B, 0xFB, 0x08, 0x60, 0x0C, 0xF1, - 0x00, 0x60, 0x40, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x1C, 0x60, 0xCE, 0x64, 0x13, 0x60, - 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x08, 0x60, 0x0C, 0xF1, 0xFF, 0x60, - 0xDF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x1E, 0xF1, - 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x1C, 0x60, - 0xDA, 0x63, 0xA3, 0xDF, 0x06, 0xA3, 0x10, 0x60, 0xA4, 0x64, 0xBD, 0xDB, 0xBD, 0xDB, 0x06, 0x64, - 0xA3, 0xDB, 0x27, 0x60, 0x68, 0x64, 0x08, 0x60, 0x51, 0xFB, 0x10, 0x60, 0x0F, 0xF1, 0x0E, 0x60, - 0x6F, 0xF9, 0x27, 0x60, 0xCF, 0x64, 0x08, 0x60, 0x38, 0xFB, 0x11, 0x60, 0x44, 0x63, 0x08, 0x60, - 0x66, 0xFD, 0x12, 0x60, 0x40, 0x63, 0x08, 0x60, 0x67, 0xFD, 0xCF, 0xF3, 0x02, 0x63, 0x01, 0x1B, - 0xCF, 0xFD, 0xCF, 0xF3, 0xFF, 0xFF, 0xF7, 0xA0, 0x01, 0x64, 0x01, 0x06, 0xCF, 0xFB, 0xCF, 0xF3, - 0xCF, 0xFB, 0xCF, 0xF3, 0x12, 0x60, 0x78, 0x63, 0x26, 0x18, 0xCC, 0x84, 0xFF, 0xFF, 0x02, 0x03, - 0x2A, 0xA3, 0xFB, 0x01, 0x63, 0x46, 0x10, 0x60, 0xF2, 0x63, 0x0E, 0x61, 0x60, 0xFE, 0xA6, 0xD1, - 0xDE, 0x86, 0x01, 0x64, 0x64, 0x40, 0x7F, 0x36, 0x00, 0x64, 0xA3, 0xDB, 0xDB, 0x83, 0xA3, 0xD9, - 0xCD, 0x81, 0x04, 0xA3, 0xF4, 0x02, 0x11, 0x60, 0x62, 0x63, 0x1C, 0x61, 0xA6, 0xD1, 0xDE, 0x86, - 0x01, 0x64, 0x64, 0x40, 0x7F, 0x36, 0x00, 0x64, 0xA3, 0xDB, 0xDB, 0x83, 0xA3, 0xD9, 0xCD, 0x81, - 0x06, 0xA3, 0xF4, 0x02, 0x20, 0xFE, 0x00, 0x60, 0x60, 0x64, 0x08, 0x60, 0x1F, 0xFB, 0x27, 0x60, - 0xE1, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x11, 0x60, 0x44, 0x63, 0x08, 0x60, - 0x66, 0xFD, 0x12, 0x60, 0x40, 0x63, 0x08, 0x60, 0x67, 0xFD, 0x00, 0x60, 0x60, 0x64, 0x08, 0x60, - 0x1F, 0xFB, 0x27, 0x60, 0xE1, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x28, 0xF3, - 0xFF, 0xFF, 0x60, 0x47, 0x0F, 0xB4, 0x98, 0x00, 0xFF, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x04, 0x64, - 0x13, 0x60, 0x1C, 0xFB, 0x27, 0x00, 0x0C, 0x64, 0x3F, 0x40, 0x02, 0x2B, 0x23, 0x00, 0x29, 0xF1, - 0x13, 0x60, 0x1C, 0xFB, 0x5A, 0xD9, 0x27, 0x60, 0xFD, 0x64, 0x9F, 0xFB, 0xFF, 0xFF, 0x2D, 0xFF, - 0x2A, 0x60, 0x1D, 0x78, 0xFF, 0xFF, 0x29, 0x60, 0x1C, 0x63, 0x09, 0x61, 0x3D, 0x60, 0x58, 0x4D, - 0x23, 0x78, 0xFF, 0xFF, 0x75, 0x00, 0x95, 0xF3, 0xFF, 0xFF, 0x7F, 0xB4, 0x95, 0xFB, 0x06, 0x64, - 0x13, 0x60, 0x1C, 0xFB, 0xFF, 0xFF, 0x2D, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x08, 0x64, - 0x13, 0x60, 0x1C, 0xFB, 0x28, 0x60, 0x7A, 0x64, 0x9F, 0xFB, 0xFF, 0xFF, 0x2D, 0xFF, 0x2A, 0x60, - 0x1D, 0x78, 0xFF, 0xFF, 0x29, 0xF3, 0x12, 0x60, 0x45, 0x65, 0x60, 0x5C, 0x3F, 0x40, 0x02, 0x2B, - 0x13, 0x00, 0x00, 0x37, 0x11, 0x00, 0x01, 0x3B, 0x53, 0x00, 0x11, 0x60, 0x65, 0x63, 0xFF, 0xB7, - 0x60, 0x5C, 0xA3, 0xD3, 0x08, 0xA3, 0x00, 0x7E, 0xD0, 0x80, 0xD7, 0x80, 0x02, 0x03, 0xF9, 0x02, - 0x47, 0x00, 0xF4, 0xA3, 0xA3, 0xD3, 0x05, 0x00, 0x00, 0xBC, 0xF2, 0xA4, 0x41, 0x03, 0x40, 0x07, - 0x64, 0x44, 0x7D, 0xFB, 0xA1, 0xFB, 0x07, 0x64, 0xA2, 0xFB, 0x28, 0x60, 0x7A, 0x64, 0x9F, 0xFB, - 0xFF, 0xFF, 0xDF, 0xFE, 0x00, 0x64, 0x19, 0xFF, 0x2A, 0x60, 0x1D, 0x78, 0xFF, 0xFF, 0x88, 0xFF, - 0xBA, 0x60, 0x98, 0x71, 0x8D, 0xE2, 0x01, 0x11, 0x09, 0x00, 0x71, 0x40, 0x80, 0x27, 0xFB, 0x01, - 0x88, 0xE2, 0xBA, 0x60, 0xD0, 0x64, 0x03, 0xFB, 0x8D, 0xFF, 0x15, 0x00, 0x8D, 0xFF, 0x28, 0x60, - 0xFB, 0x63, 0x06, 0x60, 0x0B, 0xFD, 0xFF, 0xFF, 0x62, 0xFF, 0x28, 0x60, 0x67, 0x63, 0x9F, 0xFD, - 0xFF, 0xFF, 0x1A, 0xFF, 0x2A, 0x60, 0x1D, 0x78, 0xFF, 0xFF, 0xA3, 0x60, 0xF4, 0x63, 0x06, 0x60, - 0x0B, 0xFD, 0xFF, 0xFF, 0x62, 0xFF, 0x29, 0xF5, 0x26, 0x60, 0x20, 0x63, 0x25, 0x60, 0xF2, 0x64, - 0xBD, 0xDB, 0x66, 0x44, 0xBD, 0xDB, 0x02, 0x64, 0xA3, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF9, 0xFE, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x68, 0x01, 0x00, 0x36, 0x69, 0x01, 0x01, 0x36, 0x6B, 0x01, - 0x02, 0x36, 0x81, 0x01, 0x03, 0x36, 0x8B, 0x01, 0x04, 0x36, 0xC1, 0x01, 0x05, 0x36, 0xBF, 0x01, - 0x06, 0x36, 0xF1, 0x01, 0x07, 0x36, 0xBB, 0x01, 0x08, 0x36, 0x8C, 0x01, 0x09, 0x36, 0x0C, 0x00, - 0x0A, 0x36, 0x0D, 0x00, 0x0B, 0x36, 0x0E, 0x00, 0x0C, 0x36, 0x17, 0x00, 0x0D, 0x36, 0x0D, 0x00, - 0x0E, 0x36, 0x1D, 0x00, 0x0F, 0x36, 0x41, 0x00, 0x02, 0x60, 0x00, 0x64, 0x08, 0x00, 0x04, 0x60, - 0x00, 0x64, 0x05, 0x00, 0x00, 0x60, 0x01, 0x64, 0x02, 0x00, 0x20, 0x60, 0x00, 0x64, 0x32, 0x45, - 0xB4, 0x85, 0x45, 0x52, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x29, 0x60, 0xDE, 0x63, 0x06, 0x60, - 0x0B, 0xFD, 0x62, 0xFF, 0xFF, 0xFF, 0x1A, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x3F, 0x40, - 0x02, 0x2B, 0x15, 0x00, 0x88, 0xFF, 0xBA, 0x60, 0x98, 0x71, 0x8D, 0xE2, 0x01, 0x11, 0x09, 0x00, - 0x71, 0x40, 0x80, 0x27, 0xFB, 0x01, 0x88, 0xE2, 0xBA, 0x60, 0xD0, 0x64, 0x03, 0xFB, 0x8D, 0xFF, - 0x11, 0x00, 0x8D, 0xFF, 0x90, 0x60, 0x00, 0xE8, 0x28, 0x60, 0xFB, 0x63, 0x04, 0x00, 0x91, 0x60, - 0x00, 0xE8, 0x29, 0x60, 0xC4, 0x63, 0x2A, 0xE8, 0x06, 0x60, 0x0B, 0xFD, 0xFF, 0xFF, 0x62, 0xFF, - 0xFF, 0xFF, 0x1A, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xF1, 0xF3, 0xFF, 0xFF, 0xEF, 0xB4, - 0xF1, 0xFB, 0xAD, 0x4F, 0xFD, 0xB4, 0xA0, 0x5D, 0xD0, 0x60, 0x00, 0xE8, 0x2A, 0xE8, 0xD9, 0x60, - 0xFE, 0x64, 0x32, 0x45, 0xA4, 0x85, 0x45, 0x52, 0x99, 0xFF, 0xA5, 0x4F, 0xFF, 0xB4, 0x07, 0xFB, - 0x98, 0xFF, 0xA3, 0x60, 0xF4, 0x63, 0x06, 0x60, 0x0B, 0xFD, 0x62, 0xFF, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x08, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x43, 0xFF, 0x01, 0x60, 0x00, 0xE1, 0x28, 0xF3, - 0x47, 0xFF, 0x60, 0x40, 0x07, 0x37, 0x66, 0x00, 0x05, 0x3B, 0x04, 0x00, 0xFF, 0x0A, 0x80, 0xE1, - 0xA1, 0xFF, 0xFF, 0xFF, 0x1B, 0x60, 0xF3, 0xF1, 0xAD, 0x4F, 0x00, 0x7F, 0xFA, 0xB4, 0x64, 0x41, - 0x7D, 0xF1, 0x02, 0xB1, 0x04, 0x65, 0x02, 0x02, 0x64, 0x40, 0x01, 0x2B, 0x01, 0x65, 0xB4, 0x84, - 0xA0, 0x5D, 0x29, 0xF5, 0x2A, 0xF3, 0x47, 0xFF, 0x3F, 0xF0, 0x01, 0x1B, 0x01, 0x64, 0x60, 0x56, - 0xAD, 0xE2, 0xB5, 0xFF, 0x6C, 0x40, 0x40, 0xE1, 0xA1, 0xFF, 0x00, 0xF4, 0x6E, 0x61, 0x12, 0x62, - 0x64, 0x43, 0x01, 0xE1, 0x03, 0x64, 0xE2, 0xD0, 0xC9, 0x81, 0x64, 0x4C, 0xCC, 0x84, 0xDA, 0x82, - 0xFA, 0x02, 0x01, 0x60, 0x00, 0x6B, 0x9A, 0xFF, 0xCA, 0x82, 0x03, 0x00, 0x00, 0xF4, 0x81, 0xF2, - 0xFF, 0xFF, 0x7A, 0xD0, 0xA1, 0xFF, 0x64, 0x4C, 0xFC, 0x1C, 0xF8, 0x1D, 0x00, 0xB9, 0x06, 0x1E, - 0x02, 0x02, 0x00, 0xF4, 0xDA, 0x82, 0x5A, 0xD2, 0xA1, 0xFF, 0x60, 0x4D, 0x3F, 0x40, 0x02, 0x2B, - 0x10, 0x00, 0x28, 0xF3, 0xA5, 0x60, 0xC4, 0x65, 0x60, 0x40, 0x0E, 0x3B, 0x0A, 0x00, 0xF1, 0xF3, - 0xFF, 0xFF, 0x10, 0xBC, 0xF1, 0xFB, 0xAD, 0x4F, 0x02, 0xBC, 0x00, 0x7F, 0xA0, 0x5D, 0x85, 0x4C, - 0xFE, 0x01, 0xF1, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0xF1, 0xFB, 0xA1, 0xFF, 0x87, 0x4E, 0x87, 0x4C, - 0x87, 0x4C, 0x87, 0x4C, 0x87, 0x4C, 0x67, 0x4C, 0xFF, 0xFF, 0xBC, 0xFF, 0x00, 0xE1, 0xD5, 0xFE, - 0xA1, 0xFF, 0xFF, 0xFF, 0x00, 0x64, 0x40, 0x46, 0x60, 0x41, 0xB5, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, - 0x29, 0xF5, 0x3F, 0xF0, 0x24, 0xF2, 0x44, 0x43, 0x40, 0x4D, 0x00, 0xF4, 0xF3, 0x60, 0xA0, 0x65, - 0x10, 0x62, 0x5A, 0xD2, 0xD9, 0x81, 0xD4, 0x80, 0xFF, 0xFF, 0xFB, 0x02, 0x61, 0x45, 0x2D, 0x44, - 0xD4, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xFD, 0xA5, 0x48, 0x60, 0x00, 0x64, 0xC4, 0x9D, - 0x0D, 0x60, 0x00, 0x6B, 0x2D, 0x44, 0xC0, 0x83, 0xBB, 0xFF, 0x29, 0xF5, 0x01, 0xE1, 0x00, 0xF4, - 0x6C, 0x61, 0x10, 0x62, 0x05, 0x00, 0x00, 0xF4, 0x01, 0xF2, 0xFF, 0xFF, 0x60, 0x41, 0x04, 0x62, - 0xA1, 0xFF, 0xFF, 0xFF, 0x01, 0x10, 0x1A, 0x00, 0x26, 0x44, 0x01, 0x26, 0x0C, 0x00, 0x2D, 0x44, - 0xC8, 0x84, 0x40, 0x4D, 0x02, 0x03, 0x6C, 0x45, 0xF3, 0x01, 0x03, 0x15, 0x01, 0x64, 0x05, 0xFA, - 0x15, 0x00, 0x6C, 0x45, 0xED, 0x01, 0x23, 0x44, 0xC8, 0x84, 0x40, 0x43, 0x02, 0x03, 0x6C, 0x45, - 0xE7, 0x01, 0x00, 0x64, 0x01, 0x15, 0x01, 0x64, 0x6C, 0x45, 0x05, 0xFB, 0xE2, 0xD2, 0xDA, 0x82, - 0xC9, 0x81, 0x60, 0x4C, 0xDD, 0x1C, 0xD7, 0x03, 0xBC, 0xFF, 0xDA, 0x01, 0x00, 0xE1, 0xD5, 0xFE, - 0xA1, 0xFF, 0xFF, 0xFF, 0x08, 0xE1, 0xA1, 0xFF, 0x67, 0x4C, 0x43, 0xFF, 0xF1, 0xF3, 0xFF, 0xFF, - 0x10, 0xBC, 0xF1, 0xFB, 0xAD, 0x4F, 0x02, 0xBC, 0x00, 0x7F, 0xA0, 0x5D, 0x01, 0xE1, 0x01, 0x60, - 0x69, 0x6B, 0xA5, 0x60, 0xC4, 0x64, 0x60, 0x4C, 0xBB, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x60, 0x4C, - 0xA1, 0xFF, 0xFF, 0xFF, 0x60, 0x4C, 0xFC, 0x01, 0x29, 0xF3, 0x2A, 0xF1, 0x07, 0xB5, 0x04, 0xE1, - 0x65, 0x41, 0x64, 0x54, 0xCD, 0xE2, 0x95, 0x81, 0xA1, 0x5D, 0xA1, 0xFF, 0xFF, 0xFF, 0xF9, 0x01, - 0x61, 0x44, 0xFE, 0xFB, 0xFF, 0xFD, 0xFF, 0x01, 0x7F, 0x67, 0x01, 0x61, 0x23, 0x58, 0xFF, 0xFF, - 0xB1, 0xFE, 0x08, 0x05, 0xB0, 0xFE, 0x09, 0x05, 0xB2, 0xFE, 0xB3, 0xFE, 0x78, 0x43, 0x01, 0x61, - 0x29, 0x60, 0xEA, 0x78, 0x34, 0x60, 0x8D, 0x78, 0xFF, 0xFF, 0x28, 0xF3, 0x29, 0xF1, 0x40, 0x44, - 0x44, 0x45, 0x2A, 0xF1, 0x2B, 0xF1, 0x44, 0x46, 0x44, 0x47, 0x3F, 0xB4, 0xE0, 0x85, 0x20, 0x60, - 0x28, 0x64, 0x44, 0xD7, 0x58, 0x43, 0xFF, 0xFF, 0x60, 0x45, 0x0E, 0x60, 0xDD, 0xF3, 0x61, 0x43, - 0x04, 0xB4, 0x24, 0x44, 0x02, 0x03, 0x13, 0xFF, 0x06, 0x00, 0x3F, 0xB4, 0xB4, 0x84, 0xFF, 0x27, - 0x05, 0xFD, 0x04, 0xFB, 0x10, 0x75, 0xA1, 0xFF, 0xFF, 0xFF, 0x86, 0x3E, 0xB4, 0xFE, 0x0B, 0x05, - 0xB5, 0xFE, 0x02, 0x24, 0x9F, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0xFE, 0x07, 0x05, 0x78, 0x43, - 0x01, 0x61, 0x29, 0x60, 0xEA, 0x78, 0x34, 0x60, 0xC8, 0x78, 0xFF, 0xFF, 0x36, 0x44, 0x00, 0x7F, - 0xEE, 0xA0, 0x60, 0x45, 0x05, 0x05, 0x20, 0x60, 0xBA, 0x64, 0x44, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, - 0x78, 0x43, 0x01, 0x61, 0x29, 0x60, 0xEA, 0x78, 0x78, 0x43, 0x01, 0x61, 0x29, 0x60, 0xEA, 0x78, - 0x7F, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x10, 0x02, 0x10, 0x64, - 0x40, 0x40, 0x02, 0x64, 0x40, 0x50, 0x61, 0xFF, 0x3F, 0x40, 0x40, 0x26, 0x04, 0x00, 0x10, 0xE0, - 0x46, 0x60, 0x09, 0xE0, 0x00, 0x00, 0x27, 0xF1, 0x00, 0x66, 0x20, 0x78, 0x42, 0xFE, 0x23, 0x58, - 0xFF, 0xFF, 0x7F, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x1A, 0x02, - 0x0E, 0x60, 0xDD, 0xF3, 0x07, 0x7C, 0x20, 0xB5, 0x0C, 0xB5, 0x04, 0x03, 0x03, 0x02, 0xDB, 0xF9, - 0x00, 0x67, 0x10, 0x00, 0x00, 0x61, 0x41, 0x56, 0xC7, 0xFE, 0xAD, 0x01, 0x36, 0x47, 0xFF, 0x23, - 0x04, 0x00, 0x00, 0x7F, 0x60, 0x41, 0x7F, 0x67, 0x05, 0x00, 0x62, 0xFF, 0x20, 0x44, 0x80, 0xBC, - 0x40, 0x40, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x7F, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, - 0x7F, 0x67, 0x02, 0x61, 0x31, 0x02, 0x0E, 0x60, 0xDD, 0xF3, 0x01, 0x7C, 0x20, 0xB5, 0x0C, 0xB5, - 0x03, 0x03, 0x02, 0x02, 0xDB, 0xF9, 0xFF, 0xFF, 0x02, 0x61, 0x41, 0x56, 0xC7, 0xFE, 0x2A, 0x60, - 0x1D, 0x78, 0xFF, 0xFF, 0x9D, 0xF1, 0x20, 0x44, 0x64, 0x40, 0xFF, 0x26, 0x1C, 0x00, 0x7F, 0xB4, - 0x40, 0x40, 0x5C, 0x5E, 0x82, 0xFF, 0x26, 0x44, 0xFD, 0xB4, 0x40, 0x46, 0x5C, 0x41, 0x87, 0xFF, - 0x62, 0xFF, 0x13, 0x60, 0x02, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x04, 0x03, 0x09, 0xF2, - 0x8F, 0xFC, 0xAC, 0x86, 0xFB, 0x01, 0x95, 0xF3, 0xFF, 0xFF, 0x7F, 0xB4, 0x95, 0xFB, 0x06, 0x64, - 0x13, 0x60, 0x1C, 0xFB, 0x2D, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x00, 0x67, 0x20, 0x40, - 0x80, 0x2A, 0x02, 0x00, 0x7F, 0x67, 0x06, 0x61, 0x60, 0x45, 0x0E, 0x60, 0xDD, 0xF3, 0x61, 0x43, - 0x04, 0xB4, 0x24, 0x44, 0x02, 0x03, 0x13, 0xFF, 0x56, 0x01, 0x3F, 0xB4, 0xB4, 0x84, 0xFF, 0x27, - 0x05, 0xFD, 0x04, 0xFB, 0x20, 0x40, 0x80, 0x2A, 0x02, 0x00, 0x10, 0x75, 0x05, 0x00, 0x01, 0x64, - 0x19, 0x60, 0xF7, 0xFB, 0x08, 0x60, 0x10, 0x75, 0x46, 0x01, 0x25, 0x46, 0x01, 0xF2, 0x08, 0xF0, - 0x60, 0x47, 0x03, 0xB4, 0x03, 0xAC, 0x7F, 0x67, 0x03, 0x61, 0x08, 0x02, 0x26, 0x60, 0x20, 0x64, - 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x24, 0x40, 0x01, 0x2B, 0x49, 0x00, 0x25, 0x44, 0x1F, 0xB4, 0xE0, 0x85, 0x2A, 0x60, 0xF4, 0x64, - 0xC4, 0x98, 0xFF, 0xFF, 0xC0, 0xFE, 0x3D, 0x00, 0xC1, 0xFE, 0x3B, 0x00, 0xC2, 0xFE, 0x39, 0x00, - 0xC3, 0xFE, 0x37, 0x00, 0xC4, 0xFE, 0x35, 0x00, 0xC5, 0xFE, 0x33, 0x00, 0xC6, 0xFE, 0x31, 0x00, - 0xC7, 0xFE, 0x2F, 0x00, 0xC8, 0xFE, 0x2D, 0x00, 0xC9, 0xFE, 0x2B, 0x00, 0xCA, 0xFE, 0x29, 0x00, - 0xCB, 0xFE, 0x27, 0x00, 0xCC, 0xFE, 0x25, 0x00, 0xCD, 0xFE, 0x23, 0x00, 0xCE, 0xFE, 0x21, 0x00, - 0xCF, 0xFE, 0x1F, 0x00, 0xD0, 0xFE, 0x1D, 0x00, 0xD1, 0xFE, 0x1B, 0x00, 0xD2, 0xFE, 0x19, 0x00, - 0xD3, 0xFE, 0x17, 0x00, 0xD4, 0xFE, 0x15, 0x00, 0xD5, 0xFE, 0x13, 0x00, 0xD6, 0xFE, 0x11, 0x00, - 0xD7, 0xFE, 0x0F, 0x00, 0xD8, 0xFE, 0x0D, 0x00, 0xD9, 0xFE, 0x0B, 0x00, 0xDA, 0xFE, 0x09, 0x00, - 0xDB, 0xFE, 0x07, 0x00, 0xDC, 0xFE, 0x05, 0x00, 0xDD, 0xFE, 0x03, 0x00, 0xDE, 0xFE, 0x01, 0x00, - 0xDF, 0xFE, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x9F, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x9E, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x9D, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x9C, 0xFE, 0xF0, 0x84, - 0xFF, 0xFF, 0x9B, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x9A, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x99, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x98, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x97, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x96, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x95, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x94, 0xFE, 0xF0, 0x84, - 0xFF, 0xFF, 0x93, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x92, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x91, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x90, 0xFE, 0xF0, 0x84, 0x06, 0xFB, 0x8F, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x8E, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x8D, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x8C, 0xFE, 0xF0, 0x84, - 0xFF, 0xFF, 0x8B, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x8A, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x89, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x88, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x87, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, - 0x86, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x85, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x84, 0xFE, 0xF0, 0x84, - 0xFF, 0xFF, 0x83, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x82, 0xFE, 0xF0, 0x84, 0xFF, 0xFF, 0x81, 0xFE, - 0xF0, 0x84, 0xFF, 0xFF, 0x80, 0xFE, 0xF0, 0x84, 0x05, 0xFB, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x5C, 0x5C, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x24, 0x40, 0x01, 0x27, 0x55, 0x00, 0x05, 0x60, - 0x00, 0x63, 0x05, 0xFD, 0x30, 0x44, 0xBD, 0xDB, 0x31, 0x44, 0xBD, 0xDB, 0x32, 0x44, 0xBD, 0xDB, - 0x33, 0x44, 0xBD, 0xDB, 0x34, 0x44, 0xBD, 0xDB, 0x35, 0x44, 0xBD, 0xDB, 0x36, 0x44, 0xBD, 0xDB, - 0x37, 0x44, 0xBD, 0xDB, 0x38, 0x44, 0xBD, 0xDB, 0x39, 0x44, 0xBD, 0xDB, 0x3A, 0x44, 0xBD, 0xDB, - 0x3B, 0x44, 0xBD, 0xDB, 0x3C, 0x44, 0xBD, 0xDB, 0x3D, 0x44, 0xBD, 0xDB, 0x3E, 0x44, 0xBD, 0xDB, - 0x3F, 0x44, 0xBD, 0xDB, 0x02, 0x61, 0x61, 0x44, 0x02, 0x36, 0x82, 0xFF, 0x03, 0x36, 0x83, 0xFF, - 0x04, 0x36, 0x84, 0xFF, 0x05, 0x36, 0x85, 0xFF, 0x06, 0x36, 0x86, 0xFF, 0x07, 0x36, 0x87, 0xFF, - 0x20, 0x44, 0xBD, 0xDB, 0x21, 0x44, 0xBD, 0xDB, 0x22, 0x44, 0xBD, 0xDB, 0x23, 0x44, 0xBD, 0xDB, - 0x24, 0x44, 0xBD, 0xDB, 0x25, 0x44, 0xBD, 0xDB, 0x26, 0x44, 0xBD, 0xDB, 0x27, 0x44, 0xBD, 0xDB, - 0x28, 0x44, 0xBD, 0xDB, 0x29, 0x44, 0xBD, 0xDB, 0x2A, 0x44, 0xBD, 0xDB, 0x2B, 0x44, 0xBD, 0xDB, - 0x2C, 0x44, 0xBD, 0xDB, 0x2D, 0x44, 0xBD, 0xDB, 0x2E, 0x44, 0xBD, 0xDB, 0x2F, 0x44, 0xBD, 0xDB, - 0xDD, 0x81, 0x08, 0x3A, 0xD0, 0x01, 0x54, 0x00, 0x27, 0x40, 0x10, 0x26, 0x30, 0x00, 0x26, 0x44, - 0x01, 0x36, 0x2D, 0x00, 0x02, 0x36, 0x82, 0xFF, 0x03, 0x36, 0x83, 0xFF, 0x04, 0x36, 0x84, 0xFF, - 0x05, 0x36, 0x85, 0xFF, 0x06, 0x36, 0x86, 0xFF, 0x25, 0x44, 0x00, 0x36, 0x44, 0x40, 0x01, 0x36, - 0x44, 0x41, 0x02, 0x36, 0x44, 0x42, 0x03, 0x36, 0x44, 0x43, 0x04, 0x36, 0x44, 0x44, 0x05, 0x36, - 0x44, 0x45, 0x06, 0x36, 0x44, 0x46, 0x07, 0x36, 0x44, 0x47, 0x08, 0x36, 0x44, 0x48, 0x09, 0x36, - 0x44, 0x49, 0x0A, 0x36, 0x44, 0x4A, 0x0B, 0x36, 0x44, 0x4B, 0x0C, 0x36, 0x44, 0x4C, 0x0D, 0x36, - 0x44, 0x4D, 0x0E, 0x36, 0x44, 0x4E, 0x0F, 0x36, 0x44, 0x4F, 0x87, 0xFF, 0x21, 0x00, 0x25, 0x44, - 0x10, 0x36, 0x44, 0x50, 0x11, 0x36, 0x44, 0x51, 0x12, 0x36, 0x44, 0x52, 0x13, 0x36, 0x44, 0x53, - 0x14, 0x36, 0x44, 0x54, 0x15, 0x36, 0x44, 0x55, 0x16, 0x36, 0x44, 0x56, 0x17, 0x36, 0x44, 0x57, - 0x18, 0x36, 0x44, 0x58, 0x19, 0x36, 0x44, 0x59, 0x1A, 0x36, 0x44, 0x5A, 0x1B, 0x36, 0x44, 0x5B, - 0x1C, 0x36, 0x44, 0x5C, 0x1D, 0x36, 0x44, 0x5D, 0x1E, 0x36, 0x44, 0x5E, 0x1F, 0x36, 0x44, 0x5F, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0x46, 0xB5, 0x60, 0x58, 0x4F, 0xCE, 0x78, 0xFF, 0xFF, - 0x03, 0x61, 0x7F, 0x67, 0x0A, 0x02, 0x00, 0xF0, 0x04, 0x64, 0x13, 0x60, 0x10, 0xFB, 0x5A, 0xD9, - 0x0A, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x40, 0x60, - 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x12, 0x02, 0x14, 0x64, 0x13, 0x60, - 0x1C, 0xFB, 0x00, 0x60, 0x50, 0x63, 0x5A, 0xDD, 0x2C, 0x60, 0x75, 0x64, 0x9F, 0xFB, 0x2D, 0xFF, - 0x2A, 0x60, 0x1D, 0x78, 0xFF, 0xFF, 0x2A, 0xF3, 0x05, 0xFB, 0x2B, 0xF3, 0x06, 0xFB, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x40, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, - 0x0E, 0x02, 0x16, 0x64, 0x13, 0x60, 0x1C, 0xFB, 0x00, 0x60, 0x50, 0x63, 0x5A, 0xDD, 0x2C, 0x60, - 0x90, 0x64, 0x9F, 0xFB, 0x2D, 0xFF, 0x2A, 0x60, 0x1D, 0x78, 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x7F, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x02, 0x61, 0x38, 0x02, 0x25, 0x45, - 0x20, 0x44, 0x80, 0x2A, 0x34, 0x00, 0xF1, 0x60, 0x00, 0x64, 0xD4, 0x80, 0xFF, 0xFF, 0x06, 0x03, - 0xF1, 0x60, 0x02, 0x64, 0xD4, 0x80, 0xFF, 0xFF, 0x2F, 0x03, 0x28, 0x00, 0x19, 0x60, 0x40, 0xF1, - 0xB7, 0xF3, 0x20, 0x60, 0x22, 0x61, 0xA0, 0x84, 0xA1, 0xDB, 0x25, 0x45, 0x25, 0x60, 0x86, 0x63, - 0x02, 0x61, 0xBD, 0xD3, 0xBD, 0xD1, 0xD4, 0x80, 0xBD, 0xD3, 0xBD, 0xD5, 0xCD, 0x81, 0x02, 0x03, - 0x15, 0x03, 0xF7, 0x01, 0xA2, 0xFF, 0xA6, 0xD3, 0x40, 0x4C, 0x00, 0xA8, 0x67, 0x43, 0x0C, 0x02, - 0xA2, 0xDD, 0x42, 0x48, 0x64, 0x41, 0xB6, 0x60, 0x58, 0x4D, 0x25, 0x78, 0xFF, 0xFF, 0x66, 0x44, - 0x28, 0xDB, 0x02, 0x03, 0x2C, 0x58, 0xA3, 0xFF, 0x0C, 0x61, 0x03, 0x00, 0x04, 0x61, 0x7F, 0x67, - 0x01, 0x00, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x01, 0x64, 0x10, 0x60, 0x13, 0xFB, 0xFF, 0xFF, - 0xC4, 0xFE, 0xF7, 0x01, 0xC6, 0xFE, 0xF5, 0x01, 0x7E, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, - 0x02, 0x61, 0x3F, 0x02, 0x25, 0x45, 0xF8, 0x2B, 0x3B, 0x00, 0x2E, 0xF5, 0x67, 0x44, 0xD4, 0x80, - 0x20, 0x60, 0xCC, 0x63, 0x39, 0x03, 0x79, 0x61, 0x24, 0x44, 0x01, 0x27, 0x29, 0x00, 0xA3, 0xFC, - 0xA4, 0xF8, 0xBD, 0xD3, 0xA3, 0xD1, 0xD4, 0x80, 0xCD, 0x81, 0x08, 0x24, 0x64, 0x58, 0x08, 0xA3, - 0xF8, 0x02, 0x08, 0x60, 0x00, 0x63, 0xBD, 0xD3, 0xA3, 0xD1, 0xFE, 0xA0, 0xFA, 0x60, 0x00, 0x64, - 0xD0, 0x80, 0x14, 0x02, 0x13, 0x02, 0x04, 0xA3, 0xBE, 0xD3, 0xBD, 0xD1, 0x0F, 0x18, 0xD4, 0x80, - 0x0D, 0x18, 0x03, 0x03, 0xC3, 0x83, 0xC3, 0x83, 0xF7, 0x01, 0x64, 0x41, 0xDD, 0x81, 0xE1, 0x81, - 0xCB, 0x83, 0x46, 0x65, 0x36, 0x60, 0x58, 0x4F, 0x22, 0x78, 0xFF, 0xFF, 0x00, 0x67, 0x0A, 0x00, - 0xBD, 0xD3, 0xBE, 0xD1, 0xD4, 0x80, 0xCD, 0x81, 0x08, 0x24, 0x64, 0x58, 0x08, 0xA3, 0xF8, 0x02, - 0x04, 0x61, 0x7F, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x0F, 0x64, 0x23, 0xFA, 0x67, 0x44, 0x24, 0xFA, - 0x62, 0x41, 0x3C, 0x60, 0x00, 0x65, 0x1A, 0x63, 0x80, 0x60, 0x9E, 0x64, 0x65, 0x46, 0x58, 0xD0, - 0x2E, 0xF5, 0x59, 0xD8, 0xFB, 0x1F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xCB, 0x83, 0xBF, 0xD1, - 0x4A, 0x65, 0x64, 0x43, 0xBD, 0xD3, 0xFF, 0xFF, 0x60, 0x41, 0x01, 0x26, 0xDC, 0x81, 0xE9, 0x84, - 0xDC, 0x84, 0x23, 0xFA, 0x09, 0x00, 0x4B, 0xD3, 0xFF, 0xFF, 0x60, 0x41, 0xE8, 0x84, 0xDC, 0x84, - 0x23, 0xFA, 0xBF, 0xD1, 0x4A, 0x65, 0x64, 0x43, 0x36, 0x60, 0x58, 0x4F, 0x22, 0x78, 0xFF, 0xFF, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0xF2, 0xFF, 0xFF, 0xE0, 0xA0, 0x20, 0x64, 0x01, 0x06, - 0x25, 0xFA, 0x23, 0xF2, 0xDF, 0xD1, 0xCC, 0x84, 0xE0, 0x85, 0x0B, 0x06, 0xBF, 0xD1, 0x64, 0x41, - 0xD5, 0x80, 0x64, 0x43, 0x01, 0x06, 0x65, 0x41, 0x4A, 0x65, 0x2E, 0x60, 0x58, 0x4F, 0x7A, 0x78, - 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0xDB, 0xF3, 0x02, 0x63, 0x23, 0xFC, 0x07, 0xB4, - 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x4B, 0xD3, 0xBF, 0xD3, 0x60, 0x41, 0xC9, 0x83, - 0xE9, 0x81, 0xDD, 0x81, 0xA3, 0xFA, 0xE0, 0x81, 0x3C, 0x60, 0x00, 0x67, 0x02, 0x24, 0x02, 0xA4, - 0x60, 0x47, 0x40, 0x4B, 0xC9, 0x81, 0x4A, 0x65, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0xA5, 0xD8, - 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF6, 0x1F, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0xFC, 0xA3, 0xA3, 0xD1, 0x4C, 0x65, 0xA4, 0xD3, 0xDA, 0x83, 0x60, 0x47, 0x25, 0xFA, - 0x00, 0x7E, 0x60, 0x47, 0x01, 0x26, 0xDC, 0x84, 0x60, 0x41, 0xE8, 0x84, 0xD8, 0x84, 0x23, 0xFA, - 0xAB, 0x01, 0xFC, 0xA3, 0xA3, 0xD1, 0x4C, 0x65, 0xA4, 0xD3, 0xDA, 0x83, 0x00, 0x7F, 0x25, 0xFA, - 0x60, 0x41, 0x01, 0x26, 0xDD, 0x81, 0xE9, 0x84, 0xD8, 0x84, 0x23, 0xFA, 0x9D, 0x01, 0x2E, 0x60, - 0x40, 0x63, 0xBF, 0xD3, 0xFF, 0xFF, 0x60, 0x41, 0xE8, 0x84, 0xDC, 0x84, 0x23, 0xFA, 0x4A, 0x65, - 0x36, 0x60, 0x58, 0x4F, 0x22, 0x78, 0xFF, 0xFF, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x2E, 0x60, - 0x40, 0x63, 0x23, 0xF2, 0xC0, 0x65, 0xCC, 0x84, 0xE0, 0x81, 0x0A, 0x04, 0xBF, 0xDB, 0xD5, 0x80, - 0x07, 0x03, 0x01, 0x06, 0x65, 0x41, 0x61, 0x44, 0xBF, 0xDB, 0x4A, 0x65, 0x58, 0x4F, 0xA8, 0x00, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x03, 0x4E, 0x2D, 0x60, 0x58, 0x43, 0x55, 0x78, 0xFF, 0xFF, - 0x2F, 0x60, 0x24, 0x61, 0x17, 0x60, 0x81, 0xF3, 0xA1, 0xDB, 0xCC, 0x84, 0xA8, 0x83, 0x05, 0x04, - 0x2F, 0x60, 0x02, 0x64, 0x58, 0xD1, 0x59, 0xD9, 0xFD, 0x1F, 0x0E, 0x43, 0x82, 0x01, 0x23, 0xF2, - 0x25, 0xF2, 0x02, 0xA8, 0xF8, 0xA0, 0x0F, 0x02, 0xEC, 0xA0, 0x0D, 0x04, 0x0C, 0x07, 0x19, 0x60, - 0x4F, 0xF1, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x04, 0x07, 0x19, 0x60, 0x4F, 0xFB, 0x19, 0x60, - 0x53, 0xFB, 0x16, 0x60, 0xD8, 0xFB, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x1D, 0x60, - 0xAE, 0x65, 0x60, 0x41, 0x1D, 0x60, 0x4A, 0x63, 0xA3, 0xDB, 0xFF, 0xA1, 0x48, 0x64, 0x58, 0xD0, - 0x7E, 0xA8, 0x5B, 0xD9, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x64, 0xFF, 0xA1, 0xD7, 0x80, 0x02, 0x03, - 0x01, 0x03, 0xF5, 0x01, 0x2E, 0xF5, 0x00, 0x60, 0x2F, 0x65, 0x25, 0xF2, 0x00, 0x63, 0xCC, 0x84, - 0x03, 0xA3, 0xFD, 0x05, 0x4A, 0x64, 0xD7, 0x80, 0x1C, 0x60, 0xE6, 0x61, 0x18, 0x05, 0xA1, 0xDD, - 0xE3, 0x83, 0xFE, 0xA3, 0x58, 0xD0, 0x7E, 0xA8, 0x59, 0xD9, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x64, - 0xF9, 0x1F, 0x00, 0x63, 0x59, 0xDD, 0x2E, 0xF5, 0x25, 0xF0, 0x0E, 0x60, 0x73, 0xF3, 0xD3, 0x80, - 0x01, 0xB0, 0x04, 0x03, 0x01, 0xA4, 0x03, 0x03, 0xA2, 0xDB, 0x01, 0x00, 0xA2, 0xDD, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x1D, 0x60, 0x4A, 0x61, 0xA1, 0xD3, 0x23, 0xFA, 0xE0, 0x83, 0x4A, 0x65, - 0x04, 0x02, 0x02, 0x63, 0x23, 0xFC, 0xA5, 0xFC, 0x09, 0x00, 0xDB, 0x83, 0x59, 0xD1, 0xA5, 0xD8, - 0xDA, 0x85, 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF8, 0x1F, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x0E, 0x60, 0x73, 0xF3, 0x00, 0x61, 0x02, 0xA4, 0xFE, 0xA0, 0x23, 0xFA, 0x1B, 0x03, - 0xFA, 0xA4, 0xFD, 0xA4, 0x01, 0xA1, 0xFD, 0x07, 0x61, 0x43, 0x23, 0xF2, 0x25, 0xFC, 0xE0, 0x83, - 0x02, 0xA3, 0x1C, 0x60, 0xE6, 0x61, 0x00, 0x60, 0x4A, 0x64, 0x59, 0xD1, 0x58, 0xD8, 0x7E, 0x3A, - 0x02, 0x00, 0x00, 0xF4, 0x02, 0x64, 0xF9, 0x1F, 0x25, 0xF2, 0x23, 0xF2, 0x01, 0xB0, 0xCC, 0x84, - 0x04, 0x02, 0x23, 0xFA, 0x02, 0x00, 0x00, 0x64, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x41, 0x4B, 0x65, 0x42, 0x80, 0x64, 0xD4, 0x85, 0x2B, 0x41, 0x00, 0xA1, 0x55, 0x8B, 0x0D, 0x03, - 0x02, 0x04, 0x65, 0x41, 0x02, 0x00, 0x00, 0x64, 0x40, 0x4B, 0xCA, 0x84, 0x58, 0xD0, 0xC9, 0x81, - 0xBD, 0xD9, 0xFC, 0x02, 0x00, 0xF4, 0x04, 0x65, 0xEC, 0x01, 0x2F, 0x58, 0xFF, 0xFF, 0xFC, 0xA3, - 0xA3, 0xD3, 0x02, 0x7C, 0xA0, 0xD3, 0x23, 0xF8, 0xDC, 0x84, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x02, 0x64, 0x23, 0xFA, 0x01, 0x64, 0x9D, 0xFE, 0x02, 0x28, 0x02, 0x64, 0x25, 0xFA, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x02, 0x7C, 0x23, 0xF8, 0x01, 0x64, 0x25, 0xFA, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0xFC, 0xA3, 0xA3, 0xD1, 0x02, 0x64, 0x23, 0xFA, 0xA4, 0xD3, 0x25, 0xFA, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x02, 0x64, 0x23, 0xFA, 0x88, 0xFF, 0x75, 0x44, 0x8D, 0xFF, - 0xE8, 0x87, 0xE8, 0x84, 0xE8, 0x84, 0x03, 0xB4, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x04, 0x64, 0x23, 0xFA, 0x86, 0xFF, 0x29, 0x44, 0x87, 0xFF, 0x25, 0xFA, 0x55, 0xF3, 0x52, 0xF1, - 0x80, 0x65, 0xC4, 0x87, 0x00, 0x7F, 0x26, 0xFA, 0x64, 0x44, 0xC4, 0x87, 0x00, 0x7F, 0x27, 0xFA, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x05, 0x64, 0x23, 0xFA, 0x52, 0x63, 0xB4, 0xF3, 0x4B, 0xDA, - 0xB3, 0xF3, 0x4B, 0xDA, 0xB2, 0xF3, 0x4B, 0xDA, 0x60, 0x41, 0x88, 0xFF, 0x72, 0x5C, 0x89, 0xFF, - 0x4A, 0xD8, 0xA2, 0x48, 0x20, 0x23, 0x0E, 0x00, 0x64, 0x40, 0x80, 0x27, 0x15, 0x00, 0xDC, 0x84, - 0xBD, 0xDA, 0xBD, 0xD2, 0x11, 0x04, 0xDC, 0x84, 0xA2, 0xDA, 0xA3, 0xD2, 0x0D, 0x04, 0xDC, 0x84, - 0xA3, 0xDA, 0x0A, 0x00, 0x52, 0x63, 0xB4, 0xF3, 0x4B, 0xDA, 0xB3, 0xF3, 0x4B, 0xDA, 0xB2, 0xF3, - 0x4B, 0xDA, 0x54, 0x90, 0x4C, 0x63, 0xE0, 0x02, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0xF0, - 0x23, 0xF2, 0x19, 0x60, 0x46, 0xF9, 0x02, 0xA8, 0x64, 0x44, 0x1F, 0x02, 0x3F, 0x40, 0x02, 0x2B, - 0x16, 0x00, 0x00, 0x37, 0x14, 0x00, 0x01, 0x3B, 0x18, 0x00, 0x12, 0x60, 0x45, 0x65, 0x11, 0x60, - 0x65, 0x63, 0xFF, 0xB7, 0x60, 0x5C, 0xA3, 0xD3, 0x08, 0xA3, 0x00, 0x7E, 0xD0, 0x80, 0xD7, 0x80, - 0x03, 0x03, 0xF9, 0x02, 0x7F, 0x67, 0x0A, 0x00, 0xF4, 0xA3, 0xA3, 0xD1, 0x04, 0x00, 0x00, 0xBC, - 0xF2, 0xA4, 0x03, 0x03, 0x02, 0x07, 0x16, 0x60, 0xCF, 0xF9, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x20, 0x63, 0x2E, 0x60, 0x00, 0x61, 0x48, 0x64, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x25, 0xF0, - 0x20, 0x64, 0xD0, 0x81, 0xFF, 0xFF, 0x02, 0x07, 0x25, 0xFA, 0x0F, 0x00, 0x2E, 0x60, 0x04, 0x63, - 0xC3, 0x83, 0x01, 0x2A, 0x06, 0x00, 0xCF, 0x83, 0xA3, 0xD3, 0xCD, 0x81, 0x00, 0x7F, 0xBD, 0xDB, - 0x04, 0x03, 0x00, 0x64, 0xC9, 0x81, 0xBD, 0xDB, 0xFD, 0x02, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x23, 0xF2, 0x25, 0xF0, 0x02, 0xA8, 0x01, 0x60, 0xA0, 0x62, 0x09, 0x02, 0xA2, 0xD9, 0x64, 0x41, - 0x32, 0x44, 0x02, 0xB5, 0x00, 0xB9, 0xD4, 0x84, 0x08, 0x28, 0x02, 0xBC, 0x40, 0x52, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF0, 0x02, 0xA8, 0x01, 0x60, 0xA2, 0x62, 0x09, 0x02, - 0xA2, 0xD9, 0x64, 0x41, 0x32, 0x44, 0x04, 0xB5, 0x00, 0xB9, 0xD4, 0x84, 0x08, 0x28, 0x04, 0xBC, - 0x40, 0x52, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF0, 0x02, 0xA8, 0x01, 0x60, - 0xB0, 0x62, 0x15, 0x02, 0xA2, 0xD9, 0x64, 0x41, 0x32, 0x44, 0x40, 0xB5, 0x00, 0xB9, 0xD4, 0x84, - 0x08, 0x24, 0x0C, 0x00, 0x40, 0xBC, 0x02, 0xB5, 0xD4, 0x84, 0x43, 0xF9, 0x37, 0x60, 0x76, 0x63, - 0xD3, 0x80, 0x2F, 0x60, 0x50, 0x7C, 0x02, 0x03, 0x43, 0xFD, 0xA4, 0xDF, 0x40, 0x52, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x37, 0x60, 0x76, 0x64, 0x43, 0xFB, 0x2D, 0x60, 0x5B, 0x78, 0xFF, 0xFF, - 0x23, 0xF2, 0x25, 0xF0, 0x01, 0x60, 0xAC, 0x63, 0x7F, 0x67, 0x39, 0x18, 0xA3, 0xD9, 0x26, 0xF0, - 0x7F, 0x67, 0x35, 0x18, 0x5B, 0xD9, 0x16, 0x60, 0x87, 0xF3, 0x25, 0xF0, 0x60, 0x40, 0x03, 0x3A, - 0x2D, 0x00, 0xA6, 0xF3, 0x20, 0x63, 0xE3, 0x83, 0x60, 0x46, 0x0F, 0xF8, 0x30, 0x61, 0x94, 0xFA, - 0x01, 0x61, 0x91, 0xFA, 0x16, 0x64, 0x12, 0xFA, 0x60, 0x40, 0x10, 0x36, 0x05, 0x00, 0x12, 0x36, - 0x08, 0x00, 0x0C, 0x36, 0x0B, 0x00, 0x0F, 0x00, 0x40, 0x61, 0xA1, 0x80, 0x0A, 0x64, 0x11, 0x02, - 0xF3, 0x01, 0x10, 0x61, 0xA1, 0x80, 0x0E, 0x64, 0x0C, 0x02, 0xEE, 0x01, 0x08, 0x61, 0xA1, 0x80, - 0x10, 0x64, 0x07, 0x02, 0xE9, 0x01, 0xE1, 0x81, 0xA1, 0x80, 0x05, 0x05, 0xC8, 0x84, 0x01, 0x02, - 0xE3, 0x01, 0x12, 0xFA, 0x91, 0xFA, 0x66, 0x44, 0x02, 0xA6, 0xD7, 0x1F, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x25, 0xF2, 0x19, 0x60, 0x45, 0xFB, 0x19, 0x60, 0x4C, 0xF3, 0xFF, 0xFF, 0x60, 0x40, - 0x08, 0x26, 0x18, 0x00, 0x19, 0x60, 0x45, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x0A, 0x00, - 0x19, 0x60, 0x7B, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0x60, 0x44, 0xA2, 0xDB, 0x19, 0x60, 0x45, 0xF3, - 0xFF, 0xFF, 0x60, 0x40, 0x02, 0x2A, 0x06, 0x00, 0x19, 0x60, 0x7B, 0xF3, 0xFF, 0xFF, 0x04, 0xBC, - 0x60, 0x44, 0xA2, 0xDB, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF0, 0x02, 0xA8, - 0x00, 0x67, 0x02, 0x02, 0x2D, 0xF9, 0x2C, 0xF9, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF2, - 0x02, 0xA8, 0x00, 0xA8, 0x0A, 0x02, 0x07, 0x03, 0xD0, 0xA0, 0x30, 0x65, 0x03, 0x04, 0xA7, 0xA0, - 0x59, 0x65, 0x01, 0x06, 0x65, 0x44, 0x16, 0x60, 0xCE, 0xFB, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x25, 0xF2, 0x19, 0x60, 0x4C, 0xFB, 0xFF, 0xFF, 0x08, 0x2A, 0x25, 0x00, 0x19, 0x60, 0x7B, 0xF3, - 0xFF, 0xFF, 0xE9, 0xB4, 0x60, 0x44, 0x19, 0x60, 0x4C, 0xF1, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x26, - 0x02, 0xBC, 0x64, 0x40, 0x02, 0x2A, 0x04, 0xBC, 0x64, 0x40, 0x04, 0x26, 0x08, 0x00, 0x19, 0x60, - 0x7B, 0xFB, 0x13, 0x64, 0xCB, 0xFB, 0x01, 0x60, 0x67, 0x64, 0x37, 0xFB, 0x0C, 0x00, 0x10, 0xBC, - 0x19, 0x60, 0x7B, 0xFB, 0x08, 0x64, 0xCB, 0xFB, 0xA1, 0xF3, 0x01, 0x60, 0x67, 0x7C, 0x60, 0x40, - 0x01, 0x27, 0x5B, 0x7C, 0x37, 0xF9, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0xF2, 0x19, 0x60, - 0x4D, 0xFB, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0xF2, 0x19, 0x60, 0x4E, 0xFB, 0x00, 0x67, - 0x23, 0x58, 0xFF, 0xFF, 0x25, 0xF2, 0x19, 0x60, 0x89, 0xFB, 0xFF, 0xFF, 0x0F, 0x22, 0x41, 0x75, - 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x01, 0x64, 0x01, 0x00, 0x00, 0x64, 0x1B, 0x60, 0xFE, 0xFB, - 0x7E, 0x60, 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x0E, 0x02, 0x06, 0x61, - 0x41, 0x56, 0xC7, 0xFE, 0x2A, 0x60, 0x1D, 0x78, 0xFF, 0xFF, 0x36, 0x47, 0xFF, 0x23, 0x04, 0x00, - 0x00, 0x7F, 0x60, 0x41, 0x7F, 0x67, 0x01, 0x00, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x7F, 0x60, - 0xC0, 0x64, 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x0E, 0x02, 0x08, 0x61, 0x41, 0x56, - 0xC7, 0xFE, 0x2A, 0x60, 0x1D, 0x78, 0xFF, 0xFF, 0x36, 0x47, 0xFF, 0x23, 0x04, 0x00, 0x00, 0x7F, - 0x60, 0x41, 0x7F, 0x67, 0x01, 0x00, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x7F, 0x60, 0xC0, 0x64, - 0x24, 0x45, 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x0E, 0x02, 0x0A, 0x61, 0x41, 0x56, 0xC7, 0xFE, - 0x2A, 0x60, 0x1D, 0x78, 0xFF, 0xFF, 0x36, 0x47, 0xFF, 0x23, 0x04, 0x00, 0x00, 0x7F, 0x60, 0x41, - 0x7F, 0x67, 0x01, 0x00, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x7E, 0x60, 0xC0, 0x64, 0x24, 0x45, - 0xA4, 0x80, 0x7F, 0x67, 0x02, 0x61, 0x11, 0x02, 0x65, 0x43, 0x19, 0x60, 0xA5, 0xFD, 0x0C, 0x61, - 0x41, 0x56, 0xC7, 0xFE, 0x2A, 0x60, 0x1D, 0x78, 0xFF, 0xFF, 0x36, 0x47, 0xFF, 0x23, 0x04, 0x00, - 0x00, 0x7F, 0x60, 0x41, 0x7F, 0x67, 0x01, 0x00, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x20, 0x64, - 0x23, 0xFA, 0x4A, 0x61, 0x10, 0x60, 0xDA, 0x64, 0xA0, 0xD1, 0xA1, 0xD8, 0x58, 0xD1, 0x59, 0xD8, - 0x58, 0xD1, 0x59, 0xD8, 0x01, 0xA1, 0x10, 0x60, 0xF2, 0x63, 0x5D, 0x65, 0xA3, 0xD3, 0x02, 0xA3, - 0x02, 0x1B, 0x7F, 0x64, 0x01, 0x00, 0xA3, 0xD3, 0x60, 0xFE, 0x5D, 0xDA, 0x20, 0xFE, 0xD5, 0x80, - 0x04, 0xA3, 0xF4, 0x02, 0x01, 0xA1, 0x10, 0x60, 0xE0, 0x64, 0xA0, 0xD1, 0xA1, 0xD8, 0x58, 0xD1, - 0x59, 0xD8, 0x58, 0xD1, 0x59, 0xD8, 0x01, 0xA1, 0x60, 0xFE, 0x07, 0x63, 0x7F, 0x64, 0xCF, 0x83, - 0x5D, 0xDA, 0xFD, 0x02, 0x20, 0xFE, 0x12, 0x60, 0x40, 0x7C, 0x11, 0x60, 0x62, 0x63, 0x7F, 0x65, - 0xA3, 0xD3, 0x02, 0xA3, 0x02, 0x1B, 0x7F, 0x64, 0x01, 0x00, 0xA3, 0xD3, 0x60, 0xFE, 0x5D, 0xDA, - 0x20, 0xFE, 0xD5, 0x80, 0x06, 0xA3, 0x03, 0x02, 0x46, 0x45, 0x00, 0xF4, 0x03, 0x61, 0xD3, 0x80, - 0xFF, 0xFF, 0xEE, 0x04, 0x25, 0x46, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x02, 0x63, 0x7D, 0xF3, - 0x23, 0xFC, 0x60, 0x40, 0x01, 0x23, 0x17, 0x00, 0x01, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0x11, 0x60, - 0x60, 0x61, 0x12, 0x60, 0x40, 0x65, 0xA1, 0xD1, 0xD5, 0x80, 0xD0, 0x80, 0x0B, 0x03, 0x02, 0x03, - 0x08, 0xA1, 0xF9, 0x01, 0x04, 0xA1, 0xA1, 0xD3, 0x01, 0x60, 0x00, 0x65, 0x60, 0x47, 0xFF, 0xB4, - 0xB4, 0x84, 0x01, 0x00, 0xFF, 0x64, 0x25, 0xFA, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x0C, 0x63, - 0x23, 0xFC, 0xE2, 0xF3, 0x13, 0x60, 0xF2, 0x63, 0xCC, 0x84, 0xFF, 0xFF, 0x02, 0x06, 0x0C, 0xA3, - 0xFB, 0x01, 0x48, 0x61, 0x61, 0x44, 0x18, 0xA5, 0x60, 0xFE, 0xBD, 0xD3, 0x20, 0xFE, 0x00, 0x7F, - 0x59, 0xDA, 0xD5, 0x80, 0xFF, 0xFF, 0xF8, 0x04, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, 0x25, 0xF0, - 0x17, 0x60, 0x80, 0xF9, 0x11, 0x00, 0x0C, 0x60, 0xFE, 0x62, 0x40, 0x63, 0x5A, 0xDF, 0xFE, 0x1F, - 0x04, 0x65, 0x0C, 0x60, 0xFE, 0x61, 0x48, 0x64, 0x3E, 0x63, 0x7C, 0xA8, 0x58, 0xD0, 0x59, 0xD9, - 0x02, 0x02, 0x00, 0xF4, 0x02, 0x64, 0xF9, 0x1F, 0x17, 0x60, 0x80, 0xF1, 0x0C, 0x60, 0xDA, 0x65, - 0x02, 0xFE, 0x64, 0x44, 0xF8, 0x84, 0xF8, 0x84, 0xF8, 0x87, 0x60, 0x41, 0x64, 0x44, 0xE0, 0x84, - 0xE0, 0x84, 0xC4, 0x84, 0x3E, 0xFB, 0x60, 0x42, 0x61, 0x44, 0x03, 0xA2, 0x60, 0xFE, 0xA2, 0xDB, - 0x20, 0xFE, 0x64, 0x44, 0x0D, 0x60, 0x00, 0x65, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, - 0xC4, 0x84, 0x40, 0xFB, 0xFF, 0xFF, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x5C, 0x41, - 0x25, 0xF2, 0xFF, 0xFF, 0x40, 0x42, 0x80, 0x2B, 0x04, 0x00, 0xFF, 0xB4, 0x40, 0x42, 0x01, 0x64, - 0x40, 0x41, 0xA6, 0xF3, 0x46, 0x4B, 0x60, 0x46, 0x20, 0x63, 0xE3, 0x83, 0xAB, 0x46, 0x26, 0xF0, - 0xAB, 0x46, 0x59, 0xF8, 0xAB, 0x46, 0x27, 0xF0, 0xAB, 0x46, 0x5A, 0xF8, 0xAB, 0x46, 0x28, 0xF0, - 0xAB, 0x46, 0x5B, 0xF8, 0x66, 0x44, 0x02, 0xA6, 0xF1, 0x1F, 0xA6, 0xF3, 0xFF, 0xFF, 0x60, 0x46, - 0xAB, 0x46, 0x0C, 0x60, 0x38, 0x65, 0x22, 0x44, 0xFF, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0xC4, 0x81, 0xC9, 0x81, 0x52, 0x64, 0x0E, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, - 0x21, 0x44, 0x01, 0x2A, 0x08, 0x00, 0xAB, 0x46, 0xF0, 0xA1, 0x76, 0x64, 0x0E, 0x63, 0x59, 0xD1, - 0x58, 0xD8, 0xFD, 0x1F, 0xAB, 0x46, 0x22, 0x44, 0xFF, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, - 0x0C, 0x60, 0x9A, 0x65, 0xC4, 0x81, 0x60, 0x45, 0xC9, 0x81, 0x62, 0x64, 0x06, 0x63, 0x58, 0xD0, - 0x59, 0xD9, 0xFD, 0x1F, 0x21, 0x44, 0x01, 0x2A, 0x08, 0x00, 0xAB, 0x46, 0xF8, 0xA1, 0xB6, 0x64, - 0x06, 0x63, 0x59, 0xD1, 0x58, 0xD8, 0xFD, 0x1F, 0xAB, 0x46, 0x65, 0x44, 0x0C, 0x60, 0xBA, 0x65, - 0xC4, 0x81, 0xC9, 0x81, 0x6A, 0x64, 0x06, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x22, 0x44, - 0xFF, 0xB4, 0xE0, 0x84, 0xE0, 0x85, 0xC4, 0x84, 0x0C, 0x60, 0x80, 0x65, 0xC4, 0x81, 0x72, 0x64, - 0x04, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0xAB, 0x46, 0x21, 0x44, 0x01, 0x2A, 0x06, 0x00, - 0xFA, 0xA1, 0x90, 0x64, 0x04, 0x63, 0x59, 0xD1, 0x58, 0xD8, 0xFD, 0x1F, 0x3B, 0xF0, 0x21, 0x44, - 0x01, 0x2A, 0x13, 0x00, 0x22, 0x44, 0x3D, 0xFB, 0x60, 0x41, 0x02, 0xFE, 0xF8, 0x84, 0xF8, 0x84, - 0xF8, 0x84, 0x3C, 0xFB, 0x0C, 0x60, 0x7C, 0x63, 0x88, 0xFF, 0xCD, 0x81, 0x06, 0xA3, 0xFD, 0x0D, - 0x8D, 0xFF, 0x3B, 0xFD, 0x64, 0x47, 0x80, 0xBF, 0x60, 0x5C, 0x22, 0x43, 0x80, 0x61, 0x88, 0xFF, - 0xCF, 0x83, 0xE1, 0x81, 0xFD, 0x0D, 0x8D, 0xFF, 0x61, 0x47, 0x31, 0x91, 0xB1, 0x84, 0x3B, 0xFA, - 0x1F, 0x63, 0xE3, 0x83, 0x66, 0x44, 0x02, 0xA6, 0x3B, 0xF0, 0x66, 0x44, 0xB1, 0x9C, 0x3B, 0xF8, - 0x02, 0xA6, 0xFA, 0x1F, 0xAB, 0x46, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, - 0x25, 0xF0, 0x02, 0xA8, 0x00, 0x67, 0x22, 0x02, 0x3D, 0xF1, 0x64, 0x44, 0x03, 0xB4, 0x40, 0x42, - 0xD0, 0x80, 0xA6, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0xBB, 0xF4, 0x80, 0x61, 0x02, 0x02, 0xE3, 0x83, - 0xEB, 0x83, 0x22, 0x44, 0x88, 0xFF, 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x0D, 0x8D, 0xFF, 0x61, 0x47, - 0x31, 0x91, 0x9D, 0x85, 0xA7, 0x83, 0x3B, 0xFC, 0x1F, 0x63, 0xE3, 0x83, 0x66, 0x44, 0x02, 0xA6, - 0xBB, 0xF2, 0x66, 0x44, 0xA5, 0x81, 0xBB, 0xFA, 0x02, 0xA6, 0xFA, 0x1F, 0x00, 0x67, 0x23, 0x58, - 0xFF, 0xFF, 0x27, 0xF2, 0x1D, 0x60, 0xC0, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, - 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x27, 0xF0, 0x63, 0x46, - 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x26, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, - 0x06, 0x02, 0x61, 0x46, 0x25, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, - 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0xA6, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x01, 0x03, - 0x2A, 0x00, 0x43, 0x4B, 0xAB, 0x46, 0x3B, 0xF2, 0x80, 0x60, 0x30, 0x7C, 0xB0, 0x84, 0xA2, 0xDA, - 0x4E, 0x61, 0x76, 0x64, 0x0E, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, - 0x90, 0x64, 0x04, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, 0xD9, 0x81, - 0xA0, 0x64, 0x04, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, 0xD9, 0x81, - 0xB6, 0x64, 0x0E, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, 0x00, 0x67, - 0x00, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x01, 0x67, 0x20, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x27, 0xF2, - 0x1D, 0x60, 0xC0, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, - 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, - 0x0C, 0x02, 0x61, 0x46, 0x26, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, - 0x25, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, - 0xE8, 0x1B, 0xA6, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x01, 0x03, 0x0D, 0x00, 0x43, 0x4B, - 0xAB, 0x46, 0x3B, 0xF2, 0x80, 0x60, 0x30, 0x61, 0x9D, 0x85, 0xA4, 0x84, 0xA2, 0xDA, 0xAB, 0x46, - 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x01, 0x67, 0x20, 0x61, 0x23, 0x58, 0xFF, 0xFF, - 0x00, 0x64, 0x40, 0x41, 0x4A, 0x64, 0xA0, 0xD2, 0xFF, 0xFF, 0x40, 0x42, 0x80, 0x2B, 0x04, 0x00, - 0xFF, 0xB4, 0x40, 0x42, 0x01, 0x64, 0x40, 0x41, 0xA6, 0xF3, 0x46, 0x4B, 0x60, 0x46, 0x20, 0x63, - 0xE3, 0x83, 0xAB, 0x46, 0x32, 0xF0, 0xAB, 0x46, 0x59, 0xF8, 0xAB, 0x46, 0x33, 0xF0, 0xAB, 0x46, - 0x5A, 0xF8, 0xAB, 0x46, 0x34, 0xF0, 0xAB, 0x46, 0x5B, 0xF8, 0x66, 0x44, 0x02, 0xA6, 0xF1, 0x1F, - 0xA6, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0xAB, 0x46, 0x0C, 0x60, 0x38, 0x65, 0x22, 0x44, 0xFF, 0xB4, - 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x81, 0xC9, 0x81, 0x4A, 0x64, 0x0E, 0x63, - 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x21, 0x44, 0x01, 0x2A, 0x08, 0x00, 0xAB, 0x46, 0xF0, 0xA1, - 0x76, 0x64, 0x0E, 0x63, 0x59, 0xD1, 0x58, 0xD8, 0xFD, 0x1F, 0xAB, 0x46, 0x22, 0x44, 0xFF, 0xB4, - 0xE0, 0x84, 0xE0, 0x85, 0xC4, 0x84, 0x0C, 0x60, 0x80, 0x65, 0xC4, 0x81, 0x5A, 0x64, 0x04, 0x63, - 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0xAB, 0x46, 0x21, 0x44, 0x01, 0x2A, 0x06, 0x00, 0xFA, 0xA1, - 0x90, 0x64, 0x04, 0x63, 0x59, 0xD1, 0x58, 0xD8, 0xFD, 0x1F, 0x3B, 0xF0, 0x21, 0x44, 0x01, 0x2A, - 0x13, 0x00, 0x22, 0x44, 0x3D, 0xFB, 0x60, 0x41, 0x02, 0xFE, 0xF8, 0x84, 0xF8, 0x84, 0xF8, 0x84, - 0x3C, 0xFB, 0x0C, 0x60, 0x7C, 0x63, 0x88, 0xFF, 0xCD, 0x81, 0x06, 0xA3, 0xFD, 0x0D, 0x8D, 0xFF, - 0x3B, 0xFD, 0x64, 0x47, 0x80, 0xBF, 0x60, 0x5C, 0x22, 0x43, 0x80, 0x61, 0x88, 0xFF, 0xCF, 0x83, - 0xE1, 0x81, 0xFD, 0x0D, 0x8D, 0xFF, 0x61, 0x47, 0x31, 0x91, 0xB1, 0x84, 0x3B, 0xFA, 0x1F, 0x63, - 0xE3, 0x83, 0x66, 0x44, 0x02, 0xA6, 0x3B, 0xF0, 0x66, 0x44, 0xB1, 0x9C, 0x3B, 0xF8, 0x02, 0xA6, - 0xFA, 0x1F, 0xAB, 0x46, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x23, 0xF2, 0x25, 0xF0, - 0x02, 0xA8, 0x00, 0x67, 0x22, 0x02, 0x3D, 0xF1, 0x64, 0x44, 0x03, 0xB4, 0x40, 0x42, 0xD0, 0x80, - 0xA6, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0xBB, 0xF4, 0x80, 0x61, 0x02, 0x02, 0xE3, 0x83, 0xEB, 0x83, - 0x22, 0x44, 0x88, 0xFF, 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x0D, 0x8D, 0xFF, 0x61, 0x47, 0x31, 0x91, - 0x9D, 0x85, 0xA7, 0x83, 0x3B, 0xFC, 0x1F, 0x63, 0xE3, 0x83, 0x66, 0x44, 0x02, 0xA6, 0xBB, 0xF2, - 0x66, 0x44, 0xA5, 0x81, 0xBB, 0xFA, 0x02, 0xA6, 0xFA, 0x1F, 0x00, 0x67, 0x23, 0x58, 0xFF, 0xFF, - 0x27, 0xF2, 0x1D, 0x60, 0xC0, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, - 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, - 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x26, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, - 0x61, 0x46, 0x25, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, - 0x63, 0x46, 0xE8, 0x1B, 0xA6, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x01, 0x03, 0x21, 0x00, - 0x43, 0x4B, 0xAB, 0x46, 0x3B, 0xF2, 0x80, 0x60, 0x30, 0x7C, 0xB0, 0x84, 0xA2, 0xDA, 0x4E, 0x61, - 0x76, 0x64, 0x0E, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, 0x90, 0x64, - 0x04, 0x63, 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, 0xA0, 0x64, 0x04, 0x63, - 0xAB, 0x46, 0x59, 0xD0, 0xAB, 0x46, 0x58, 0xD8, 0xFB, 0x1F, 0x00, 0x67, 0x00, 0x61, 0x23, 0x58, - 0xFF, 0xFF, 0x01, 0x67, 0x20, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0x27, 0xF2, 0x1D, 0x60, 0xC0, 0x65, - 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, - 0x16, 0x18, 0x61, 0x46, 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, - 0x26, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x25, 0xF0, 0x63, 0x46, - 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0xA6, 0xF3, - 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x01, 0x03, 0x0D, 0x00, 0x43, 0x4B, 0xAB, 0x46, 0x3B, 0xF2, - 0x80, 0x60, 0x30, 0x61, 0x9D, 0x85, 0xA4, 0x84, 0xA2, 0xDA, 0xAB, 0x46, 0x00, 0x67, 0x00, 0x61, - 0x23, 0x58, 0xFF, 0xFF, 0x01, 0x67, 0x20, 0x61, 0x23, 0x58, 0xFF, 0xFF, 0xA2, 0xFF, 0x46, 0x45, - 0x02, 0xF0, 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, 0x00, 0xF4, 0x01, 0xF2, 0x66, 0x5C, 0x25, 0x46, - 0x56, 0x02, 0x70, 0x27, 0x54, 0x00, 0x12, 0x64, 0x03, 0xFA, 0x04, 0xF8, 0x0E, 0xF2, 0x87, 0xFC, - 0x8D, 0xFC, 0x8E, 0xFC, 0xDA, 0x82, 0x16, 0x61, 0x00, 0x63, 0xC9, 0x81, 0x5A, 0xDC, 0xFD, 0x02, - 0x60, 0x40, 0xF0, 0x3B, 0x16, 0x00, 0x32, 0x44, 0xAC, 0xF3, 0x01, 0xB0, 0xFA, 0xA0, 0x08, 0x24, - 0x2C, 0x05, 0xDC, 0x83, 0xF0, 0x67, 0x0E, 0xFA, 0x26, 0x60, 0x04, 0x64, 0x2B, 0xDB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xAC, 0xFD, 0x2B, 0xFF, 0xFE, 0x64, 0x3B, 0x42, 0x4A, 0xDB, - 0x4F, 0x00, 0xAD, 0xF3, 0x05, 0x65, 0xD4, 0x80, 0xDC, 0x83, 0x17, 0x05, 0xAD, 0xFD, 0x98, 0xFE, - 0x04, 0x04, 0x00, 0x7F, 0x08, 0x7E, 0x0E, 0xFA, 0x3B, 0xFF, 0x25, 0x60, 0xF8, 0x64, 0x2B, 0xDB, - 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0x0E, 0xF2, 0x2B, 0xFF, 0x60, 0x40, 0x08, 0x26, - 0xF7, 0xFE, 0xFD, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x32, 0x00, 0xA9, 0xF3, 0xFF, 0xFF, 0xD8, 0xA0, - 0xFF, 0xFF, 0x0D, 0x04, 0x26, 0x60, 0x10, 0x64, 0x2B, 0xDB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFC, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0x21, 0x00, 0x46, 0x45, - 0x00, 0x64, 0x2B, 0xDB, 0x25, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xA2, 0xFF, 0x00, 0xF4, 0x01, 0xF0, 0x0A, 0x18, 0x70, 0x67, 0xA0, 0x80, 0xF0, 0x67, 0x06, 0x03, - 0xC0, 0x84, 0x01, 0xFA, 0x25, 0x46, 0x25, 0x44, 0x80, 0xFC, 0x05, 0xFA, 0xB6, 0x60, 0x58, 0x4E, - 0xF5, 0x78, 0xFF, 0xFF, 0xD4, 0xFE, 0xA3, 0xFF, 0xFF, 0x64, 0x3B, 0x42, 0x4A, 0xDB, 0xD4, 0xFE, - 0xA3, 0xFF, 0x2D, 0x58, 0xFF, 0xFF, 0x25, 0x60, 0xFE, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x0D, 0x00, - 0x25, 0x60, 0xF2, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x18, 0x00, 0x26, 0x60, 0x0A, 0x64, 0x40, 0x47, - 0x58, 0x4F, 0x03, 0x00, 0x2A, 0x60, 0x1D, 0x78, 0xFF, 0xFF, 0x27, 0xD5, 0x0E, 0xF2, 0x0B, 0x18, - 0x60, 0x40, 0x01, 0x2A, 0x08, 0x00, 0x26, 0x60, 0x20, 0x64, 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, - 0x08, 0x78, 0xFF, 0xFF, 0xF2, 0x01, 0x2F, 0x58, 0xFF, 0xFF, 0x27, 0xD5, 0x0E, 0xF2, 0x14, 0x18, - 0x60, 0x40, 0x01, 0x2A, 0x11, 0x00, 0x02, 0xF0, 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, 0xA2, 0xFF, - 0xAD, 0xF3, 0x02, 0x02, 0xCC, 0x84, 0xAD, 0xFB, 0x26, 0x60, 0x20, 0x64, 0x40, 0x4B, 0x34, 0x60, - 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, 0xE9, 0x01, 0x2F, 0x58, 0xFF, 0xFF, 0xFB, 0x64, 0x3A, 0x42, - 0x4A, 0xDB, 0xA2, 0xFF, 0xB0, 0xF3, 0xAC, 0xF3, 0xCC, 0x80, 0xFD, 0xA0, 0x01, 0x14, 0x1D, 0x05, - 0xB5, 0x60, 0x58, 0x4D, 0xFA, 0x78, 0xFF, 0xFF, 0xA2, 0xFF, 0x17, 0x03, 0xF0, 0x67, 0x0E, 0xFA, - 0x26, 0x60, 0x04, 0x64, 0x13, 0x60, 0x10, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xF6, 0x64, 0x3A, 0x42, 0x4A, 0xDB, 0xB0, 0xF3, 0xAC, 0xF3, 0xCC, 0x83, - 0xDC, 0x84, 0x01, 0x15, 0xB0, 0xFD, 0xAC, 0xFB, 0xD4, 0xFE, 0xAF, 0xF3, 0xAD, 0xF3, 0x00, 0xA8, - 0xAE, 0xF1, 0x03, 0x02, 0xD0, 0x80, 0xFF, 0xFF, 0x26, 0x05, 0xB5, 0x60, 0x58, 0x4D, 0xFA, 0x78, - 0xFF, 0xFF, 0xA2, 0xFF, 0x20, 0x03, 0x00, 0x63, 0xAF, 0xF3, 0x0E, 0xFC, 0xCC, 0x84, 0xFF, 0x3A, - 0xAF, 0xFB, 0x98, 0xFE, 0x03, 0x04, 0x08, 0xBB, 0x0E, 0xFC, 0x3B, 0xFF, 0x25, 0x60, 0xF8, 0x64, - 0x13, 0x60, 0x10, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xF7, 0x64, 0x3A, 0x42, 0x4A, 0xDB, 0xAD, 0xF3, 0x0E, 0xF2, 0xDC, 0x83, 0x08, 0xB0, 0xAD, 0xFD, - 0x08, 0x28, 0xF7, 0xFE, 0xD4, 0xFE, 0xA3, 0xFF, 0x2A, 0x60, 0x1D, 0x78, 0xFF, 0xFF, 0xB9, 0xFE, - 0x13, 0xFF, 0x24, 0x40, 0x80, 0x2B, 0x0B, 0x00, 0xA2, 0xFF, 0x25, 0x46, 0x09, 0xF4, 0x0E, 0xF2, - 0x05, 0x18, 0x08, 0xBC, 0x0E, 0xFA, 0xFF, 0xFF, 0xF7, 0xFE, 0x01, 0x00, 0xD8, 0xFE, 0xA3, 0xFF, - 0x25, 0x46, 0x3E, 0xF2, 0x00, 0xF4, 0x08, 0xF0, 0x25, 0x46, 0x06, 0xB4, 0xFF, 0x7F, 0x10, 0xBC, - 0x06, 0x26, 0xFD, 0x7F, 0x0E, 0xFA, 0x3E, 0xF2, 0x3F, 0xF2, 0x60, 0x41, 0x08, 0x2A, 0x64, 0x47, - 0x3F, 0xFA, 0x60, 0x45, 0xB9, 0xFC, 0x16, 0x60, 0xAA, 0xF3, 0xA3, 0xFC, 0xAB, 0xFC, 0x91, 0xFC, - 0xD4, 0x80, 0x18, 0x60, 0x21, 0x65, 0xA5, 0x80, 0x01, 0x04, 0x07, 0x03, 0x23, 0xF0, 0x08, 0x64, - 0xB0, 0x84, 0xA2, 0xDA, 0x35, 0x60, 0xEA, 0x78, 0xFF, 0xFF, 0x36, 0x60, 0x58, 0x4F, 0x30, 0x78, - 0xFF, 0xFF, 0x0B, 0x04, 0x23, 0xF0, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0x2C, 0x60, 0xEE, 0x64, - 0xF1, 0x60, 0x78, 0x41, 0xE4, 0x78, 0xB5, 0xF1, 0x83, 0x00, 0xDB, 0xF3, 0xA6, 0xF1, 0x07, 0xB4, - 0x64, 0x43, 0xFD, 0xA0, 0x2C, 0xF2, 0x71, 0x02, 0x01, 0xB0, 0x64, 0x43, 0x78, 0x02, 0x2E, 0xF2, - 0x1D, 0x60, 0xC0, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, - 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x2E, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, - 0x0C, 0x02, 0x61, 0x46, 0x2D, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, - 0x2C, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, - 0xE8, 0x1B, 0xA6, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x51, 0x03, 0x63, 0x46, 0x80, 0xF6, - 0x25, 0x46, 0x43, 0x18, 0x2E, 0xF2, 0x66, 0x41, 0x1D, 0x60, 0xC0, 0x65, 0x60, 0x47, 0x00, 0x7F, - 0xA6, 0xF1, 0xE0, 0x84, 0x44, 0xD3, 0x64, 0x43, 0x11, 0x18, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, - 0xFC, 0x1B, 0x66, 0x44, 0x64, 0x46, 0x80, 0xF0, 0x60, 0x46, 0x80, 0xF8, 0x65, 0x46, 0x65, 0x43, - 0x80, 0xF0, 0x01, 0xFA, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x0B, 0x00, 0x64, 0x46, 0x62, 0x43, - 0x00, 0xF2, 0xA3, 0xDB, 0x60, 0x46, 0x80, 0xF0, 0x81, 0xFC, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, - 0x60, 0x43, 0x61, 0x46, 0x43, 0x4B, 0x2C, 0xF0, 0xAD, 0xF0, 0x2E, 0xF2, 0xAB, 0x46, 0x03, 0xF8, - 0x84, 0xF8, 0x05, 0xFA, 0x03, 0x64, 0x06, 0xFA, 0xAB, 0x46, 0x1F, 0x60, 0xC2, 0x61, 0xA1, 0xD3, - 0x20, 0x60, 0x04, 0x7C, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0xA0, 0xDD, 0xDA, 0x9C, 0xA1, 0xD9, - 0x49, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xA1, 0xDB, 0x0A, 0x00, 0xDB, 0xF3, 0x02, 0xA3, 0xFE, 0xA0, - 0xF9, 0xA0, 0x01, 0x06, 0x04, 0x02, 0x23, 0xF0, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0x07, 0xFC, - 0x23, 0xF2, 0xFF, 0xFF, 0x24, 0x1B, 0x16, 0x60, 0xAB, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x00, 0x3A, - 0x0F, 0x00, 0x25, 0x60, 0xC8, 0x64, 0x13, 0x60, 0x10, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x0E, 0xF2, 0xC1, 0xFE, 0x10, 0xAC, 0x0E, 0xFA, 0x1D, 0x00, - 0x25, 0x60, 0xDA, 0x64, 0x13, 0x60, 0x10, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0x0E, 0xF2, 0xC8, 0xFE, 0x10, 0xAC, 0x0E, 0xFA, 0x0E, 0x00, 0x25, 0x60, - 0xEC, 0x64, 0x13, 0x60, 0x10, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0x0E, 0xF2, 0xCE, 0xFE, 0x10, 0xAC, 0x0E, 0xFA, 0x2A, 0x60, 0x1D, 0x78, 0xFF, 0xFF, - 0xCB, 0x84, 0xC9, 0x83, 0xFF, 0xFF, 0x08, 0x04, 0x58, 0xD1, 0xA5, 0xD8, 0xDA, 0x85, 0x80, 0x3A, - 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF8, 0x1F, 0x2F, 0x58, 0xFF, 0xFF, 0x3E, 0xF2, 0xC9, 0xF1, - 0x08, 0xB0, 0x19, 0xF8, 0x57, 0x02, 0xEA, 0xF1, 0x2F, 0xF8, 0xEB, 0xF3, 0x30, 0xFA, 0x60, 0x45, - 0xEC, 0xF3, 0x31, 0xFA, 0x46, 0x4A, 0x00, 0xF4, 0x60, 0x43, 0x05, 0xF2, 0x06, 0xF2, 0xD0, 0x80, - 0x07, 0xF0, 0x05, 0x02, 0xD4, 0x80, 0xD3, 0x80, 0x02, 0x02, 0xDB, 0xF3, 0x03, 0x03, 0xAA, 0x46, - 0x42, 0xFE, 0x41, 0x00, 0x60, 0x40, 0x03, 0x2A, 0x20, 0x00, 0x02, 0xF2, 0x03, 0xF0, 0x04, 0xF2, - 0x60, 0x43, 0xAA, 0x46, 0x2C, 0xFC, 0x2D, 0xF8, 0x2E, 0xFA, 0x7F, 0xF1, 0x32, 0xF8, 0x80, 0xF1, - 0x33, 0xF8, 0x81, 0xF1, 0x34, 0xF8, 0x08, 0x64, 0x32, 0x40, 0x04, 0x2A, 0x0D, 0x00, 0x2C, 0xF0, - 0x39, 0xF0, 0x64, 0x40, 0x01, 0x26, 0x08, 0x00, 0x3E, 0xF2, 0xFF, 0xFF, 0x00, 0x60, 0xC0, 0xB4, - 0xE8, 0x84, 0xB0, 0x9C, 0x39, 0xF8, 0x88, 0x64, 0x1C, 0x00, 0x02, 0xF2, 0x03, 0xF0, 0x04, 0xF2, - 0x60, 0x43, 0xAA, 0x46, 0x32, 0xFC, 0x33, 0xF8, 0x34, 0xFA, 0x7F, 0xF1, 0x2C, 0xF8, 0x80, 0xF1, - 0x2D, 0xF8, 0x81, 0xF1, 0x2E, 0xF8, 0x01, 0x60, 0x08, 0x64, 0x32, 0x40, 0x04, 0x2A, 0x09, 0x00, - 0x3E, 0xF2, 0x39, 0xF0, 0x00, 0x60, 0xC0, 0xB4, 0xE8, 0x84, 0xB0, 0x9C, 0x39, 0xF8, 0x01, 0x60, - 0x88, 0x64, 0x2A, 0xFA, 0x02, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x36, 0x60, 0x22, 0x63, 0x20, 0x44, - 0xBD, 0xDB, 0x21, 0x44, 0xBD, 0xDB, 0x22, 0x44, 0xBD, 0xDB, 0x23, 0x44, 0xBD, 0xDB, 0x24, 0x44, - 0xBD, 0xDB, 0x25, 0x44, 0xBD, 0xDB, 0x26, 0x44, 0xBD, 0xDB, 0x27, 0x44, 0xBD, 0xDB, 0x28, 0x44, - 0xBD, 0xDB, 0x29, 0x44, 0xBD, 0xDB, 0x2A, 0x44, 0xBD, 0xDB, 0x2B, 0x44, 0xBD, 0xDB, 0x2C, 0x44, - 0xBD, 0xDB, 0x2D, 0x44, 0xBD, 0xDB, 0x2E, 0x44, 0xBD, 0xDB, 0x2F, 0x44, 0xBD, 0xDB, 0x1B, 0x60, - 0x0B, 0xFD, 0x37, 0x60, 0x42, 0x63, 0x1B, 0x60, 0x0C, 0xFD, 0x30, 0x44, 0x1B, 0x60, 0x0D, 0xFB, - 0x31, 0x44, 0x1B, 0x60, 0x0E, 0xFB, 0x32, 0x44, 0x1B, 0x60, 0x0F, 0xFB, 0x33, 0x44, 0x1B, 0x60, - 0x10, 0xFB, 0x81, 0xFF, 0x91, 0xFF, 0x58, 0x51, 0x44, 0x00, 0x82, 0xFF, 0x92, 0xFF, 0x58, 0x51, - 0x40, 0x00, 0x83, 0xFF, 0x93, 0xFF, 0x58, 0x51, 0x3C, 0x00, 0x84, 0xFF, 0x94, 0xFF, 0x58, 0x51, - 0x38, 0x00, 0x85, 0xFF, 0x95, 0xFF, 0x58, 0x51, 0x34, 0x00, 0x86, 0xFF, 0x96, 0xFF, 0x58, 0x51, - 0x30, 0x00, 0x87, 0xFF, 0x97, 0xFF, 0x58, 0x51, 0x2C, 0x00, 0x80, 0xFF, 0x90, 0xFF, 0x99, 0xFF, - 0x1B, 0x60, 0x0B, 0xF1, 0x30, 0x44, 0x64, 0x43, 0xBD, 0xDB, 0x31, 0x44, 0xBD, 0xDB, 0x32, 0x44, - 0xBD, 0xDB, 0x33, 0x44, 0xBD, 0xDB, 0x34, 0x44, 0xBD, 0xDB, 0x35, 0x44, 0xBD, 0xDB, 0x36, 0x44, - 0xBD, 0xDB, 0x37, 0x44, 0xBD, 0xDB, 0x38, 0x44, 0xBD, 0xDB, 0x39, 0x44, 0xBD, 0xDB, 0x3A, 0x44, - 0xBD, 0xDB, 0x3B, 0x44, 0xBD, 0xDB, 0x3C, 0x44, 0xBD, 0xDB, 0x3D, 0x44, 0xBD, 0xDB, 0x3E, 0x44, - 0xBD, 0xDB, 0x3F, 0x44, 0xBD, 0xDB, 0xF6, 0x60, 0x16, 0x64, 0x0A, 0xFB, 0x40, 0x21, 0xFE, 0x01, - 0x74, 0x00, 0x42, 0x50, 0x40, 0x53, 0x1B, 0x60, 0x0C, 0xF3, 0xFF, 0xFF, 0x40, 0x52, 0x33, 0x44, - 0x32, 0x42, 0xA2, 0xDB, 0xDA, 0x82, 0xA2, 0xDD, 0xDA, 0x83, 0x65, 0x44, 0xBD, 0xDB, 0x61, 0x44, - 0xBD, 0xDB, 0x66, 0x44, 0xBD, 0xDB, 0xBD, 0xD9, 0x30, 0x44, 0xBD, 0xDB, 0x99, 0xFF, 0xA4, 0x4C, - 0xBD, 0xDB, 0xA5, 0x4C, 0xBD, 0xDB, 0xA0, 0x4C, 0xBD, 0xDB, 0xA1, 0x4C, 0xBD, 0xDB, 0x98, 0xFF, - 0x1B, 0x60, 0x0C, 0xFD, 0x1B, 0x60, 0x0D, 0xF3, 0xFF, 0xFF, 0x40, 0x50, 0x1B, 0x60, 0x0F, 0xF3, - 0xFF, 0xFF, 0x40, 0x52, 0x1B, 0x60, 0x10, 0xF3, 0xFF, 0xFF, 0x40, 0x53, 0x31, 0x41, 0x1B, 0x60, - 0x0E, 0xF3, 0xFF, 0xFF, 0x40, 0x51, 0x1B, 0x60, 0x0B, 0xF3, 0xFF, 0xFF, 0x60, 0x43, 0x20, 0x44, - 0xBD, 0xDB, 0x21, 0x44, 0xBD, 0xDB, 0x22, 0x44, 0xBD, 0xDB, 0x23, 0x44, 0xBD, 0xDB, 0x24, 0x44, - 0xBD, 0xDB, 0x25, 0x44, 0xBD, 0xDB, 0x26, 0x44, 0xBD, 0xDB, 0x27, 0x44, 0xBD, 0xDB, 0x28, 0x44, - 0xBD, 0xDB, 0x29, 0x44, 0xBD, 0xDB, 0x2A, 0x44, 0xBD, 0xDB, 0x2B, 0x44, 0xBD, 0xDB, 0x2C, 0x44, - 0xBD, 0xDB, 0x2D, 0x44, 0xBD, 0xDB, 0x2E, 0x44, 0xBD, 0xDB, 0x2F, 0x44, 0xBD, 0xDB, 0x1B, 0x60, - 0x0B, 0xFD, 0x61, 0x58, 0xFF, 0xFF, 0x2F, 0x60, 0x4E, 0x63, 0xA3, 0xD3, 0x33, 0x5C, 0x02, 0xA4, - 0xBD, 0xDB, 0xFE, 0xB4, 0xE0, 0x85, 0xC4, 0x85, 0x47, 0xD9, 0x34, 0x44, 0x5B, 0xDB, 0x44, 0xF3, - 0x5B, 0xDB, 0xA1, 0xFF, 0xFF, 0xFF, 0x87, 0x3E, 0x84, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x87, 0x3E, - 0xFF, 0x01, 0x86, 0xE1, 0x80, 0xFF, 0x90, 0xFF, 0x88, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x87, 0x3E, - 0x19, 0x60, 0xF7, 0xF3, 0xFF, 0xFF, 0x10, 0x1B, 0x32, 0x40, 0x80, 0x2A, 0xF6, 0x01, 0x9D, 0xFE, - 0xF4, 0x05, 0xDB, 0xF3, 0xFF, 0xFF, 0x04, 0xA8, 0x33, 0x60, 0xE2, 0x62, 0x01, 0x02, 0xBD, 0x00, - 0xA2, 0xD3, 0xFF, 0xFF, 0x4A, 0x1B, 0xE9, 0x01, 0x87, 0xFF, 0x20, 0x44, 0x80, 0xFF, 0x60, 0x40, - 0x80, 0x26, 0xE3, 0x01, 0xF1, 0xFC, 0xAD, 0x4F, 0xFD, 0xB4, 0xA0, 0x5D, 0xC0, 0x60, 0x40, 0xEC, - 0xC0, 0x60, 0x00, 0xED, 0xC0, 0x60, 0x80, 0xEE, 0xAC, 0x4F, 0xBF, 0xB4, 0xA0, 0x5C, 0x19, 0x60, - 0x48, 0xF1, 0xFF, 0xFF, 0x64, 0x40, 0x02, 0x27, 0x06, 0x00, 0x28, 0xE2, 0x24, 0xE2, 0x40, 0x21, - 0xFE, 0x01, 0x75, 0x40, 0x0D, 0x00, 0x28, 0xE2, 0x24, 0xE2, 0x75, 0x40, 0x80, 0x2B, 0xAB, 0xFF, - 0x14, 0xE0, 0x94, 0xE0, 0x40, 0x21, 0xFE, 0x01, 0x10, 0xE0, 0x75, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, - 0x33, 0x60, 0xEE, 0x62, 0xA2, 0xDF, 0x01, 0x60, 0x39, 0xE2, 0x04, 0x60, 0x00, 0x7A, 0xAC, 0x4F, - 0x40, 0xBC, 0x00, 0x7F, 0xA0, 0x5C, 0xC0, 0x60, 0x59, 0xEC, 0xC0, 0x60, 0x07, 0xED, 0xC0, 0x60, - 0x8F, 0xEE, 0xAE, 0x4F, 0x04, 0xBC, 0x00, 0x7F, 0xA0, 0x5E, 0x26, 0x61, 0xCD, 0x81, 0xFF, 0xFF, - 0xFD, 0x02, 0xAE, 0x4F, 0xFB, 0xB4, 0xA0, 0x5E, 0xA0, 0x01, 0xF1, 0xFC, 0xAD, 0x4F, 0xFD, 0xB4, - 0xA0, 0x5D, 0x15, 0x60, 0x80, 0xE7, 0xC0, 0x60, 0x40, 0xEC, 0xC0, 0x60, 0x00, 0xED, 0xAC, 0x4F, - 0xBF, 0xB4, 0xA0, 0x5C, 0xC0, 0x60, 0x84, 0xEE, 0xAE, 0x4F, 0x04, 0xBC, 0x00, 0x7F, 0xA0, 0x5E, - 0x00, 0x7A, 0x0F, 0x60, 0x19, 0xE2, 0x0E, 0x60, 0x36, 0xF3, 0xFF, 0xFF, 0x60, 0x41, 0x75, 0x44, - 0x80, 0x2B, 0xAB, 0xFF, 0x80, 0x27, 0x08, 0x00, 0x14, 0xE0, 0x94, 0xE0, 0x34, 0xE2, 0x61, 0x5A, - 0x48, 0x21, 0xFE, 0x01, 0x00, 0xE0, 0x75, 0x40, 0x0A, 0x60, 0x19, 0xE2, 0x00, 0x64, 0x19, 0x60, - 0xF1, 0xFB, 0x08, 0x60, 0x15, 0xF1, 0x08, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x01, 0x64, 0x19, 0x60, 0xF2, 0xFB, 0xFF, 0xFF, 0x10, 0xE0, 0x01, 0x60, 0x34, 0xE2, 0xFF, 0xFF, - 0x05, 0x7A, 0xAC, 0x4F, 0x40, 0xBC, 0x00, 0x7F, 0xA0, 0x5C, 0xC0, 0x60, 0x59, 0xEC, 0xC0, 0x60, - 0x07, 0xED, 0xC0, 0x60, 0x8F, 0xEE, 0xAE, 0x4F, 0x04, 0xBC, 0x00, 0x7F, 0xA0, 0x5E, 0x1B, 0x60, - 0xF3, 0xF1, 0xAD, 0x4F, 0x00, 0x7F, 0xFA, 0xB4, 0x64, 0x41, 0x7D, 0xF1, 0x02, 0xB1, 0x04, 0x65, - 0x02, 0x02, 0x64, 0x40, 0x01, 0x2B, 0x01, 0x65, 0xB4, 0x84, 0xA0, 0x5D, 0x26, 0x61, 0xCD, 0x81, - 0xFF, 0xFF, 0xFD, 0x02, 0xAE, 0x4F, 0xFB, 0xB4, 0xA0, 0x5E, 0x1B, 0x60, 0xF3, 0xF1, 0xAD, 0x4F, - 0x00, 0x7F, 0xFA, 0xB4, 0x64, 0x41, 0x7D, 0xF1, 0x02, 0xB1, 0x04, 0x65, 0x02, 0x02, 0x64, 0x40, - 0x01, 0x2B, 0x01, 0x65, 0xB4, 0x84, 0xA0, 0x5D, 0x30, 0x01, 0x19, 0x60, 0xF3, 0xF3, 0xFF, 0xFF, - 0x01, 0x1B, 0x2B, 0x01, 0x31, 0x44, 0x04, 0x2A, 0x28, 0x01, 0x08, 0x26, 0x26, 0x01, 0x19, 0x60, - 0xF4, 0xF3, 0xFF, 0xFF, 0x01, 0x18, 0x21, 0x01, 0x7E, 0xF5, 0xF1, 0xFC, 0xAD, 0x4F, 0xFD, 0xB4, - 0xA0, 0x5D, 0x15, 0x60, 0x80, 0xE7, 0xC0, 0x60, 0x40, 0xEC, 0xC0, 0x60, 0x00, 0xED, 0xAC, 0x4F, - 0xBF, 0xB4, 0xA0, 0x5C, 0xC0, 0x60, 0x84, 0xEE, 0xAE, 0x4F, 0x04, 0xBC, 0x00, 0x7F, 0xA0, 0x5E, - 0x00, 0x7A, 0x2D, 0x60, 0x5A, 0x63, 0xA3, 0xD1, 0x05, 0x60, 0xDC, 0x64, 0xD0, 0x80, 0x00, 0x64, - 0x01, 0x06, 0x01, 0x64, 0x40, 0x4E, 0xB2, 0xF1, 0x66, 0x41, 0xE1, 0x81, 0xE1, 0x81, 0xE1, 0x81, - 0xE1, 0x81, 0x61, 0x46, 0x73, 0x42, 0x5A, 0x92, 0x3F, 0x64, 0xA0, 0x84, 0x60, 0x47, 0xE0, 0x84, - 0xE0, 0x85, 0x62, 0x47, 0xE8, 0x84, 0xE8, 0x84, 0x3F, 0xB4, 0x60, 0x41, 0x64, 0x44, 0x14, 0x90, - 0x3F, 0x26, 0xCC, 0x84, 0x14, 0x90, 0x3F, 0x26, 0xCC, 0x84, 0x62, 0x41, 0x60, 0x55, 0xB2, 0xFB, - 0x72, 0x5C, 0x67, 0x42, 0xD2, 0x80, 0xA2, 0x48, 0x20, 0x2B, 0x05, 0x00, 0x01, 0x02, 0x7C, 0x5C, - 0x04, 0x60, 0x00, 0x64, 0xC4, 0x85, 0xE8, 0xE2, 0xE4, 0xE2, 0x61, 0x42, 0x49, 0x91, 0x64, 0x44, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xB4, 0x84, 0x60, 0x45, - 0x51, 0x94, 0x04, 0x60, 0x00, 0x61, 0x01, 0x0D, 0x44, 0x94, 0x62, 0x41, 0x19, 0x60, 0xF5, 0xF1, - 0x61, 0x42, 0x64, 0x43, 0xCF, 0x83, 0xCF, 0x83, 0x03, 0x03, 0xE3, 0x83, 0x48, 0x94, 0xFE, 0x1F, - 0x2E, 0x40, 0x01, 0x26, 0xE0, 0x84, 0x60, 0x41, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, - 0x44, 0x94, 0xE9, 0x81, 0xE9, 0x81, 0x54, 0x94, 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0x44, 0x94, - 0xE9, 0x81, 0xE9, 0x81, 0xE9, 0x81, 0x54, 0x94, 0x19, 0xE2, 0x2E, 0x40, 0x01, 0x26, 0xE8, 0x84, - 0x29, 0x61, 0x54, 0x91, 0x61, 0x43, 0x11, 0x06, 0x75, 0x44, 0x80, 0x2B, 0xAB, 0xFF, 0x80, 0x27, - 0x0C, 0x00, 0x14, 0xE0, 0x94, 0xE0, 0x34, 0xE2, 0x61, 0x5A, 0x48, 0x21, 0xFE, 0x01, 0x00, 0xE0, - 0x7A, 0x43, 0x15, 0xA1, 0x75, 0x40, 0x80, 0x2B, 0x06, 0xA1, 0x5D, 0x91, 0x61, 0x44, 0x2E, 0x40, - 0x01, 0x26, 0xE0, 0x84, 0x60, 0x43, 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0x89, 0xFF, 0x10, 0xE0, - 0x80, 0x60, 0x00, 0x75, 0x88, 0xFF, 0xEB, 0x83, 0xEB, 0x83, 0x5C, 0x94, 0xEB, 0x83, 0x5C, 0x94, - 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0x4C, 0x94, 0x2E, 0x40, 0x01, 0x26, - 0xE8, 0x84, 0x60, 0x43, 0x65, 0x41, 0x62, 0x45, 0xD5, 0x85, 0x04, 0x60, 0x00, 0x61, 0x01, 0x0D, - 0xC5, 0x85, 0xC4, 0x84, 0x60, 0x43, 0x62, 0x41, 0xE1, 0x81, 0xE1, 0x81, 0xE1, 0x81, 0xE1, 0x81, - 0xE1, 0x81, 0xE1, 0x9C, 0x00, 0x61, 0xDD, 0x81, 0x58, 0x94, 0x4A, 0x92, 0xFC, 0x05, 0x41, 0x4F, - 0x00, 0x61, 0x62, 0x45, 0x1C, 0x60, 0x0A, 0xF3, 0xE3, 0x83, 0xF1, 0x81, 0xE3, 0x83, 0xF1, 0x81, - 0xE3, 0x83, 0xF1, 0x81, 0xE3, 0x83, 0xF1, 0x81, 0xE3, 0x83, 0xF1, 0x81, 0xE3, 0x83, 0xF1, 0x81, - 0xA0, 0x52, 0xB2, 0xF3, 0xC3, 0x9C, 0x44, 0x94, 0x01, 0x04, 0xDC, 0x84, 0x60, 0x55, 0xB2, 0xFB, - 0x64, 0x52, 0xE9, 0xE2, 0x65, 0x53, 0xB3, 0xF3, 0x06, 0x04, 0xDC, 0x84, 0xB3, 0xFB, 0xB4, 0xF3, - 0x02, 0x04, 0xDC, 0x84, 0xB4, 0xFB, 0x2F, 0x43, 0xCF, 0x83, 0x6C, 0xF3, 0xFF, 0xFF, 0x5C, 0x94, - 0xFF, 0xFF, 0x0C, 0x24, 0x01, 0x64, 0x6C, 0xFB, 0x16, 0x60, 0xAC, 0xF1, 0xFF, 0xFF, 0x03, 0x1B, - 0x31, 0x40, 0x02, 0x2A, 0x07, 0x00, 0x73, 0xF3, 0xFF, 0xFF, 0x5C, 0x94, 0xFF, 0xFF, 0x0C, 0x24, - 0x00, 0x64, 0x73, 0xFB, 0x19, 0x60, 0xF5, 0xF3, 0x01, 0x7C, 0x5C, 0x94, 0x00, 0x36, 0x01, 0x64, - 0xA2, 0xDB, 0x19, 0x60, 0xF2, 0xF9, 0x01, 0x60, 0x34, 0xE2, 0x32, 0x7A, 0xAC, 0x4F, 0x40, 0xBC, - 0x00, 0x7F, 0xA0, 0x5C, 0xC0, 0x60, 0x59, 0xEC, 0xC0, 0x60, 0x07, 0xED, 0xC0, 0x60, 0x8F, 0xEE, - 0xAE, 0x4F, 0x04, 0xBC, 0x00, 0x7F, 0xA0, 0x5E, 0x0A, 0x61, 0xCD, 0x81, 0xFF, 0xFF, 0xFD, 0x02, - 0xAE, 0x4F, 0xFB, 0xB4, 0xA0, 0x5E, 0x1B, 0x60, 0xF3, 0xF1, 0xAD, 0x4F, 0x00, 0x7F, 0xFA, 0xB4, - 0x64, 0x41, 0x7D, 0xF1, 0x02, 0xB1, 0x04, 0x65, 0x02, 0x02, 0x64, 0x40, 0x01, 0x2B, 0x01, 0x65, - 0xB4, 0x84, 0xA0, 0x5D, 0x37, 0x60, 0x7F, 0x78, 0xFF, 0xFF, 0x24, 0xE2, 0x2D, 0xF3, 0x2C, 0xF3, - 0x00, 0xBD, 0xCC, 0x84, 0x08, 0x03, 0x2C, 0xFB, 0x06, 0x02, 0x65, 0x44, 0x2C, 0xFB, 0x8A, 0xFF, - 0x80, 0x60, 0x00, 0x75, 0x88, 0xFF, 0x44, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, 0x44, 0xFB, 0x2F, 0x60, - 0x4A, 0x65, 0x2F, 0x60, 0x48, 0x61, 0xA5, 0xD3, 0xA1, 0xD3, 0x11, 0x18, 0xCC, 0x84, 0xA1, 0xDB, - 0x0E, 0x02, 0xA5, 0xD3, 0xA1, 0xDB, 0x17, 0x60, 0xA7, 0xF3, 0x17, 0x60, 0xA6, 0xF1, 0xA2, 0xDB, - 0xD0, 0x80, 0xFF, 0xFF, 0x04, 0x03, 0x8A, 0xFF, 0x20, 0x60, 0x00, 0x75, 0x88, 0xFF, 0xF1, 0xF3, - 0x31, 0x40, 0x01, 0x2A, 0x3D, 0x00, 0x60, 0x43, 0x04, 0xB0, 0x02, 0xB0, 0x08, 0x24, 0x16, 0x02, - 0x10, 0xB0, 0x29, 0x44, 0x34, 0x02, 0x00, 0xA8, 0xCC, 0x81, 0x0D, 0x03, 0x41, 0x49, 0x2F, 0x02, - 0x63, 0x40, 0x08, 0x2A, 0x08, 0x00, 0xF7, 0xB3, 0x1B, 0x60, 0xF6, 0xF1, 0xAD, 0x4F, 0xFD, 0xB4, - 0xA0, 0x5D, 0x44, 0x49, 0x24, 0x00, 0x63, 0x40, 0x02, 0x2A, 0x10, 0x00, 0x1B, 0x60, 0xF7, 0xF3, - 0x1B, 0x60, 0xF5, 0xFB, 0x40, 0x49, 0x1B, 0x60, 0xF8, 0xF3, 0x1B, 0x60, 0xF6, 0xFB, 0x0C, 0xBB, - 0xFD, 0xB3, 0xAD, 0x4F, 0x02, 0xBC, 0x00, 0x7F, 0xA0, 0x5D, 0x11, 0x00, 0x1B, 0x60, 0xF9, 0xF3, - 0x37, 0x60, 0xEA, 0x7C, 0x0C, 0x18, 0xA4, 0xDB, 0x40, 0x49, 0x1B, 0x60, 0xFA, 0xF3, 0x1B, 0x60, - 0xF6, 0xFB, 0x08, 0xBB, 0xFB, 0xB3, 0xAD, 0x4F, 0x02, 0xBC, 0x00, 0x7F, 0xA0, 0x5D, 0xF1, 0xFD, - 0x00, 0x60, 0xA4, 0xF3, 0x62, 0x43, 0x17, 0x18, 0x58, 0xD3, 0x62, 0x41, 0x03, 0x18, 0xCC, 0x84, - 0xA1, 0xDB, 0x11, 0x00, 0x49, 0xD3, 0xA3, 0xDB, 0x06, 0xA1, 0xA1, 0xD3, 0x59, 0xD1, 0x60, 0x45, - 0xA5, 0xD3, 0x59, 0xD1, 0xB0, 0x84, 0xA5, 0xDB, 0x64, 0x44, 0x06, 0x36, 0xCD, 0xFE, 0x07, 0x36, - 0xD6, 0xFE, 0xE6, 0x01, 0x23, 0x46, 0xB8, 0x60, 0x03, 0x78, 0xFF, 0xFF, 0x46, 0x43, 0x26, 0x60, - 0x3E, 0x61, 0xA1, 0xD3, 0x59, 0xD1, 0x06, 0x1B, 0x59, 0xD3, 0x59, 0xD1, 0x03, 0x1B, 0x59, 0xD3, - 0x59, 0xD1, 0xF0, 0x18, 0x00, 0x63, 0x49, 0xDD, 0x60, 0x40, 0x02, 0x36, 0x11, 0x00, 0x03, 0x36, - 0x32, 0x00, 0x01, 0x36, 0x08, 0x00, 0x05, 0x3A, 0xEA, 0x01, 0xA4, 0xD3, 0x5A, 0xD3, 0x9C, 0x85, - 0xA4, 0x84, 0xA2, 0xDB, 0xE4, 0x01, 0x01, 0x60, 0x48, 0x61, 0x00, 0x64, 0xA1, 0xDB, 0xDF, 0x01, - 0x3A, 0x60, 0x3E, 0x64, 0x40, 0x45, 0x22, 0x00, 0x01, 0x60, 0x48, 0x66, 0xA6, 0xD3, 0x04, 0xA1, - 0x60, 0x43, 0xA1, 0xD3, 0xC9, 0x81, 0x60, 0x45, 0x00, 0xBB, 0xA1, 0xDB, 0xBE, 0xD3, 0x09, 0x03, - 0xD4, 0x84, 0x9C, 0x84, 0xDC, 0x84, 0xFF, 0xFF, 0x04, 0x0E, 0xA3, 0xD1, 0x63, 0x46, 0x64, 0x43, - 0xF2, 0x01, 0x9C, 0x84, 0xDC, 0x85, 0x49, 0xDD, 0x61, 0x44, 0x00, 0xBB, 0xA6, 0xDB, 0x02, 0x03, - 0x65, 0x44, 0xBE, 0xDB, 0xBC, 0x01, 0x3A, 0x60, 0x19, 0x64, 0x40, 0x45, 0x01, 0x60, 0x48, 0x66, - 0xA6, 0xD3, 0xFF, 0xFF, 0xD0, 0x80, 0x0F, 0x18, 0x02, 0x03, 0x60, 0x46, 0xF9, 0x01, 0x58, 0xD3, - 0xA4, 0xD3, 0x60, 0x45, 0x00, 0x63, 0xA4, 0xDD, 0x05, 0x18, 0x58, 0xD3, 0xFF, 0xFF, 0xC4, 0x83, - 0xA2, 0xDD, 0xCA, 0x84, 0xA6, 0xDB, 0x25, 0x58, 0x64, 0x41, 0x00, 0x60, 0x46, 0x74, 0xCD, 0xE2, - 0x04, 0xE1, 0x02, 0x60, 0x00, 0xE1, 0x3F, 0x44, 0x40, 0x26, 0x05, 0x00, 0x1C, 0x60, 0x0F, 0xF3, - 0x5A, 0xD1, 0xA0, 0x50, 0xA4, 0x50, 0x3F, 0x40, 0x02, 0x2B, 0x03, 0x00, 0x3A, 0x60, 0xB7, 0x78, - 0xFF, 0xFF, 0x04, 0x29, 0xFE, 0x01, 0xC4, 0xE2, 0x43, 0x64, 0x3A, 0xDB, 0xA1, 0xF3, 0xFF, 0xFF, - 0x60, 0x41, 0x3F, 0x44, 0xFF, 0x01, 0x3F, 0x40, 0x40, 0x26, 0x05, 0x00, 0x1C, 0x60, 0x0D, 0xF3, - 0x5A, 0xD1, 0xA0, 0x50, 0xA4, 0x52, 0xC4, 0xE2, 0x32, 0x7B, 0x4D, 0xE2, 0xBF, 0xFE, 0xC4, 0xE2, - 0x41, 0xFF, 0xE0, 0xFE, 0xE1, 0xFE, 0xE2, 0xFE, 0x43, 0xFF, 0x44, 0xFF, 0x46, 0xFF, 0xA2, 0xF3, - 0x62, 0xFF, 0x60, 0x40, 0x05, 0x36, 0x2D, 0xFF, 0x07, 0x36, 0xD5, 0xFE, 0x08, 0xE1, 0x88, 0x60, - 0x85, 0x71, 0x8D, 0xE2, 0xA2, 0x60, 0x41, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x10, 0x62, 0x3D, 0x60, - 0x58, 0x4D, 0x3B, 0x78, 0xFF, 0xFF, 0x64, 0x41, 0xA9, 0x9C, 0x60, 0x45, 0x3D, 0x60, 0x58, 0x4D, - 0x0F, 0x78, 0xFF, 0xFF, 0xA1, 0xF1, 0x09, 0x60, 0xB4, 0x61, 0x64, 0x44, 0x01, 0x27, 0x24, 0x00, - 0x60, 0x40, 0x0E, 0x3A, 0x0D, 0x00, 0x01, 0x7C, 0x14, 0x60, 0x6F, 0xF9, 0x44, 0x60, 0x08, 0x7C, - 0x14, 0x60, 0x41, 0xF9, 0x16, 0x60, 0x62, 0xF1, 0x02, 0x60, 0xB0, 0x61, 0xB1, 0x9C, 0x26, 0x00, - 0x00, 0x7C, 0x14, 0x60, 0x6F, 0xF9, 0x40, 0x60, 0x08, 0x7C, 0x14, 0x60, 0x41, 0xF9, 0x16, 0x60, - 0x62, 0xF1, 0x02, 0x60, 0x90, 0x61, 0xB1, 0x9C, 0x09, 0x60, 0x67, 0x65, 0xFF, 0xB4, 0xC4, 0x85, - 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x81, 0x12, 0x00, 0xFF, 0xB4, 0xED, 0xA0, 0x2C, 0x60, 0xC6, 0x61, - 0x04, 0x04, 0xE2, 0xA0, 0xD9, 0x81, 0x01, 0x04, 0xD9, 0x81, 0xA1, 0xD1, 0x02, 0x60, 0x50, 0x61, - 0x26, 0x60, 0xF0, 0x65, 0xE0, 0x84, 0x44, 0xD3, 0xB1, 0x9C, 0xC8, 0x81, 0x61, 0x47, 0x00, 0x7E, - 0xE9, 0x81, 0x07, 0x60, 0xF0, 0x65, 0xA5, 0x81, 0x0B, 0xB9, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x85, - 0xB5, 0x85, 0x04, 0x60, 0x44, 0x62, 0x3D, 0x60, 0x58, 0x4D, 0x0F, 0x78, 0xFF, 0xFF, 0xA1, 0xF3, - 0xC8, 0x61, 0x61, 0x54, 0xCD, 0xE2, 0x60, 0x40, 0x01, 0x27, 0x2E, 0x00, 0xCC, 0x84, 0xE0, 0x85, - 0x15, 0x60, 0xA2, 0xE7, 0x26, 0x60, 0x80, 0x64, 0x3D, 0x60, 0x58, 0x4F, 0x04, 0x78, 0xFF, 0xFF, - 0x26, 0x60, 0x9C, 0x64, 0x3D, 0x60, 0x58, 0x4F, 0x04, 0x78, 0xFF, 0xFF, 0x26, 0x60, 0xB8, 0x64, - 0x3D, 0x60, 0x58, 0x4F, 0x04, 0x78, 0xFF, 0xFF, 0x26, 0x60, 0xD4, 0x64, 0x3D, 0x60, 0x58, 0x4F, - 0x04, 0x78, 0xFF, 0xFF, 0x75, 0x64, 0x06, 0x61, 0x61, 0x48, 0x60, 0x44, 0x80, 0xBC, 0xFF, 0xB4, - 0x60, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x28, 0x60, 0xE6, 0x7C, 0x07, 0x60, 0xE8, 0xF9, - 0x28, 0x60, 0x6E, 0x63, 0x14, 0x61, 0x21, 0x00, 0x14, 0x60, 0xDF, 0xF1, 0xFF, 0xB4, 0xED, 0xA0, - 0x64, 0x41, 0x04, 0x04, 0xE2, 0xA0, 0xD9, 0x81, 0x01, 0x04, 0xD9, 0x81, 0xA1, 0xD1, 0x14, 0x60, - 0x0E, 0xF3, 0x64, 0x41, 0xFF, 0xB1, 0xFF, 0x60, 0x00, 0x65, 0xA4, 0x84, 0x34, 0x94, 0xA2, 0xDB, - 0x5A, 0xD3, 0x64, 0x41, 0xA5, 0x81, 0xFF, 0xB4, 0x34, 0x94, 0xA2, 0xDB, 0x29, 0x60, 0x52, 0x7C, - 0x07, 0x60, 0xE8, 0xF9, 0x27, 0x60, 0xFC, 0x63, 0x13, 0x61, 0x3D, 0x60, 0x58, 0x4D, 0x23, 0x78, - 0xFF, 0xFF, 0x07, 0x60, 0xE8, 0xF3, 0x31, 0x40, 0x80, 0x26, 0x36, 0xA4, 0x07, 0x60, 0xE8, 0xFB, - 0x60, 0x43, 0x09, 0x61, 0x3D, 0x60, 0x58, 0x4D, 0x23, 0x78, 0xFF, 0xFF, 0xA1, 0xF3, 0x29, 0x60, - 0xBE, 0x61, 0x00, 0x7C, 0x7E, 0x63, 0x59, 0xD9, 0xFE, 0x1F, 0x60, 0x40, 0x01, 0x27, 0x03, 0x00, - 0x2A, 0x60, 0x40, 0x65, 0x15, 0x00, 0xFF, 0xB4, 0xF9, 0xA0, 0x2A, 0x60, 0x62, 0x65, 0x01, 0x7C, - 0x0D, 0x04, 0xED, 0xA0, 0x2A, 0x60, 0x84, 0x65, 0x11, 0x7C, 0x08, 0x04, 0xE2, 0xA0, 0x2A, 0x60, - 0xA6, 0x65, 0x21, 0x7C, 0x03, 0x04, 0x2A, 0x60, 0xC8, 0x65, 0x31, 0x7C, 0x64, 0x5F, 0x7D, 0xFB, - 0xA5, 0xD3, 0xDA, 0x85, 0xF0, 0xA0, 0x29, 0x60, 0xBE, 0x61, 0x08, 0x06, 0x40, 0x54, 0x58, 0x53, - 0x08, 0xFF, 0x37, 0x60, 0x7A, 0x64, 0x43, 0xFB, 0x08, 0xFF, 0xFF, 0x01, 0x60, 0x43, 0x60, 0x46, - 0xA5, 0xD1, 0xDA, 0x85, 0xA5, 0xD3, 0xDA, 0x85, 0x59, 0xD9, 0x59, 0xDB, 0x59, 0xD9, 0x59, 0xDB, - 0xFB, 0x1F, 0x0C, 0x63, 0xA5, 0xD1, 0xDA, 0x85, 0xA5, 0xD3, 0xDA, 0x85, 0x59, 0xD9, 0x59, 0xDB, - 0x59, 0xD9, 0x59, 0xDB, 0xF7, 0x1F, 0x66, 0x44, 0x0E, 0x63, 0x53, 0x93, 0x60, 0x40, 0x10, 0x36, - 0x07, 0x00, 0x65, 0x44, 0x48, 0xD3, 0x59, 0xD9, 0x59, 0xDB, 0x59, 0xD9, 0x59, 0xDB, 0xFB, 0x1F, - 0x16, 0x60, 0x39, 0xF1, 0x7D, 0xF3, 0x64, 0x43, 0xDB, 0x81, 0x2C, 0x60, 0x54, 0x65, 0x60, 0x40, - 0x01, 0x37, 0x12, 0x00, 0x11, 0x37, 0x17, 0x00, 0x21, 0x37, 0x1D, 0x00, 0x31, 0x37, 0x22, 0x00, - 0xA3, 0xD1, 0x16, 0x60, 0x34, 0xF5, 0x64, 0x44, 0xFF, 0xB4, 0x16, 0x60, 0x33, 0xFB, 0x64, 0x47, - 0xFF, 0xB4, 0x16, 0x60, 0x2A, 0xF1, 0x1D, 0x00, 0xA1, 0xD3, 0x16, 0x60, 0x35, 0xF5, 0xFF, 0xB4, - 0x16, 0x60, 0x2B, 0xF1, 0x16, 0x00, 0xA1, 0xD3, 0x16, 0x60, 0x36, 0xF5, 0x60, 0x47, 0xFF, 0xB4, - 0x16, 0x60, 0x2C, 0xF1, 0x0E, 0x00, 0x59, 0xD3, 0x16, 0x60, 0x37, 0xF5, 0xFF, 0xB4, 0x16, 0x60, - 0x2D, 0xF1, 0x07, 0x00, 0x59, 0xD3, 0x16, 0x60, 0x38, 0xF5, 0x60, 0x47, 0xFF, 0xB4, 0x16, 0x60, - 0x2E, 0xF1, 0x16, 0x60, 0x32, 0xFB, 0x16, 0x60, 0x2F, 0xF9, 0x66, 0x42, 0xFC, 0xA2, 0xA2, 0xD3, - 0x2B, 0x60, 0x42, 0x63, 0xCC, 0x84, 0xE8, 0x84, 0xCC, 0x81, 0x63, 0x45, 0xA6, 0xD3, 0xDA, 0x82, - 0xFF, 0xB4, 0xFF, 0xFF, 0x03, 0x03, 0x60, 0x40, 0x80, 0x2B, 0x03, 0x00, 0xDA, 0x86, 0xCD, 0x81, - 0xF5, 0x01, 0x00, 0xB9, 0xA6, 0xD3, 0x0B, 0x03, 0x5A, 0xD1, 0xDA, 0x86, 0xFF, 0xB4, 0xE0, 0x84, - 0xC4, 0x84, 0x5C, 0x90, 0xBD, 0xD9, 0xFD, 0x02, 0xCD, 0x81, 0x66, 0x42, 0xF2, 0x02, 0x5A, 0xD3, - 0x2B, 0x60, 0x80, 0x65, 0xD7, 0x80, 0xBD, 0xDB, 0xFD, 0x02, 0x7D, 0xF3, 0x19, 0x60, 0x7B, 0xF1, - 0x60, 0x40, 0x01, 0x27, 0x09, 0x00, 0x64, 0x40, 0x10, 0x26, 0x06, 0x00, 0x13, 0x64, 0xCB, 0xFB, - 0x01, 0x60, 0x67, 0x64, 0x37, 0xFB, 0x09, 0x00, 0x08, 0x64, 0xCB, 0xFB, 0xA1, 0xF3, 0x01, 0x60, - 0x67, 0x7C, 0x60, 0x40, 0x01, 0x27, 0x5B, 0x7C, 0x37, 0xF9, 0x19, 0x60, 0x4D, 0xF1, 0x7D, 0xF3, - 0x64, 0x40, 0x00, 0x3A, 0x1B, 0x00, 0x60, 0x40, 0x01, 0x27, 0x0D, 0x00, 0x32, 0x60, 0xAB, 0x63, - 0x4C, 0x94, 0x0E, 0xA5, 0x60, 0xFE, 0xA0, 0xD1, 0xA5, 0xD3, 0x19, 0x60, 0x72, 0xF9, 0x19, 0x60, - 0x73, 0xFB, 0x20, 0xFE, 0x0B, 0x00, 0xFF, 0xB4, 0xF8, 0xA4, 0x32, 0x60, 0xC8, 0x63, 0x4C, 0x94, - 0x60, 0xFE, 0xA0, 0xD1, 0xFF, 0xFF, 0x19, 0x60, 0x73, 0xF9, 0x20, 0xFE, 0x19, 0x60, 0x75, 0xF3, - 0x16, 0x60, 0xD8, 0xF1, 0x60, 0x43, 0xD3, 0x80, 0x19, 0x60, 0x76, 0xF3, 0x01, 0x07, 0x63, 0x5C, - 0xD0, 0x80, 0xFF, 0xFF, 0x01, 0x07, 0x60, 0x5C, 0x19, 0x60, 0x4F, 0xF9, 0x19, 0x60, 0x53, 0xF9, - 0x7D, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x27, 0x0A, 0x00, 0xFF, 0xB5, 0x10, 0x60, 0xF4, 0x63, - 0x65, 0x41, 0xCD, 0x81, 0x06, 0xA3, 0xFD, 0x02, 0xFA, 0xA3, 0xA3, 0xD3, 0x0F, 0x00, 0x01, 0x60, - 0xFF, 0x65, 0xA4, 0x84, 0x11, 0x60, 0x60, 0x61, 0xA1, 0xD1, 0xFF, 0xFF, 0xD0, 0x80, 0x08, 0xA1, - 0xFB, 0x02, 0xFC, 0xA1, 0xA1, 0xD3, 0x19, 0x60, 0x4F, 0xF1, 0xFF, 0xB4, 0xD0, 0x80, 0xFF, 0xFF, - 0x04, 0x07, 0x19, 0x60, 0x4F, 0xFB, 0x19, 0x60, 0x53, 0xFB, 0x19, 0x60, 0x4F, 0xF3, 0x19, 0x60, - 0x72, 0xF1, 0x19, 0x60, 0x74, 0xFB, 0xD0, 0x80, 0xFF, 0xFF, 0x02, 0x04, 0x19, 0x60, 0x74, 0xF9, - 0x2C, 0x60, 0x74, 0x63, 0x2B, 0x60, 0x02, 0x65, 0x16, 0x60, 0x33, 0xF1, 0x2A, 0x60, 0xEA, 0x61, - 0x2C, 0x60, 0x62, 0x64, 0x40, 0x4F, 0x04, 0x64, 0xC3, 0x60, 0x58, 0x4D, 0x1A, 0x78, 0xFF, 0xFF, - 0x19, 0x60, 0x4F, 0xF3, 0x19, 0x60, 0x73, 0xF1, 0x19, 0x60, 0x74, 0xFB, 0xD0, 0x80, 0xFF, 0xFF, - 0x02, 0x04, 0x19, 0x60, 0x74, 0xF9, 0x2C, 0x60, 0x7C, 0x63, 0x16, 0x60, 0x32, 0xF1, 0x2B, 0x60, - 0x42, 0x65, 0x2C, 0x60, 0x60, 0x64, 0x40, 0x4F, 0x08, 0x64, 0xC3, 0x60, 0x58, 0x4D, 0x1A, 0x78, - 0xFF, 0xFF, 0x7D, 0xF3, 0x08, 0x7C, 0x38, 0xF9, 0x2B, 0x60, 0xDA, 0x61, 0x60, 0x40, 0x01, 0x2B, - 0x0E, 0x00, 0x01, 0x37, 0x06, 0x00, 0x11, 0x37, 0x03, 0x00, 0x21, 0x3B, 0x1E, 0xA1, 0x1E, 0xA1, - 0x1E, 0xA1, 0x1C, 0x63, 0x2B, 0x60, 0xBC, 0x64, 0x59, 0xD1, 0x58, 0xD9, 0xFD, 0x1F, 0x16, 0x60, - 0x2F, 0xF3, 0x00, 0x7C, 0x60, 0x45, 0x70, 0x62, 0x3D, 0x60, 0x58, 0x4D, 0x0F, 0x78, 0xFF, 0xFF, - 0x04, 0x29, 0xFE, 0x01, 0x00, 0x60, 0x10, 0x62, 0x3D, 0x60, 0x58, 0x4D, 0x3B, 0x78, 0xFF, 0xFF, - 0x01, 0x61, 0xB1, 0x9C, 0x60, 0x45, 0x3D, 0x60, 0x58, 0x4D, 0x0F, 0x78, 0xFF, 0xFF, 0x3A, 0x60, - 0x95, 0x78, 0xFF, 0xFF, 0x44, 0xD3, 0x80, 0x7C, 0x60, 0x48, 0x60, 0x47, 0x00, 0x7F, 0xB0, 0x8A, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x2F, 0x58, 0xFF, 0xFF, 0xD5, 0x60, 0x84, 0xE7, 0x62, 0x47, - 0x80, 0xBF, 0x60, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x64, 0x4A, 0xFF, 0xFF, 0x01, 0x16, - 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x95, 0x60, 0x84, 0xE7, 0x2D, 0x58, - 0xFF, 0xFF, 0x00, 0x7C, 0xBD, 0xD3, 0xD5, 0x60, 0x84, 0xE7, 0x60, 0x47, 0x80, 0xBF, 0x60, 0x4A, - 0xBD, 0xD3, 0x01, 0x16, 0xFE, 0x01, 0x90, 0x8A, 0xBD, 0xD3, 0x01, 0x16, 0xFE, 0x01, 0x90, 0x8A, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0xCD, 0x81, 0x95, 0x60, 0x84, 0xE7, 0xEB, 0x02, 0x2D, 0x58, - 0xFF, 0xFF, 0xD5, 0x60, 0x84, 0xE7, 0x62, 0x4A, 0x02, 0x64, 0x01, 0x16, 0xFE, 0x01, 0xCC, 0x84, - 0xFF, 0xFF, 0xFD, 0x02, 0x7C, 0x49, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x68, 0x5C, 0x7C, 0x49, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x68, 0x44, 0x95, 0x60, 0x84, 0xE7, 0x2D, 0x58, 0xFF, 0xFF, - 0x40, 0xFF, 0x20, 0x44, 0xBF, 0xB4, 0x40, 0x40, 0x03, 0x00, 0x20, 0x44, 0x40, 0xBC, 0x40, 0x40, - 0x43, 0x45, 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, 0x02, 0x00, 0x43, 0x45, 0xF6, 0x01, 0x00, 0x64, - 0x19, 0x60, 0xF2, 0xFB, 0x3F, 0x44, 0x40, 0x26, 0x05, 0x00, 0x1C, 0x60, 0x0F, 0xF3, 0x5A, 0xD1, - 0xA0, 0x50, 0xA4, 0x50, 0xAE, 0x4F, 0xFD, 0xB4, 0x04, 0xBC, 0xA0, 0x5E, 0x00, 0x60, 0x02, 0x71, - 0x8D, 0xE2, 0x40, 0xE1, 0x40, 0x29, 0xFE, 0x01, 0x04, 0xAC, 0xA0, 0x5E, 0xFF, 0xFF, 0x00, 0x60, - 0x10, 0x62, 0x19, 0x60, 0x8E, 0x7C, 0x00, 0x60, 0xAC, 0x65, 0x3D, 0x60, 0x58, 0x4D, 0x0F, 0x78, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x10, 0x62, 0x3D, 0x60, 0x58, 0x4D, 0x3B, 0x78, 0xFF, 0xFF, - 0x60, 0x40, 0x19, 0x60, 0x8E, 0x64, 0x64, 0x40, 0xD0, 0x80, 0x14, 0x71, 0x05, 0x03, 0x8D, 0xE2, - 0x40, 0xE1, 0x40, 0x29, 0xFE, 0x01, 0xE2, 0x01, 0x3F, 0x44, 0x40, 0x26, 0x05, 0x00, 0x1C, 0x60, - 0x0D, 0xF3, 0x5A, 0xD1, 0xA0, 0x50, 0xA4, 0x52, 0x27, 0x60, 0x36, 0x63, 0x1E, 0x61, 0x3D, 0x60, - 0x58, 0x4D, 0x23, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x14, 0x71, 0x8D, 0xE2, 0x40, 0xE1, 0x40, 0x29, - 0xFE, 0x01, 0x31, 0x44, 0x40, 0x26, 0x02, 0x00, 0x80, 0x26, 0x17, 0x00, 0x28, 0x60, 0xE6, 0x63, - 0x07, 0x60, 0xE8, 0xFD, 0x09, 0x61, 0x3D, 0x60, 0x58, 0x4D, 0x23, 0x78, 0xFF, 0xFF, 0x31, 0x44, - 0x40, 0x2A, 0x14, 0x00, 0x31, 0x44, 0x7F, 0xB4, 0x40, 0x51, 0xAE, 0x4C, 0x10, 0x26, 0x0E, 0x00, - 0x07, 0x60, 0xE9, 0xFB, 0x31, 0x44, 0x80, 0xBC, 0x40, 0x51, 0x29, 0x60, 0x1C, 0x63, 0x07, 0x60, - 0xE8, 0xFD, 0x09, 0x61, 0x3D, 0x60, 0x58, 0x4D, 0x23, 0x78, 0xFF, 0xFF, 0x27, 0x60, 0xEA, 0x63, - 0x03, 0x61, 0x3D, 0x60, 0x58, 0x4D, 0x23, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x10, 0x62, 0x19, 0x60, - 0x8F, 0x7C, 0x00, 0x60, 0xAC, 0x65, 0x3D, 0x60, 0x58, 0x4D, 0x0F, 0x78, 0xFF, 0xFF, 0x80, 0xE1, - 0xBF, 0xFE, 0xA1, 0x4F, 0x70, 0xB4, 0x50, 0x36, 0x0C, 0x00, 0x20, 0x36, 0x03, 0x00, 0x3A, 0x60, - 0x77, 0x78, 0xFF, 0xFF, 0x01, 0x60, 0x1A, 0xE1, 0xDF, 0xFE, 0x19, 0xFF, 0x00, 0xE1, 0xA1, 0xFF, - 0xFF, 0xFF, 0x20, 0x44, 0x40, 0x2A, 0x85, 0x00, 0x7D, 0xF1, 0x3B, 0x00, 0x83, 0x00, 0x19, 0x60, - 0xF2, 0xF3, 0xFF, 0xFF, 0x01, 0x18, 0x59, 0x01, 0x43, 0x45, 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, - 0x1C, 0x60, 0x0F, 0xF3, 0x3F, 0x40, 0x40, 0x26, 0x01, 0x00, 0xA0, 0x50, 0xAE, 0x4F, 0xFD, 0xB4, - 0xA0, 0x5E, 0xAC, 0x4F, 0x10, 0xBC, 0xA0, 0x5C, 0xFF, 0xFF, 0x10, 0xAC, 0xA0, 0x5C, 0x00, 0x60, - 0xC8, 0x71, 0x8D, 0xE2, 0x40, 0xE1, 0x40, 0x29, 0xFE, 0x01, 0x7D, 0xF1, 0x30, 0x61, 0x64, 0x44, - 0x01, 0x2B, 0x20, 0xA1, 0x30, 0x64, 0x61, 0x5F, 0x60, 0x45, 0x0C, 0x60, 0x00, 0x62, 0x00, 0x60, - 0x71, 0x7C, 0x3D, 0x60, 0x58, 0x4D, 0x0F, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0xC8, 0x71, 0x8D, 0xE2, - 0x40, 0xE1, 0x40, 0x29, 0xFE, 0x01, 0x01, 0x60, 0x08, 0xE1, 0x7D, 0xF1, 0x20, 0x44, 0x40, 0xBC, - 0x40, 0x40, 0x19, 0x60, 0xF2, 0xF3, 0xFF, 0xFF, 0x03, 0x18, 0x3D, 0x60, 0x57, 0x78, 0xFF, 0xFF, - 0x1B, 0x60, 0xF3, 0xF1, 0xAD, 0x4F, 0x00, 0x7F, 0xFA, 0xB4, 0x64, 0x41, 0x7D, 0xF1, 0x02, 0xB1, - 0x04, 0x65, 0x02, 0x02, 0x64, 0x40, 0x01, 0x2B, 0x01, 0x65, 0xB4, 0x84, 0xA0, 0x5D, 0x20, 0x44, - 0x40, 0x2A, 0x43, 0x45, 0x20, 0xBC, 0x40, 0x40, 0xA1, 0xF9, 0x05, 0x64, 0xA2, 0xFB, 0xDF, 0xFE, - 0x19, 0xFF, 0xDD, 0xFE, 0x26, 0x00, 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, 0x43, 0x45, 0xA4, 0xD1, - 0xDA, 0x83, 0xC3, 0x85, 0x80, 0xE1, 0xDF, 0xFE, 0xBD, 0xD3, 0xFF, 0xFF, 0x60, 0x48, 0x60, 0x47, - 0x80, 0xBC, 0x00, 0x7F, 0x60, 0x4A, 0xD7, 0x80, 0xA1, 0xFF, 0xF6, 0x02, 0xBF, 0xFE, 0x11, 0x00, - 0x43, 0x45, 0xA4, 0xD1, 0xDA, 0x83, 0x0D, 0x18, 0x64, 0x44, 0x00, 0x61, 0xFA, 0xA4, 0xDD, 0x81, - 0xFD, 0x02, 0x3D, 0x60, 0x58, 0x4D, 0x23, 0x78, 0xFF, 0xFF, 0xBF, 0xFE, 0x02, 0x00, 0xF1, 0xFE, - 0x01, 0x00, 0x25, 0x43, 0x21, 0xE1, 0x00, 0x64, 0xBF, 0xDB, 0x20, 0x44, 0x20, 0x2A, 0x07, 0x00, - 0x07, 0xB4, 0x04, 0x36, 0xC3, 0xFE, 0x06, 0x36, 0xCC, 0xFE, 0x07, 0x36, 0xD5, 0xFE, 0x20, 0x44, - 0x98, 0xB4, 0x40, 0x40, 0x26, 0x60, 0x26, 0x63, 0xBD, 0xD3, 0x03, 0x61, 0x0F, 0x1B, 0x04, 0xA3, - 0xBD, 0xD3, 0x04, 0x61, 0x0B, 0x1B, 0x04, 0xA3, 0xBD, 0xD3, 0x06, 0x61, 0x07, 0x1B, 0x04, 0xA3, - 0xBD, 0xD3, 0x07, 0x61, 0x03, 0x1B, 0xC3, 0x60, 0x48, 0x78, 0xFF, 0xFF, 0xA3, 0xD1, 0x40, 0x44, - 0x20, 0x44, 0x07, 0xB5, 0xD4, 0x85, 0x35, 0x80, 0x24, 0x45, 0x26, 0x60, 0x66, 0x64, 0x44, 0xD7, - 0xFF, 0xFF, 0xFF, 0xFF, 0x43, 0x45, 0x20, 0x44, 0x20, 0xBC, 0x40, 0x40, 0x64, 0x43, 0xBD, 0xD3, - 0xBD, 0xD1, 0x40, 0x44, 0x10, 0x27, 0x19, 0x00, 0x3F, 0x40, 0x02, 0x2B, 0x06, 0x00, 0x24, 0x47, - 0x08, 0x2B, 0x13, 0x00, 0x07, 0xB4, 0x01, 0x36, 0x11, 0x00, 0xFF, 0x60, 0x7F, 0x65, 0x15, 0x60, - 0xA2, 0x64, 0x24, 0x40, 0x08, 0x2B, 0xA4, 0x84, 0xA0, 0x57, 0xFF, 0xFF, 0x64, 0x49, 0xFF, 0xFF, - 0x68, 0x44, 0x01, 0x16, 0xFD, 0x01, 0x00, 0x7F, 0xA3, 0xDB, 0xAB, 0x01, 0x64, 0x42, 0x3D, 0x60, - 0x58, 0x4D, 0x3B, 0x78, 0xFF, 0xFF, 0xBD, 0xD9, 0xA3, 0xDB, 0xA3, 0x01, 0x43, 0x45, 0x20, 0x44, - 0x20, 0xBC, 0x40, 0x40, 0x64, 0x43, 0xBD, 0xD3, 0xA3, 0xD1, 0x40, 0x44, 0x10, 0x2B, 0x16, 0x00, - 0xBE, 0xD1, 0xFF, 0xFF, 0x15, 0x60, 0x80, 0xE7, 0x24, 0x40, 0x07, 0x27, 0x04, 0x00, 0xAC, 0x4F, - 0x10, 0xBC, 0x00, 0x7F, 0xA0, 0x5C, 0x64, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x24, 0x40, - 0x20, 0x27, 0x1D, 0x00, 0xAC, 0x4F, 0xEF, 0xB4, 0xA0, 0x5C, 0x19, 0x00, 0x3F, 0x40, 0x02, 0x2B, - 0x06, 0x00, 0x24, 0x47, 0x08, 0x2B, 0x13, 0x00, 0x07, 0xB4, 0x01, 0x36, 0x11, 0x00, 0x15, 0x60, - 0x22, 0x64, 0x24, 0x40, 0x08, 0x27, 0x80, 0xBC, 0x7C, 0x48, 0xBE, 0xD3, 0xA0, 0x57, 0x60, 0x48, - 0x64, 0x44, 0x80, 0xBC, 0xFF, 0xB4, 0x60, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x69, 0x01, - 0x01, 0x61, 0x3D, 0x60, 0x58, 0x4D, 0x23, 0x78, 0xFF, 0xFF, 0x63, 0x01, 0x30, 0x44, 0x02, 0xA8, - 0x00, 0xE1, 0x07, 0x02, 0x62, 0xFF, 0x63, 0xFF, 0x64, 0xFF, 0x65, 0xFF, 0x66, 0xFF, 0xBF, 0xFE, - 0xA1, 0xFF, 0x82, 0xFF, 0x88, 0xFF, 0x6C, 0x40, 0x41, 0xFF, 0xC4, 0xE2, 0x43, 0xFF, 0x5C, 0x49, - 0x08, 0xE1, 0xA2, 0x60, 0x41, 0x78, 0xFF, 0xFF, 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x02, 0x02, - 0xA1, 0xFF, 0xFF, 0xFF, 0x82, 0xFF, 0x88, 0xFF, 0xA8, 0xE2, 0xCB, 0xF1, 0x00, 0x6B, 0x89, 0xFF, - 0x64, 0x54, 0x88, 0xFF, 0x9F, 0xFE, 0x02, 0x05, 0x64, 0x44, 0x60, 0x54, 0xCD, 0xE2, 0xC2, 0x64, - 0x3A, 0xDB, 0xBC, 0xFF, 0xB5, 0xFF, 0x1D, 0xFF, 0x26, 0x44, 0x02, 0xB4, 0x40, 0x46, 0x3C, 0x44, - 0x00, 0xBC, 0xFF, 0xFF, 0x06, 0x03, 0x27, 0x40, 0x26, 0x22, 0x03, 0x00, 0x02, 0x64, 0x31, 0xFB, - 0xC0, 0xFE, 0x27, 0x44, 0x20, 0x2A, 0x04, 0x00, 0xA0, 0x60, 0x00, 0xEA, 0xB0, 0x60, 0x00, 0xEA, - 0x5C, 0x44, 0x27, 0x44, 0x18, 0xB4, 0x40, 0x47, 0x00, 0xE1, 0x29, 0x40, 0x50, 0x2B, 0x37, 0x00, - 0xEF, 0x60, 0xFF, 0x65, 0x29, 0x44, 0x24, 0x89, 0x31, 0x40, 0x08, 0x26, 0x0B, 0x00, 0x21, 0x46, - 0xA7, 0xF4, 0x1D, 0xF2, 0xFF, 0xB3, 0x00, 0x7C, 0x05, 0x03, 0x06, 0x61, 0x5D, 0x91, 0x09, 0x60, - 0x02, 0x65, 0x02, 0x03, 0x00, 0x61, 0x15, 0x00, 0xD4, 0x80, 0x63, 0x45, 0xFB, 0x07, 0x65, 0x43, - 0x80, 0x60, 0x00, 0x62, 0xF6, 0x82, 0x53, 0x90, 0xE3, 0x83, 0xFC, 0x04, 0xEB, 0x83, 0xEB, 0x83, - 0xEA, 0x82, 0x5C, 0x94, 0xB2, 0x9C, 0xF3, 0x07, 0x64, 0x41, 0xDD, 0x81, 0xE1, 0x81, 0xE1, 0x81, - 0xE1, 0x81, 0x2B, 0x44, 0x54, 0x90, 0x70, 0x45, 0x02, 0x28, 0x61, 0x44, 0xC4, 0x84, 0xFF, 0xFF, - 0x04, 0x24, 0x00, 0xB4, 0x60, 0x50, 0x08, 0x28, 0x01, 0x00, 0x20, 0x29, 0x6D, 0xE2, 0xA4, 0xE2, - 0xC4, 0xE2, 0x47, 0xFF, 0xB6, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0x32, 0xF1, 0x08, 0x29, 0x09, 0x00, - 0x64, 0x40, 0x07, 0x22, 0x06, 0x00, 0x43, 0xFF, 0x27, 0x44, 0x10, 0xBC, 0x40, 0x47, 0x00, 0x64, - 0x32, 0xFB, 0x31, 0x41, 0x3C, 0x44, 0x01, 0xB1, 0x00, 0xBC, 0x0A, 0x02, 0x09, 0x03, 0x32, 0xF3, - 0x00, 0x7C, 0x01, 0xB4, 0xFF, 0xFF, 0x04, 0x03, 0x32, 0xF9, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, - 0xC8, 0x60, 0x09, 0x7D, 0x00, 0x60, 0x00, 0x6B, 0x00, 0x64, 0x33, 0xFB, 0x0C, 0x60, 0x16, 0x64, - 0xA0, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xE1, 0x30, 0x40, 0x02, 0x36, 0xA1, 0xFF, 0x83, 0xFF, - 0x8D, 0xFF, 0x5C, 0x44, 0x5C, 0x43, 0x5C, 0x42, 0x5C, 0x41, 0x5C, 0x40, 0xAC, 0xFF, 0xAD, 0xFF, - 0xE7, 0xE1, 0xB3, 0x60, 0xFC, 0x78, 0xFF, 0xFF, 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x03, 0x02, - 0x28, 0xE2, 0x40, 0xFF, 0xA1, 0xFF, 0x84, 0xFF, 0xC2, 0x60, 0x45, 0x64, 0x40, 0x42, 0xB7, 0x60, - 0xF7, 0x64, 0x40, 0x40, 0xBA, 0xF3, 0x7E, 0xFB, 0x0F, 0x60, 0xE2, 0x63, 0xC7, 0xF3, 0xBD, 0xDB, - 0x00, 0x60, 0x9A, 0x64, 0xBD, 0xDB, 0x02, 0x64, 0xBD, 0xDB, 0x04, 0x64, 0xA3, 0xDB, 0x5C, 0x49, - 0x0A, 0x64, 0x40, 0x4B, 0x5C, 0x5C, 0x01, 0x60, 0x39, 0xE2, 0x04, 0x60, 0x00, 0x7A, 0x89, 0xFF, - 0x03, 0x60, 0xFF, 0x73, 0x88, 0xFF, 0xB7, 0x60, 0xF7, 0x78, 0xFF, 0xFF, 0x30, 0x44, 0x02, 0xA8, - 0x00, 0xE1, 0x06, 0x02, 0x40, 0xFF, 0x42, 0xFF, 0x43, 0xFF, 0x44, 0xFF, 0x45, 0xFF, 0xA1, 0xFF, - 0x88, 0xFF, 0x85, 0xFF, 0x21, 0xE1, 0x5C, 0x40, 0xC3, 0x60, 0x48, 0x78, 0xFF, 0xFF, 0xA2, 0xFF, - 0x30, 0x44, 0x02, 0xA8, 0x00, 0xE1, 0x01, 0x02, 0xA1, 0xFF, 0x86, 0xFF, 0x88, 0xFF, 0x5C, 0x46, - 0x5C, 0x49, 0x5C, 0x40, 0xEF, 0x60, 0x58, 0x4F, 0x1B, 0x78, 0xFF, 0xFF, 0x1D, 0x60, 0x58, 0x4F, - 0x81, 0x78, 0xFF, 0xFF, 0xD3, 0x60, 0x58, 0x4F, 0x58, 0x78, 0xFF, 0xFF, 0xE7, 0x60, 0x58, 0x4F, - 0x99, 0x78, 0xFF, 0xFF, 0x20, 0x60, 0x58, 0x4F, 0x19, 0x78, 0xFF, 0xFF, 0xF4, 0x60, 0x58, 0x4F, - 0xE9, 0x78, 0xFF, 0xFF, 0xE9, 0x60, 0x58, 0x4F, 0xCA, 0x78, 0xFF, 0xFF, 0x27, 0x60, 0x58, 0x4F, - 0x71, 0x78, 0xFF, 0xFF, 0xEE, 0x60, 0x58, 0x4F, 0x69, 0x78, 0xFF, 0xFF, 0x1F, 0xE1, 0xA3, 0xFF, - 0xCA, 0x60, 0xD4, 0x78, 0xFF, 0xFF, 0x03, 0xE1, 0xA3, 0xFF, 0xFE, 0xFC, 0xFF, 0xFC, 0x25, 0x60, - 0x96, 0x63, 0x17, 0xFD, 0xAE, 0xFF, 0x2A, 0x60, 0x1D, 0x78, 0xFF, 0xFF, 0x42, 0x6F, 0x6F, 0x74, - 0x63, 0x6F, 0x64, 0x65, 0x20, 0x21, 0x21, 0x20, 0x20, 0x00, 0x53, 0x54, 0x41, 0x2F, 0x41, 0x50, - 0x20, 0x46, 0x75, 0x6E, 0x63, 0x27, 0x73, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x01, 0x00, 0x24, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, - 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0xA6, 0xF3, 0x21, 0x61, 0x00, 0x7C, 0x01, 0x00, 0x00, 0xFA, - 0x60, 0x46, 0xFE, 0x63, 0xA3, 0xD8, 0xFE, 0x1F, 0xCD, 0x81, 0xD8, 0x84, 0xF8, 0x02, 0x21, 0x61, - 0x80, 0x67, 0x40, 0x4A, 0xA6, 0xF5, 0x05, 0x18, 0x2A, 0x43, 0x02, 0xFC, 0x5F, 0x8A, 0x00, 0xF4, - 0xFA, 0x01, 0x2E, 0x58, 0xFF, 0xFF, 0xA8, 0xF1, 0xA7, 0xF3, 0x7C, 0x63, 0xAA, 0xFB, 0x60, 0x46, - 0x01, 0xFC, 0xDC, 0x84, 0xD0, 0x80, 0x00, 0xFA, 0xFA, 0x04, 0xAB, 0xFB, 0x60, 0x46, 0x00, 0x64, - 0x00, 0xFA, 0x63, 0x44, 0x80, 0x7F, 0x01, 0xFA, 0xA8, 0xF3, 0xA7, 0xF1, 0xDC, 0x84, 0xD0, 0x84, - 0xA9, 0xFB, 0x03, 0x60, 0x26, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x0F, 0x78, 0xFF, 0xFF, 0x66, 0x44, - 0x2E, 0xFB, 0x82, 0xFF, 0x40, 0x42, 0x87, 0xFF, 0xA9, 0xF3, 0xB1, 0xFB, 0x00, 0x64, 0x40, 0x50, - 0x63, 0xFF, 0x60, 0xFF, 0x66, 0xFF, 0x65, 0xFF, 0x64, 0xFF, 0x61, 0xFF, 0x62, 0xFF, 0x49, 0x60, - 0x02, 0xE1, 0x52, 0x60, 0x02, 0xE1, 0x5C, 0x60, 0x02, 0xE1, 0x65, 0x60, 0x02, 0xE1, 0x6B, 0x60, - 0x02, 0xE1, 0x76, 0x60, 0x02, 0xE1, 0x41, 0x60, 0x02, 0xE1, 0x0C, 0x64, 0x13, 0x60, 0x1C, 0xFB, - 0x41, 0x60, 0x07, 0x64, 0x9F, 0xFB, 0x2D, 0xFF, 0x06, 0x61, 0x41, 0x4B, 0x09, 0x60, 0x08, 0x61, - 0xB6, 0x60, 0x58, 0x4D, 0x0F, 0x78, 0xFF, 0xFF, 0xF0, 0x67, 0x0E, 0xFA, 0x26, 0x60, 0x04, 0x64, - 0x13, 0x60, 0x10, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0x2B, 0x41, 0x4D, 0x8B, 0xFF, 0xFF, 0xEA, 0x02, 0x05, 0x61, 0x41, 0x4B, 0x09, 0x60, 0x08, 0x61, - 0xB6, 0x60, 0x58, 0x4D, 0x0F, 0x78, 0xFF, 0xFF, 0x25, 0x60, 0xF8, 0x64, 0x13, 0x60, 0x10, 0xFB, - 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x2B, 0x41, 0x4D, 0x8B, - 0xFF, 0xFF, 0xEC, 0x02, 0x40, 0x60, 0x45, 0x78, 0xFF, 0xFF, 0x00, 0xEA, 0x00, 0xEB, 0x50, 0x60, - 0x03, 0xEA, 0x51, 0x60, 0x13, 0xEA, 0x52, 0x60, 0x30, 0xEA, 0x53, 0x60, 0x40, 0xEA, 0x54, 0x60, - 0x52, 0xEA, 0x55, 0x60, 0x6D, 0xEA, 0x56, 0x60, 0x71, 0xEA, 0x57, 0x60, 0x8B, 0xEA, 0x58, 0x60, - 0x47, 0xEA, 0x59, 0x60, 0xA0, 0xEA, 0x5A, 0x60, 0xB2, 0xEA, 0x5B, 0x60, 0xC1, 0xEA, 0x5C, 0x60, - 0xD7, 0xEA, 0x5D, 0x60, 0xEB, 0xEA, 0x5E, 0x60, 0xA0, 0xEA, 0x50, 0x60, 0x36, 0xEB, 0x51, 0x60, - 0x37, 0xEB, 0x52, 0x60, 0x20, 0xEB, 0x53, 0x60, 0xE4, 0xEB, 0x54, 0x60, 0x34, 0xEB, 0x55, 0x60, - 0x58, 0xEB, 0x56, 0x60, 0x48, 0xEB, 0x57, 0x60, 0xD0, 0xEB, 0x58, 0x60, 0xC3, 0xEB, 0x59, 0x60, - 0xFC, 0xEB, 0x5A, 0x60, 0x34, 0xEB, 0x5B, 0x60, 0x58, 0xEB, 0x5C, 0x60, 0xC0, 0xEB, 0x5D, 0x60, - 0xD0, 0xEB, 0x5E, 0x60, 0x91, 0xEB, 0x00, 0xEA, 0x00, 0xEB, 0xE0, 0x60, 0x02, 0xEA, 0xE0, 0x60, - 0x03, 0xEB, 0xA0, 0x60, 0x00, 0xEB, 0xB0, 0x60, 0x00, 0xEB, 0xAB, 0x48, 0x40, 0x3B, 0x01, 0x00, - 0xFC, 0x01, 0x00, 0xEB, 0x03, 0x60, 0x02, 0x64, 0xA0, 0xDB, 0x0F, 0x64, 0x60, 0x7F, 0xA0, 0x5A, - 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0x24, 0x44, 0xFF, 0xB4, - 0x04, 0xFB, 0x50, 0x60, 0x00, 0x64, 0x05, 0xFB, 0x10, 0x60, 0x10, 0x75, 0x2A, 0x60, 0x1D, 0x78, - 0xFF, 0xFF, 0x3F, 0x40, 0x40, 0x26, 0x40, 0x00, 0x05, 0x60, 0xF9, 0xF1, 0x42, 0x60, 0x08, 0x64, - 0x09, 0x60, 0x19, 0x63, 0x64, 0x40, 0x01, 0x2B, 0x04, 0x00, 0x42, 0x60, 0x09, 0x64, 0x0A, 0x60, - 0x19, 0x63, 0x1C, 0x60, 0x0F, 0xFB, 0x04, 0x60, 0x00, 0xBC, 0x1C, 0x60, 0x0B, 0xFB, 0x1C, 0x60, - 0x0A, 0xFD, 0x1D, 0x60, 0x19, 0x63, 0x1C, 0x60, 0x0E, 0xFD, 0x80, 0x60, 0x1C, 0x64, 0x3F, 0x40, - 0x01, 0x2A, 0x02, 0x00, 0x60, 0x60, 0x1C, 0x64, 0x1C, 0x60, 0x10, 0xFB, 0x1C, 0x60, 0x0C, 0xFB, - 0x1C, 0x60, 0x0F, 0xF3, 0xA0, 0x50, 0xA0, 0x50, 0x0B, 0x60, 0xF8, 0x63, 0xA3, 0xD1, 0x38, 0x60, - 0x12, 0x61, 0xA1, 0xD3, 0xF8, 0xA3, 0x90, 0x84, 0xA2, 0xDB, 0xA3, 0xD1, 0x59, 0xD3, 0x06, 0xA3, - 0x90, 0x84, 0xA2, 0xDB, 0xA3, 0xD1, 0x59, 0xD3, 0xFE, 0xA3, 0x90, 0x84, 0xA2, 0xDB, 0xA3, 0xD1, - 0x59, 0xD3, 0xFF, 0xFF, 0x90, 0x84, 0xA2, 0xDB, 0x80, 0x60, 0x58, 0xEC, 0x80, 0x60, 0x00, 0xED, - 0x80, 0x60, 0x80, 0xEE, 0x40, 0xEC, 0x00, 0xED, 0x00, 0xEE, 0xC0, 0x60, 0x59, 0xEC, 0xC0, 0x60, - 0x07, 0xED, 0xC0, 0x60, 0x8F, 0xEE, 0xAD, 0x4F, 0xFA, 0xB4, 0xA0, 0x5D, 0x00, 0xF3, 0x28, 0xFB, - 0x40, 0x44, 0x37, 0x60, 0x7B, 0x7C, 0x20, 0xF9, 0x3F, 0x60, 0x18, 0x7C, 0x21, 0xF9, 0x3F, 0x60, - 0x2E, 0x7C, 0x22, 0xF9, 0x3F, 0x60, 0xC5, 0x7C, 0x23, 0xF9, 0x3F, 0x60, 0xD6, 0x7C, 0x24, 0xF9, - 0x40, 0x60, 0x00, 0x7C, 0x25, 0xF9, 0x40, 0x60, 0x11, 0x7C, 0x26, 0xF9, 0xD0, 0x60, 0x00, 0xE8, - 0x28, 0xE8, 0x44, 0x60, 0x01, 0xE6, 0x10, 0x67, 0x40, 0x52, 0x10, 0x60, 0x04, 0xE6, 0x08, 0x60, - 0x06, 0x63, 0xFD, 0x60, 0x0C, 0x65, 0x5B, 0xD3, 0xBF, 0xD1, 0x10, 0x18, 0xC3, 0x83, 0xD4, 0x80, - 0xC3, 0x83, 0xF9, 0x02, 0xFA, 0xA3, 0xA3, 0xD3, 0x02, 0x60, 0x00, 0x65, 0xF9, 0xA0, 0xFC, 0xA0, - 0x0D, 0x05, 0x04, 0x05, 0x78, 0x43, 0x02, 0x61, 0x29, 0x60, 0xEA, 0x78, 0x21, 0x60, 0x00, 0x65, - 0x3F, 0x43, 0x21, 0x60, 0x00, 0x65, 0xC0, 0x60, 0x8F, 0xEE, 0x08, 0x00, 0x02, 0x60, 0x00, 0x65, - 0x00, 0x60, 0x00, 0x64, 0x18, 0xFB, 0x3F, 0x43, 0x11, 0x60, 0x10, 0xE6, 0xB7, 0x84, 0x40, 0x5F, - 0x37, 0x60, 0xF8, 0x63, 0x3F, 0x40, 0x20, 0x27, 0x06, 0x00, 0x0F, 0x60, 0xFF, 0x64, 0xBD, 0xDB, - 0x0F, 0x60, 0xF0, 0x64, 0x03, 0x00, 0x0F, 0x64, 0xBD, 0xDB, 0x00, 0x64, 0xA3, 0xDB, 0x00, 0x60, - 0x30, 0xE2, 0x00, 0x60, 0x50, 0xE2, 0x00, 0x60, 0x79, 0xE2, 0x00, 0x60, 0x90, 0xE2, 0x01, 0x60, - 0xD0, 0xE2, 0x01, 0x60, 0xF0, 0xE2, 0x01, 0x60, 0xB0, 0xE2, 0x13, 0x64, 0xCB, 0xFB, 0x01, 0x60, - 0x67, 0x64, 0x37, 0xFB, 0x00, 0x60, 0x28, 0x64, 0x36, 0xFB, 0x09, 0x60, 0x2A, 0x64, 0xB6, 0xFB, - 0x82, 0xFF, 0x92, 0xFF, 0x5C, 0x41, 0x5C, 0x46, 0x5C, 0x47, 0x00, 0xE1, 0xA3, 0x60, 0xF4, 0x63, - 0x0C, 0x60, 0x16, 0x64, 0xA0, 0xDD, 0x87, 0xFF, 0x97, 0xFF, 0x0C, 0x60, 0x02, 0x64, 0x40, 0x5A, - 0x06, 0xA4, 0x40, 0x5B, 0x5C, 0x5E, 0x16, 0x60, 0xCF, 0xF3, 0x7D, 0xFB, 0x3F, 0x40, 0x01, 0x22, - 0x03, 0x00, 0x80, 0x60, 0x37, 0x7C, 0x02, 0x00, 0x80, 0x60, 0x27, 0x7C, 0x1A, 0x60, 0x1F, 0xF9, - 0x01, 0x60, 0x06, 0x64, 0xA7, 0xFB, 0x02, 0x60, 0x7F, 0x64, 0x00, 0x60, 0x42, 0x65, 0xD4, 0x84, - 0xA8, 0xFB, 0xDC, 0x84, 0xA6, 0xFB, 0x12, 0x60, 0xD8, 0xFB, 0x40, 0x60, 0x58, 0x4E, 0x7D, 0x78, - 0xFF, 0xFF, 0x3F, 0x40, 0x40, 0x26, 0x05, 0x00, 0x1C, 0x60, 0x0D, 0xF3, 0x5A, 0xD1, 0xA0, 0x50, - 0xA4, 0x52, 0x08, 0x60, 0x00, 0x63, 0xFA, 0x60, 0x00, 0x65, 0xBD, 0xD3, 0xA3, 0xD3, 0x02, 0xA8, - 0xD4, 0x80, 0x21, 0x02, 0x20, 0x02, 0x19, 0x60, 0x48, 0xF1, 0xFF, 0xFF, 0x64, 0x40, 0x80, 0x26, - 0x1A, 0x00, 0x04, 0xA3, 0xFD, 0x60, 0x0D, 0x65, 0x5B, 0xD3, 0xBF, 0xD1, 0x14, 0x18, 0xC3, 0x83, - 0xD4, 0x80, 0xC3, 0x83, 0xF9, 0x02, 0xBF, 0xD3, 0xAD, 0x49, 0xFE, 0xA0, 0x00, 0x64, 0x0C, 0x04, - 0x08, 0xB1, 0x20, 0xBC, 0x08, 0x28, 0x18, 0xBC, 0x07, 0x7C, 0x0E, 0x60, 0xDF, 0xF9, 0x05, 0x7C, - 0x0E, 0x60, 0xDE, 0xF9, 0x01, 0x00, 0x00, 0x64, 0x0E, 0x60, 0xDD, 0xFB, 0x40, 0x60, 0x95, 0x78, - 0xFF, 0xFF, 0x5C, 0x51, 0x3F, 0x41, 0xA5, 0x4C, 0x50, 0x37, 0x0B, 0x00, 0x01, 0xB9, 0x41, 0x5F, - 0xB5, 0x60, 0x55, 0xE0, 0x05, 0x60, 0xF9, 0xF1, 0xC0, 0x67, 0x90, 0x84, 0x3F, 0x40, 0x01, 0x26, - 0xA0, 0x50, 0x06, 0x60, 0x08, 0xF3, 0x01, 0x60, 0x01, 0x65, 0x01, 0x60, 0x02, 0x7C, 0xD4, 0x80, - 0xD0, 0x80, 0x01, 0x03, 0x10, 0x02, 0x5A, 0xD1, 0x5A, 0xD3, 0x3C, 0x60, 0x00, 0x66, 0xE0, 0x87, - 0x40, 0x4A, 0x80, 0x60, 0x9E, 0x61, 0x64, 0x44, 0xC8, 0x84, 0x0C, 0x63, 0xAA, 0x46, 0x58, 0xD0, - 0xAA, 0x46, 0x59, 0xD8, 0xFB, 0x1F, 0x08, 0x60, 0x00, 0x63, 0xFA, 0x60, 0x00, 0x65, 0xBD, 0xD3, - 0xA3, 0xD3, 0x02, 0xA8, 0xD4, 0x80, 0x07, 0x02, 0x06, 0x02, 0x8C, 0x60, 0xBA, 0x61, 0x3C, 0x60, - 0x00, 0x66, 0x41, 0x4B, 0x03, 0x00, 0x46, 0x60, 0x3B, 0x78, 0xFF, 0xFF, 0x2B, 0x41, 0x8D, 0x60, - 0x02, 0x7C, 0xD1, 0x80, 0xA1, 0xD2, 0x25, 0x05, 0x59, 0xD0, 0x60, 0x45, 0x59, 0xD2, 0x44, 0x47, - 0xE0, 0x87, 0x40, 0x4A, 0x59, 0xD2, 0x59, 0x8B, 0x40, 0x4C, 0x08, 0x60, 0x00, 0x63, 0xBE, 0xD3, - 0xBD, 0xD1, 0xEC, 0x18, 0xD4, 0x80, 0xEA, 0x18, 0x03, 0x03, 0xC3, 0x83, 0xC3, 0x83, 0xF7, 0x01, - 0x67, 0x44, 0xC0, 0x84, 0xE0, 0x85, 0x2C, 0x44, 0xD4, 0x80, 0x63, 0x41, 0x01, 0x06, 0x65, 0x44, - 0xC8, 0x83, 0xAA, 0x46, 0x59, 0xD1, 0x27, 0xD8, 0x5A, 0x87, 0xFC, 0x1F, 0xAA, 0x46, 0x2B, 0x41, - 0xD5, 0x01, 0x8D, 0x60, 0x02, 0x61, 0x41, 0x4B, 0x2B, 0x41, 0x8D, 0x60, 0x02, 0x7C, 0xD1, 0x80, - 0xA1, 0xD2, 0x27, 0x05, 0x59, 0xD0, 0x60, 0x45, 0x59, 0xD2, 0x44, 0x47, 0xE0, 0x87, 0x40, 0x4A, - 0x59, 0xD2, 0x59, 0x8B, 0x40, 0x4C, 0x08, 0x60, 0x00, 0x63, 0xBE, 0xD3, 0xBD, 0xD1, 0xEC, 0x18, - 0xD4, 0x80, 0xEA, 0x18, 0x03, 0x03, 0xC3, 0x83, 0xC3, 0x83, 0xF7, 0x01, 0x04, 0xA3, 0xA3, 0xD1, - 0x5A, 0x88, 0x2C, 0x43, 0xD3, 0x80, 0xFF, 0xFF, 0x01, 0x06, 0x64, 0x43, 0xCF, 0x83, 0xAA, 0x46, - 0x60, 0xFE, 0x28, 0xD1, 0x5E, 0x88, 0x27, 0xD8, 0x5A, 0x87, 0xFB, 0x1F, 0x20, 0xFE, 0xAA, 0x46, - 0xD3, 0x01, 0x07, 0x60, 0xEC, 0xF3, 0x20, 0x60, 0x00, 0x7C, 0x08, 0xB0, 0x10, 0xB0, 0x05, 0x02, - 0x04, 0x03, 0x07, 0x60, 0xEB, 0xF9, 0x07, 0x60, 0xEA, 0xF9, 0x02, 0xB0, 0x04, 0xB0, 0x0F, 0x02, - 0x13, 0x60, 0xD2, 0xF3, 0x0C, 0x03, 0x02, 0xBC, 0xA2, 0xDB, 0x14, 0x60, 0x65, 0xF3, 0x14, 0x60, - 0x29, 0xF3, 0x02, 0xBD, 0x02, 0xBC, 0xA2, 0xDB, 0x65, 0x44, 0x14, 0x60, 0x65, 0xFB, 0x07, 0x60, - 0xEC, 0xF3, 0x31, 0x41, 0x60, 0x40, 0x20, 0x2A, 0x40, 0xB9, 0x40, 0x26, 0x03, 0x00, 0x60, 0x40, - 0x01, 0x26, 0x80, 0xB9, 0x41, 0x51, 0xFA, 0x60, 0x3A, 0x65, 0x46, 0x60, 0x58, 0x4D, 0x4E, 0x78, - 0xFF, 0xFF, 0x03, 0x02, 0x44, 0x60, 0xAD, 0x78, 0xFF, 0xFF, 0x5B, 0xD3, 0xF8, 0x60, 0x3F, 0x65, - 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0x14, 0x60, 0x74, 0xF3, 0xE0, 0x9C, 0xA4, 0x84, 0xB0, 0x84, - 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0xBD, 0xD3, 0xFF, 0xFF, - 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0x14, 0x60, 0x77, 0xF3, 0xE0, 0x9C, 0xA4, 0x84, - 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x28, 0x60, - 0xF4, 0x61, 0xA3, 0xD3, 0xFF, 0xFF, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0xA1, 0xD3, - 0xE0, 0x9C, 0xA4, 0x84, 0xB0, 0x84, 0xA1, 0xDB, 0xA3, 0xD3, 0xFF, 0xFF, 0x00, 0x7F, 0xE0, 0x84, - 0xE0, 0x84, 0x59, 0xD3, 0xE0, 0x9C, 0xA4, 0x84, 0xB0, 0x84, 0xA1, 0xDB, 0x14, 0x60, 0x7D, 0xF3, - 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, - 0xA2, 0xDB, 0x14, 0x60, 0x80, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, - 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x14, 0x60, 0x83, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, - 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0xA3, 0xD3, - 0xFF, 0xFF, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0x14, 0x60, 0x86, 0xF3, 0xE0, 0x9C, - 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, - 0x14, 0x60, 0x89, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, - 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x14, 0x60, 0x8C, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, - 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x02, 0xA3, 0xA3, 0xD3, - 0xF8, 0x60, 0x3F, 0x65, 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0x14, 0x60, 0x8F, 0xF3, 0xE0, 0x9C, - 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, - 0xBD, 0xD3, 0xFF, 0xFF, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0x14, 0x60, 0x92, 0xF3, - 0xE0, 0x9C, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, - 0xA2, 0xDB, 0x29, 0x60, 0x2A, 0x61, 0xA3, 0xD3, 0xFF, 0xFF, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, - 0xE0, 0x84, 0xA1, 0xD3, 0xE0, 0x9C, 0xA4, 0x84, 0xB0, 0x84, 0xA1, 0xDB, 0xA3, 0xD3, 0xFF, 0xFF, - 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0x59, 0xD3, 0xE0, 0x9C, 0xA4, 0x84, 0xB0, 0x84, 0xA1, 0xDB, - 0x14, 0x60, 0x98, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, - 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x14, 0x60, 0x9B, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, - 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x14, 0x60, 0x9E, 0xF3, - 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, - 0xA2, 0xDB, 0xA3, 0xD3, 0xFF, 0xFF, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0xE0, 0x84, 0x14, 0x60, - 0xA1, 0xF3, 0xE0, 0x9C, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, - 0xB0, 0x84, 0xA2, 0xDB, 0x14, 0x60, 0xA4, 0xF3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, - 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x14, 0x60, 0xA7, 0xF3, 0xFF, 0xFF, - 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0xA4, 0x84, 0xB0, 0x84, 0xA2, 0xDB, - 0x00, 0x60, 0x6A, 0x63, 0x29, 0x60, 0x50, 0x61, 0x28, 0x60, 0xE4, 0x64, 0x58, 0xD1, 0x59, 0xD9, - 0xFD, 0x1F, 0x14, 0x60, 0xB0, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, - 0x18, 0xAC, 0xA2, 0xDB, 0x14, 0x60, 0xB4, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x14, 0x60, - 0xB6, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x14, 0x60, 0xBD, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, - 0xA2, 0xDB, 0x14, 0x60, 0xBF, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x14, 0x60, 0xCB, 0xF3, - 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x5A, 0xD3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x14, 0x60, - 0xCF, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x14, 0x60, 0xD1, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, - 0xA2, 0xDB, 0x14, 0x60, 0xD8, 0xF3, 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0x14, 0x60, 0xDA, 0xF3, - 0xFF, 0xFF, 0x18, 0xAC, 0xA2, 0xDB, 0xFA, 0x60, 0x2C, 0x65, 0x46, 0x60, 0x58, 0x4D, 0x4E, 0x78, - 0xFF, 0xFF, 0x0E, 0x03, 0x63, 0x45, 0x2A, 0x60, 0xEA, 0x63, 0x06, 0x61, 0xA5, 0xD1, 0xDA, 0x85, - 0x64, 0x44, 0x0F, 0xB4, 0xBD, 0xDB, 0x64, 0x47, 0x0F, 0xB4, 0xCD, 0x81, 0xBD, 0xDB, 0xF6, 0x02, - 0xFA, 0x60, 0x30, 0x65, 0x46, 0x60, 0x58, 0x4D, 0x4E, 0x78, 0xFF, 0xFF, 0x14, 0x03, 0xBD, 0xD3, - 0x63, 0x46, 0x2B, 0x60, 0x82, 0x63, 0x15, 0x60, 0xD0, 0xFB, 0xDA, 0x85, 0xBD, 0xDB, 0x0E, 0x61, - 0xA6, 0xD1, 0xDA, 0x86, 0x64, 0x44, 0xFF, 0xB4, 0xA5, 0xDB, 0xDA, 0x85, 0x64, 0x47, 0xFF, 0xB4, - 0xCD, 0x81, 0xBD, 0xDB, 0xF5, 0x02, 0xFA, 0x60, 0x31, 0x65, 0x46, 0x60, 0x58, 0x4D, 0x4E, 0x78, - 0xFF, 0xFF, 0x22, 0x03, 0xBD, 0xD3, 0x15, 0x60, 0xEE, 0xFB, 0x5A, 0x81, 0x15, 0x60, 0xFD, 0xFB, - 0x5A, 0x82, 0x16, 0x60, 0x0C, 0xFB, 0x5A, 0x83, 0x16, 0x60, 0x1B, 0xFB, 0x5A, 0x84, 0x0E, 0x61, - 0xBD, 0xD1, 0xBD, 0xD5, 0x64, 0x44, 0xFF, 0xB4, 0x21, 0xDB, 0x5A, 0x81, 0x64, 0x47, 0xFF, 0xB4, - 0x22, 0xDB, 0x5A, 0x82, 0x66, 0x44, 0xFF, 0xB4, 0x23, 0xDB, 0x5A, 0x83, 0x66, 0x47, 0xFF, 0xB4, - 0x24, 0xDB, 0xCD, 0x81, 0x5A, 0x84, 0xEC, 0x02, 0xFA, 0x60, 0x47, 0x65, 0x46, 0x60, 0x58, 0x4D, - 0x4E, 0x78, 0xFF, 0xFF, 0x11, 0x03, 0x63, 0x45, 0x2C, 0x60, 0x54, 0x63, 0xA5, 0xD1, 0xDA, 0x85, - 0xBD, 0xD9, 0x02, 0x61, 0xA5, 0xD1, 0xDA, 0x85, 0x64, 0x47, 0x00, 0x7E, 0xBD, 0xDB, 0x64, 0x44, - 0x00, 0x7E, 0xCD, 0x81, 0xBD, 0xDB, 0xF6, 0x02, 0xFA, 0x60, 0x2E, 0x65, 0x46, 0x60, 0x58, 0x4D, - 0x4E, 0x78, 0xFF, 0xFF, 0x1F, 0x03, 0x63, 0x46, 0xFC, 0xA3, 0xA3, 0xD3, 0x2B, 0x60, 0x02, 0x63, - 0xCC, 0x84, 0xE8, 0x84, 0xCC, 0x81, 0x00, 0x36, 0x0D, 0x00, 0x63, 0x45, 0xA6, 0xD3, 0x5A, 0xD1, - 0xDA, 0x86, 0xFF, 0xB4, 0xE0, 0x84, 0xC4, 0x84, 0x5C, 0x90, 0xBD, 0xD9, 0xFD, 0x02, 0xCD, 0x81, - 0x66, 0x42, 0xF4, 0x02, 0x66, 0x42, 0x5A, 0xD3, 0x2B, 0x60, 0x42, 0x65, 0xBD, 0xDB, 0xD7, 0x80, - 0xFF, 0xFF, 0xFC, 0x02, 0x2C, 0x60, 0x68, 0x61, 0xFA, 0x60, 0x46, 0x65, 0x46, 0x60, 0x58, 0x4D, - 0x4E, 0x78, 0xFF, 0xFF, 0x01, 0x03, 0xA1, 0xDD, 0xD9, 0x81, 0xFA, 0x60, 0x2F, 0x65, 0x46, 0x60, - 0x58, 0x4D, 0x4E, 0x78, 0xFF, 0xFF, 0x01, 0x03, 0xA1, 0xDD, 0xD9, 0x81, 0xFA, 0x60, 0x3E, 0x65, - 0x46, 0x60, 0x58, 0x4D, 0x4E, 0x78, 0xFF, 0xFF, 0x01, 0x03, 0xA1, 0xDD, 0xD9, 0x81, 0xFA, 0x60, - 0x3F, 0x65, 0x46, 0x60, 0x58, 0x4D, 0x4E, 0x78, 0xFF, 0xFF, 0x01, 0x03, 0xA1, 0xDD, 0xD9, 0x81, - 0xFA, 0x60, 0x40, 0x65, 0x46, 0x60, 0x58, 0x4D, 0x4E, 0x78, 0xFF, 0xFF, 0x01, 0x03, 0xA1, 0xDD, - 0xD9, 0x81, 0xFA, 0x60, 0x3B, 0x65, 0x46, 0x60, 0x58, 0x4D, 0x4E, 0x78, 0xFF, 0xFF, 0x01, 0x03, - 0xA1, 0xDD, 0xFA, 0x60, 0x48, 0x65, 0x46, 0x60, 0x58, 0x4D, 0x4E, 0x78, 0xFF, 0xFF, 0x10, 0x03, - 0xBD, 0xD3, 0x2C, 0x60, 0xC4, 0x61, 0x0E, 0xB4, 0xBD, 0xD1, 0xA1, 0xDB, 0x64, 0x47, 0x0E, 0xB4, - 0xA3, 0xD1, 0x59, 0xDB, 0x64, 0x44, 0x0E, 0xB4, 0x59, 0xDB, 0x64, 0x47, 0x0E, 0xB4, 0x59, 0xDB, - 0xFA, 0x60, 0x29, 0x65, 0x46, 0x60, 0x58, 0x4D, 0x4E, 0x78, 0xFF, 0xFF, 0x07, 0x03, 0x04, 0xA3, - 0xA3, 0xD3, 0x20, 0x60, 0x00, 0x65, 0xB4, 0x84, 0x13, 0x60, 0xA6, 0xFB, 0xFA, 0x60, 0x2A, 0x65, - 0x46, 0x60, 0x58, 0x4D, 0x4E, 0x78, 0xFF, 0xFF, 0x30, 0x03, 0x04, 0xA3, 0xBD, 0xD1, 0x14, 0x60, - 0x4A, 0xF3, 0x64, 0x41, 0x64, 0x5E, 0xA2, 0xDB, 0x64, 0x47, 0x5A, 0xD3, 0x60, 0x5C, 0x64, 0x5F, - 0xA2, 0xDB, 0x14, 0x60, 0x60, 0xF3, 0xFF, 0x60, 0xC0, 0xB5, 0x61, 0x40, 0x80, 0x27, 0x05, 0x00, - 0xE9, 0x87, 0x3F, 0xB4, 0xB4, 0x84, 0xA2, 0xDB, 0x15, 0x00, 0x65, 0x44, 0xA2, 0xDB, 0xE1, 0x80, - 0xF9, 0x87, 0x01, 0x7F, 0x14, 0x60, 0x63, 0xF3, 0x60, 0x41, 0xE0, 0x84, 0xE0, 0x84, 0xE9, 0x81, - 0xF8, 0x84, 0xE9, 0x81, 0xF8, 0x84, 0xA2, 0xDB, 0x4A, 0xD3, 0xFF, 0x60, 0x80, 0x65, 0xA4, 0x84, - 0x34, 0x94, 0xA2, 0xDB, 0xDB, 0x83, 0x14, 0x60, 0xDF, 0xFD, 0xFA, 0x60, 0x2B, 0x65, 0x46, 0x60, - 0x58, 0x4D, 0x4E, 0x78, 0xFF, 0xFF, 0x07, 0x03, 0x04, 0xA3, 0xBD, 0xD3, 0x14, 0x60, 0x4D, 0xFB, - 0xA3, 0xD3, 0x14, 0x60, 0x11, 0xFB, 0xFA, 0x60, 0x3C, 0x65, 0x46, 0x60, 0x58, 0x4D, 0x4E, 0x78, - 0xFF, 0xFF, 0x1F, 0x03, 0xA3, 0xD3, 0xFC, 0x60, 0xFC, 0x65, 0xA4, 0x84, 0x60, 0x5C, 0x00, 0x7E, - 0xC0, 0x60, 0x00, 0xA0, 0x60, 0x43, 0x07, 0x04, 0x14, 0x60, 0x51, 0xF3, 0xFF, 0xFF, 0x03, 0x60, - 0xFF, 0xB4, 0x3C, 0x94, 0xA2, 0xDB, 0x28, 0x60, 0x2A, 0x61, 0x64, 0x44, 0x00, 0x7F, 0xC0, 0xA0, - 0x60, 0x47, 0x07, 0x04, 0x60, 0x43, 0xA1, 0xD3, 0xFF, 0xFF, 0x03, 0x60, 0xFF, 0xB4, 0x3C, 0x94, - 0xA1, 0xDB, 0xFA, 0x60, 0x49, 0x65, 0x46, 0x60, 0x58, 0x4D, 0x4E, 0x78, 0xFF, 0xFF, 0x1B, 0x03, - 0x32, 0x60, 0xAB, 0x61, 0x1C, 0x7C, 0x60, 0xFE, 0xA3, 0xD3, 0x5D, 0xD3, 0x0F, 0xB5, 0xD4, 0x84, - 0xA1, 0xDB, 0xBD, 0xD3, 0xFF, 0xFF, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x5D, 0xD3, - 0x0F, 0xB5, 0xD4, 0x84, 0xA1, 0xDB, 0x67, 0x44, 0xC0, 0x9C, 0x64, 0x40, 0x00, 0x36, 0x10, 0x00, - 0x64, 0x40, 0x0E, 0x3A, 0xE9, 0x01, 0x20, 0xFE, 0xFA, 0x60, 0x4A, 0x65, 0x46, 0x60, 0x58, 0x4D, - 0x4E, 0x78, 0xFF, 0xFF, 0x05, 0x03, 0x32, 0x60, 0xC7, 0x61, 0x0E, 0x7C, 0x60, 0xFE, 0xDC, 0x01, - 0x20, 0xFE, 0xB8, 0xFE, 0xB9, 0xFE, 0xBA, 0xFE, 0xBB, 0xFE, 0xBD, 0xFE, 0xBF, 0xFE, 0x19, 0x60, - 0x48, 0xF3, 0x12, 0x63, 0x60, 0x40, 0x01, 0x27, 0x04, 0x00, 0x0B, 0x60, 0xEA, 0x62, 0x5A, 0xDF, - 0xFE, 0x1F, 0x41, 0x60, 0x6B, 0x78, 0xFF, 0xFF, 0x08, 0x60, 0x06, 0x63, 0xBE, 0xD3, 0xBD, 0xD1, - 0x07, 0x18, 0xD4, 0x80, 0x05, 0x18, 0x03, 0x03, 0xC3, 0x83, 0xC3, 0x83, 0xF7, 0x01, 0xDB, 0x83, - 0x00, 0xBC, 0x2D, 0x58, 0xFF, 0xFF, 0x86, 0xFD, 0xAA, 0x2D, 0x00, 0x00, 0x06, 0x00, 0x10, 0xFD, - 0x6E, 0x01, 0x00, 0x00, 0x02, 0x00, 0x14, 0xFD, 0x8E, 0x32, 0x00, 0x00, 0x0A, 0x00, 0x41, 0xFA, - 0x40, 0x2A, 0x00, 0x00, 0x22, 0x00, 0x42, 0xFA, 0x62, 0x2A, 0x00, 0x00, 0x22, 0x00, 0x43, 0xFA, - 0x84, 0x2A, 0x00, 0x00, 0x22, 0x00, 0x44, 0xFA, 0xA6, 0x2A, 0x00, 0x00, 0x22, 0x00, 0x45, 0xFA, - 0xC8, 0x2A, 0x00, 0x00, 0x22, 0x00, 0x25, 0xFD, 0x9E, 0x01, 0x00, 0x00, 0x02, 0x00, - -}; /* fw_image_3_data */ - -static const hcf_8 fw_image_4_data[] = { - 0x6C, 0x40, 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x41, 0xFF, 0x33, 0xF3, 0x02, 0x11, 0x31, 0x18, 0x1E, 0x00, 0x44, 0xFF, 0x2E, 0x00, 0xFF, 0xFF, - 0xC4, 0xE2, 0x27, 0x44, 0x20, 0x2A, 0x01, 0x00, 0xFF, 0xFF, 0x42, 0x64, 0x3A, 0xDB, 0x23, 0x00, - 0x41, 0xFF, 0xA2, 0x60, 0x45, 0x78, 0xE2, 0xFE, 0x40, 0x49, 0x02, 0x60, 0x01, 0xE1, 0x1D, 0x00, - 0x44, 0xFF, 0x1B, 0x09, 0x29, 0x44, 0x10, 0x2A, 0x04, 0x74, 0xCD, 0xE2, 0x10, 0x65, 0x0B, 0x00, - 0xA3, 0x60, 0xC1, 0x78, 0xA4, 0xE2, 0x29, 0x44, 0x20, 0x2A, 0x0D, 0x00, 0x20, 0xAC, 0xEC, 0x01, - 0xA3, 0x60, 0xC1, 0x78, 0x46, 0xFF, 0xB4, 0x84, 0x40, 0x49, 0xA1, 0xFF, 0xFF, 0xFF, 0x80, 0x3E, - 0xA3, 0x60, 0xC1, 0x78, 0xFF, 0xFF, 0x62, 0xFF, 0x08, 0xE1, 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, - 0xAA, 0x60, 0xA5, 0x78, 0x4C, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAA, 0x60, 0xB3, 0x78, 0x44, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC4, 0xE2, 0x84, 0xFF, 0x22, 0x58, 0x82, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA4, 0x60, 0x39, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0xE1, 0x01, 0xFF, 0xFF, - 0x10, 0x29, 0xFA, 0x01, 0xE4, 0xE2, 0xAA, 0x60, 0x5F, 0x78, 0xB2, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC1, 0x60, 0xFC, 0x78, 0x64, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAA, 0x60, 0x46, 0x78, 0xAC, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0x29, 0xE2, 0x01, 0xAA, 0x60, 0xA2, 0x78, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB5, 0x60, 0x5C, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB5, 0x60, 0x94, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB3, 0x60, 0xC9, 0x78, 0x42, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB3, 0x60, 0xFC, 0x78, 0x43, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB3, 0x60, 0xFC, 0x78, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB7, 0x60, 0x20, 0x78, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB3, 0x60, 0xFF, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x60, 0x83, 0x64, 0x80, 0x29, 0x09, 0xFB, 0xB5, 0x60, 0x25, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, - 0x98, 0xFF, 0x3A, 0x60, 0x18, 0x78, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x39, 0x60, 0x8F, 0x78, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC0, 0x60, 0x67, 0x78, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBF, 0x60, 0xE1, 0x78, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xB7, 0x60, 0xE9, 0x78, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA1, 0xFF, 0x98, 0xFF, 0x83, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC3, 0x60, 0x4D, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0x42, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xB0, 0xFF, 0xB1, 0xFF, 0x40, 0xFF, 0x43, 0xFF, 0xC3, 0x60, 0x48, 0x78, 0x44, 0xFF, 0xFF, 0x01, - 0xC3, 0x60, 0x4D, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0x3E, 0x60, 0x8C, 0x78, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xC3, 0x60, 0x48, 0x78, 0x84, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xC3, 0x60, 0x47, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, - 0xCA, 0x60, 0xC8, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF3, 0x60, 0x9A, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x42, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x85, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xCA, 0x60, 0xD0, 0x78, 0x24, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF2, 0x60, 0x47, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xCA, 0x60, 0xD0, 0x78, 0x44, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xCA, 0x60, 0xD0, 0x78, 0x84, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xCA, 0x60, 0xD0, 0x78, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x29, 0x60, 0xF2, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x2A, 0x60, 0x20, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x2A, 0x60, 0x3E, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x2A, 0x60, 0x1D, 0x78, 0x28, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x2A, 0x60, 0x1D, 0x78, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x2A, 0x60, 0x1D, 0x78, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x2A, 0x60, 0x1D, 0x78, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x60, 0x87, 0x64, 0x80, 0x29, 0x09, 0xFB, 0x47, 0xFF, 0x2A, 0x60, 0x1D, 0x78, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0xF7, 0xA7, 0xFF, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x37, 0x60, 0x82, 0x78, 0x42, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x36, 0x60, 0x8F, 0x78, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x41, 0xFF, 0x00, 0x60, 0x03, 0xE1, 0x21, 0x46, 0x66, 0x45, 0x00, 0xF4, 0x2E, 0x44, 0x09, 0xFA, - 0x6A, 0x61, 0x7F, 0x60, 0xFE, 0x63, 0xA1, 0xFF, 0x9A, 0xFF, 0x05, 0x11, 0x0A, 0x00, 0x00, 0xF4, - 0x01, 0xF2, 0x17, 0x18, 0x7A, 0x61, 0x02, 0x25, 0x04, 0x00, 0x6C, 0x44, 0x7A, 0xDA, 0xFB, 0x1C, - 0xF6, 0x11, 0xD9, 0x81, 0x41, 0xFF, 0x02, 0x1C, 0x00, 0xF4, 0xDA, 0x82, 0x41, 0xFF, 0xC9, 0x81, - 0xCB, 0x83, 0x6C, 0x44, 0x5A, 0xDA, 0x02, 0x1C, 0x00, 0xF4, 0x81, 0xF2, 0x6C, 0x44, 0x5A, 0xDA, - 0xCB, 0x83, 0x02, 0x74, 0x02, 0x60, 0x04, 0xE1, 0x80, 0x60, 0x00, 0x61, 0x5D, 0x93, 0xB5, 0xFF, - 0x98, 0xFF, 0x26, 0x44, 0xFD, 0xB4, 0x84, 0xBC, 0x40, 0x46, 0x65, 0x46, 0x00, 0x64, 0x23, 0xFA, - 0x3F, 0xFC, 0x63, 0x47, 0x0A, 0x63, 0x0F, 0xFC, 0x00, 0xF4, 0x08, 0xFA, 0xCB, 0xFE, 0x18, 0xE1, - 0x44, 0xFF, 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, 0xE2, 0xFE, 0x03, 0x04, 0xA3, 0x60, 0x05, 0x78, - 0xFF, 0xFF, 0xE0, 0xFE, 0x03, 0x04, 0xA3, 0x60, 0x1B, 0x78, 0xFF, 0xFF, 0xE1, 0xFE, 0x07, 0x05, - 0x9F, 0xFE, 0x03, 0x04, 0x3A, 0x60, 0x77, 0x78, 0xFF, 0xFF, 0x43, 0xFF, 0xA9, 0x01, 0x95, 0xF3, - 0xFF, 0xFF, 0x80, 0xB4, 0xFF, 0xFF, 0x08, 0x24, 0x16, 0x00, 0x29, 0x44, 0x08, 0x26, 0xE1, 0x01, - 0x72, 0x44, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xB2, 0xF3, 0xE8, 0x85, - 0xFF, 0xB7, 0xE0, 0x84, 0xE0, 0x84, 0xB4, 0x85, 0x73, 0x44, 0xD4, 0x84, 0x10, 0x65, 0xD4, 0x80, - 0xFF, 0xFF, 0x01, 0x05, 0x8F, 0x00, 0x80, 0x60, 0x01, 0xE0, 0xD5, 0x60, 0x84, 0xE7, 0xA1, 0xF3, - 0x7C, 0x45, 0x60, 0x40, 0x01, 0x23, 0x02, 0x65, 0x8C, 0x60, 0x48, 0x6A, 0xFF, 0xFF, 0x01, 0x16, - 0xFE, 0x01, 0x00, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x7F, 0x6A, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x84, 0x60, 0x04, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, - 0x48, 0x60, 0x08, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, - 0xFE, 0x01, 0x84, 0x60, 0x04, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x40, 0x60, 0x08, 0x6A, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x95, 0x60, - 0x84, 0xE7, 0xBD, 0xFE, 0x0C, 0x60, 0x00, 0x62, 0x00, 0x60, 0x71, 0x7C, 0x00, 0x60, 0xB1, 0x65, - 0x3D, 0x60, 0x58, 0x4D, 0x0F, 0x78, 0xFF, 0xFF, 0x08, 0xE1, 0x62, 0xFF, 0xA3, 0xFF, 0xFF, 0xFF, - 0xA2, 0xFF, 0x02, 0x60, 0x08, 0xE1, 0xAE, 0x4F, 0x02, 0xBC, 0x00, 0x7F, 0xA0, 0x5E, 0x3F, 0x40, - 0x40, 0x26, 0x09, 0x00, 0x1C, 0x60, 0x09, 0xF3, 0x5A, 0xD1, 0xA0, 0x50, 0xA4, 0x52, 0x5A, 0xD3, - 0x5A, 0xD1, 0xA0, 0x50, 0xA4, 0x50, 0xDB, 0xF3, 0xF1, 0xF1, 0x01, 0xA8, 0x07, 0xA8, 0x0A, 0x03, - 0x09, 0x03, 0x64, 0x40, 0x01, 0x26, 0x09, 0x00, 0x1B, 0x60, 0xF3, 0xF3, 0xFF, 0xFF, 0x01, 0xB4, - 0xFF, 0xFF, 0x03, 0x02, 0xAD, 0x4F, 0xFA, 0xB4, 0xA0, 0x5D, 0x19, 0x60, 0xF6, 0xF1, 0x89, 0xFF, - 0x32, 0x40, 0x80, 0x2A, 0x1E, 0x00, 0x31, 0x40, 0x01, 0x2A, 0x1B, 0x00, 0x12, 0x60, 0xFF, 0xF3, - 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x05, 0x03, 0x0E, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, - 0x10, 0x00, 0x13, 0x60, 0x02, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x03, 0x03, 0x0F, 0xF2, - 0xFF, 0xFF, 0x07, 0x1B, 0x64, 0x40, 0x01, 0x26, 0x03, 0x00, 0x08, 0x60, 0x00, 0x75, 0x01, 0x00, - 0x10, 0xFF, 0x88, 0xFF, 0xA2, 0x60, 0x41, 0x78, 0xFF, 0xFF, 0x21, 0x46, 0x01, 0x5D, 0x5C, 0x62, - 0x03, 0xE1, 0x44, 0xFF, 0xA1, 0xFF, 0x9A, 0xFF, 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x62, 0x62, - 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0xA1, 0xFF, 0x5A, 0xDC, 0x12, 0xE1, 0x02, 0x60, 0x01, 0xE1, - 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, 0x28, 0x40, 0x40, 0x2B, 0x03, 0x00, 0x29, 0x40, 0x20, 0x27, - 0xA3, 0x00, 0xC8, 0x74, 0xCD, 0xE2, 0x29, 0x44, 0x08, 0xBC, 0x40, 0x49, 0x44, 0xFF, 0x05, 0xE1, - 0xDB, 0xF3, 0x37, 0x60, 0xE8, 0x63, 0x03, 0xA8, 0x04, 0xA8, 0x06, 0x03, 0x05, 0x03, 0xA3, 0xD3, - 0xFF, 0xFF, 0x01, 0xA8, 0x07, 0x18, 0x0A, 0x03, 0x28, 0x40, 0x08, 0x2A, 0x07, 0x00, 0x28, 0x40, - 0x48, 0x36, 0x04, 0x00, 0xF1, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0xF1, 0xFB, 0x29, 0x44, 0xFF, 0x60, - 0xEF, 0x65, 0x24, 0x89, 0x40, 0x27, 0x3F, 0x00, 0x00, 0x00, 0x29, 0x40, 0x80, 0x27, 0x0B, 0x00, - 0x07, 0x61, 0xA1, 0xFF, 0xCD, 0x81, 0x04, 0x25, 0x61, 0x00, 0x87, 0x4C, 0xFB, 0x02, 0xF3, 0x60, - 0xA0, 0x64, 0x80, 0x4C, 0x07, 0x00, 0xA1, 0xFF, 0x9C, 0x4C, 0x9C, 0x4C, 0x9C, 0x4D, 0x05, 0x60, - 0xCF, 0x64, 0x80, 0x4C, 0x28, 0x40, 0x40, 0x2B, 0x05, 0x00, 0x29, 0x40, 0x20, 0x27, 0x02, 0x00, - 0x15, 0x60, 0x6F, 0x6B, 0x04, 0x25, 0x4A, 0x00, 0x30, 0x64, 0x3A, 0xDB, 0x44, 0xFF, 0x04, 0x25, - 0x45, 0x00, 0x04, 0x60, 0x00, 0x65, 0x25, 0x44, 0xB4, 0x84, 0x80, 0x4E, 0x2D, 0x41, 0x04, 0x25, - 0x3D, 0x00, 0x61, 0x4C, 0x00, 0x60, 0x8A, 0x65, 0xC5, 0x81, 0x61, 0x54, 0xA1, 0xFF, 0xFF, 0xFF, - 0x04, 0x25, 0x34, 0x00, 0x67, 0x4E, 0x07, 0x64, 0x1C, 0xFB, 0x00, 0xE1, 0x02, 0x60, 0x05, 0xE1, - 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, 0x28, 0x40, 0x40, 0x27, 0x0A, 0x00, 0x1C, 0x65, 0x28, 0x40, - 0xA4, 0x36, 0x14, 0x65, 0x23, 0x44, 0xC4, 0x84, 0x28, 0x40, 0x08, 0x2A, 0x0C, 0x00, 0x07, 0x00, - 0x23, 0x44, 0x1C, 0xA4, 0x29, 0x40, 0x20, 0x27, 0x02, 0x00, 0x11, 0x60, 0x0F, 0x6B, 0x3C, 0x46, - 0x98, 0xF0, 0x23, 0x44, 0xC4, 0x84, 0x06, 0x74, 0x25, 0x5C, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0xB0, 0x84, 0x80, 0x4C, 0x9C, 0x4C, 0x44, 0xFF, 0x18, 0xE1, 0x0A, 0x64, 0x1E, 0x74, - 0x02, 0x60, 0x05, 0xE1, 0x40, 0x40, 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, 0xC4, 0xE2, 0x27, 0x44, - 0x20, 0x2A, 0x06, 0x00, 0x42, 0x64, 0x3A, 0xDB, 0x67, 0x4C, 0xB1, 0x60, 0xAD, 0x78, 0xFF, 0xFF, - 0x41, 0x64, 0x3A, 0xDB, 0x62, 0xFF, 0x08, 0xE1, 0xE2, 0xFE, 0x72, 0x52, 0xA1, 0xFF, 0x98, 0xFF, - 0x80, 0x3E, 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, 0x28, 0x40, 0x08, 0x27, 0x5A, 0x01, 0x3C, 0x46, - 0x8B, 0xFF, 0x84, 0x60, 0x00, 0xE4, 0x0F, 0x60, 0x90, 0x64, 0xC9, 0x60, 0x58, 0x4F, 0x56, 0x78, - 0xFF, 0xFF, 0x3F, 0xF2, 0x00, 0x60, 0x18, 0x70, 0x18, 0x71, 0x20, 0x72, 0x00, 0xF2, 0x60, 0x53, - 0x20, 0xE1, 0xA1, 0xFF, 0x88, 0x75, 0x00, 0xE1, 0xFF, 0xFF, 0x60, 0x50, 0x75, 0x44, 0x12, 0x71, - 0x6E, 0x72, 0x81, 0x75, 0xFF, 0xFF, 0x88, 0xFF, 0xA3, 0x60, 0x21, 0x78, 0xFF, 0xFF, 0x32, 0xF3, - 0x08, 0x29, 0x0A, 0x00, 0x60, 0x40, 0x07, 0x22, 0x07, 0x00, 0xFE, 0xB4, 0x32, 0xFB, 0x27, 0x44, - 0x10, 0xBC, 0xF7, 0xB4, 0x40, 0x47, 0x43, 0xFF, 0x00, 0x64, 0x3A, 0xDB, 0x01, 0x60, 0x08, 0xE1, - 0x31, 0x40, 0x01, 0x2A, 0x06, 0x00, 0x00, 0x64, 0x33, 0xFB, 0x01, 0x60, 0x0A, 0xE1, 0x25, 0x11, - 0x24, 0x0A, 0xE5, 0xFE, 0x2D, 0x05, 0x32, 0x40, 0x80, 0x2A, 0x05, 0x00, 0x19, 0x60, 0xF2, 0xF3, - 0xFF, 0xFF, 0x01, 0x18, 0x16, 0x00, 0x9F, 0xFE, 0x14, 0x05, 0x9D, 0xFE, 0x12, 0x04, 0x31, 0x41, - 0x40, 0x2A, 0x0F, 0x00, 0x07, 0x60, 0xE9, 0xF1, 0xAE, 0x4C, 0x90, 0x80, 0x10, 0x2A, 0x09, 0x00, - 0x7F, 0xB1, 0x07, 0x60, 0xE9, 0xFB, 0x60, 0x40, 0x10, 0x2A, 0x80, 0xB9, 0x41, 0x51, 0xDF, 0xFE, - 0x19, 0xFF, 0x9F, 0xFE, 0x02, 0x04, 0x40, 0xE1, 0x08, 0x00, 0x7C, 0xE1, 0x31, 0x44, 0x01, 0x2A, - 0x04, 0x00, 0xFD, 0xE1, 0x27, 0x44, 0x10, 0x26, 0x06, 0x00, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, - 0xAA, 0x60, 0x6F, 0x78, 0xFF, 0xFF, 0x27, 0x44, 0x08, 0x26, 0xFF, 0xFF, 0xC1, 0x60, 0xA3, 0x78, - 0xFF, 0xFF, 0x48, 0xF3, 0x32, 0xF1, 0x00, 0x63, 0x64, 0x40, 0x07, 0x26, 0x03, 0x00, 0xA5, 0x60, - 0x0F, 0x78, 0xFF, 0xFF, 0x43, 0xFF, 0x31, 0x40, 0x08, 0x26, 0xF0, 0x01, 0xCD, 0xE2, 0x85, 0xE1, - 0x70, 0x41, 0xAD, 0x80, 0x71, 0x40, 0x80, 0x27, 0xE9, 0x12, 0x03, 0x03, 0xC2, 0x60, 0x15, 0x78, - 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0xC4, 0xE2, 0x32, 0xFD, 0x60, 0x40, 0x01, 0x2A, 0xDB, 0x01, - 0x00, 0x63, 0x32, 0xFD, 0x3C, 0x46, 0x3E, 0xF2, 0x2A, 0xF0, 0x27, 0x41, 0x44, 0x48, 0x20, 0xB9, - 0x01, 0xB4, 0xF7, 0xB1, 0x0A, 0x03, 0x64, 0x40, 0x08, 0x27, 0x07, 0x00, 0x0F, 0x60, 0xDA, 0x63, - 0x00, 0x64, 0x45, 0xFB, 0x46, 0xFB, 0xBD, 0xDB, 0xA3, 0xDB, 0xC8, 0x0A, 0xC7, 0x11, 0x1B, 0x60, - 0xEE, 0xF3, 0xFF, 0xFF, 0x14, 0x18, 0x28, 0x40, 0xD4, 0x36, 0x11, 0x00, 0xAC, 0x4C, 0x80, 0x2A, - 0x0E, 0x00, 0x1B, 0x60, 0xF1, 0xF3, 0xFF, 0xFF, 0x0A, 0x18, 0x1B, 0x60, 0xF2, 0xF3, 0x1B, 0x60, - 0xEF, 0xF3, 0x60, 0x45, 0xD4, 0x80, 0xDC, 0x84, 0x02, 0x03, 0xA2, 0xDB, 0xAF, 0x01, 0x00, 0x64, - 0x1B, 0x60, 0xEF, 0xFB, 0x41, 0x47, 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x10, 0x26, 0x04, 0x00, - 0x01, 0x2A, 0x05, 0x00, 0x10, 0x2B, 0x03, 0x00, 0x29, 0x47, 0x20, 0xBF, 0x40, 0x49, 0x1B, 0x60, - 0xEE, 0xF3, 0xFF, 0xFF, 0x04, 0x18, 0xAE, 0x4F, 0x08, 0xBC, 0x00, 0x7F, 0xA0, 0x5E, 0x05, 0xE1, - 0x01, 0x60, 0x08, 0xE1, 0x2A, 0xE8, 0x3C, 0x46, 0x0F, 0xF0, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x2A, - 0x03, 0x00, 0xA7, 0x60, 0xE1, 0x78, 0xFF, 0xFF, 0x7D, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x27, - 0x0E, 0x00, 0x1F, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x2B, 0x09, 0x00, 0x19, 0x60, 0x7B, 0xF3, - 0xFF, 0xFF, 0x60, 0x40, 0x02, 0x2A, 0x03, 0x00, 0xA8, 0x60, 0xEC, 0x78, 0xFF, 0xFF, 0x1F, 0xF2, - 0xC0, 0x60, 0x00, 0x65, 0xA4, 0x9C, 0x3F, 0x60, 0xCF, 0x65, 0x29, 0x44, 0xA4, 0x84, 0x30, 0x89, - 0x19, 0x60, 0x77, 0xF3, 0xFF, 0xFF, 0x19, 0x60, 0x55, 0xFB, 0x1F, 0xF2, 0x39, 0xF1, 0xE0, 0x60, - 0xFF, 0xB5, 0x0A, 0x18, 0x60, 0x47, 0x1F, 0xB4, 0xD0, 0x84, 0xE0, 0xA0, 0x02, 0x0D, 0x00, 0x64, - 0x02, 0x00, 0x01, 0x04, 0x1F, 0x64, 0x60, 0x47, 0xB4, 0x81, 0x07, 0x60, 0xEA, 0xF1, 0xFF, 0xFF, - 0xB1, 0x8C, 0x29, 0x40, 0x40, 0x2B, 0x10, 0x00, 0x29, 0x60, 0xC0, 0x65, 0x60, 0x47, 0x1F, 0xB4, - 0xE0, 0x84, 0xE0, 0x84, 0x44, 0xD3, 0x5A, 0xD1, 0x01, 0x60, 0x00, 0xE1, 0x01, 0x60, 0x09, 0x6B, - 0x60, 0x4C, 0xB5, 0xFF, 0x64, 0x4C, 0x14, 0x00, 0x29, 0x60, 0xC0, 0x65, 0x60, 0x47, 0x1F, 0xB4, - 0xE0, 0x84, 0xE0, 0x84, 0x44, 0xD3, 0x5A, 0xD1, 0x01, 0x60, 0x00, 0xE1, 0x05, 0x60, 0x69, 0x6B, - 0x60, 0x4C, 0xB5, 0xFF, 0x64, 0x4C, 0x7C, 0x44, 0x29, 0x40, 0x80, 0x2B, 0x67, 0x44, 0x60, 0x4C, - 0x00, 0xE1, 0x84, 0xFF, 0xC2, 0x60, 0x45, 0x64, 0x40, 0x42, 0x82, 0xFF, 0x0D, 0x00, 0xE5, 0xFE, - 0x03, 0x04, 0xAA, 0x60, 0x6F, 0x78, 0xFF, 0xFF, 0x32, 0xF1, 0xFF, 0xFF, 0x64, 0x40, 0x07, 0x22, - 0x43, 0xFF, 0xA3, 0x60, 0xF4, 0x78, 0xFF, 0xFF, 0x0B, 0x64, 0x3A, 0xDB, 0x01, 0x60, 0x0A, 0xE1, - 0x1C, 0x42, 0x22, 0x46, 0x13, 0xF2, 0xFF, 0x65, 0x60, 0x47, 0x2A, 0xF2, 0x40, 0x45, 0x40, 0x48, - 0x04, 0x2B, 0x13, 0x00, 0x16, 0xF2, 0x1D, 0xF2, 0x40, 0x43, 0x0F, 0xF2, 0x40, 0x4D, 0x0F, 0x64, - 0x14, 0xF0, 0x35, 0xF2, 0xA0, 0x82, 0x0F, 0xB4, 0xCA, 0x85, 0xD4, 0x80, 0x10, 0xF2, 0x01, 0x02, - 0x2B, 0xFA, 0x27, 0x44, 0x40, 0xBC, 0x40, 0x47, 0x13, 0x00, 0x17, 0xF2, 0x2C, 0xF0, 0x40, 0x43, - 0x1B, 0xF2, 0x1D, 0xFA, 0x40, 0x4D, 0x64, 0x40, 0x01, 0x2A, 0x02, 0x00, 0xAB, 0xFC, 0x05, 0x00, - 0x28, 0x40, 0xA4, 0x36, 0x02, 0x00, 0x11, 0xF2, 0x2B, 0xFA, 0x27, 0x44, 0xBF, 0xB4, 0x40, 0x47, - 0xF0, 0xFE, 0xB0, 0x60, 0xB0, 0x78, 0xFF, 0xFF, 0x22, 0x46, 0x2C, 0xF0, 0x27, 0x44, 0xDF, 0xB4, - 0x40, 0x47, 0x64, 0x40, 0x01, 0x26, 0x09, 0x00, 0x2A, 0xF2, 0x39, 0xF0, 0x8F, 0xB0, 0x88, 0x3A, - 0x0D, 0x00, 0x64, 0x44, 0x60, 0xB0, 0x20, 0x3A, 0x09, 0x00, 0x28, 0x44, 0x04, 0x27, 0x05, 0x00, - 0xD4, 0x3A, 0x03, 0x00, 0xAE, 0x4F, 0xF7, 0xB4, 0xA0, 0x5E, 0x11, 0x00, 0x2A, 0xF0, 0x01, 0x65, - 0x64, 0x40, 0xA4, 0x3A, 0x04, 0x65, 0x27, 0x44, 0x34, 0x87, 0x36, 0xF3, 0xFF, 0xFF, 0x60, 0x56, - 0xAD, 0xE2, 0x04, 0x64, 0x3A, 0xDB, 0x41, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x06, 0x64, - 0x3A, 0xDB, 0x22, 0x46, 0x01, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0xC2, 0x60, 0x1E, 0x78, 0xFF, 0xFF, - 0x28, 0x40, 0xC4, 0x3A, 0x0C, 0x00, 0x27, 0x44, 0xFD, 0xB4, 0x40, 0x47, 0xA8, 0xE2, 0x05, 0xE1, - 0x01, 0x60, 0x08, 0xE1, 0x2A, 0xE8, 0x3C, 0x46, 0xA4, 0x60, 0xBF, 0x78, 0xFF, 0xFF, 0x3F, 0x40, - 0x01, 0x2B, 0x05, 0x00, 0x67, 0x4C, 0x01, 0x60, 0x00, 0xE1, 0x05, 0x60, 0x69, 0x6B, 0x07, 0x60, - 0xEB, 0xF1, 0x1F, 0xF2, 0x2A, 0xE8, 0xB0, 0x81, 0x29, 0x40, 0x40, 0x2B, 0x14, 0x00, 0x61, 0x4C, - 0x29, 0x60, 0xC0, 0x65, 0x61, 0x47, 0x1F, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0x44, 0xD3, 0x5A, 0xD1, - 0x01, 0x60, 0x00, 0xE1, 0x01, 0x60, 0x09, 0x6B, 0x60, 0x4C, 0xB5, 0xFF, 0xFF, 0x60, 0xF2, 0x64, - 0x64, 0x4C, 0x40, 0x43, 0x18, 0x00, 0x29, 0x47, 0x80, 0xB7, 0x34, 0x94, 0x60, 0x4C, 0x29, 0x60, - 0xC0, 0x65, 0x61, 0x47, 0x1F, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0x44, 0xD3, 0x5A, 0xD1, 0x01, 0x60, - 0x00, 0xE1, 0x05, 0x60, 0x69, 0x6B, 0x60, 0x4C, 0xB5, 0xFF, 0x64, 0x4C, 0x7C, 0x44, 0x29, 0x40, - 0x80, 0x2B, 0x67, 0x44, 0x60, 0x4C, 0x40, 0xE1, 0x01, 0x60, 0x08, 0xE1, 0x28, 0x45, 0xBF, 0x60, - 0xFF, 0x64, 0x24, 0x88, 0xC4, 0xE2, 0x08, 0x64, 0x3A, 0xDB, 0x21, 0x46, 0x2A, 0x44, 0x72, 0x45, - 0x24, 0xFA, 0xB2, 0xF3, 0x06, 0x04, 0xE4, 0xE2, 0xDC, 0x9C, 0x29, 0x40, 0x01, 0x26, 0x64, 0x44, - 0xB2, 0xF9, 0x25, 0xFA, 0xB3, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0xB3, 0xFB, 0x28, 0xFA, 0xB4, 0xF3, - 0x02, 0x04, 0xDC, 0x84, 0xB4, 0xFB, 0x29, 0xFA, 0x24, 0x44, 0x04, 0x2A, 0x06, 0x00, 0x28, 0x40, - 0xA4, 0x36, 0x03, 0x00, 0xA6, 0x60, 0xB1, 0x78, 0xFF, 0xFF, 0x26, 0x43, 0x84, 0xBB, 0xFC, 0xB3, - 0x21, 0x46, 0x01, 0x5D, 0x0F, 0xFC, 0x5C, 0x46, 0x05, 0xFF, 0x27, 0x44, 0x01, 0x2A, 0x13, 0x00, - 0x50, 0xFE, 0x28, 0x40, 0x08, 0x3A, 0x12, 0x00, 0x2F, 0xF2, 0x30, 0xF0, 0x60, 0x43, 0x31, 0xF2, - 0x22, 0x46, 0x64, 0x41, 0x2C, 0xF0, 0x2D, 0xF0, 0xD3, 0x80, 0x2E, 0xF0, 0xD1, 0x80, 0xD0, 0x80, - 0x27, 0x44, 0x09, 0x0C, 0x03, 0x00, 0x27, 0x44, 0x06, 0x22, 0x05, 0x00, 0xB8, 0xB4, 0x40, 0x47, - 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0xD4, 0x64, 0x40, 0x48, 0x0D, 0x64, 0x3A, 0xDB, 0x7C, 0x44, - 0x1B, 0x60, 0xF0, 0xFB, 0x21, 0x46, 0x1C, 0xF2, 0x00, 0xE1, 0xF0, 0xFE, 0x00, 0x63, 0x28, 0x44, - 0xA4, 0x36, 0x0A, 0x00, 0x04, 0x2B, 0x08, 0x00, 0x30, 0xF3, 0x2D, 0x45, 0xD4, 0x84, 0xCA, 0x65, - 0xD4, 0x83, 0x01, 0x64, 0x1B, 0x60, 0xF0, 0xFB, 0xD4, 0x64, 0x35, 0x00, 0x0F, 0x64, 0x3A, 0xDB, - 0x21, 0x46, 0x29, 0x40, 0x40, 0x27, 0x15, 0x00, 0x80, 0x27, 0x02, 0x00, 0xCA, 0x65, 0x01, 0x00, - 0x6A, 0x65, 0x1C, 0xF2, 0xFF, 0xFF, 0x04, 0x7F, 0x40, 0x45, 0x0A, 0x36, 0x70, 0x64, 0x14, 0x36, - 0x38, 0x64, 0x37, 0x36, 0x15, 0x64, 0x6E, 0x3A, 0x17, 0x00, 0x84, 0x7F, 0x40, 0x45, 0x0B, 0x64, - 0x13, 0x00, 0x1C, 0xF2, 0x1E, 0x65, 0x40, 0x45, 0x0B, 0x36, 0x1E, 0x64, 0x0F, 0x36, 0x16, 0x64, - 0x0A, 0x36, 0x12, 0x64, 0x0E, 0x36, 0x0E, 0x64, 0x09, 0x36, 0x0E, 0x64, 0x0D, 0x36, 0x0A, 0x64, - 0x08, 0x36, 0x0A, 0x64, 0x0C, 0x36, 0x0A, 0x64, 0x40, 0x4D, 0x00, 0xE1, 0xF0, 0xFE, 0x2B, 0xF2, - 0xC4, 0x85, 0xD4, 0x83, 0xC4, 0x64, 0x40, 0x48, 0x2F, 0xF0, 0xB0, 0xF0, 0xB1, 0xF2, 0xA1, 0xFF, - 0x12, 0x74, 0xCD, 0xE2, 0x80, 0x4E, 0x12, 0x74, 0x83, 0x4C, 0x12, 0x74, 0x9A, 0xFF, 0x84, 0x4C, - 0x12, 0x74, 0x85, 0x4C, 0x12, 0x74, 0x81, 0x4C, 0x12, 0x74, 0xA1, 0xFF, 0x98, 0xFF, 0xB2, 0x60, - 0x58, 0x4F, 0x2D, 0x78, 0xFF, 0xFF, 0x01, 0x60, 0x18, 0xE1, 0x78, 0x44, 0x03, 0xA4, 0x35, 0xFB, - 0xB2, 0x60, 0x70, 0x78, 0xFF, 0xFF, 0x29, 0x44, 0xF7, 0xB4, 0x40, 0x49, 0x28, 0x40, 0xC4, 0x36, - 0x07, 0x00, 0x1B, 0x60, 0xF0, 0xF3, 0xFF, 0xFF, 0x03, 0x1B, 0xAE, 0x4F, 0xF7, 0xB4, 0xA0, 0x5E, - 0x27, 0x44, 0x01, 0x2A, 0x05, 0x00, 0xFE, 0xB4, 0x40, 0x47, 0xA5, 0x60, 0x7F, 0x78, 0xFF, 0xFF, - 0x16, 0x60, 0xAB, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x02, 0x36, 0xC1, 0xFE, 0xA3, 0x60, 0xE7, 0x78, - 0xFF, 0xFF, 0x28, 0x40, 0xB4, 0x3A, 0x0B, 0x00, 0x27, 0x44, 0x07, 0x22, 0x05, 0x00, 0xF8, 0xB4, - 0x40, 0x47, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0xA6, 0x60, 0x3E, 0x78, 0xFF, 0xFF, 0x28, 0x44, - 0xD4, 0x36, 0x03, 0x00, 0xA7, 0x60, 0xC8, 0x78, 0xFF, 0xFF, 0xA8, 0xE2, 0x27, 0x44, 0xFB, 0xB4, - 0x40, 0x47, 0x1C, 0x42, 0x22, 0x46, 0x19, 0x60, 0xCF, 0xF3, 0xFF, 0xFF, 0x34, 0xFB, 0x2A, 0xF0, - 0xF7, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDA, 0x60, 0x40, 0x40, 0x2B, 0xC4, 0x00, 0x22, 0xF2, - 0xFF, 0xFF, 0x60, 0x40, 0x22, 0x26, 0x3F, 0x00, 0x01, 0x26, 0x03, 0x00, 0x04, 0x26, 0x05, 0x00, - 0xBA, 0x00, 0x04, 0x2B, 0xB8, 0x00, 0xA6, 0xF5, 0x01, 0x00, 0x07, 0xF4, 0x4B, 0xF2, 0xFF, 0xFF, - 0xDC, 0x84, 0x4B, 0xFA, 0x0C, 0x60, 0xFC, 0x62, 0x80, 0xFF, 0xC8, 0x60, 0x78, 0x44, 0x02, 0xA4, - 0xA2, 0xDB, 0x8C, 0x78, 0xFF, 0xFF, 0x82, 0xFF, 0xA6, 0xF3, 0x66, 0x5C, 0xD0, 0x80, 0x00, 0x7C, - 0x07, 0x03, 0x66, 0x43, 0x22, 0x46, 0x22, 0xF2, 0x63, 0x46, 0x60, 0x40, 0x01, 0x2A, 0x01, 0x00, - 0x3C, 0xF1, 0x4B, 0xF0, 0x64, 0x41, 0x64, 0x47, 0x60, 0x5F, 0x20, 0xBC, 0x80, 0x26, 0x80, 0xAC, - 0x60, 0x47, 0x22, 0x46, 0x3A, 0xFA, 0x64, 0x44, 0x20, 0x7F, 0x34, 0x94, 0x3B, 0xFA, 0x08, 0x60, - 0x00, 0xEA, 0x0F, 0x64, 0x60, 0x7F, 0xA0, 0x5A, 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, - 0xD1, 0x60, 0x00, 0xEA, 0x80, 0x00, 0x2A, 0xF2, 0x00, 0x60, 0x7C, 0x62, 0x60, 0x40, 0x40, 0x2B, - 0x24, 0x00, 0xA2, 0xD3, 0x00, 0x61, 0x60, 0xFE, 0xA0, 0xD3, 0x5E, 0xD1, 0xFF, 0xFF, 0x20, 0xFE, - 0x64, 0x5F, 0xDC, 0x84, 0xF1, 0x81, 0xC0, 0x2B, 0x04, 0x00, 0x80, 0x2A, 0x02, 0x00, 0x7F, 0xA4, - 0xDC, 0x84, 0xFF, 0x3B, 0x03, 0x00, 0x60, 0x47, 0xDC, 0x87, 0x01, 0x61, 0xC0, 0x80, 0x00, 0x36, - 0xDC, 0x84, 0x4E, 0xDB, 0x60, 0xFE, 0x5A, 0xD1, 0xFF, 0xFF, 0xC1, 0x84, 0xF0, 0x22, 0x10, 0xA4, - 0xF0, 0x2A, 0x01, 0x00, 0x00, 0x64, 0xA2, 0xDB, 0x20, 0xFE, 0x00, 0x60, 0x3E, 0xF3, 0xFF, 0xFF, - 0xA0, 0xD3, 0x5A, 0xD1, 0x3A, 0xFA, 0x3B, 0xF8, 0x74, 0x62, 0xA2, 0xD0, 0xFF, 0xFF, 0x64, 0x44, - 0xE0, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xE1, 0x7F, 0x5A, 0xD0, 0xA0, 0x5A, 0x64, 0x44, 0xE2, 0x7F, - 0xA0, 0x5A, 0x00, 0x60, 0x40, 0xF3, 0xFF, 0xFF, 0xA0, 0xD1, 0x5A, 0xD1, 0x64, 0x45, 0x64, 0x44, - 0xE3, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xE4, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xE5, 0x7F, - 0xA0, 0x5A, 0x64, 0x47, 0xE6, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xE7, 0x7F, 0xA0, 0x5A, - 0x65, 0x40, 0x0D, 0x3A, 0x1C, 0x00, 0x64, 0x47, 0xE8, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, - 0xE9, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xEA, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xEB, 0x7F, - 0xA0, 0x5A, 0x64, 0x47, 0xEC, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xED, 0x7F, 0xA0, 0x5A, - 0x64, 0x47, 0xEE, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xEF, 0x7F, 0xA0, 0x5A, 0x08, 0x60, - 0x00, 0xEA, 0x65, 0x44, 0x02, 0xA4, 0x60, 0x7F, 0xA0, 0x5A, 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, - 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0x0B, 0xF2, 0xFF, 0xFF, 0x7F, 0xB4, 0x0C, 0xF0, 0x04, 0x02, - 0x64, 0x46, 0x00, 0xF0, 0x04, 0x64, 0x22, 0x46, 0x03, 0xFA, 0x60, 0x41, 0x64, 0x46, 0x01, 0xF2, - 0xFC, 0xA1, 0x61, 0x45, 0xD4, 0x84, 0xFF, 0xFF, 0x08, 0x02, 0x00, 0xF0, 0x04, 0x63, 0x64, 0x46, - 0x01, 0xF2, 0x22, 0x46, 0x1A, 0xFA, 0x03, 0xFC, 0x02, 0x00, 0x22, 0x46, 0x1A, 0xFA, 0x35, 0xF2, - 0x04, 0xF8, 0xDC, 0x84, 0x35, 0xFA, 0x14, 0xF2, 0x0F, 0xB5, 0x0F, 0xB4, 0xCC, 0x84, 0x94, 0x80, - 0x04, 0x60, 0x00, 0x65, 0x2A, 0xF2, 0x01, 0x02, 0x94, 0x84, 0x2A, 0xFA, 0x95, 0xFC, 0x06, 0x00, - 0xC4, 0x3A, 0x07, 0x00, 0x27, 0x44, 0xFD, 0xB4, 0x40, 0x47, 0xA8, 0xE2, 0xA5, 0x60, 0x1C, 0x78, - 0xFF, 0xFF, 0x28, 0x44, 0x04, 0x26, 0x05, 0x00, 0x68, 0x3A, 0x03, 0x00, 0x32, 0x44, 0x00, 0x27, - 0x03, 0x00, 0xA3, 0x60, 0xF4, 0x78, 0xFF, 0xFF, 0x0A, 0x64, 0x3A, 0xDB, 0xA3, 0x60, 0xF4, 0x78, - 0xFF, 0xFF, 0x0E, 0x64, 0x3A, 0xDB, 0x3C, 0x44, 0x60, 0x46, 0x1E, 0xF0, 0x40, 0x42, 0x64, 0x40, - 0x40, 0x27, 0x48, 0x00, 0x1F, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x27, 0x3C, 0x00, 0x80, 0x2B, - 0x0B, 0x00, 0xBF, 0x60, 0xFF, 0x65, 0x29, 0x44, 0x24, 0x89, 0x80, 0x60, 0x00, 0x65, 0x29, 0x44, - 0x34, 0x89, 0x80, 0x60, 0x00, 0x63, 0x05, 0x00, 0x3F, 0x60, 0xFF, 0x65, 0x29, 0x44, 0x24, 0x89, - 0x00, 0x63, 0x1E, 0xF2, 0x39, 0xF1, 0xC0, 0x60, 0xFF, 0xB5, 0x0A, 0x18, 0x60, 0x47, 0x1F, 0xB4, - 0xD0, 0x84, 0xE0, 0xA0, 0x02, 0x0D, 0x00, 0x64, 0x02, 0x00, 0x01, 0x04, 0x1F, 0x64, 0x60, 0x47, - 0xB4, 0x84, 0x07, 0x60, 0xEA, 0xF1, 0x3C, 0x94, 0xB0, 0x84, 0x60, 0x4C, 0x29, 0x60, 0xC0, 0x65, - 0x60, 0x47, 0x1F, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0x44, 0xD3, 0x5A, 0xD1, 0x01, 0x60, 0x00, 0xE1, - 0x05, 0x60, 0x69, 0x6B, 0x60, 0x4C, 0xB5, 0xFF, 0x64, 0x4C, 0x7C, 0x44, 0x29, 0x40, 0x80, 0x2B, - 0x67, 0x44, 0x60, 0x4C, 0x32, 0x00, 0x19, 0x60, 0x7B, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x04, 0x26, - 0xCB, 0x01, 0xBF, 0x01, 0x40, 0x60, 0x00, 0x65, 0x29, 0x44, 0x34, 0x89, 0x40, 0x60, 0x00, 0x63, - 0x9F, 0xF2, 0x1E, 0xF2, 0x39, 0xF1, 0xC0, 0x60, 0xFF, 0xB5, 0x0A, 0x18, 0x60, 0x47, 0x1F, 0xB4, - 0xD0, 0x84, 0xE0, 0xA0, 0x02, 0x0D, 0x00, 0x64, 0x02, 0x00, 0x01, 0x04, 0x1F, 0x64, 0x60, 0x47, - 0xB4, 0x84, 0x07, 0x60, 0xEA, 0xF1, 0x3C, 0x94, 0xB0, 0x81, 0x61, 0x4C, 0x29, 0x60, 0xC0, 0x65, - 0x61, 0x47, 0x1F, 0xB4, 0xE0, 0x84, 0xE0, 0x84, 0x44, 0xD3, 0x5A, 0xD1, 0x01, 0x60, 0x00, 0xE1, - 0x01, 0x60, 0x09, 0x6B, 0x60, 0x4C, 0xB5, 0xFF, 0x64, 0x4C, 0x40, 0xE1, 0x01, 0x60, 0x08, 0xE1, - 0x84, 0xFF, 0xC2, 0x60, 0x45, 0x64, 0x40, 0x42, 0x82, 0xFF, 0x2A, 0xF2, 0x10, 0x60, 0x00, 0x65, - 0xA4, 0x84, 0xB4, 0xBC, 0x1E, 0xF0, 0x40, 0x48, 0x64, 0x40, 0x40, 0x27, 0x17, 0x00, 0x1C, 0xF2, - 0xFF, 0xFF, 0x60, 0x40, 0x0A, 0x36, 0x06, 0x00, 0x14, 0x36, 0x07, 0x00, 0x37, 0x36, 0x08, 0x00, - 0x6E, 0x36, 0x09, 0x00, 0x70, 0x7C, 0xA0, 0x63, 0x0F, 0x00, 0x38, 0x7C, 0x50, 0x63, 0x0C, 0x00, - 0x15, 0x7C, 0x1E, 0x63, 0x09, 0x00, 0x0B, 0x7C, 0x0F, 0x63, 0x06, 0x00, 0x9C, 0xF4, 0xFF, 0x65, - 0x63, 0x47, 0xA4, 0x9C, 0xA7, 0x84, 0x23, 0x00, 0x40, 0x45, 0x43, 0x4D, 0x00, 0xE1, 0xF0, 0xFE, - 0x29, 0x40, 0x80, 0x2B, 0x03, 0x00, 0x00, 0x60, 0x6A, 0x65, 0x02, 0x00, 0x00, 0x60, 0xCA, 0x65, - 0x1F, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x27, 0x0E, 0x00, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, - 0x04, 0x27, 0x03, 0x00, 0x65, 0x44, 0xE0, 0x85, 0x12, 0x00, 0x2B, 0xF2, 0x11, 0xF0, 0xC0, 0x84, - 0xD0, 0x84, 0xC4, 0x83, 0x11, 0x00, 0x1E, 0x64, 0xC4, 0x84, 0x60, 0x45, 0x08, 0x00, 0x40, 0x45, - 0xFF, 0x60, 0xF8, 0x64, 0x40, 0x43, 0x00, 0xE1, 0xF0, 0xFE, 0x00, 0x60, 0x3C, 0x65, 0x91, 0xF4, - 0x1B, 0xF0, 0xC3, 0x84, 0xC4, 0x84, 0xC0, 0x83, 0x28, 0x44, 0xA1, 0xFF, 0x12, 0x74, 0x80, 0x4E, - 0x12, 0x74, 0x83, 0x4C, 0x9A, 0xFF, 0x12, 0x74, 0x56, 0x62, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, - 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x5C, 0x62, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, - 0x7A, 0xD4, 0x12, 0x74, 0xA1, 0xFF, 0x98, 0xFF, 0xB2, 0x60, 0x58, 0x4F, 0x2D, 0x78, 0xFF, 0xFF, - 0xBC, 0xFF, 0xB5, 0xFF, 0x01, 0x60, 0x18, 0xE1, 0x47, 0xFF, 0x27, 0x44, 0x02, 0xBC, 0x40, 0x47, - 0x36, 0xF3, 0xB6, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0xC8, 0x60, 0x09, 0x7D, 0x7C, 0x4B, 0x60, 0x56, - 0xAD, 0xE2, 0xA5, 0x60, 0x79, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0x7B, 0xF3, 0x19, 0x60, 0x3B, 0xF3, - 0x60, 0x40, 0x04, 0x26, 0x0B, 0x00, 0x07, 0xB4, 0x60, 0x40, 0x01, 0x36, 0x07, 0x00, 0x29, 0x44, - 0xBF, 0x60, 0xFF, 0xB7, 0x80, 0xBF, 0x40, 0x49, 0x80, 0x67, 0x05, 0x00, 0x3F, 0x60, 0xFF, 0x65, - 0x29, 0x44, 0x24, 0x89, 0x00, 0x64, 0x16, 0x60, 0x50, 0xF1, 0xFF, 0xFF, 0x19, 0x60, 0x55, 0xF9, - 0x39, 0xF1, 0x16, 0x60, 0x3C, 0xF1, 0x64, 0x41, 0x64, 0x5E, 0x60, 0x45, 0x64, 0x47, 0x1F, 0xB4, - 0x54, 0x94, 0xE0, 0xA0, 0x02, 0x0D, 0x00, 0x64, 0x02, 0x00, 0x01, 0x04, 0x1F, 0x64, 0x60, 0x47, - 0x07, 0x60, 0xEA, 0xF1, 0xB4, 0x84, 0xB0, 0x8C, 0x29, 0x60, 0xC0, 0x7C, 0x60, 0x47, 0x1F, 0xB4, - 0xE0, 0x84, 0xE0, 0x84, 0x40, 0xD3, 0x5A, 0xD1, 0x01, 0x60, 0x00, 0xE1, 0x05, 0x60, 0x69, 0x6B, - 0x60, 0x4C, 0xB5, 0xFF, 0x64, 0x4C, 0x7C, 0x44, 0x29, 0x40, 0x80, 0x2B, 0x67, 0x44, 0x60, 0x4C, - 0x40, 0xE1, 0x01, 0x60, 0x08, 0xE1, 0x84, 0xFF, 0xC2, 0x60, 0x45, 0x64, 0x40, 0x42, 0x82, 0xFF, - 0x3C, 0x44, 0x60, 0x46, 0x40, 0x42, 0x13, 0x64, 0x3A, 0xDB, 0x10, 0x60, 0x00, 0x65, 0x3C, 0x46, - 0x2A, 0xF2, 0x19, 0x60, 0x3B, 0xF1, 0xA4, 0x84, 0xC4, 0xBC, 0x40, 0x48, 0x64, 0x44, 0x04, 0x26, - 0x09, 0x00, 0x02, 0x26, 0x0A, 0x00, 0x01, 0x26, 0x0B, 0x00, 0x08, 0x2A, 0x03, 0x00, 0x0B, 0x63, - 0x6E, 0x64, 0x08, 0x00, 0x15, 0x63, 0x37, 0x64, 0x05, 0x00, 0x38, 0x63, 0x14, 0x64, 0x02, 0x00, - 0x70, 0x63, 0x0A, 0x64, 0x43, 0x4D, 0x40, 0x45, 0x00, 0xE1, 0xF0, 0xFE, 0x00, 0x60, 0x1E, 0x64, - 0x1B, 0xF0, 0x11, 0xF0, 0xC0, 0x84, 0xC0, 0x84, 0x60, 0x43, 0x28, 0x44, 0xA1, 0xFF, 0x12, 0x74, - 0x80, 0x4E, 0x12, 0x74, 0x83, 0x4C, 0x9A, 0xFF, 0x12, 0x74, 0x5C, 0x62, 0x7A, 0xD4, 0x12, 0x74, - 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0xA1, 0xFF, 0x98, 0xFF, 0xB2, 0x60, 0x58, 0x4F, - 0x2D, 0x78, 0xFF, 0xFF, 0x01, 0x60, 0x18, 0xE1, 0x78, 0x44, 0x03, 0xA4, 0x35, 0xFB, 0xB2, 0x60, - 0x70, 0x78, 0xFF, 0xFF, 0xC4, 0xE2, 0x08, 0x64, 0x3A, 0xDB, 0xA4, 0x60, 0xBF, 0x78, 0xFF, 0xFF, - 0x26, 0x43, 0x24, 0x40, 0x01, 0x2A, 0x0E, 0x00, 0x1D, 0xFF, 0x26, 0x44, 0x02, 0xBC, 0x40, 0x46, - 0x27, 0x44, 0x07, 0x22, 0x05, 0x00, 0xF8, 0xB4, 0x40, 0x47, 0x06, 0x64, 0x31, 0xFB, 0xC0, 0xFE, - 0x30, 0xF1, 0x81, 0x00, 0xFC, 0xB3, 0x32, 0x40, 0x01, 0x2A, 0x06, 0x00, 0x0A, 0xBB, 0x0F, 0xFC, - 0xCB, 0xFE, 0xA3, 0x60, 0xF4, 0x78, 0xFF, 0xFF, 0x24, 0x44, 0x04, 0x26, 0x29, 0x00, 0x0F, 0xFC, - 0x05, 0xFF, 0xDB, 0xF3, 0x28, 0x40, 0x80, 0x3A, 0x23, 0x00, 0x60, 0x40, 0x03, 0x3A, 0x20, 0x00, - 0x32, 0xF2, 0x7F, 0xF1, 0x33, 0xF2, 0xD0, 0x80, 0x80, 0xF1, 0x1A, 0x02, 0xD0, 0x80, 0x34, 0xF2, - 0x81, 0xF1, 0x16, 0x02, 0xD0, 0x80, 0x3C, 0x44, 0x13, 0x02, 0xAC, 0x86, 0xBB, 0xFE, 0x10, 0x03, - 0x2A, 0xF2, 0x21, 0x46, 0x60, 0x40, 0x80, 0x3A, 0x0B, 0x00, 0x01, 0x64, 0x31, 0xFB, 0xC0, 0xFE, - 0x00, 0x64, 0x32, 0xFB, 0x43, 0xFF, 0x84, 0xFF, 0xC2, 0x60, 0x45, 0x64, 0x40, 0x42, 0x82, 0xFF, - 0x30, 0xF1, 0x27, 0x44, 0x05, 0x22, 0x34, 0x00, 0xFA, 0xB4, 0x40, 0x47, 0x24, 0x44, 0x10, 0x2A, - 0x2B, 0x00, 0x28, 0x40, 0xD4, 0x3A, 0x28, 0x00, 0x31, 0x40, 0x08, 0x26, 0x00, 0x7C, 0x29, 0x40, - 0x50, 0x2B, 0x0D, 0x00, 0xEF, 0x60, 0xFF, 0x65, 0x29, 0x44, 0x24, 0x89, 0x31, 0x40, 0x08, 0x2A, - 0x06, 0x00, 0x1C, 0x60, 0x11, 0xF3, 0xFF, 0xFF, 0xE0, 0x85, 0x2B, 0x44, 0x05, 0x05, 0x2B, 0x44, - 0xFF, 0xA4, 0x01, 0xA4, 0x04, 0x24, 0x00, 0x64, 0xD0, 0x80, 0x70, 0x45, 0x02, 0x28, 0x64, 0x44, - 0xC4, 0x84, 0xFF, 0xFF, 0x04, 0x24, 0x00, 0xB4, 0x60, 0x50, 0x08, 0x28, 0x01, 0x00, 0x20, 0x29, - 0x6D, 0xE2, 0xA5, 0x60, 0x7F, 0x78, 0xFF, 0xFF, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x07, 0x00, - 0x02, 0x2A, 0x05, 0x00, 0xFD, 0xB4, 0x40, 0x47, 0x06, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x05, 0x64, - 0x3A, 0xDB, 0x28, 0x44, 0xA4, 0x3A, 0x07, 0x00, 0x01, 0x60, 0x02, 0x7C, 0x25, 0x44, 0x0A, 0x3A, - 0x02, 0x00, 0x01, 0x60, 0x3A, 0x7C, 0x31, 0x40, 0x08, 0x26, 0x00, 0x7C, 0x29, 0x40, 0x50, 0x2B, - 0x0D, 0x00, 0xEF, 0x60, 0xFF, 0x65, 0x29, 0x44, 0x24, 0x89, 0x31, 0x40, 0x08, 0x2A, 0x06, 0x00, - 0x1C, 0x60, 0x11, 0xF3, 0xFF, 0xFF, 0xE0, 0x85, 0x2B, 0x44, 0x05, 0x05, 0x2B, 0x44, 0xFF, 0xA4, - 0x01, 0xA4, 0x04, 0x24, 0x00, 0x64, 0xD0, 0x80, 0x70, 0x45, 0x02, 0x28, 0x64, 0x44, 0xC4, 0x84, - 0xFF, 0xFF, 0x04, 0x24, 0x00, 0xB4, 0x28, 0x40, 0xE4, 0x36, 0x00, 0xB4, 0x60, 0x50, 0x08, 0x28, - 0x01, 0x00, 0x20, 0x29, 0x6D, 0xE2, 0xA3, 0x60, 0xE7, 0x78, 0xFF, 0xFF, 0x27, 0x44, 0x05, 0x22, - 0x09, 0x00, 0xBA, 0xB4, 0x40, 0x47, 0x3C, 0x46, 0x02, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0xA3, 0x60, - 0xF4, 0x78, 0xFF, 0xFF, 0x27, 0x44, 0x02, 0x2A, 0x06, 0x00, 0xFD, 0xB4, 0x40, 0x47, 0x06, 0x64, - 0x31, 0xFB, 0xC0, 0xFE, 0xF4, 0x01, 0xF3, 0x0A, 0x7C, 0x50, 0x6D, 0xE2, 0xF0, 0x01, 0x72, 0x45, - 0xDC, 0x84, 0xB2, 0xFB, 0x11, 0x64, 0x3A, 0xDB, 0xB3, 0xF3, 0x06, 0x04, 0xDC, 0x84, 0xB3, 0xFB, - 0xB4, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0xB4, 0xFB, 0xA4, 0x60, 0x01, 0x78, 0xFF, 0xFF, 0x00, 0x61, - 0x12, 0x64, 0x3A, 0xDB, 0x20, 0x60, 0x04, 0x63, 0xBD, 0xD3, 0x72, 0x45, 0x44, 0x8A, 0x02, 0x28, - 0x03, 0x00, 0xE4, 0xE2, 0xDD, 0x81, 0x04, 0x00, 0x02, 0x28, 0x02, 0x00, 0xE4, 0xE2, 0xDD, 0x81, - 0xBD, 0xD3, 0xB2, 0xF1, 0x61, 0x45, 0xC0, 0x84, 0x00, 0x61, 0x02, 0x24, 0x01, 0xB9, 0xC4, 0x84, - 0x60, 0x55, 0x2A, 0x52, 0xE4, 0xE2, 0xB2, 0xFB, 0x02, 0x24, 0x01, 0xB9, 0xBD, 0xD3, 0xB3, 0xF1, - 0x61, 0x45, 0xC0, 0x84, 0x00, 0x61, 0x02, 0x24, 0x01, 0xB9, 0xC4, 0x84, 0xB3, 0xFB, 0x02, 0x24, - 0x01, 0xB9, 0xBD, 0xD3, 0xB4, 0xF1, 0x61, 0x45, 0xC0, 0x84, 0xC4, 0x84, 0xB4, 0xFB, 0xA5, 0x60, - 0x14, 0x78, 0xFF, 0xFF, 0xB0, 0x60, 0x9E, 0x78, 0xFF, 0xFF, 0x47, 0xFF, 0x1B, 0x60, 0xEE, 0xF3, - 0xFF, 0xFF, 0x04, 0x18, 0xAE, 0x4F, 0x08, 0xBC, 0x00, 0x7F, 0xA0, 0x5E, 0xC8, 0x74, 0xCD, 0xE2, - 0xAA, 0x60, 0xB9, 0x78, 0x00, 0x61, 0xA3, 0x60, 0xF4, 0x78, 0xFF, 0xFF, 0xAB, 0x60, 0xE8, 0x78, - 0xFF, 0xFF, 0x21, 0x46, 0x5C, 0x44, 0x26, 0x44, 0x02, 0x26, 0x01, 0x00, 0x3E, 0x46, 0x09, 0xF2, - 0x46, 0x41, 0x66, 0x40, 0xF3, 0x18, 0x40, 0x5E, 0xFD, 0xFB, 0x02, 0x64, 0x40, 0x46, 0x41, 0x5D, - 0x00, 0x64, 0x31, 0xFA, 0x00, 0xF2, 0x46, 0x45, 0x87, 0xFC, 0xAC, 0xE2, 0x01, 0x64, 0x33, 0xFB, - 0x32, 0x40, 0x01, 0x2A, 0x21, 0x00, 0x19, 0xF3, 0x01, 0x60, 0x1E, 0xE1, 0x1D, 0x18, 0x80, 0x64, - 0x40, 0x49, 0x00, 0xE1, 0x19, 0xFF, 0x08, 0x64, 0x2A, 0xFA, 0x5A, 0xDA, 0x2C, 0xFA, 0x5A, 0xDA, - 0x5A, 0xDA, 0xF1, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0xF1, 0xFB, 0x72, 0x44, 0x24, 0xFA, 0xB2, 0xF3, - 0x25, 0xFA, 0xA1, 0xFF, 0xFF, 0xFF, 0xB6, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0xC8, 0x60, 0x09, 0x7D, - 0x7C, 0x4B, 0xA3, 0x60, 0xF4, 0x78, 0xFF, 0xFF, 0x01, 0xE1, 0x01, 0x60, 0x1A, 0xE1, 0x3F, 0x60, - 0xCF, 0x65, 0x29, 0x44, 0x24, 0x89, 0x2E, 0x44, 0x00, 0x36, 0x48, 0x00, 0x01, 0x3A, 0xE5, 0x00, - 0x88, 0xFF, 0x40, 0x67, 0x29, 0x45, 0x34, 0x89, 0x04, 0x64, 0x89, 0xFF, 0x60, 0x54, 0x88, 0xFF, - 0xA1, 0xFF, 0x6C, 0x45, 0x65, 0x44, 0x0F, 0xB4, 0x40, 0x45, 0x1C, 0xFA, 0x65, 0x44, 0x29, 0x41, - 0xF9, 0x81, 0x52, 0x4A, 0x71, 0x89, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x83, 0x1D, 0xFC, - 0x1B, 0xFC, 0x10, 0x60, 0x00, 0x65, 0x29, 0x44, 0x34, 0x89, 0x50, 0x4B, 0x67, 0x50, 0x69, 0xE2, - 0xB6, 0xF1, 0xFC, 0xA3, 0xD3, 0x80, 0x43, 0x43, 0x03, 0x04, 0xAB, 0x60, 0xDE, 0x78, 0xFF, 0xFF, - 0x09, 0x7C, 0xD3, 0x80, 0x9A, 0xFF, 0x03, 0x07, 0xAB, 0x60, 0xDE, 0x78, 0xFF, 0xFF, 0x25, 0x44, - 0x01, 0x26, 0x0F, 0xAC, 0x26, 0x60, 0x4A, 0x65, 0x44, 0xD3, 0x12, 0x65, 0x45, 0x46, 0x60, 0x47, - 0x40, 0x7F, 0x27, 0xFA, 0x8F, 0xFC, 0x18, 0x61, 0xEA, 0xF1, 0xA1, 0xFF, 0x6C, 0x44, 0xDC, 0x80, - 0xFF, 0xFF, 0x21, 0x03, 0x50, 0xFE, 0xAC, 0x60, 0xC1, 0x78, 0xFF, 0xFF, 0xC8, 0x60, 0x0B, 0x7D, - 0x08, 0x60, 0x00, 0x6B, 0xB5, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0xAA, 0x74, 0xCD, 0xE2, 0x01, 0x64, - 0x89, 0xFF, 0x60, 0x54, 0x88, 0xFF, 0x01, 0x60, 0x08, 0xE1, 0x05, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, - 0x04, 0x25, 0x8B, 0x00, 0x6C, 0x44, 0x0A, 0x36, 0x07, 0x00, 0x14, 0x36, 0x05, 0x00, 0x37, 0x36, - 0x03, 0x00, 0x6E, 0x36, 0x01, 0x00, 0x81, 0x00, 0x40, 0x45, 0x32, 0x74, 0xA1, 0xFF, 0x1C, 0xFA, - 0x40, 0x4E, 0x8C, 0x44, 0x60, 0x43, 0x1D, 0xFA, 0x01, 0xE1, 0x20, 0x64, 0x3A, 0xDB, 0x2E, 0x44, - 0x14, 0x36, 0x12, 0x00, 0x0A, 0x36, 0x0F, 0x00, 0x63, 0x45, 0xE3, 0x83, 0xE3, 0x83, 0xC7, 0x83, - 0xE3, 0x83, 0xC7, 0x83, 0xFF, 0xFF, 0x37, 0x36, 0x05, 0x00, 0x6E, 0x36, 0x04, 0x00, 0xAC, 0x60, - 0xBF, 0x78, 0xFF, 0xFF, 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0xEB, 0x83, 0xFF, 0xFF, 0x80, 0x27, - 0xCF, 0x83, 0x1B, 0xFC, 0x01, 0x64, 0x51, 0xFB, 0xA1, 0xFF, 0x29, 0x41, 0xF9, 0x81, 0x52, 0x4A, - 0x71, 0x89, 0x2E, 0x44, 0x27, 0xFA, 0xB6, 0xF1, 0xFC, 0xA3, 0xD3, 0x80, 0x43, 0x43, 0x03, 0x04, - 0xAB, 0x60, 0xDE, 0x78, 0xFF, 0xFF, 0x9A, 0xFF, 0x54, 0x63, 0x12, 0x64, 0x40, 0x46, 0x8F, 0xFC, - 0x18, 0x61, 0xEA, 0xF1, 0x50, 0xFE, 0x6C, 0x40, 0x9E, 0x15, 0x01, 0x60, 0x08, 0xE1, 0x80, 0xE1, - 0x00, 0x64, 0x33, 0xFB, 0x29, 0x40, 0x50, 0x2B, 0x0F, 0x00, 0x2B, 0x44, 0x70, 0x45, 0xC4, 0x84, - 0xFF, 0xFF, 0x04, 0x24, 0x00, 0xB4, 0x60, 0x50, 0x08, 0x28, 0x01, 0x00, 0x20, 0x29, 0x6D, 0xE2, - 0xEF, 0x60, 0xFF, 0x65, 0x29, 0x44, 0x24, 0x89, 0x01, 0x60, 0x18, 0xE1, 0x01, 0x11, 0x12, 0x00, - 0x29, 0x44, 0x20, 0xBC, 0x40, 0x49, 0x01, 0x64, 0x33, 0xFB, 0xB6, 0xFF, 0x00, 0xE1, 0x01, 0x60, - 0x1A, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x6C, 0x40, 0xFC, 0x11, 0x01, 0x60, 0x18, 0xE1, 0xAE, 0x4F, - 0xF7, 0xB4, 0xA0, 0x5E, 0xB5, 0xFF, 0xB6, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0xC8, 0x60, 0x09, 0x7D, - 0x7C, 0x4B, 0x35, 0xE1, 0xAC, 0xE2, 0xAA, 0x60, 0x46, 0x78, 0xFF, 0xFF, 0x16, 0x60, 0x7F, 0xF3, - 0xFF, 0xFF, 0xDC, 0x84, 0x00, 0x36, 0x00, 0x3B, 0xA2, 0xDB, 0x21, 0x64, 0x3A, 0xDB, 0xBD, 0x01, - 0xAC, 0xE2, 0x01, 0x64, 0x33, 0xFB, 0x01, 0xE1, 0x3F, 0x60, 0xCF, 0x65, 0x29, 0x44, 0x24, 0x89, - 0x2E, 0x44, 0x00, 0x36, 0x21, 0x00, 0x01, 0x3A, 0xF0, 0x01, 0x88, 0xFF, 0x40, 0x67, 0x29, 0x45, - 0x34, 0x89, 0xA1, 0xFF, 0x6C, 0x45, 0x65, 0x44, 0x0F, 0xB4, 0x40, 0x45, 0x65, 0x44, 0x29, 0x41, - 0xF9, 0x81, 0x52, 0x4A, 0x71, 0x89, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x83, 0x0E, 0x7C, - 0xD3, 0x80, 0xFF, 0xFF, 0x03, 0x03, 0xAB, 0x60, 0xDE, 0x78, 0xFF, 0xFF, 0xA1, 0xFF, 0x6C, 0x44, - 0xDC, 0x80, 0xFF, 0xFF, 0xD2, 0x03, 0x41, 0x00, 0xC8, 0x60, 0x0B, 0x7D, 0x08, 0x60, 0x00, 0x6B, - 0xB5, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0xAA, 0x74, 0xCD, 0xE2, 0x01, 0x60, 0x08, 0xE1, 0x05, 0xE1, - 0xA1, 0xFF, 0xFF, 0xFF, 0x04, 0x25, 0xC1, 0x01, 0x6C, 0x44, 0x0A, 0x36, 0x07, 0x00, 0x14, 0x36, - 0x05, 0x00, 0x37, 0x36, 0x03, 0x00, 0x6E, 0x36, 0x01, 0x00, 0xB7, 0x01, 0x40, 0x45, 0x32, 0x74, - 0xA1, 0xFF, 0x40, 0x4E, 0x8C, 0x44, 0x60, 0x43, 0x01, 0xE1, 0x20, 0x64, 0x3A, 0xDB, 0x2E, 0x44, - 0x14, 0x36, 0x09, 0x00, 0x0A, 0x36, 0x07, 0x00, 0x37, 0x36, 0x05, 0x00, 0x6E, 0x36, 0x03, 0x00, - 0xAC, 0x60, 0xBF, 0x78, 0xFF, 0xFF, 0x01, 0x64, 0x51, 0xFB, 0xA1, 0xFF, 0x29, 0x41, 0xF9, 0x81, - 0x52, 0x4A, 0x71, 0x89, 0x0E, 0x7C, 0xD3, 0x80, 0x43, 0x43, 0x03, 0x03, 0xAB, 0x60, 0xDE, 0x78, - 0xFF, 0xFF, 0x6C, 0x40, 0xFF, 0xFF, 0x01, 0x15, 0x90, 0x01, 0x12, 0x64, 0x40, 0x46, 0xEA, 0xF1, - 0x50, 0xFE, 0xA1, 0xFF, 0x12, 0x61, 0x8C, 0x44, 0xEB, 0xF0, 0x40, 0x48, 0x8C, 0x44, 0x30, 0xFB, - 0x04, 0x61, 0x50, 0xFE, 0x8C, 0x44, 0xD0, 0x80, 0x8C, 0x44, 0xD4, 0x80, 0x8C, 0x44, 0xEC, 0xF1, - 0x00, 0x65, 0xD0, 0x80, 0x28, 0x44, 0x01, 0x0C, 0x13, 0x00, 0x10, 0x65, 0x60, 0x40, 0xC4, 0x36, - 0x04, 0x00, 0xD4, 0x3A, 0x0D, 0x00, 0x27, 0x40, 0x40, 0x26, 0x30, 0x65, 0x35, 0x84, 0xA1, 0xFF, - 0x8C, 0x44, 0x47, 0xFF, 0x50, 0x4B, 0x67, 0x50, 0x69, 0xE2, 0x6A, 0x44, 0x40, 0x2B, 0x09, 0x15, - 0x2C, 0x60, 0xEC, 0x64, 0xF1, 0x60, 0x78, 0x41, 0xE4, 0x78, 0xB5, 0xF1, 0x2A, 0x64, 0x3A, 0xDB, - 0x1C, 0x01, 0x29, 0x40, 0x10, 0x26, 0x02, 0x00, 0x04, 0x74, 0xCD, 0xE2, 0x8C, 0x44, 0xB6, 0xFF, - 0xB7, 0xFF, 0x01, 0x60, 0x18, 0xE1, 0x05, 0xE1, 0x00, 0x64, 0x33, 0xFB, 0xA1, 0xFF, 0x6C, 0x44, - 0xA1, 0xFF, 0x6C, 0x44, 0x29, 0x40, 0x40, 0x2B, 0x03, 0x00, 0xB6, 0xFF, 0xA1, 0xFF, 0x6C, 0x44, - 0xA1, 0xFF, 0x02, 0x74, 0x29, 0x44, 0x40, 0x27, 0x05, 0x74, 0xCD, 0xE2, 0xA1, 0xFF, 0xCB, 0xF3, - 0xC4, 0xE2, 0x89, 0xFF, 0x60, 0x54, 0x88, 0xFF, 0xDC, 0x84, 0xE0, 0x94, 0x26, 0x44, 0x84, 0xBC, - 0x40, 0x46, 0x23, 0x64, 0x3A, 0xDB, 0xB5, 0xFF, 0xBC, 0xFF, 0x47, 0xFF, 0xB6, 0xFF, 0xB7, 0xFF, - 0xB4, 0xFF, 0xC8, 0x60, 0x09, 0x7D, 0x7C, 0x4B, 0xA9, 0x60, 0x88, 0x78, 0xFF, 0xFF, 0x29, 0x64, - 0x3A, 0xDB, 0xA2, 0xFC, 0x32, 0x40, 0x01, 0x2A, 0xB9, 0x00, 0x01, 0x60, 0x1A, 0xE1, 0x23, 0x43, - 0xA1, 0xFF, 0xEC, 0x44, 0x2A, 0xFA, 0x40, 0x48, 0xA1, 0xFF, 0x7A, 0xDC, 0x7E, 0x36, 0x04, 0xA2, - 0xFC, 0x1C, 0x03, 0x1D, 0x00, 0x64, 0x3F, 0xFA, 0x2E, 0x00, 0x03, 0x2B, 0x04, 0x00, 0xA1, 0xFF, - 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x8F, 0xB0, 0x88, 0x3A, 0x03, 0x00, 0x70, 0x62, 0xA1, 0xFF, - 0x7A, 0xDC, 0x28, 0x40, 0x40, 0x2B, 0x06, 0x00, 0x72, 0x62, 0xA1, 0xFF, 0x7A, 0xDC, 0x7A, 0xDC, - 0x7A, 0xDC, 0x7A, 0xDC, 0x3F, 0xFC, 0x00, 0xF4, 0x10, 0x62, 0x6E, 0x61, 0xA1, 0xFF, 0x05, 0x1D, - 0x12, 0x1E, 0x0C, 0x00, 0x00, 0xF4, 0x7C, 0x61, 0x02, 0x62, 0x7A, 0xDC, 0x63, 0x40, 0xFD, 0x1C, - 0xF9, 0x1D, 0xFF, 0xB1, 0x08, 0x1E, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x62, 0xB6, 0xFF, 0xB7, 0xFF, - 0xA1, 0xFF, 0x6C, 0x44, 0x5A, 0xDA, 0x98, 0xFF, 0xA1, 0xFF, 0x6C, 0x40, 0xA1, 0xFF, 0x47, 0xFF, - 0x7C, 0x44, 0x33, 0xFB, 0x26, 0x44, 0xFD, 0xB4, 0x84, 0xBC, 0x01, 0x15, 0x7F, 0xB4, 0x40, 0x46, - 0x6C, 0x40, 0xB6, 0xFF, 0xB7, 0xFF, 0xA1, 0xFF, 0x6C, 0x45, 0xA1, 0xFF, 0x7F, 0x60, 0x7F, 0x7C, - 0x6C, 0x44, 0xA0, 0x84, 0x15, 0xA7, 0x15, 0xA4, 0x21, 0x46, 0x26, 0xFA, 0x29, 0x40, 0x40, 0x2B, - 0x07, 0x00, 0xB6, 0xFF, 0x40, 0x60, 0x00, 0x65, 0xA1, 0xFF, 0x6C, 0x44, 0x1A, 0xFA, 0x09, 0x00, - 0x65, 0x44, 0x0F, 0xB4, 0x06, 0xA8, 0x80, 0x60, 0x00, 0x65, 0x08, 0x28, 0x7C, 0x45, 0x29, 0x44, - 0x34, 0x89, 0x27, 0xF0, 0x65, 0x44, 0x64, 0x5E, 0x27, 0xFA, 0x81, 0xE1, 0x01, 0x60, 0x18, 0xE1, - 0x01, 0x11, 0x12, 0x00, 0x29, 0x44, 0x20, 0xBC, 0x40, 0x49, 0x01, 0x64, 0x33, 0xFB, 0xB6, 0xFF, - 0x00, 0xE1, 0x01, 0x60, 0x1A, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x6C, 0x40, 0xFC, 0x11, 0x01, 0x60, - 0x18, 0xE1, 0xAE, 0x4F, 0xF7, 0xB4, 0xA0, 0x5E, 0x00, 0x70, 0x00, 0x64, 0x40, 0x4B, 0x21, 0x46, - 0xB5, 0xFF, 0xBC, 0xFF, 0x47, 0xFF, 0xB6, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0xC8, 0x60, 0x09, 0x7D, - 0x7C, 0x4B, 0x28, 0x44, 0x04, 0x27, 0x09, 0x00, 0xD4, 0x36, 0x04, 0x00, 0x0C, 0x22, 0x02, 0x00, - 0x0C, 0x3A, 0x03, 0x00, 0xAE, 0x4F, 0xF7, 0xB4, 0xA0, 0x5E, 0x2A, 0x44, 0x72, 0x45, 0x24, 0xFA, - 0xB2, 0xF3, 0x06, 0x04, 0xE4, 0xE2, 0xDC, 0x9C, 0x29, 0x40, 0x01, 0x26, 0x64, 0x44, 0xB2, 0xF9, - 0x25, 0xFA, 0xB3, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0xB3, 0xFB, 0x28, 0xFA, 0xB4, 0xF3, 0x02, 0x04, - 0xDC, 0x84, 0xB4, 0xFB, 0x29, 0xFA, 0xA9, 0x60, 0x88, 0x78, 0xFF, 0xFF, 0xA1, 0xFF, 0x19, 0x60, - 0xA3, 0xF3, 0x12, 0x61, 0x60, 0x40, 0x01, 0x2A, 0x08, 0x00, 0x00, 0x64, 0x3B, 0xFA, 0xBF, 0x60, - 0xFF, 0x65, 0x8C, 0x44, 0x3D, 0xFA, 0xA4, 0x84, 0x01, 0x00, 0x8C, 0x44, 0xEB, 0xF0, 0x2A, 0xFA, - 0x40, 0x48, 0x04, 0x26, 0x48, 0x00, 0xA1, 0xFF, 0x8C, 0x44, 0x5A, 0xDA, 0x30, 0xFB, 0x6C, 0x44, - 0x2C, 0xFA, 0xFF, 0xFF, 0x01, 0x26, 0x2B, 0x00, 0xD0, 0x80, 0xA1, 0xFF, 0x8C, 0x44, 0x6C, 0x5C, - 0x00, 0xE1, 0xF2, 0xFE, 0x2D, 0xFA, 0xEC, 0xF3, 0xD4, 0x80, 0xD0, 0x80, 0x2E, 0xF8, 0x24, 0x44, - 0x16, 0x0C, 0x32, 0x40, 0x02, 0x2A, 0x07, 0x00, 0x28, 0x42, 0x0C, 0xB2, 0x08, 0x3A, 0x03, 0x00, - 0x10, 0xBC, 0x40, 0x44, 0x61, 0x00, 0x04, 0x0A, 0xA1, 0xFF, 0xAB, 0x60, 0xE7, 0x78, 0xFF, 0xFF, - 0x11, 0xBC, 0x40, 0x44, 0x28, 0x45, 0xBF, 0x60, 0xFF, 0x64, 0x24, 0x88, 0x55, 0x00, 0x30, 0xBC, - 0x40, 0x44, 0x22, 0xF0, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0x4D, 0x00, 0x20, 0xB9, - 0x5C, 0x8E, 0xA1, 0xFF, 0x8C, 0x44, 0x2D, 0xFA, 0xDC, 0x9C, 0x6C, 0x44, 0x00, 0xE1, 0xF2, 0xFE, - 0x2E, 0xFA, 0x08, 0x28, 0x44, 0x4E, 0xDC, 0x84, 0x2E, 0x5C, 0xB0, 0x84, 0xEF, 0xB1, 0x08, 0x24, - 0x40, 0xB9, 0x41, 0x46, 0x39, 0x00, 0x23, 0x41, 0x13, 0x64, 0x51, 0x90, 0x56, 0x63, 0x03, 0x04, - 0xAB, 0x60, 0xDE, 0x78, 0xFF, 0xFF, 0x8C, 0x44, 0x04, 0x61, 0x2B, 0xFA, 0x50, 0xFE, 0x80, 0x27, - 0x00, 0x64, 0x30, 0xFB, 0x8C, 0x44, 0x2C, 0xFA, 0xD0, 0x80, 0x8C, 0x44, 0x2D, 0xFA, 0xD4, 0x80, - 0x00, 0x65, 0x8C, 0x44, 0xEC, 0xF1, 0x2E, 0xFA, 0xD0, 0x80, 0x28, 0x44, 0x03, 0x0C, 0xA0, 0x2A, - 0x0A, 0x00, 0x11, 0x00, 0x10, 0x65, 0x60, 0x40, 0xC4, 0x36, 0x04, 0x00, 0xD4, 0x3A, 0x08, 0x00, - 0x27, 0x40, 0x40, 0x26, 0x30, 0x65, 0x00, 0x64, 0x3F, 0xFA, 0x46, 0x4E, 0x35, 0x84, 0x64, 0x00, - 0x40, 0x26, 0xF9, 0x01, 0x30, 0x65, 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x04, 0x61, 0xF3, 0x01, - 0xA1, 0xFF, 0xAB, 0x60, 0xA5, 0x78, 0xFF, 0xFF, 0xFF, 0x60, 0xFE, 0x65, 0x23, 0x43, 0xE8, 0xA3, - 0x80, 0x27, 0xF6, 0x01, 0x20, 0xE6, 0x08, 0x60, 0x00, 0xEB, 0x28, 0x44, 0x03, 0x2B, 0x05, 0x00, - 0x6A, 0x62, 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x28, 0x44, 0x8F, 0xB0, 0x88, 0x3A, 0x03, 0x00, - 0x70, 0x62, 0x7A, 0xDC, 0x28, 0x44, 0x40, 0x2B, 0x0D, 0x00, 0x72, 0x62, 0x7A, 0xDC, 0xA1, 0xFF, - 0x6C, 0x5C, 0x5A, 0xD8, 0xE4, 0x40, 0x20, 0x2B, 0x03, 0x00, 0x7A, 0xDC, 0x7A, 0xDC, 0xF8, 0xA3, - 0x25, 0xFF, 0xB0, 0xFF, 0x3F, 0xFC, 0x00, 0xF4, 0x10, 0x62, 0x10, 0x61, 0x57, 0x90, 0x6C, 0x61, - 0xA1, 0xFF, 0x09, 0x07, 0x02, 0x1D, 0x28, 0x1E, 0x1F, 0x00, 0xCB, 0x83, 0x7A, 0xDC, 0xFE, 0x1C, - 0xD9, 0x81, 0x22, 0x1E, 0x19, 0x00, 0xCB, 0x83, 0x0E, 0xA3, 0xA7, 0x84, 0xF2, 0xA3, 0x7A, 0xDC, - 0xFE, 0x1C, 0x03, 0x1D, 0x7C, 0xA8, 0xD9, 0x81, 0x0A, 0x02, 0x00, 0xF4, 0x02, 0x62, 0xA7, 0x84, - 0x7A, 0x61, 0x7A, 0xDC, 0xFE, 0x1C, 0xF9, 0x1D, 0x7C, 0xA8, 0xD9, 0x81, 0xF6, 0x03, 0xFF, 0xB1, - 0x0B, 0x1E, 0x02, 0x02, 0x00, 0xF4, 0x02, 0x62, 0xA1, 0xFF, 0xFF, 0xFF, 0xB6, 0xFF, 0xB7, 0xFF, - 0x6C, 0x44, 0x5A, 0xDA, 0xCD, 0x81, 0x64, 0x40, 0x46, 0x45, 0x28, 0x44, 0x40, 0x2B, 0x0E, 0x00, - 0x64, 0x40, 0x20, 0x2B, 0x0B, 0x00, 0x01, 0xA2, 0x62, 0x44, 0x46, 0x45, 0x21, 0x46, 0x00, 0xF4, - 0x02, 0x62, 0x9A, 0xFF, 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x7A, 0xDC, 0x01, 0x60, 0x18, 0xE1, - 0x24, 0x76, 0xAD, 0xE2, 0x41, 0xE1, 0x98, 0xFF, 0x00, 0xE6, 0x01, 0xF2, 0x61, 0x45, 0xD4, 0x9E, - 0x21, 0x46, 0x16, 0xFA, 0x25, 0x44, 0x06, 0xFA, 0xA1, 0xFF, 0x8C, 0x44, 0xA1, 0xFF, 0x47, 0xFF, - 0x29, 0x40, 0x50, 0x2B, 0x06, 0x00, 0x2B, 0x44, 0x1C, 0x60, 0x11, 0xFB, 0x70, 0x45, 0x44, 0x8B, - 0x01, 0x00, 0x50, 0x4B, 0x67, 0x50, 0x69, 0xE2, 0x25, 0x46, 0x01, 0xF2, 0x61, 0x45, 0xD4, 0x9E, - 0x21, 0x46, 0x16, 0xFA, 0x25, 0x45, 0x86, 0xF8, 0xFF, 0xFF, 0x6A, 0x44, 0x40, 0x2B, 0x03, 0x15, - 0xAF, 0x60, 0xF3, 0x78, 0xFF, 0xFF, 0x29, 0x40, 0x10, 0x26, 0x04, 0x00, 0x04, 0x74, 0xCD, 0xE2, - 0xA1, 0xFF, 0xFF, 0xFF, 0x6C, 0x44, 0xB6, 0xFF, 0xB7, 0xFF, 0xC4, 0xE2, 0x01, 0x60, 0x18, 0xE1, - 0x05, 0x76, 0xAD, 0xE2, 0x41, 0xE1, 0xA1, 0xFF, 0x6C, 0x45, 0xA1, 0xFF, 0x65, 0x41, 0x7F, 0x60, - 0x7F, 0x7C, 0x6C, 0x44, 0xA0, 0x84, 0x15, 0xA7, 0x15, 0xA4, 0x21, 0x46, 0x26, 0xFA, 0x22, 0x46, - 0x10, 0xFA, 0x21, 0x46, 0x29, 0x40, 0x40, 0x2B, 0x07, 0x00, 0xB6, 0xFF, 0xA1, 0xFF, 0x40, 0x60, - 0x00, 0x65, 0x6C, 0x44, 0x1A, 0xFA, 0x09, 0x00, 0x65, 0x44, 0x0F, 0xB4, 0x06, 0xA8, 0x80, 0x60, - 0x00, 0x65, 0x08, 0x28, 0x7C, 0x45, 0x29, 0x44, 0x34, 0x89, 0x00, 0x64, 0x33, 0xFB, 0x40, 0x21, - 0x00, 0x00, 0xAC, 0xE2, 0x05, 0xE1, 0x27, 0xF0, 0x65, 0x44, 0x64, 0x5E, 0x27, 0xFA, 0x28, 0x44, - 0x8F, 0xB0, 0x88, 0x3A, 0x09, 0x00, 0x39, 0xF2, 0xFF, 0xFF, 0x60, 0xB0, 0x20, 0x3A, 0x04, 0x00, - 0x24, 0x44, 0xFF, 0x60, 0xDF, 0xB4, 0x40, 0x44, 0x28, 0x40, 0x03, 0x26, 0xE2, 0x00, 0x31, 0x40, - 0x20, 0x2A, 0x03, 0x00, 0x28, 0x40, 0x50, 0x3A, 0xDC, 0x00, 0x24, 0x44, 0x20, 0x2A, 0xD9, 0x00, - 0x29, 0x40, 0x50, 0x2B, 0x0D, 0x00, 0xEF, 0x60, 0xFF, 0x65, 0x29, 0x44, 0x24, 0x89, 0x31, 0x40, - 0x08, 0x2A, 0x06, 0x00, 0x1C, 0x60, 0x11, 0xF3, 0xFF, 0xFF, 0xE0, 0x85, 0x2B, 0x44, 0x06, 0x05, - 0x2B, 0x44, 0xFF, 0xA4, 0x01, 0xA4, 0x04, 0x24, 0x00, 0x64, 0x40, 0x4B, 0xAC, 0x80, 0x28, 0x40, - 0xB4, 0x3A, 0x03, 0x00, 0x02, 0x03, 0x30, 0xFB, 0xBC, 0x00, 0x28, 0x44, 0xBF, 0x60, 0xFF, 0x65, - 0xA4, 0x84, 0x40, 0x48, 0x2B, 0x50, 0xA1, 0xFF, 0xFF, 0xFF, 0x01, 0x60, 0x08, 0xE1, 0x1C, 0xF2, - 0xC4, 0xE2, 0x40, 0x45, 0x28, 0x40, 0xC4, 0x36, 0x9C, 0x00, 0x29, 0x40, 0x40, 0x2B, 0x48, 0x00, - 0x32, 0x60, 0xFA, 0x63, 0x60, 0x40, 0x0B, 0x36, 0x20, 0x00, 0x0F, 0x36, 0x1B, 0x00, 0x0A, 0x36, - 0x16, 0x00, 0x0E, 0x36, 0x11, 0x00, 0x09, 0x36, 0x0C, 0x00, 0x0D, 0x36, 0x07, 0x00, 0x08, 0x36, - 0x02, 0x00, 0xA3, 0xD3, 0x15, 0x00, 0x02, 0xA3, 0xA3, 0xD3, 0x12, 0x00, 0x04, 0xA3, 0xA3, 0xD3, - 0x0F, 0x00, 0x06, 0xA3, 0xA3, 0xD3, 0x0C, 0x00, 0x08, 0xA3, 0xA3, 0xD3, 0x09, 0x00, 0x0A, 0xA3, - 0xA3, 0xD3, 0x06, 0x00, 0x0C, 0xA3, 0xA3, 0xD3, 0x03, 0x00, 0x0E, 0xA3, 0xA3, 0xD3, 0xFF, 0xFF, - 0x2C, 0x60, 0x7C, 0x63, 0x60, 0x40, 0x0C, 0x36, 0x19, 0x00, 0x08, 0x36, 0x15, 0x00, 0x0D, 0x36, - 0x11, 0x00, 0x09, 0x36, 0x0D, 0x00, 0x0E, 0x36, 0x09, 0x00, 0x0A, 0x36, 0x05, 0x00, 0x0F, 0x36, - 0x01, 0x00, 0x39, 0x00, 0x02, 0xA3, 0x37, 0x00, 0x04, 0xA3, 0x35, 0x00, 0x06, 0xA3, 0x33, 0x00, - 0x08, 0xA3, 0x31, 0x00, 0x0A, 0xA3, 0x2F, 0x00, 0x0C, 0xA3, 0x2D, 0x00, 0x0E, 0xA3, 0x2B, 0x00, - 0x33, 0x60, 0x0A, 0x63, 0x25, 0x44, 0x0A, 0x36, 0x0C, 0x00, 0x14, 0x36, 0x07, 0x00, 0x37, 0x36, - 0x02, 0x00, 0xA3, 0xD3, 0x09, 0x00, 0x02, 0xA3, 0xA3, 0xD3, 0x06, 0x00, 0x04, 0xA3, 0xA3, 0xD3, - 0x03, 0x00, 0x06, 0xA3, 0xA3, 0xD3, 0xFF, 0xFF, 0x40, 0x45, 0x0A, 0x36, 0x0D, 0x00, 0x14, 0x36, - 0x38, 0x64, 0x37, 0x3A, 0x03, 0x00, 0x04, 0x7F, 0x40, 0x45, 0x15, 0x64, 0x6E, 0x3A, 0x09, 0x00, - 0x84, 0x7F, 0x40, 0x45, 0x0B, 0x64, 0x05, 0x00, 0x29, 0x44, 0x7F, 0x60, 0xFF, 0xB4, 0x40, 0x49, - 0x70, 0x64, 0x40, 0x4D, 0x02, 0x00, 0x40, 0x45, 0x0A, 0x00, 0x2C, 0x60, 0x74, 0x63, 0x0A, 0x36, - 0x06, 0x00, 0x14, 0x36, 0x02, 0xA3, 0x37, 0x36, 0x04, 0xA3, 0x6E, 0x36, 0x06, 0xA3, 0x28, 0xA3, - 0xA3, 0xD1, 0xD8, 0xA3, 0x19, 0x60, 0x55, 0xF9, 0x39, 0xF1, 0xA3, 0xD1, 0x64, 0x41, 0x64, 0x5E, - 0x60, 0x45, 0x64, 0x47, 0x1F, 0xB4, 0x54, 0x94, 0xE0, 0xA0, 0x02, 0x0D, 0x00, 0x64, 0x02, 0x00, - 0x01, 0x04, 0x1F, 0x64, 0x60, 0x47, 0xB4, 0x85, 0x29, 0x44, 0xC0, 0x60, 0x00, 0xB4, 0xB4, 0x84, - 0x1F, 0xFA, 0xB5, 0xFF, 0xA1, 0xFF, 0xCB, 0xF3, 0xC4, 0xE2, 0x89, 0xFF, 0x60, 0x54, 0x88, 0xFF, - 0xDC, 0x84, 0xE0, 0x94, 0xFF, 0x60, 0xCF, 0x65, 0x29, 0x44, 0x24, 0x89, 0xA5, 0x60, 0x88, 0x78, - 0x04, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0xC4, 0xE2, 0xA1, 0xFF, 0xFF, 0x60, 0xCF, 0x65, 0x29, 0x44, - 0x24, 0x89, 0xCB, 0xF3, 0xC4, 0xE2, 0x89, 0xFF, 0x60, 0x54, 0x88, 0xFF, 0xDC, 0x84, 0xE0, 0x94, - 0x26, 0x44, 0x84, 0xBC, 0x24, 0x40, 0x0C, 0x22, 0xFD, 0xB4, 0x40, 0x46, 0x23, 0x64, 0x3A, 0xDB, - 0xAD, 0x60, 0x4F, 0x78, 0xFF, 0xFF, 0x27, 0x40, 0x26, 0x22, 0x05, 0x00, 0xF8, 0xB4, 0x40, 0x47, - 0x06, 0x64, 0x31, 0xFB, 0xC0, 0xFE, 0x29, 0x40, 0x10, 0x26, 0x02, 0x00, 0x04, 0x74, 0xCD, 0xE2, - 0x01, 0x60, 0x18, 0xE1, 0x01, 0x60, 0x18, 0xE1, 0x01, 0x11, 0x12, 0x00, 0x29, 0x44, 0x20, 0xBC, - 0x40, 0x49, 0x01, 0x64, 0x33, 0xFB, 0xB6, 0xFF, 0x00, 0xE1, 0x01, 0x60, 0x1A, 0xE1, 0xA1, 0xFF, - 0xFF, 0xFF, 0x6C, 0x40, 0xFC, 0x11, 0x01, 0x60, 0x18, 0xE1, 0xAE, 0x4F, 0xF7, 0xB4, 0xA0, 0x5E, - 0xB5, 0xFF, 0x47, 0xFF, 0xB6, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0xC8, 0x60, 0x09, 0x7D, 0x7C, 0x4B, - 0x29, 0x40, 0x50, 0x2B, 0x1B, 0x00, 0x31, 0x40, 0x08, 0x2A, 0x0D, 0x00, 0x1C, 0x60, 0x11, 0xF3, - 0xFF, 0xFF, 0xE0, 0x85, 0x2B, 0x44, 0x07, 0x04, 0x70, 0x45, 0xC4, 0x84, 0xEF, 0x60, 0xFF, 0x65, - 0x29, 0x44, 0x24, 0x89, 0x11, 0x00, 0x2B, 0x44, 0x70, 0x45, 0xC4, 0x84, 0xFF, 0xFF, 0x04, 0x24, - 0x00, 0xB4, 0x40, 0x4B, 0xEF, 0x60, 0xFF, 0x65, 0x29, 0x44, 0x24, 0x89, 0x37, 0xF3, 0x2B, 0x45, - 0xD4, 0x80, 0xFF, 0xFF, 0x02, 0x28, 0x65, 0x44, 0x60, 0x50, 0xA0, 0x4C, 0x20, 0xBC, 0xFF, 0xB4, - 0xA0, 0x51, 0x00, 0x60, 0x2E, 0x7C, 0x74, 0x44, 0xC0, 0x94, 0x32, 0x40, 0x02, 0x2A, 0x19, 0x00, - 0x28, 0x44, 0xA4, 0x36, 0x03, 0x00, 0x0C, 0xB4, 0x04, 0x36, 0x13, 0x00, 0x26, 0x43, 0xFD, 0xB3, - 0x04, 0xBB, 0x43, 0x46, 0x01, 0x2A, 0x03, 0x00, 0x28, 0x47, 0x40, 0xBF, 0x40, 0x48, 0x0A, 0xBB, - 0x0F, 0xFC, 0x50, 0x4B, 0x67, 0x50, 0x00, 0x64, 0x30, 0xFB, 0x05, 0xFF, 0xAD, 0x60, 0x4F, 0x78, - 0xFF, 0xFF, 0x24, 0x64, 0x3A, 0xDB, 0x28, 0x44, 0x04, 0x2A, 0x03, 0x00, 0xA3, 0x60, 0xE7, 0x78, - 0xFF, 0xFF, 0x32, 0x40, 0x04, 0x2A, 0x1C, 0x00, 0x28, 0x44, 0x0C, 0xB0, 0x08, 0x3A, 0x18, 0x00, - 0x2C, 0xF0, 0x22, 0xF0, 0x64, 0x40, 0x01, 0x26, 0x0B, 0x00, 0x64, 0x40, 0x40, 0x2B, 0x10, 0x00, - 0x8F, 0xB0, 0x88, 0x3A, 0x0D, 0x00, 0x39, 0xF2, 0xFF, 0xFF, 0x60, 0xB0, 0x20, 0x3A, 0x08, 0x00, - 0x26, 0x44, 0xFD, 0xB4, 0x04, 0xBC, 0x40, 0x46, 0xFC, 0xB4, 0x0F, 0xFA, 0x05, 0xFF, 0x01, 0x00, - 0x1D, 0xFF, 0x01, 0xE2, 0x26, 0x40, 0x10, 0x2A, 0x06, 0x00, 0x2C, 0x60, 0xEA, 0x64, 0xF1, 0x60, - 0x78, 0x41, 0xE4, 0x78, 0xB5, 0xF1, 0xA3, 0x60, 0xE7, 0x78, 0xFF, 0xFF, 0x03, 0x0A, 0xA3, 0x60, - 0xF4, 0x78, 0xFF, 0xFF, 0x01, 0x64, 0x51, 0xFB, 0x1B, 0x60, 0xEE, 0xF3, 0xFF, 0xFF, 0x04, 0x18, - 0xAE, 0x4F, 0x08, 0xBC, 0x00, 0x7F, 0xA0, 0x5E, 0xE1, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, - 0x54, 0x62, 0x22, 0x46, 0xA2, 0xD0, 0x16, 0x63, 0x7C, 0x41, 0x44, 0x48, 0x80, 0x36, 0x04, 0x61, - 0x28, 0x40, 0x50, 0x36, 0x04, 0x61, 0x41, 0x4E, 0x28, 0x44, 0xA4, 0x36, 0x0E, 0x63, 0x9A, 0xFF, - 0xA1, 0xFF, 0x19, 0x60, 0xA3, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x06, 0x00, 0x3D, 0xF2, - 0xAA, 0xF0, 0xFF, 0xFF, 0xB4, 0x84, 0x08, 0x36, 0x2A, 0xFA, 0x12, 0x74, 0xCD, 0xE2, 0x54, 0x62, - 0xA2, 0xD2, 0xFF, 0xFF, 0x6A, 0x40, 0x80, 0x4E, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, - 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, - 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0xFF, 0xFF, 0x01, 0x1D, 0xB2, 0x00, 0x7A, 0xD4, 0x12, 0x74, - 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x28, 0x40, 0x03, 0x2B, - 0x06, 0x00, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x70, 0x62, - 0x28, 0x44, 0x8F, 0xB0, 0x88, 0x3A, 0x02, 0x00, 0x7A, 0xD4, 0x12, 0x74, 0x28, 0x40, 0x40, 0x2B, - 0x16, 0x00, 0x72, 0x62, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD2, 0x12, 0x74, 0x80, 0x4C, 0x20, 0x2B, - 0x05, 0x00, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x22, 0xF2, 0xFF, 0xFF, - 0x60, 0x40, 0x10, 0x26, 0x04, 0x00, 0x26, 0x26, 0x4D, 0x00, 0x26, 0x27, 0x4B, 0x00, 0x23, 0x43, - 0xFF, 0xFF, 0x06, 0x1D, 0x2E, 0x1E, 0x00, 0x00, 0x03, 0xF0, 0x04, 0xF4, 0x64, 0x42, 0x3D, 0x00, - 0x2E, 0x40, 0x04, 0x2A, 0x27, 0x00, 0xA1, 0xFF, 0x02, 0xFE, 0x10, 0x25, 0x42, 0xFE, 0x12, 0x74, - 0x72, 0x45, 0x65, 0x4C, 0xB2, 0xF3, 0x03, 0x04, 0xE4, 0xE2, 0xDC, 0x84, 0xB2, 0xFB, 0xA1, 0xFF, - 0x12, 0x74, 0x80, 0x4C, 0x12, 0x74, 0xB3, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0xB3, 0xFB, 0x80, 0x4C, - 0x12, 0x74, 0xB4, 0xF3, 0x02, 0x04, 0xDC, 0x84, 0xB4, 0xFB, 0x80, 0x4C, 0x12, 0x74, 0x5C, 0x4E, - 0xF8, 0xA3, 0x03, 0xF2, 0x9A, 0xF2, 0x04, 0xF4, 0xFF, 0xB1, 0xF8, 0xA1, 0x06, 0xA4, 0x60, 0x42, - 0x0A, 0x00, 0x4E, 0x00, 0x03, 0xF2, 0x9A, 0xF2, 0x04, 0xF4, 0xC8, 0x82, 0xFF, 0xB1, 0x03, 0x00, - 0x00, 0xF4, 0x81, 0xF2, 0xFF, 0xB1, 0x7A, 0xD4, 0x12, 0x74, 0xFD, 0x1C, 0xF9, 0x1D, 0xFF, 0xB1, - 0x1B, 0x1E, 0x02, 0x02, 0x00, 0xF4, 0xDA, 0x82, 0xDA, 0x82, 0xA2, 0xD2, 0xA1, 0xFF, 0x09, 0x74, - 0x60, 0x4D, 0x12, 0x00, 0x03, 0xF2, 0x9A, 0xF2, 0x04, 0xF4, 0x23, 0x43, 0xA1, 0xFF, 0x12, 0x74, - 0xA0, 0xD2, 0xFE, 0xA1, 0xCB, 0x83, 0x60, 0x4E, 0xAF, 0x83, 0x03, 0x1D, 0x05, 0x03, 0x12, 0x74, - 0xEB, 0x01, 0xA1, 0xFF, 0x12, 0x74, 0xDF, 0x01, 0x12, 0x74, 0xDA, 0x83, 0x66, 0x44, 0x22, 0x46, - 0x0C, 0xFA, 0x22, 0xF2, 0x0B, 0xFC, 0x28, 0x40, 0x40, 0x2B, 0x1A, 0x00, 0x10, 0x26, 0x04, 0x00, - 0x26, 0x26, 0x0F, 0x00, 0x26, 0x27, 0x0D, 0x00, 0x00, 0xF4, 0x02, 0x62, 0xA1, 0xFF, 0x12, 0x74, - 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, 0x7A, 0xD4, 0x12, 0x74, - 0x07, 0x00, 0xA1, 0xFF, 0x12, 0x74, 0x9C, 0x4E, 0x12, 0x74, 0x9C, 0x4C, 0x12, 0x74, 0x00, 0x00, - 0x88, 0xFF, 0xA1, 0xFF, 0xB2, 0x60, 0x58, 0x4F, 0x2D, 0x78, 0xFF, 0xFF, 0x01, 0x60, 0x18, 0xE1, - 0x78, 0x44, 0x02, 0xA4, 0x35, 0xFB, 0xCC, 0x00, 0x29, 0x44, 0xF7, 0xB4, 0x40, 0x49, 0x34, 0x64, - 0x3A, 0xDB, 0x44, 0xE1, 0xA5, 0x60, 0x54, 0x78, 0xFF, 0xFF, 0x00, 0x6B, 0xBC, 0xFF, 0x15, 0xF3, - 0xFF, 0xFF, 0xDC, 0x84, 0x15, 0xFB, 0x78, 0x5C, 0x07, 0x00, 0x78, 0x5C, 0x2F, 0x00, 0x62, 0xFF, - 0xFF, 0xFF, 0xA1, 0xFF, 0x98, 0xFF, 0x80, 0x3E, 0x80, 0x60, 0x01, 0xE0, 0xD5, 0x60, 0x84, 0xE7, - 0xA1, 0xF3, 0x40, 0x60, 0x60, 0x40, 0x01, 0x23, 0x48, 0x60, 0x5E, 0x65, 0x80, 0x60, 0x00, 0x6A, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, - 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x80, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, - 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x01, 0x6A, 0xFF, 0xFF, - 0x01, 0x16, 0xFE, 0x01, 0x95, 0x60, 0x84, 0xE7, 0x64, 0x58, 0xFF, 0xFF, 0x80, 0x60, 0x01, 0xE0, - 0xD5, 0x60, 0x84, 0xE7, 0xA1, 0xF3, 0x7C, 0x45, 0x60, 0x40, 0x01, 0x23, 0x02, 0x65, 0x8C, 0x60, - 0x48, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, - 0xFE, 0x01, 0x00, 0x60, 0x7F, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x84, 0x60, 0x04, 0x6A, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x48, 0x60, 0x08, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, - 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x84, 0x60, 0x04, 0x6A, 0xFF, 0xFF, 0x01, 0x16, - 0xFE, 0x01, 0x40, 0x60, 0x08, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, - 0x01, 0x16, 0xFE, 0x01, 0x8C, 0x60, 0x48, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, - 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, - 0xFE, 0x01, 0x95, 0x60, 0x84, 0xE7, 0x64, 0x58, 0xFF, 0xFF, 0x12, 0x74, 0x6A, 0x40, 0x87, 0x4F, - 0x12, 0x74, 0x87, 0x4C, 0x12, 0x74, 0x29, 0x40, 0x40, 0x2B, 0x08, 0x00, 0x0A, 0x64, 0x89, 0xFF, - 0x60, 0x54, 0x88, 0xFF, 0x87, 0x4D, 0x12, 0x74, 0x87, 0x4D, 0x09, 0x00, 0x03, 0x64, 0x89, 0xFF, - 0x60, 0x54, 0x88, 0xFF, 0x87, 0x4F, 0x12, 0x74, 0x87, 0x4D, 0x12, 0x74, 0x87, 0x4D, 0x7C, 0x44, - 0x01, 0x08, 0x01, 0x00, 0x67, 0x44, 0x12, 0x74, 0x87, 0x4C, 0x12, 0x74, 0x87, 0x4C, 0x12, 0x74, - 0x87, 0x4C, 0x12, 0x74, 0x87, 0x4D, 0x12, 0x74, 0x87, 0x4D, 0x12, 0x74, 0x87, 0x4D, 0x12, 0x74, - 0x04, 0x21, 0x04, 0x00, 0xFF, 0x2A, 0x01, 0x00, 0x04, 0x00, 0x03, 0x00, 0xFF, 0x2A, 0x0D, 0x00, - 0x0C, 0x00, 0xBC, 0xFF, 0x61, 0xFF, 0x78, 0x5C, 0x57, 0x01, 0x78, 0x5C, 0x7F, 0x01, 0xB6, 0xFF, - 0xB7, 0xFF, 0xB4, 0xFF, 0xC8, 0x60, 0x09, 0x7D, 0x7C, 0x4B, 0x6A, 0x44, 0x2F, 0x58, 0xFF, 0xFF, - 0x04, 0x74, 0xC4, 0xE2, 0x04, 0xE1, 0x29, 0x40, 0x40, 0x2B, 0x05, 0x00, 0xA1, 0xFF, 0xFF, 0xFF, - 0xBC, 0xFF, 0x14, 0x74, 0x01, 0x00, 0x04, 0x74, 0xC4, 0xE2, 0x04, 0xE1, 0xBC, 0xFF, 0xB5, 0xFF, - 0x47, 0xFF, 0xB6, 0xFF, 0xB7, 0xFF, 0xB4, 0xFF, 0xC8, 0x60, 0x09, 0x7D, 0x7C, 0x4B, 0x29, 0x40, - 0x40, 0x27, 0x04, 0x00, 0xC2, 0x60, 0x58, 0x4F, 0xBA, 0x78, 0xFF, 0xFF, 0xA1, 0xFF, 0x29, 0x40, - 0x10, 0x26, 0x6D, 0x00, 0x80, 0x60, 0x01, 0xE0, 0xD5, 0x60, 0x84, 0xE7, 0xA1, 0xF3, 0x40, 0x60, - 0x60, 0x40, 0x01, 0x23, 0x48, 0x60, 0x5E, 0x65, 0x80, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, - 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x00, 0x6A, 0xFF, 0xFF, - 0x01, 0x16, 0xFE, 0x01, 0x80, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x65, 0x4A, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x01, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, - 0x95, 0x60, 0x84, 0xE7, 0x80, 0x60, 0x01, 0xE0, 0xD5, 0x60, 0x84, 0xE7, 0xA1, 0xF3, 0x7C, 0x45, - 0x60, 0x40, 0x01, 0x23, 0x02, 0x65, 0x8C, 0x60, 0x48, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, - 0x00, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x7F, 0x6A, 0xFF, 0xFF, - 0x01, 0x16, 0xFE, 0x01, 0x84, 0x60, 0x04, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x48, 0x60, - 0x08, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, - 0x84, 0x60, 0x04, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x40, 0x60, 0x08, 0x6A, 0xFF, 0xFF, - 0x01, 0x16, 0xFE, 0x01, 0x65, 0x4A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x8C, 0x60, 0x48, 0x6A, - 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x00, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, - 0x00, 0x60, 0x00, 0x6A, 0xFF, 0xFF, 0x01, 0x16, 0xFE, 0x01, 0x95, 0x60, 0x84, 0xE7, 0x01, 0x60, - 0x08, 0xE1, 0xFF, 0xFF, 0xC4, 0xE2, 0x29, 0x40, 0x40, 0x2B, 0x04, 0x00, 0xC2, 0x60, 0x58, 0x4F, - 0xBA, 0x78, 0xFF, 0xFF, 0xC2, 0x60, 0x58, 0x4F, 0xC5, 0x78, 0xFF, 0xFF, 0xA1, 0xFF, 0xCB, 0xF3, - 0xC4, 0xE2, 0x89, 0xFF, 0x60, 0x54, 0x88, 0xFF, 0xDC, 0x84, 0xE0, 0x94, 0x35, 0xF7, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x01, 0x10, 0x61, 0x7F, 0x60, 0xC0, 0x64, 0xA0, 0x80, 0x7F, 0x67, 0x02, 0x63, - 0x25, 0x02, 0x98, 0xFE, 0x19, 0x05, 0x12, 0x60, 0xFC, 0xF5, 0x0E, 0xF2, 0x15, 0x18, 0x02, 0x18, - 0x09, 0xF4, 0xFB, 0x01, 0x23, 0x44, 0x00, 0xA8, 0x08, 0x7E, 0x0A, 0x02, 0x66, 0x44, 0x11, 0xFB, - 0x46, 0x43, 0x23, 0x47, 0x80, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x28, 0xB9, 0x10, 0x7E, - 0x00, 0x7F, 0x0E, 0xFA, 0x00, 0x67, 0x0A, 0x00, 0x20, 0x44, 0xDC, 0x85, 0x0F, 0xB4, 0xFB, 0xA0, - 0x7F, 0x67, 0x07, 0x63, 0x03, 0x05, 0x45, 0x40, 0x00, 0x67, 0xD8, 0xFE, 0xFF, 0x27, 0x05, 0xFD, - 0x0A, 0x7E, 0x04, 0xFB, 0x61, 0x55, 0x48, 0x00, 0x28, 0xFB, 0x01, 0xF3, 0x29, 0xFB, 0x44, 0x46, - 0x40, 0x45, 0x10, 0x61, 0x7E, 0x60, 0xC0, 0x64, 0xA0, 0x80, 0x7F, 0x67, 0x02, 0x63, 0x30, 0x02, - 0xB5, 0x60, 0x58, 0x4F, 0xCE, 0x78, 0xFF, 0xFF, 0x7F, 0x67, 0x03, 0x63, 0x29, 0x02, 0x26, 0x40, - 0x01, 0x2B, 0x23, 0x00, 0x98, 0xFE, 0x18, 0x05, 0x12, 0x60, 0xFC, 0xF5, 0x0E, 0xF2, 0x14, 0x18, - 0x02, 0x18, 0x09, 0xF4, 0xFB, 0x01, 0x23, 0x44, 0x00, 0xA8, 0x08, 0x7E, 0x0A, 0x02, 0x66, 0x44, - 0x11, 0xFB, 0x46, 0x43, 0x23, 0x47, 0x80, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x08, 0xB9, - 0x10, 0x7E, 0x00, 0x7F, 0x0E, 0xFA, 0x09, 0x00, 0x20, 0x44, 0xDC, 0x85, 0x0F, 0xB4, 0xFB, 0xA0, - 0x7F, 0x67, 0x07, 0x63, 0x05, 0x05, 0x45, 0x40, 0xD8, 0xFE, 0x00, 0x67, 0xD0, 0xFE, 0xD9, 0xFE, - 0xFF, 0x27, 0x05, 0xFD, 0x0B, 0x7E, 0x04, 0xFB, 0x0E, 0x60, 0xDD, 0xF3, 0xFF, 0xFF, 0x20, 0xB0, - 0x80, 0xBC, 0x08, 0x28, 0xA2, 0xDB, 0x61, 0x55, 0x66, 0x00, 0x04, 0xB5, 0x82, 0xB5, 0x25, 0x02, - 0x04, 0x03, 0x20, 0x44, 0x7F, 0xB4, 0x40, 0x40, 0xA3, 0xD3, 0x99, 0xFE, 0x04, 0x04, 0x02, 0xBC, - 0xFE, 0xB4, 0xA3, 0xDB, 0x59, 0x00, 0xDB, 0xF3, 0x20, 0x40, 0x80, 0x26, 0x55, 0x00, 0xA3, 0xD3, - 0xFF, 0xA0, 0xF8, 0xB4, 0x02, 0x02, 0xA3, 0xDB, 0x1C, 0x00, 0x04, 0xBC, 0xBF, 0xB4, 0xA3, 0xDB, - 0x08, 0xB0, 0x01, 0x64, 0x08, 0x24, 0x02, 0x64, 0x28, 0xFB, 0x20, 0x44, 0x80, 0xBC, 0x40, 0x40, - 0xD0, 0xFE, 0x42, 0x00, 0xBF, 0xB4, 0xA3, 0xDB, 0x3F, 0x00, 0x40, 0xB0, 0xFF, 0xFF, 0xFA, 0x02, - 0xF8, 0xB4, 0xA3, 0xDB, 0x08, 0xB5, 0x07, 0x7C, 0x01, 0x02, 0xDB, 0xF9, 0x20, 0x44, 0x7F, 0xB4, - 0x40, 0x40, 0x1D, 0x60, 0xBA, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0x20, 0xB5, 0x07, 0xB5, 0x08, 0x28, - 0xC4, 0x02, 0x99, 0xFE, 0x29, 0x05, 0x20, 0x44, 0x80, 0x26, 0x26, 0x00, 0x20, 0x2A, 0x03, 0x00, - 0xDF, 0xB4, 0x40, 0x40, 0x74, 0x00, 0x40, 0x2A, 0x1F, 0x00, 0xBF, 0xB4, 0x40, 0x40, 0x09, 0x00, - 0xA8, 0xFF, 0x20, 0x44, 0x99, 0xFE, 0x02, 0x05, 0x80, 0x2A, 0x03, 0x00, 0x40, 0xBC, 0x40, 0x40, - 0x13, 0x00, 0x00, 0xF1, 0x80, 0xBC, 0x40, 0x40, 0x64, 0x44, 0xE0, 0x84, 0xE8, 0x84, 0x0A, 0x36, - 0x29, 0x01, 0x0B, 0x36, 0x59, 0x01, 0x28, 0xFB, 0x01, 0xF1, 0x29, 0xF9, 0x02, 0xF1, 0x2A, 0xF9, - 0x03, 0xF1, 0x2B, 0xF9, 0xD0, 0xFE, 0xAE, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x82, 0x3E, 0x75, 0x44, - 0x02, 0xB0, 0x01, 0xB0, 0x54, 0x02, 0xDC, 0x02, 0x04, 0xB0, 0x08, 0xB0, 0x10, 0x02, 0x2A, 0x02, - 0x40, 0x26, 0xA7, 0xFF, 0x8C, 0xFF, 0x75, 0x40, 0x80, 0x2B, 0x06, 0x00, 0xAB, 0xFF, 0x19, 0x60, - 0xF6, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0xA2, 0xDB, 0x75, 0x44, 0x8D, 0xFF, 0xE5, 0x01, 0x0A, 0xF3, - 0xAA, 0xFF, 0x60, 0x40, 0x20, 0x2B, 0x02, 0x00, 0x38, 0xFF, 0x0D, 0x00, 0x01, 0x26, 0x0C, 0x00, - 0xC0, 0x60, 0x00, 0x7C, 0xA0, 0x84, 0x80, 0x3B, 0x02, 0x00, 0xC0, 0x67, 0x03, 0x00, 0x40, 0x3B, - 0x02, 0x00, 0x00, 0x67, 0x0A, 0xFB, 0xD0, 0x01, 0x19, 0x60, 0xF6, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, - 0xA2, 0xDB, 0xCA, 0x01, 0x0B, 0xF1, 0xAB, 0xFF, 0x64, 0x44, 0xFF, 0x27, 0x1F, 0x00, 0x20, 0x26, - 0x03, 0x00, 0x02, 0x60, 0x00, 0x75, 0x1A, 0x00, 0x19, 0xF3, 0xFF, 0xFF, 0x03, 0x1B, 0x04, 0x60, - 0x00, 0x75, 0x0A, 0x64, 0xCC, 0x84, 0x19, 0xFB, 0x01, 0x60, 0x00, 0x75, 0x64, 0x40, 0x03, 0x22, - 0x0D, 0x00, 0x20, 0x44, 0x80, 0x2A, 0x03, 0x00, 0x20, 0xBC, 0x40, 0x40, 0x07, 0x00, 0xD9, 0xFE, - 0x81, 0x60, 0x0B, 0x64, 0x28, 0xFB, 0x2C, 0x44, 0x29, 0xFB, 0xD0, 0xFE, 0xA5, 0x01, 0xA9, 0xFF, - 0x77, 0x44, 0x60, 0x57, 0x40, 0x4A, 0x01, 0x2A, 0x31, 0x00, 0x24, 0x44, 0xAC, 0x86, 0x08, 0xF2, - 0x2D, 0x03, 0x25, 0x60, 0xFE, 0x65, 0xD4, 0x80, 0x0E, 0xF2, 0x02, 0x03, 0xA5, 0xD5, 0x04, 0x00, - 0x01, 0xBC, 0x0E, 0xFA, 0x09, 0xF4, 0xD1, 0xFE, 0x46, 0x44, 0x11, 0x1B, 0x32, 0x40, 0x80, 0x2A, - 0x1D, 0x00, 0x9D, 0xFE, 0x1B, 0x05, 0x13, 0x60, 0x02, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, - 0x03, 0x03, 0x0F, 0xF2, 0xFF, 0xFF, 0x12, 0x1B, 0x08, 0x60, 0x00, 0x75, 0x0F, 0x00, 0x3F, 0xF2, - 0x48, 0x65, 0xC4, 0x84, 0x13, 0xFB, 0x66, 0x44, 0x10, 0xFB, 0x66, 0x47, 0x20, 0xBF, 0x3B, 0x42, - 0x04, 0xA2, 0xA2, 0xDB, 0x0E, 0xF2, 0x41, 0x75, 0x10, 0xBC, 0x0E, 0xFA, 0x2A, 0x44, 0x08, 0x2A, - 0x17, 0x00, 0x23, 0x44, 0x00, 0xA8, 0x5C, 0x43, 0x13, 0x03, 0x12, 0x60, 0xFC, 0xF5, 0x01, 0x00, - 0x09, 0xF4, 0x0E, 0xF2, 0x0D, 0x18, 0x08, 0xB0, 0x18, 0xAC, 0xFA, 0x03, 0x0E, 0xFA, 0x66, 0x43, - 0x11, 0xFD, 0x46, 0x43, 0x23, 0x47, 0x80, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x28, 0x75, - 0x2A, 0x44, 0x06, 0x22, 0x2D, 0x00, 0x22, 0x44, 0x00, 0xA8, 0x60, 0x46, 0x0E, 0xF2, 0x28, 0x03, - 0x10, 0xB0, 0x01, 0xBC, 0x03, 0x02, 0x00, 0x64, 0x40, 0x42, 0x22, 0x00, 0x0E, 0xFA, 0xD1, 0xFE, - 0x25, 0x60, 0xF2, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x94, 0x00, 0x46, 0x42, 0x19, 0x02, 0x22, 0x47, - 0x40, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x23, 0xF2, 0x66, 0x43, 0x00, 0xA8, 0x0E, 0xF2, - 0x08, 0x02, 0x60, 0x40, 0x02, 0x2A, 0xE4, 0x01, 0x12, 0xFD, 0x10, 0x64, 0x0E, 0xFA, 0x02, 0x75, - 0x07, 0x00, 0x60, 0x40, 0x04, 0x2A, 0xDC, 0x01, 0x12, 0xFD, 0x10, 0x64, 0x0E, 0xFA, 0x04, 0x75, - 0x2A, 0x44, 0x80, 0x2A, 0x19, 0x00, 0x21, 0x44, 0xAC, 0x86, 0x0E, 0xF2, 0x15, 0x03, 0x01, 0xBC, - 0x0E, 0xFA, 0xD1, 0xFE, 0x26, 0x60, 0x0A, 0x64, 0x40, 0x47, 0x58, 0x4F, 0x6A, 0x00, 0x46, 0x41, - 0x0B, 0x02, 0x21, 0x47, 0x10, 0xBF, 0x3B, 0x42, 0x04, 0xA2, 0xA2, 0xDB, 0x0E, 0xF2, 0x66, 0x43, - 0x08, 0xFD, 0x10, 0xBC, 0x0E, 0xFA, 0x80, 0x75, 0x2A, 0x44, 0x10, 0xB0, 0x20, 0x44, 0x18, 0x03, - 0x7F, 0xB4, 0x40, 0x40, 0x1D, 0x60, 0xBA, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, 0x20, 0xB0, 0x80, 0xB0, - 0x09, 0x03, 0x08, 0x03, 0x40, 0xBC, 0x7F, 0xB4, 0x04, 0xB0, 0xA3, 0xDB, 0x03, 0x03, 0x20, 0x44, - 0x80, 0xBC, 0x40, 0x40, 0x2A, 0x40, 0x08, 0x27, 0x03, 0x00, 0xB3, 0x60, 0xC9, 0x78, 0xFF, 0xFF, - 0x2A, 0x40, 0x08, 0x2B, 0x0F, 0x00, 0x32, 0x40, 0x80, 0x26, 0x05, 0x00, 0x19, 0x60, 0xF7, 0xF3, - 0xFF, 0xFF, 0x01, 0x1B, 0x07, 0x00, 0x19, 0x60, 0xF6, 0xF3, 0xFF, 0xFF, 0x01, 0xBC, 0xA2, 0xDB, - 0xFF, 0xFF, 0x10, 0xFF, 0xB3, 0x60, 0xFC, 0x78, 0xFF, 0xFF, 0xE8, 0xFE, 0x14, 0x05, 0xEA, 0xFE, - 0x23, 0x05, 0xE9, 0xFE, 0x1C, 0x05, 0xE7, 0xFE, 0x09, 0x05, 0x47, 0xFF, 0x20, 0x44, 0x0F, 0x22, - 0x03, 0x00, 0xCC, 0x84, 0x40, 0x40, 0x0F, 0x22, 0xB8, 0xFE, 0xEC, 0x01, 0x23, 0x41, 0x00, 0xB9, - 0x5C, 0x4A, 0xE8, 0x02, 0x5A, 0x01, 0x24, 0x41, 0x00, 0xB9, 0x25, 0x60, 0xFE, 0x65, 0x45, 0x47, - 0xE1, 0x02, 0x58, 0x4F, 0x0E, 0x00, 0xDE, 0x02, 0x5C, 0x4A, 0x46, 0x44, 0x38, 0x01, 0x22, 0x41, - 0x00, 0xB9, 0x5C, 0x4A, 0xD7, 0x02, 0x6C, 0x01, 0x21, 0x41, 0x00, 0xB9, 0x5C, 0x4A, 0x92, 0x03, - 0xD1, 0x01, 0x27, 0xD3, 0x03, 0x00, 0x10, 0xB0, 0x09, 0xF2, 0x04, 0x03, 0xAC, 0x86, 0x0E, 0xF2, - 0xFA, 0x02, 0x08, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x0E, 0xF3, 0x0F, 0x60, 0xFE, 0x65, 0x0C, 0xF3, - 0x24, 0x86, 0x24, 0x46, 0x60, 0x40, 0xFB, 0x3B, 0x07, 0x00, 0x80, 0x26, 0x02, 0x00, 0x23, 0x46, - 0x03, 0x4C, 0x46, 0x61, 0x3A, 0x65, 0x0C, 0x00, 0x2E, 0xF3, 0x40, 0x45, 0xF8, 0x2B, 0x02, 0x00, - 0x40, 0x45, 0x03, 0x00, 0x58, 0x4F, 0x5A, 0x00, 0x07, 0x02, 0x58, 0x4F, 0x66, 0x00, 0x04, 0x05, - 0x66, 0x50, 0x65, 0x52, 0x61, 0x51, 0x09, 0x00, 0x26, 0x47, 0x00, 0xBF, 0x0E, 0xFB, 0x2E, 0xF5, - 0x05, 0xF0, 0x80, 0x60, 0x64, 0x50, 0x00, 0x72, 0x7E, 0x71, 0xAC, 0xFF, 0x31, 0x40, 0x01, 0x2A, - 0x08, 0x00, 0x19, 0x60, 0xF2, 0xF3, 0xFF, 0xFF, 0x04, 0x18, 0x0C, 0x64, 0x13, 0x60, 0x13, 0xFB, - 0x2D, 0xFF, 0xB3, 0x60, 0xFC, 0x78, 0xFF, 0xFF, 0x8E, 0xFF, 0x0F, 0xF3, 0x0F, 0x60, 0xFE, 0x65, - 0x24, 0x86, 0x0D, 0xF3, 0x24, 0x46, 0x60, 0x40, 0xFB, 0x3B, 0x07, 0x00, 0x80, 0x26, 0x02, 0x00, - 0x23, 0x46, 0x03, 0x4C, 0x46, 0x61, 0x3A, 0x65, 0x0C, 0x00, 0x2E, 0xF3, 0x40, 0x45, 0xF8, 0x2B, - 0x02, 0x00, 0x40, 0x45, 0x03, 0x00, 0x58, 0x4F, 0x21, 0x00, 0x07, 0x02, 0x58, 0x4F, 0x2D, 0x00, - 0x04, 0x05, 0x66, 0x50, 0x65, 0x52, 0x61, 0x51, 0x09, 0x00, 0x26, 0x47, 0x00, 0xBF, 0x0F, 0xFB, - 0x2E, 0xF5, 0x05, 0xF0, 0x80, 0x60, 0x64, 0x50, 0x00, 0x72, 0x7E, 0x71, 0x8D, 0xFF, 0xAD, 0xFF, - 0x31, 0x40, 0x01, 0x2A, 0xCE, 0x01, 0x19, 0x60, 0xF2, 0xF3, 0xFF, 0xFF, 0x04, 0x18, 0x0C, 0x64, - 0x13, 0x60, 0x13, 0xFB, 0x2D, 0xFF, 0xB3, 0x60, 0xFC, 0x78, 0xFF, 0xFF, 0x25, 0x44, 0xA7, 0xF1, - 0xA8, 0xF1, 0xD0, 0x80, 0xD0, 0x80, 0x07, 0x04, 0x01, 0x06, 0x05, 0x00, 0x25, 0x46, 0x01, 0xF0, - 0x03, 0x67, 0xA0, 0x85, 0x94, 0x80, 0x2F, 0x58, 0xFF, 0xFF, 0x25, 0x46, 0x26, 0x41, 0x46, 0x63, - 0x01, 0xF2, 0xFF, 0xFF, 0xFF, 0xB5, 0xD5, 0x81, 0x00, 0xF2, 0x05, 0x04, 0x04, 0x63, 0x60, 0x46, - 0xF7, 0x1B, 0x42, 0xFE, 0x0D, 0x00, 0x61, 0x44, 0xC5, 0x81, 0x63, 0x45, 0xC5, 0x81, 0x9C, 0x84, - 0xDC, 0x84, 0x01, 0xF2, 0xF0, 0x85, 0xF0, 0x80, 0x65, 0x44, 0xF8, 0x85, 0xFF, 0xFF, 0x02, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0xA2, 0xFF, 0x13, 0x60, 0x08, 0xF3, 0xFF, 0xFF, 0xAC, 0x86, 0x0E, 0xF2, - 0x07, 0x03, 0x00, 0xA8, 0x09, 0xF2, 0xFA, 0x02, 0x01, 0x67, 0x0E, 0xFA, 0x08, 0xFE, 0x17, 0x00, - 0xA9, 0xF3, 0xFF, 0xFF, 0xD8, 0xA0, 0x00, 0xB4, 0x12, 0x06, 0x09, 0x60, 0x08, 0x61, 0x41, 0x4A, - 0x7C, 0xA1, 0x0E, 0xA1, 0xA2, 0xFF, 0xB6, 0x60, 0x58, 0x4E, 0x44, 0x78, 0xFF, 0xFF, 0xA3, 0xFF, - 0x06, 0x03, 0x2A, 0x43, 0xB6, 0x60, 0x58, 0x4E, 0x65, 0x78, 0xFF, 0xFF, 0x08, 0xFE, 0xA3, 0xFF, - 0x2D, 0x58, 0xFF, 0xFF, 0x41, 0x4A, 0x42, 0xA1, 0x03, 0x00, 0x41, 0x4A, 0x7C, 0xA1, 0x0E, 0xA1, - 0xA2, 0xFF, 0xB6, 0x60, 0x58, 0x4E, 0x44, 0x78, 0xFF, 0xFF, 0x07, 0x03, 0x2A, 0x43, 0xB6, 0x60, - 0x58, 0x4E, 0x65, 0x78, 0xFF, 0xFF, 0x08, 0xFE, 0x0C, 0x00, 0x13, 0x60, 0x08, 0xF3, 0xFF, 0xFF, - 0xAC, 0x86, 0x0E, 0xF2, 0x06, 0x03, 0x00, 0xA8, 0x09, 0xF2, 0xFA, 0x02, 0x01, 0x67, 0x0E, 0xFA, - 0x08, 0xFE, 0xA3, 0xFF, 0x2D, 0x58, 0xFF, 0xFF, 0xAA, 0xF3, 0x7C, 0x63, 0x00, 0xBE, 0x40, 0x45, - 0x1A, 0x03, 0x00, 0x65, 0x65, 0x44, 0xDC, 0x85, 0x84, 0xA1, 0x00, 0xF2, 0x06, 0x06, 0x01, 0xFC, - 0x00, 0xA8, 0x60, 0x46, 0xF7, 0x02, 0x40, 0x45, 0x0E, 0x00, 0xA9, 0xF3, 0x00, 0x63, 0xD4, 0x84, - 0xA9, 0xFB, 0x80, 0x60, 0x7C, 0x64, 0x01, 0xFA, 0x00, 0xF0, 0x00, 0xFC, 0xD3, 0x80, 0xAA, 0xF9, - 0x02, 0x02, 0xAB, 0xF9, 0x08, 0xFE, 0x2E, 0x58, 0xFF, 0xFF, 0x66, 0x44, 0x25, 0x46, 0x05, 0xFA, - 0x06, 0xFA, 0x01, 0xF0, 0x03, 0x67, 0x02, 0xFC, 0xB0, 0x84, 0x3A, 0x7E, 0x01, 0xFA, 0x12, 0x64, - 0x03, 0xFA, 0x00, 0xF0, 0x04, 0xF8, 0x00, 0x64, 0x0C, 0x61, 0x10, 0x63, 0x59, 0xDA, 0xFE, 0x1F, - 0x2E, 0x58, 0xFF, 0xFF, 0x27, 0x43, 0xE3, 0x81, 0xE9, 0x81, 0x03, 0x05, 0x16, 0x03, 0x00, 0x61, - 0x01, 0x00, 0xEC, 0x63, 0x61, 0x46, 0xBF, 0xD2, 0x27, 0x45, 0xDC, 0x84, 0xA2, 0xDA, 0xBE, 0xD2, - 0x25, 0x46, 0x88, 0xF8, 0x04, 0x1B, 0x25, 0x44, 0x61, 0x46, 0xA3, 0xDA, 0x04, 0x00, 0x0A, 0xFA, - 0x60, 0x46, 0x25, 0x44, 0x09, 0xFA, 0x61, 0x46, 0xBE, 0xDA, 0x2F, 0x58, 0xFF, 0xFF, 0x25, 0x44, - 0x00, 0xA8, 0x07, 0x4B, 0x0C, 0x03, 0x58, 0x4F, 0x33, 0x00, 0x0B, 0x47, 0x26, 0x60, 0x04, 0x65, - 0x27, 0x44, 0xD4, 0x80, 0x00, 0x64, 0x01, 0x02, 0x0F, 0xFA, 0x58, 0x4F, 0xD3, 0x01, 0x70, 0x00, - 0x25, 0x43, 0xE3, 0x84, 0x7C, 0x41, 0x02, 0x04, 0xE8, 0x81, 0xEC, 0x63, 0x61, 0x46, 0xA3, 0xD2, - 0x00, 0x7C, 0x40, 0x45, 0xBF, 0xD8, 0xA3, 0xD8, 0xBE, 0xD8, 0x27, 0x42, 0x5A, 0xD3, 0x25, 0x5C, - 0x60, 0x41, 0x02, 0x1B, 0x27, 0xD9, 0x05, 0x00, 0x25, 0x46, 0x0A, 0xFA, 0x61, 0x46, 0x25, 0x44, - 0x09, 0xFA, 0x25, 0x44, 0x27, 0x43, 0x00, 0x61, 0x60, 0x46, 0x09, 0xF2, 0x08, 0xFC, 0x00, 0xA8, - 0xDD, 0x81, 0xFA, 0x02, 0xBF, 0xD1, 0x66, 0x44, 0xBE, 0xDB, 0xC1, 0x84, 0xBF, 0xDB, 0x48, 0x00, - 0x25, 0x46, 0xEC, 0x63, 0x08, 0xF2, 0x89, 0xF2, 0x1E, 0x18, 0x40, 0x47, 0xE0, 0x84, 0xE8, 0x85, - 0x02, 0x05, 0xE8, 0x83, 0x00, 0x65, 0x65, 0x46, 0xBF, 0xD2, 0x61, 0x5C, 0xCC, 0x84, 0xA2, 0xDA, - 0x25, 0x46, 0x0A, 0xF2, 0x00, 0xB9, 0x65, 0x46, 0x08, 0x24, 0xBE, 0xDA, 0x02, 0x1B, 0xA3, 0xD8, - 0x02, 0x00, 0x60, 0x46, 0x89, 0xFA, 0x00, 0xB9, 0x61, 0x46, 0x08, 0x28, 0x0A, 0xFA, 0x25, 0x46, - 0x89, 0xFC, 0x8A, 0xFC, 0x88, 0xFC, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x61, 0x28, 0x65, 0x25, 0x43, - 0xAB, 0xF3, 0xAF, 0x83, 0x00, 0xBE, 0x18, 0x03, 0x02, 0x03, 0x00, 0xFC, 0x01, 0x00, 0xAA, 0xFD, - 0x63, 0x46, 0x65, 0x44, 0xCC, 0x85, 0x00, 0xF2, 0x07, 0x02, 0xAB, 0xF5, 0x00, 0x64, 0x00, 0xFA, - 0xDE, 0x60, 0xAF, 0x64, 0x09, 0xFB, 0x08, 0x00, 0x66, 0x43, 0x00, 0xBE, 0xDD, 0x81, 0xF1, 0x02, - 0xA9, 0xF1, 0xAB, 0xFD, 0xC1, 0x84, 0xA9, 0xFB, 0x2E, 0x58, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x45, - 0x29, 0x43, 0xFC, 0xA3, 0x66, 0x44, 0xBD, 0xDB, 0x25, 0x44, 0xBD, 0xDB, 0x00, 0x64, 0xBD, 0xDB, - 0x03, 0x61, 0x0E, 0x65, 0x26, 0x60, 0x18, 0x63, 0x43, 0x49, 0xA3, 0xD3, 0x06, 0xA3, 0x00, 0xA8, - 0xCD, 0x81, 0x04, 0x02, 0xF9, 0x02, 0xB3, 0x60, 0xFC, 0x78, 0xFF, 0xFF, 0x01, 0x26, 0xE6, 0x01, - 0xD4, 0x80, 0x60, 0x45, 0xE3, 0x05, 0xF6, 0xA3, 0xBD, 0xD1, 0xBD, 0xD1, 0x44, 0x47, 0x44, 0x48, - 0x44, 0x45, 0x26, 0x60, 0x5A, 0x64, 0x44, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x25, 0x60, 0xC8, 0x63, - 0x0D, 0x65, 0x00, 0x61, 0x41, 0x48, 0xA3, 0xD3, 0x06, 0xA3, 0xAC, 0x86, 0x00, 0x61, 0x09, 0x03, - 0x00, 0xF2, 0x09, 0xF0, 0xAC, 0x86, 0x00, 0xF2, 0xDD, 0x81, 0xFC, 0x02, 0x64, 0x44, 0xAC, 0x86, - 0xF6, 0x01, 0x61, 0x44, 0x25, 0x46, 0x27, 0xDA, 0x65, 0x44, 0x28, 0x45, 0x45, 0x88, 0xCC, 0x85, - 0x5A, 0x87, 0xE9, 0x02, 0x00, 0x64, 0x27, 0xDA, 0x5A, 0xDA, 0x5A, 0x87, 0xA6, 0xF3, 0xA5, 0xF1, - 0x02, 0xA4, 0x60, 0x46, 0x60, 0x45, 0x00, 0x61, 0x22, 0xF2, 0xFF, 0xFF, 0xAC, 0x86, 0x00, 0xF2, - 0x04, 0x03, 0xAC, 0x86, 0x00, 0xF2, 0xDD, 0x81, 0xFC, 0x02, 0x65, 0x44, 0x02, 0xA5, 0x65, 0x46, - 0x64, 0x44, 0xCC, 0x9C, 0xFF, 0xFF, 0xF0, 0x02, 0x61, 0x44, 0x25, 0x46, 0x27, 0xDA, 0x5A, 0x87, - 0x28, 0x45, 0x45, 0x88, 0x00, 0x64, 0x27, 0xDA, 0x5A, 0x87, 0x06, 0x60, 0x40, 0x65, 0xAA, 0xF3, - 0x01, 0x61, 0xAC, 0x86, 0x00, 0xF2, 0x03, 0x03, 0xD5, 0x80, 0xDD, 0x81, 0xFA, 0x04, 0xCD, 0x84, - 0x25, 0x46, 0x27, 0xDA, 0x28, 0x45, 0xC4, 0x84, 0x5A, 0xDA, 0xDA, 0x81, 0xA9, 0xF1, 0x59, 0xD8, - 0x25, 0x60, 0xC6, 0x64, 0x18, 0x63, 0xA0, 0xD1, 0x06, 0xA4, 0x59, 0xD8, 0xFC, 0x1F, 0x00, 0x64, - 0x59, 0xDA, 0x59, 0xDA, 0x01, 0x60, 0x56, 0x64, 0x0A, 0x63, 0x58, 0xD1, 0x59, 0xD8, 0xFD, 0x1F, - 0xDB, 0xF1, 0x59, 0xD8, 0x75, 0x01, 0x07, 0x4B, 0xB6, 0x60, 0x58, 0x4F, 0xD0, 0x78, 0xFF, 0xFF, - 0x0B, 0x47, 0x58, 0x4F, 0x21, 0x00, 0x6C, 0x01, 0x07, 0x4B, 0xB6, 0x60, 0x58, 0x4F, 0xD0, 0x78, - 0xFF, 0xFF, 0x0B, 0x47, 0x27, 0x44, 0x00, 0xBE, 0x08, 0xF0, 0x15, 0x03, 0x64, 0x42, 0x4A, 0xD3, - 0x09, 0xF2, 0xDC, 0x83, 0xA2, 0xDD, 0x25, 0x43, 0x09, 0xFC, 0x63, 0x46, 0x27, 0x43, 0x0A, 0xFC, - 0x09, 0xFA, 0x08, 0xF8, 0x00, 0xA8, 0x66, 0x43, 0x03, 0x02, 0x64, 0x44, 0x58, 0xDD, 0x03, 0x00, - 0x60, 0x46, 0x25, 0x44, 0x0A, 0xFA, 0x4C, 0x01, 0x27, 0x43, 0xE3, 0x81, 0xE9, 0x81, 0x03, 0x05, - 0x16, 0x03, 0x00, 0x61, 0x01, 0x00, 0xEC, 0x63, 0x61, 0x46, 0xBF, 0xD2, 0x27, 0x45, 0xDC, 0x84, - 0xA2, 0xDA, 0xA3, 0xD2, 0x25, 0x46, 0x88, 0xF8, 0x04, 0x1B, 0x25, 0x44, 0x61, 0x46, 0xBE, 0xDA, - 0x04, 0x00, 0x09, 0xFA, 0x60, 0x46, 0x25, 0x44, 0x0A, 0xFA, 0x61, 0x46, 0xA3, 0xDA, 0x2F, 0x58, - 0xFF, 0xFF, 0xA0, 0xFE, 0x07, 0x05, 0xA3, 0xFE, 0x07, 0x05, 0xA1, 0xFE, 0x48, 0x05, 0x60, 0x64, - 0x3B, 0xDB, 0x11, 0x00, 0x20, 0x58, 0xFF, 0xFF, 0x4F, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x60, - 0xDF, 0xF3, 0xFF, 0xFF, 0xFB, 0xB4, 0xA2, 0xDB, 0xA0, 0x4C, 0x59, 0xBC, 0xFF, 0xB4, 0xA0, 0x51, - 0xA0, 0x4C, 0x7D, 0xB4, 0xA0, 0x51, 0xA1, 0xFF, 0xFF, 0xFF, 0x83, 0x3E, 0x40, 0x60, 0x0B, 0x65, - 0x2B, 0x44, 0x00, 0x63, 0xE8, 0x80, 0xF8, 0x84, 0x02, 0x24, 0x94, 0x84, 0xF3, 0x83, 0xCD, 0x81, - 0xFF, 0xFF, 0xF8, 0x02, 0xDF, 0x83, 0x2F, 0x58, 0x40, 0x4B, 0x00, 0x62, 0x01, 0x64, 0xD4, 0x80, - 0xE0, 0x84, 0x1A, 0x03, 0xD4, 0x80, 0xE0, 0x84, 0x15, 0x03, 0x61, 0x44, 0x11, 0x61, 0xE0, 0x84, - 0xCD, 0x81, 0xFD, 0x04, 0x01, 0x00, 0xE0, 0x84, 0xF2, 0x82, 0xFF, 0xFF, 0x02, 0x24, 0xC6, 0x82, - 0x02, 0x28, 0xD6, 0x82, 0xE2, 0x80, 0xCD, 0x81, 0x02, 0x28, 0x01, 0xBC, 0xF4, 0x02, 0x01, 0x2A, - 0xC6, 0x82, 0x03, 0x00, 0xE9, 0x81, 0xF2, 0x82, 0x61, 0x44, 0x2D, 0x58, 0xFF, 0xFF, 0x00, 0x64, - 0x3B, 0xDB, 0x3C, 0x44, 0xAC, 0x80, 0xFF, 0xFF, 0xC6, 0x02, 0x89, 0xF3, 0x8A, 0xF3, 0x02, 0xA8, - 0x02, 0xA8, 0x08, 0x02, 0x00, 0x64, 0x8B, 0xFB, 0x89, 0xFB, 0x8A, 0xFB, 0x00, 0x64, 0x8C, 0xFB, - 0xCA, 0xFE, 0x2A, 0x00, 0x03, 0x02, 0x00, 0x64, 0x8A, 0xFB, 0xCA, 0xFE, 0x01, 0x64, 0x3B, 0xDB, - 0x12, 0x60, 0xE7, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x13, 0x03, 0xDB, 0xF3, 0x2A, 0xF2, - 0xFD, 0xA0, 0x60, 0x40, 0x80, 0x3A, 0x33, 0x00, 0x32, 0x02, 0x9B, 0xFE, 0x30, 0x05, 0x00, 0x64, - 0x13, 0x60, 0x0A, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xE7, 0x01, 0x8A, 0xF3, 0xFF, 0xFF, 0x01, 0xA8, 0xFF, 0xFF, 0x06, 0x02, 0x12, 0x60, 0xE4, 0xF3, - 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x1B, 0x02, 0x86, 0xFF, 0x20, 0x40, 0x12, 0x27, 0x13, 0x00, - 0x9A, 0xFE, 0x11, 0x04, 0x9D, 0xFE, 0x0F, 0x04, 0x95, 0xF3, 0xFF, 0xFF, 0x80, 0xBC, 0x95, 0xFB, - 0x84, 0xFF, 0xC2, 0x60, 0x45, 0x64, 0x40, 0x42, 0x06, 0x64, 0x13, 0x60, 0x16, 0xFB, 0xFF, 0xFF, - 0x2D, 0xFF, 0x12, 0x64, 0x3B, 0xDB, 0x84, 0xFF, 0xB7, 0x60, 0xF7, 0x78, 0xFF, 0xFF, 0x66, 0x44, - 0xFC, 0xFB, 0x46, 0x5C, 0x19, 0x60, 0xCF, 0xF3, 0x0D, 0xF2, 0x60, 0x5C, 0x64, 0x5F, 0x0D, 0xFA, - 0x11, 0x64, 0x3B, 0xDB, 0x9D, 0xFE, 0x06, 0x05, 0x08, 0x64, 0x13, 0x60, 0x16, 0xFB, 0x2D, 0xFF, - 0xFF, 0xFF, 0xA3, 0xFE, 0x07, 0xF0, 0x00, 0x64, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x02, 0x23, 0xF0, - 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0xBF, 0x60, 0x79, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x00, 0x63, - 0x40, 0x47, 0x50, 0x36, 0x05, 0x00, 0xA4, 0x36, 0x03, 0x00, 0x80, 0x36, 0x01, 0x00, 0x01, 0x63, - 0x48, 0xFD, 0x40, 0x47, 0x08, 0x2A, 0x08, 0x00, 0x03, 0x2F, 0x06, 0x00, 0x7F, 0xF1, 0x2C, 0xF8, - 0x80, 0xF1, 0x2D, 0xF8, 0x81, 0xF1, 0x2E, 0xF8, 0x4A, 0xF3, 0x35, 0xFA, 0x10, 0xA4, 0x4A, 0xFB, - 0x00, 0x64, 0x15, 0xFA, 0x16, 0xFA, 0x0F, 0xFA, 0x07, 0xF0, 0xA6, 0xF3, 0xFF, 0xFF, 0xD0, 0x80, - 0xFF, 0xFF, 0x05, 0x03, 0x66, 0x43, 0x64, 0x46, 0x11, 0xF2, 0xD9, 0xFB, 0x63, 0x46, 0x03, 0xF2, - 0x00, 0xF4, 0x01, 0xF2, 0xFC, 0xA5, 0x00, 0x7F, 0xD4, 0x84, 0x27, 0x45, 0x3C, 0x46, 0x1A, 0xFA, - 0x22, 0x63, 0x7B, 0x60, 0xFF, 0x64, 0xA4, 0x84, 0x03, 0x2B, 0x1C, 0x63, 0x2A, 0xFA, 0x8F, 0xB0, - 0x88, 0x36, 0x02, 0xA3, 0x60, 0x40, 0xA4, 0x36, 0x14, 0x63, 0x43, 0x4C, 0x18, 0xFC, 0x00, 0x7C, - 0x22, 0xF8, 0x64, 0x41, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x3A, 0xF2, 0x63, 0x46, 0xFF, 0xB4, - 0x22, 0xFA, 0x60, 0x40, 0x00, 0x36, 0x82, 0x00, 0x2A, 0xF2, 0xFF, 0xFF, 0x0C, 0xB0, 0x08, 0x3A, - 0xAD, 0x00, 0x60, 0x40, 0x40, 0x26, 0xAA, 0x00, 0x03, 0xF2, 0x00, 0xF4, 0xA0, 0xD2, 0xAA, 0x60, - 0xAA, 0x65, 0x5A, 0xD0, 0xD4, 0x80, 0x03, 0x64, 0x0A, 0x02, 0xD0, 0x80, 0x00, 0x64, 0x5A, 0xD0, - 0x06, 0x02, 0xD0, 0x80, 0xF8, 0x7F, 0xD0, 0x80, 0x01, 0x03, 0x01, 0x02, 0x01, 0x61, 0x62, 0x43, - 0x46, 0x43, 0x3C, 0x46, 0x07, 0xF4, 0x3A, 0xF2, 0xFF, 0xFF, 0xA3, 0x46, 0x60, 0x40, 0x22, 0x26, - 0x64, 0x00, 0x60, 0x45, 0x63, 0x42, 0x5A, 0xD0, 0xCD, 0x81, 0x3C, 0x46, 0x1B, 0x02, 0x64, 0x44, - 0x88, 0x3A, 0x18, 0x00, 0x8E, 0x37, 0x03, 0x00, 0xC7, 0x37, 0x01, 0x00, 0x13, 0x00, 0x65, 0x44, - 0x01, 0x26, 0x7C, 0x00, 0x04, 0x26, 0x03, 0x00, 0x10, 0x26, 0x01, 0x00, 0x31, 0x00, 0xA3, 0x46, - 0x3B, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x27, 0x5B, 0x00, 0xA3, 0x46, 0x00, 0x7C, 0x22, 0xF8, - 0xA3, 0x46, 0x6C, 0x00, 0xA3, 0x46, 0x65, 0x44, 0x01, 0x26, 0x0B, 0x00, 0x04, 0x26, 0x03, 0x00, - 0x10, 0x26, 0x01, 0x00, 0x1D, 0x00, 0x3B, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x27, 0x48, 0x00, - 0x17, 0x00, 0xA6, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0x3A, 0xF2, 0x66, 0x43, 0xFF, 0xB4, 0x3C, 0x46, - 0x22, 0xF0, 0x60, 0x47, 0xB0, 0x84, 0x22, 0xFA, 0x63, 0x46, 0x3B, 0xF0, 0x60, 0x40, 0x04, 0x27, - 0x03, 0x00, 0x10, 0x27, 0x01, 0x00, 0x04, 0x00, 0x64, 0x40, 0x80, 0x27, 0x31, 0x00, 0x00, 0x00, - 0x3C, 0x46, 0x02, 0x65, 0xBF, 0x60, 0x19, 0x78, 0xFF, 0xFF, 0xCD, 0x81, 0x63, 0x42, 0x5A, 0xD0, - 0x3C, 0x46, 0x26, 0x02, 0x64, 0x44, 0x88, 0x3A, 0x23, 0x00, 0x77, 0x37, 0x37, 0x00, 0x78, 0x37, - 0x35, 0x00, 0x8E, 0x37, 0x33, 0x00, 0xC7, 0x37, 0x31, 0x00, 0x1A, 0x00, 0x19, 0x60, 0xA3, 0xF3, - 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x2A, 0x00, 0x06, 0x00, 0x19, 0x60, 0xA3, 0xF3, 0xFF, 0xFF, - 0x60, 0x40, 0x01, 0x2A, 0xE2, 0x01, 0x3C, 0x46, 0x3E, 0xF2, 0x40, 0x60, 0x00, 0x65, 0xF0, 0x84, - 0xA4, 0x84, 0x3D, 0xFA, 0x2A, 0xF2, 0xBF, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0x2A, 0xFA, 0x16, 0x00, - 0x3C, 0x46, 0x22, 0xF0, 0x80, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0xFF, 0xFF, 0x3F, 0xF2, 0x3E, 0xF0, - 0x08, 0xA4, 0x60, 0x41, 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x26, 0x03, 0x00, 0x04, 0x26, - 0x03, 0x00, 0x04, 0x00, 0x04, 0x2B, 0x02, 0x00, 0x61, 0x44, 0x3F, 0xFA, 0x3C, 0x46, 0x2C, 0xF2, - 0x27, 0x40, 0x01, 0x27, 0x32, 0xF2, 0xD3, 0xF1, 0x60, 0x40, 0x01, 0x26, 0x47, 0x00, 0x09, 0x60, - 0x00, 0x64, 0xD0, 0x80, 0x3F, 0xF2, 0x09, 0x06, 0x2C, 0x45, 0xC4, 0x84, 0xD0, 0x80, 0x40, 0x4A, - 0x34, 0x06, 0x60, 0x43, 0x64, 0x44, 0x54, 0x88, 0x17, 0x00, 0x60, 0x45, 0x16, 0x60, 0xC8, 0xF3, - 0xDA, 0xF3, 0x00, 0xBC, 0x60, 0x47, 0xEC, 0xA0, 0x28, 0x03, 0x27, 0x07, 0x2C, 0x44, 0xC4, 0x81, - 0x02, 0x60, 0x1C, 0x65, 0x45, 0x4A, 0xD5, 0x80, 0x2C, 0x45, 0x1F, 0x06, 0x27, 0x40, 0x04, 0x27, - 0x25, 0x00, 0x2A, 0x43, 0xD7, 0x85, 0x45, 0x48, 0xD4, 0xF1, 0x0F, 0xF2, 0xD3, 0x80, 0x01, 0x65, - 0x01, 0x07, 0x00, 0x65, 0xB4, 0x84, 0x0F, 0xFA, 0x00, 0x63, 0x3F, 0xF2, 0x28, 0x45, 0x60, 0x41, - 0xD4, 0x84, 0xDF, 0x83, 0xFC, 0x07, 0x14, 0xFC, 0x17, 0xFA, 0x04, 0x60, 0x00, 0x64, 0x27, 0x45, - 0xB4, 0x84, 0x2A, 0xFA, 0x28, 0x43, 0x16, 0xFC, 0x0D, 0x00, 0x3F, 0xF2, 0x2C, 0x45, 0xD4, 0xF1, - 0xC4, 0x81, 0xD1, 0x80, 0x0F, 0xF2, 0x01, 0x06, 0x01, 0xBC, 0x0F, 0xFA, 0x3F, 0xF2, 0x17, 0xFA, - 0x01, 0x64, 0x14, 0xFA, 0xAA, 0xF2, 0x19, 0x60, 0x3F, 0xF3, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, - 0x44, 0x44, 0x61, 0x40, 0x08, 0x26, 0x02, 0x00, 0x61, 0x40, 0x80, 0x36, 0x12, 0xF2, 0x63, 0x46, - 0x33, 0x60, 0x86, 0x61, 0x00, 0x7F, 0x60, 0x45, 0x45, 0xD3, 0xFF, 0xFF, 0x60, 0x45, 0x00, 0x7F, - 0x4B, 0xFB, 0x65, 0x44, 0x00, 0x7E, 0xDA, 0xFB, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x12, 0xF0, - 0x60, 0x47, 0x63, 0x46, 0x64, 0x40, 0x10, 0x2A, 0x1E, 0x00, 0x33, 0x60, 0x0A, 0x63, 0x60, 0x40, - 0x0A, 0x36, 0x0C, 0x00, 0x14, 0x36, 0x07, 0x00, 0x37, 0x36, 0x02, 0x00, 0xA3, 0xD3, 0x09, 0x00, - 0x02, 0xA3, 0xA3, 0xD3, 0x06, 0x00, 0x04, 0xA3, 0xA3, 0xD3, 0x03, 0x00, 0x06, 0xA3, 0xA3, 0xD3, - 0xFF, 0xFF, 0x60, 0x40, 0x0A, 0x36, 0x70, 0x64, 0x14, 0x36, 0x38, 0x64, 0x37, 0x36, 0x15, 0x64, - 0x6E, 0x36, 0x0B, 0x64, 0x39, 0x00, 0x32, 0x60, 0xFA, 0x63, 0x60, 0x40, 0x0B, 0x36, 0x20, 0x00, - 0x0F, 0x36, 0x1B, 0x00, 0x0A, 0x36, 0x16, 0x00, 0x0E, 0x36, 0x11, 0x00, 0x09, 0x36, 0x0C, 0x00, - 0x0D, 0x36, 0x07, 0x00, 0x08, 0x36, 0x02, 0x00, 0xA3, 0xD3, 0x15, 0x00, 0x02, 0xA3, 0xA3, 0xD3, - 0x12, 0x00, 0x04, 0xA3, 0xA3, 0xD3, 0x0F, 0x00, 0x06, 0xA3, 0xA3, 0xD3, 0x0C, 0x00, 0x08, 0xA3, - 0xA3, 0xD3, 0x09, 0x00, 0x0A, 0xA3, 0xA3, 0xD3, 0x06, 0x00, 0x0C, 0xA3, 0xA3, 0xD3, 0x03, 0x00, - 0x0E, 0xA3, 0xA3, 0xD3, 0xFF, 0xFF, 0x60, 0x40, 0x0B, 0x36, 0x1E, 0x64, 0x0F, 0x36, 0x16, 0x64, - 0x0A, 0x36, 0x12, 0x64, 0x0E, 0x36, 0x0E, 0x64, 0x09, 0x36, 0x0E, 0x64, 0x0D, 0x36, 0x0A, 0x64, - 0x08, 0x36, 0x0A, 0x64, 0x0C, 0x36, 0x0A, 0x64, 0x40, 0x46, 0x2A, 0xF2, 0x07, 0xF0, 0x60, 0x40, - 0xB0, 0x3A, 0x03, 0x00, 0x40, 0x3B, 0x01, 0x00, 0x12, 0x00, 0x0C, 0xB4, 0x08, 0x3A, 0x44, 0x00, - 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x2B, 0x3F, 0x00, 0x17, 0xF2, 0x22, 0xF0, 0xFF, 0xFF, - 0x64, 0x40, 0x22, 0x22, 0x04, 0x00, 0x00, 0xA8, 0x01, 0xA8, 0x36, 0x03, 0x35, 0x03, 0x3C, 0x46, - 0x2A, 0xF0, 0x40, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0x60, 0x45, 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x43, - 0x60, 0x40, 0x01, 0x26, 0x05, 0x00, 0x04, 0x26, 0x1D, 0x00, 0x10, 0x26, 0x10, 0x00, 0x04, 0x00, - 0x04, 0x27, 0x18, 0x00, 0x10, 0x27, 0x0B, 0x00, 0x65, 0x44, 0x2A, 0x61, 0x60, 0x40, 0x03, 0x2B, - 0x24, 0x61, 0x8F, 0xB0, 0x88, 0x36, 0x02, 0xA1, 0x41, 0x4C, 0x98, 0xFA, 0x15, 0x00, 0x65, 0x44, - 0x32, 0x61, 0x60, 0x40, 0x03, 0x2B, 0x2C, 0x61, 0x8F, 0xB0, 0x88, 0x36, 0x02, 0xA1, 0x41, 0x4C, - 0x98, 0xFA, 0x0A, 0x00, 0x65, 0x44, 0x2E, 0x61, 0x60, 0x40, 0x03, 0x2B, 0x28, 0x61, 0x8F, 0xB0, - 0x88, 0x36, 0x02, 0xA1, 0x41, 0x4C, 0x98, 0xFA, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x27, - 0x03, 0x00, 0xBC, 0x60, 0x46, 0x78, 0xFF, 0xFF, 0x22, 0xF2, 0x46, 0x43, 0x60, 0x40, 0x22, 0x26, - 0x09, 0x00, 0x01, 0x26, 0x0A, 0x00, 0x04, 0x26, 0x4B, 0x00, 0x10, 0x26, 0x10, 0x00, 0xBC, 0x60, - 0x46, 0x78, 0xFF, 0xFF, 0xBB, 0x60, 0xC1, 0x78, 0xFF, 0xFF, 0x04, 0x27, 0x3D, 0x00, 0x10, 0x27, - 0x03, 0x00, 0xBC, 0x60, 0x46, 0x78, 0xFF, 0xFF, 0xA6, 0xF3, 0x3C, 0xF1, 0x02, 0x00, 0x07, 0xF2, - 0x00, 0x7C, 0x40, 0x43, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x27, 0x21, 0x00, 0xA3, 0x46, - 0x4B, 0xF2, 0xFF, 0xFF, 0xDC, 0x84, 0x4B, 0xFA, 0x4A, 0xF2, 0x08, 0x04, 0xDC, 0x84, 0x4A, 0xFA, - 0x49, 0xF2, 0x04, 0x04, 0xDC, 0x84, 0x49, 0xFA, 0x01, 0x04, 0xFF, 0xFF, 0xA6, 0xF3, 0x66, 0x5C, - 0xD0, 0x80, 0x00, 0x7C, 0x01, 0x02, 0x3C, 0xF1, 0x4B, 0xF0, 0x64, 0x47, 0x20, 0xBF, 0xA3, 0x46, - 0x3A, 0xF8, 0x3B, 0xFA, 0xA3, 0x46, 0x4A, 0xF2, 0x49, 0xF0, 0xA3, 0x46, 0x3C, 0xFA, 0x3D, 0xF8, - 0x0F, 0x60, 0x9E, 0x64, 0xA3, 0x46, 0x76, 0x61, 0x0E, 0x63, 0x59, 0xD0, 0x58, 0xD9, 0xFD, 0x1F, - 0xA3, 0x46, 0xBC, 0x60, 0x46, 0x78, 0xFF, 0xFF, 0xA6, 0xF3, 0xFF, 0xFF, 0x60, 0x46, 0x02, 0x00, - 0x07, 0xF4, 0xFF, 0xFF, 0xA3, 0x46, 0x2A, 0xF2, 0xA3, 0x46, 0x60, 0x40, 0x08, 0x27, 0x48, 0x00, - 0xA6, 0xF3, 0x66, 0x5C, 0xD0, 0x80, 0x3B, 0xF0, 0x08, 0x03, 0x64, 0x40, 0x10, 0x2A, 0x12, 0x00, - 0xFF, 0x60, 0xEF, 0x64, 0xA0, 0x84, 0x3B, 0xFA, 0x24, 0x00, 0x3D, 0xF3, 0x01, 0x61, 0x60, 0x43, - 0xCF, 0x83, 0xE1, 0x81, 0xFD, 0x0D, 0xE9, 0x81, 0xA1, 0x80, 0xFF, 0xFF, 0x03, 0x03, 0x91, 0x84, - 0x3B, 0xFA, 0x17, 0x00, 0x4B, 0xF2, 0xFF, 0xFF, 0x10, 0xA0, 0xFF, 0xFF, 0x02, 0x04, 0xFF, 0x60, - 0xFF, 0x64, 0xDC, 0x84, 0x4B, 0xFA, 0x4A, 0xF2, 0x16, 0x04, 0xDC, 0x84, 0x4A, 0xFA, 0x49, 0xF2, - 0x08, 0x04, 0xDC, 0x84, 0x49, 0xFA, 0x05, 0x04, 0x3B, 0xF2, 0xFF, 0xFF, 0xE0, 0x84, 0xE8, 0x84, - 0x3B, 0xFA, 0x0C, 0x60, 0xFC, 0x62, 0x80, 0xFF, 0x78, 0x44, 0x03, 0xA4, 0xA2, 0xDB, 0xC8, 0x60, - 0x15, 0x78, 0xFF, 0xFF, 0x84, 0xFF, 0x06, 0x60, 0x17, 0xE1, 0x77, 0x40, 0x8B, 0xFF, 0x02, 0x60, - 0x00, 0x75, 0xC9, 0x60, 0x58, 0x4F, 0xAD, 0x78, 0xFF, 0xFF, 0x01, 0x64, 0x06, 0x60, 0x7F, 0xFB, - 0x0C, 0x60, 0xFC, 0x62, 0x80, 0xFF, 0x78, 0x44, 0x03, 0xA4, 0xA2, 0xDB, 0xC8, 0x60, 0x8C, 0x78, - 0xFF, 0xFF, 0x84, 0xFF, 0x00, 0x7C, 0x06, 0x60, 0x7F, 0xF3, 0xA2, 0xD9, 0x60, 0x40, 0x01, 0x2A, - 0x04, 0x00, 0xC9, 0x60, 0x58, 0x4F, 0xF6, 0x78, 0xFF, 0xFF, 0x3C, 0x46, 0x07, 0xF4, 0xA6, 0xF3, - 0x66, 0x5C, 0xD0, 0x80, 0x00, 0x7C, 0x07, 0x03, 0x66, 0x43, 0x3C, 0x46, 0x22, 0xF2, 0x63, 0x46, - 0x60, 0x40, 0x01, 0x2A, 0x01, 0x00, 0x3C, 0xF1, 0x4B, 0xF0, 0x64, 0x41, 0x64, 0x47, 0xFF, 0xB4, - 0x60, 0x5F, 0x20, 0xBC, 0x80, 0x26, 0x80, 0xAC, 0x60, 0x47, 0xA3, 0x46, 0x3A, 0xFA, 0x64, 0x44, - 0x20, 0x7F, 0x34, 0x94, 0x3B, 0xFA, 0xA3, 0x46, 0x4A, 0xF2, 0x49, 0xF0, 0xA3, 0x46, 0x3C, 0xFA, - 0x3D, 0xF8, 0x80, 0x60, 0x10, 0xE0, 0x08, 0x60, 0x00, 0xEA, 0x0F, 0x64, 0x60, 0x7F, 0xA0, 0x5A, - 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0xBC, 0x60, 0x46, 0x78, - 0xFF, 0xFF, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x27, 0x31, 0x00, 0x2A, 0xF2, 0x00, 0x60, - 0x7C, 0x62, 0x60, 0x40, 0x40, 0x2B, 0x24, 0x00, 0xA2, 0xD3, 0x00, 0x61, 0x60, 0xFE, 0xA0, 0xD3, - 0x5E, 0xD1, 0xFF, 0xFF, 0x20, 0xFE, 0x64, 0x5F, 0xDC, 0x84, 0xF1, 0x81, 0xC0, 0x2B, 0x04, 0x00, - 0x80, 0x2A, 0x02, 0x00, 0x7F, 0xA4, 0xDC, 0x84, 0xFF, 0x3B, 0x03, 0x00, 0x60, 0x47, 0xDC, 0x87, - 0x01, 0x61, 0xC0, 0x80, 0x00, 0x36, 0xDC, 0x84, 0x4E, 0xDB, 0x60, 0xFE, 0x5A, 0xD1, 0xFF, 0xFF, - 0xC1, 0x84, 0xF0, 0x22, 0x10, 0xA4, 0xF0, 0x2A, 0x01, 0x00, 0x00, 0x64, 0xA2, 0xDB, 0x20, 0xFE, - 0x00, 0x60, 0x3E, 0xF3, 0xFF, 0xFF, 0xA0, 0xD3, 0x5A, 0xD1, 0x3A, 0xFA, 0x3B, 0xF8, 0x74, 0x62, - 0xA2, 0xD0, 0xFF, 0xFF, 0x64, 0x44, 0xE0, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xE1, 0x7F, 0x5A, 0xD0, - 0xA0, 0x5A, 0x64, 0x44, 0xE2, 0x7F, 0xA0, 0x5A, 0x00, 0x60, 0x40, 0xF3, 0xFF, 0xFF, 0xA0, 0xD1, - 0x5A, 0xD1, 0x64, 0x45, 0x64, 0x44, 0xE3, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xE4, 0x7F, 0x5A, 0xD1, - 0xA0, 0x5A, 0x64, 0x44, 0xE5, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xE6, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, - 0x64, 0x44, 0xE7, 0x7F, 0xA0, 0x5A, 0x65, 0x40, 0x0D, 0x3A, 0x1C, 0x00, 0x64, 0x47, 0xE8, 0x7F, - 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, 0xE9, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xEA, 0x7F, 0x5A, 0xD1, - 0xA0, 0x5A, 0x64, 0x44, 0xEB, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xEC, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, - 0x64, 0x44, 0xED, 0x7F, 0xA0, 0x5A, 0x64, 0x47, 0xEE, 0x7F, 0x5A, 0xD1, 0xA0, 0x5A, 0x64, 0x44, - 0xEF, 0x7F, 0xA0, 0x5A, 0x08, 0x60, 0x00, 0xEA, 0x65, 0x44, 0x02, 0xA4, 0x60, 0x7F, 0xA0, 0x5A, - 0x80, 0x60, 0x00, 0xEA, 0xA0, 0x60, 0x00, 0xEA, 0xD1, 0x60, 0x00, 0xEA, 0x66, 0x45, 0xAA, 0xF2, - 0x19, 0x60, 0x3F, 0xF3, 0x24, 0x46, 0x61, 0x40, 0x08, 0x26, 0x02, 0x00, 0x61, 0x40, 0x80, 0x36, - 0x12, 0xF2, 0x65, 0x46, 0x60, 0x40, 0x10, 0x26, 0x34, 0x00, 0x2C, 0x45, 0x17, 0xF2, 0x4B, 0xF1, - 0xC4, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x81, 0x64, 0x45, 0x16, 0xA1, 0xB8, 0x60, 0x58, 0x4D, - 0x15, 0x78, 0xFF, 0xFF, 0x7D, 0xF1, 0x01, 0xA4, 0xE0, 0x84, 0xE0, 0x84, 0x64, 0x40, 0x01, 0x2B, - 0x06, 0xA4, 0x1B, 0xFA, 0xDA, 0xF3, 0x2C, 0x60, 0x7C, 0x65, 0x60, 0x40, 0x0B, 0x37, 0x00, 0x63, - 0x0F, 0x37, 0x02, 0x63, 0x0A, 0x37, 0x04, 0x63, 0x0E, 0x37, 0x06, 0x63, 0x09, 0x37, 0x08, 0x63, - 0x0D, 0x37, 0x0A, 0x63, 0x08, 0x37, 0x0C, 0x63, 0x0C, 0x37, 0x0E, 0x63, 0x28, 0xA3, 0x47, 0xD1, - 0xD8, 0xA3, 0xD7, 0x83, 0x19, 0x60, 0x77, 0xF9, 0x47, 0xD1, 0x40, 0x67, 0xB0, 0x84, 0x1F, 0xFA, - 0x58, 0x00, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x36, 0x19, 0x00, 0x50, 0x36, 0x17, 0x00, - 0x40, 0x36, 0x15, 0x00, 0x00, 0x36, 0x13, 0x00, 0x20, 0x36, 0x11, 0x00, 0xA0, 0x36, 0x0F, 0x00, - 0xB0, 0x36, 0x0D, 0x00, 0xC0, 0x36, 0x0B, 0x00, 0xDA, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x0A, 0x37, - 0x06, 0x00, 0x19, 0x60, 0x7B, 0xF3, 0x80, 0x60, 0x00, 0x61, 0x60, 0x40, 0x04, 0x26, 0x00, 0x61, - 0xDA, 0xF3, 0x2C, 0x60, 0x74, 0x65, 0x60, 0x40, 0x0A, 0x37, 0x00, 0x63, 0x14, 0x37, 0x02, 0x63, - 0x37, 0x37, 0x04, 0x63, 0x6E, 0x37, 0x06, 0x63, 0x28, 0xA3, 0x47, 0xD1, 0xD8, 0xA3, 0xD7, 0x83, - 0x19, 0x60, 0x77, 0xF9, 0x47, 0xD1, 0xFF, 0xFF, 0xB1, 0x84, 0x1F, 0xFA, 0xDA, 0xF1, 0x2C, 0x45, - 0x64, 0x43, 0x17, 0xF2, 0x4B, 0xF1, 0xC4, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x81, 0x63, 0x40, - 0x37, 0x37, 0xE1, 0x81, 0x64, 0x45, 0xB8, 0x60, 0x58, 0x4D, 0x15, 0x78, 0xFF, 0xFF, 0xAE, 0x82, - 0xFC, 0xA2, 0x0A, 0x03, 0x63, 0x40, 0x6E, 0x3B, 0x06, 0x00, 0x60, 0x41, 0x04, 0x0D, 0x63, 0x44, - 0x80, 0x7E, 0xDA, 0xFB, 0x61, 0x44, 0xDC, 0x84, 0x2B, 0xF0, 0x1B, 0xFA, 0x64, 0x44, 0x80, 0x27, - 0x58, 0x00, 0x07, 0xF0, 0x66, 0x45, 0x64, 0x46, 0x12, 0xF2, 0x65, 0x46, 0x60, 0x40, 0x10, 0x2A, - 0x31, 0x00, 0x16, 0xF2, 0x0F, 0xF0, 0xAC, 0x84, 0x2C, 0x45, 0x2C, 0x03, 0x4B, 0xF1, 0xC4, 0x84, - 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x81, 0x63, 0x40, 0x37, 0x37, 0xE1, 0x81, 0x64, 0x45, 0x0F, 0xF0, - 0xB8, 0x60, 0x58, 0x4D, 0x15, 0x78, 0xFF, 0xFF, 0xAE, 0x82, 0xFC, 0xA2, 0x0A, 0x03, 0x63, 0x40, - 0x6E, 0x3B, 0x06, 0x00, 0x60, 0x41, 0x04, 0x0D, 0x80, 0x67, 0xB0, 0x84, 0x0F, 0xFA, 0x61, 0x44, - 0xDC, 0x84, 0x1D, 0xFA, 0x1F, 0xF0, 0x01, 0x60, 0x3E, 0x65, 0x64, 0x40, 0x80, 0x27, 0x02, 0x00, - 0x02, 0x60, 0x5E, 0x65, 0x1B, 0xF0, 0x26, 0x41, 0xE1, 0x81, 0xC5, 0x81, 0x44, 0x94, 0xC1, 0x81, - 0x2B, 0xFA, 0x90, 0xFA, 0x26, 0x44, 0x2C, 0xF0, 0x0A, 0xA4, 0x66, 0x45, 0x24, 0x46, 0x92, 0xF2, - 0x65, 0x46, 0x9F, 0xF0, 0x61, 0x40, 0x10, 0x2A, 0x05, 0x00, 0x60, 0xA4, 0x65, 0x40, 0x80, 0x2B, - 0x60, 0xA4, 0x01, 0x00, 0x14, 0xA4, 0x64, 0x40, 0x01, 0x26, 0x00, 0x64, 0x60, 0x45, 0x2A, 0xF2, - 0x39, 0xF0, 0x8F, 0xB0, 0x88, 0x3A, 0x04, 0x00, 0x64, 0x44, 0x60, 0xB0, 0x20, 0x36, 0x00, 0x65, - 0x65, 0x44, 0x11, 0xFA, 0xDA, 0xF3, 0x13, 0xFA, 0x7C, 0x44, 0x1D, 0xFA, 0x0F, 0xF0, 0xFF, 0xFF, - 0x64, 0x40, 0x01, 0x2A, 0x6F, 0x00, 0x7D, 0xF1, 0x19, 0x60, 0x7B, 0xF3, 0x64, 0x40, 0x01, 0x27, - 0x03, 0x00, 0x60, 0x40, 0x02, 0x26, 0x14, 0x00, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x12, 0xF0, - 0x19, 0x60, 0x7C, 0xF3, 0x63, 0x46, 0x64, 0x40, 0x10, 0x2A, 0x20, 0x00, 0x60, 0x40, 0x02, 0x26, - 0x07, 0x00, 0x01, 0x26, 0x08, 0x00, 0x04, 0x26, 0x09, 0x00, 0x06, 0x61, 0x6E, 0x63, 0x08, 0x00, - 0x02, 0x61, 0x14, 0x63, 0x05, 0x00, 0x00, 0x61, 0x0A, 0x63, 0x02, 0x00, 0x04, 0x61, 0x37, 0x63, - 0x00, 0x64, 0x2C, 0x60, 0x9C, 0x65, 0x45, 0xD1, 0xD5, 0x81, 0x19, 0x60, 0x78, 0xF9, 0x2C, 0x60, - 0x74, 0x65, 0x45, 0xD1, 0x1C, 0xFC, 0xB0, 0x84, 0x1E, 0xFA, 0x3C, 0x00, 0x60, 0x40, 0x10, 0x2A, - 0x04, 0x00, 0x08, 0x61, 0x1E, 0x60, 0x0B, 0x63, 0x27, 0x00, 0x20, 0x2A, 0x04, 0x00, 0x0A, 0x61, - 0x16, 0x60, 0x0F, 0x63, 0x21, 0x00, 0x40, 0x2A, 0x04, 0x00, 0x0C, 0x61, 0x12, 0x60, 0x0A, 0x63, - 0x1B, 0x00, 0x80, 0x2A, 0x04, 0x00, 0x0E, 0x61, 0x0E, 0x60, 0x0E, 0x63, 0x15, 0x00, 0x01, 0x2B, - 0x04, 0x00, 0x10, 0x61, 0x0E, 0x60, 0x09, 0x63, 0x0F, 0x00, 0x02, 0x2B, 0x04, 0x00, 0x12, 0x61, - 0x0A, 0x60, 0x0D, 0x63, 0x09, 0x00, 0x04, 0x2B, 0x04, 0x00, 0x14, 0x61, 0x0A, 0x60, 0x08, 0x63, - 0x03, 0x00, 0x16, 0x61, 0x0A, 0x60, 0x0C, 0x63, 0x1E, 0xF0, 0x40, 0x67, 0x2C, 0x60, 0x9C, 0x65, - 0x45, 0xD1, 0xD5, 0x81, 0x19, 0x60, 0x78, 0xF9, 0x2C, 0x60, 0x74, 0x65, 0x45, 0xD1, 0x1C, 0xFC, - 0xB0, 0x84, 0x1E, 0xFA, 0xFF, 0xFF, 0x0D, 0xF2, 0x3E, 0xF0, 0x60, 0x47, 0xFF, 0xB4, 0x64, 0x41, - 0x01, 0xB1, 0x01, 0x63, 0x17, 0x02, 0x60, 0x41, 0xFF, 0x22, 0x04, 0x00, 0xB8, 0x60, 0x58, 0x4F, - 0x06, 0x78, 0xFF, 0xFF, 0x07, 0x60, 0xED, 0xFD, 0x19, 0x60, 0xCF, 0xF3, 0xFF, 0xFF, 0x60, 0x41, - 0x01, 0x63, 0x61, 0x40, 0xFF, 0x22, 0x04, 0x00, 0xB8, 0x60, 0x58, 0x4F, 0x06, 0x78, 0xFF, 0xFF, - 0x07, 0x60, 0xEE, 0xFD, 0x02, 0x64, 0x3B, 0xDB, 0xBF, 0x60, 0xE4, 0x78, 0xFF, 0xFF, 0x66, 0x44, - 0xFC, 0xFB, 0x07, 0xF0, 0x00, 0x64, 0xD0, 0x80, 0xA6, 0xF3, 0x0E, 0x03, 0xD0, 0x80, 0xFF, 0xFF, - 0x0B, 0x03, 0x47, 0xF1, 0x07, 0xF0, 0x64, 0x40, 0x02, 0x26, 0x01, 0x00, 0x08, 0x00, 0x03, 0x12, - 0xBE, 0x60, 0xA0, 0x78, 0xFF, 0xFF, 0xFC, 0x0A, 0xBF, 0x60, 0x00, 0x78, 0xFF, 0xFF, 0x87, 0xF0, - 0xA6, 0xF3, 0x10, 0xF0, 0xD4, 0x80, 0xFF, 0xFF, 0x3D, 0x03, 0x66, 0x43, 0x65, 0x46, 0xFF, 0x67, - 0x20, 0x85, 0x64, 0x5F, 0x40, 0x44, 0x15, 0xF0, 0x25, 0x44, 0xD0, 0x84, 0x03, 0xA4, 0x03, 0x0E, - 0xE8, 0x84, 0xE8, 0x84, 0x04, 0x00, 0xFA, 0xA4, 0xE8, 0x84, 0xE8, 0x87, 0xC0, 0xBF, 0xC0, 0x84, - 0x15, 0xFA, 0x40, 0x45, 0x14, 0xF0, 0x24, 0x44, 0xD0, 0x84, 0x1F, 0xA4, 0x06, 0x0E, 0xE8, 0x84, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x07, 0x00, 0xC2, 0xA4, 0xE8, 0x84, 0xE8, 0x84, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x87, 0xF8, 0xBF, 0xC0, 0x84, 0x14, 0xFA, 0x60, 0x5C, 0x2F, 0x67, - 0xD0, 0x80, 0x60, 0x45, 0x02, 0x28, 0x64, 0x45, 0x25, 0x5C, 0x8B, 0x67, 0xD0, 0x80, 0x60, 0x41, - 0x02, 0x24, 0x64, 0x41, 0xD5, 0x84, 0x80, 0x65, 0xC4, 0x87, 0x01, 0x05, 0x00, 0x64, 0xFF, 0xB4, - 0x0E, 0xFA, 0x63, 0x46, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x17, 0xF2, 0x63, 0x46, 0x60, 0x40, - 0x00, 0x36, 0x2E, 0x00, 0x01, 0x36, 0x1E, 0x00, 0x03, 0x3A, 0x25, 0x00, 0x64, 0x46, 0x10, 0xF2, - 0x11, 0xFA, 0x12, 0xF2, 0x00, 0x61, 0x60, 0x47, 0x00, 0x7F, 0x12, 0xFA, 0x97, 0xFA, 0x46, 0x44, - 0x63, 0x46, 0xC2, 0x60, 0x58, 0x4E, 0x4C, 0x78, 0xFF, 0xFF, 0x65, 0x40, 0x00, 0x3A, 0x04, 0x00, - 0xC2, 0x60, 0x58, 0x4E, 0x96, 0x78, 0xFF, 0xFF, 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x96, 0xFC, - 0x63, 0x46, 0x43, 0x00, 0x64, 0x46, 0x16, 0xF2, 0x00, 0x61, 0x20, 0x28, 0xFF, 0xA4, 0x97, 0xFA, - 0x16, 0xFA, 0x63, 0x46, 0x3A, 0x00, 0x64, 0x46, 0x00, 0x61, 0x97, 0xFA, 0x63, 0x46, 0x35, 0x00, - 0x07, 0xF0, 0x66, 0x41, 0x64, 0x46, 0x16, 0xF2, 0xFF, 0xFF, 0x20, 0x28, 0xFF, 0xA4, 0x16, 0xFA, - 0x93, 0xF4, 0x12, 0xF2, 0x20, 0x28, 0xFF, 0xA3, 0x13, 0xFC, 0x61, 0x46, 0x63, 0x40, 0x00, 0x3A, - 0x24, 0x00, 0xC2, 0x60, 0x58, 0x4E, 0x6D, 0x78, 0xFF, 0xFF, 0x61, 0x40, 0xFF, 0x36, 0x1D, 0x00, - 0x66, 0x41, 0x64, 0x46, 0x12, 0xF2, 0x93, 0xF4, 0x61, 0x46, 0x20, 0x28, 0x16, 0x00, 0x44, 0x44, - 0xC2, 0x60, 0x58, 0x4E, 0x4C, 0x78, 0xFF, 0xFF, 0x24, 0x5C, 0x65, 0x40, 0x00, 0x36, 0x06, 0x00, - 0x66, 0x41, 0x64, 0x46, 0x01, 0x64, 0x17, 0xFA, 0x61, 0x46, 0x07, 0x00, 0x66, 0x43, 0x64, 0x46, - 0xC2, 0x60, 0x58, 0x4E, 0x96, 0x78, 0xFF, 0xFF, 0x63, 0x46, 0xBF, 0x60, 0x00, 0x78, 0xFF, 0xFF, - 0x07, 0xF0, 0x66, 0x43, 0x64, 0x46, 0x17, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0xFF, 0x27, 0xFF, 0xFF, - 0x00, 0x36, 0x07, 0x00, 0x01, 0x36, 0x1C, 0x00, 0x02, 0x36, 0x24, 0x00, 0x03, 0x36, 0x43, 0x00, - 0xFF, 0xFF, 0x19, 0x60, 0xA9, 0xF1, 0x16, 0xF2, 0x43, 0x44, 0xD0, 0x80, 0x33, 0x60, 0x84, 0x61, - 0x09, 0x03, 0xA1, 0xD1, 0x33, 0x60, 0x82, 0x63, 0xC0, 0x84, 0x16, 0xFA, 0xA3, 0xD3, 0xFF, 0xFF, - 0x13, 0xFA, 0x39, 0x00, 0x96, 0xFC, 0xC2, 0x60, 0x58, 0x4E, 0x96, 0x78, 0xFF, 0xFF, 0x33, 0x00, - 0x43, 0x44, 0xC2, 0x60, 0x58, 0x4E, 0x96, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0xC1, 0xF3, 0x96, 0xFC, - 0x13, 0xFA, 0x29, 0x00, 0x63, 0x46, 0x33, 0x60, 0x54, 0x63, 0xA3, 0xD3, 0x15, 0xF2, 0x60, 0x45, - 0xD4, 0x80, 0x07, 0xF0, 0x0C, 0x03, 0x66, 0x41, 0x44, 0x44, 0x64, 0x46, 0x12, 0xF2, 0x61, 0x46, - 0xC2, 0x60, 0x58, 0x4E, 0x4C, 0x78, 0xFF, 0xFF, 0x65, 0x40, 0x00, 0x3A, 0x19, 0x00, 0x66, 0x43, - 0x24, 0x46, 0xC2, 0x60, 0x58, 0x4E, 0x96, 0x78, 0xFF, 0xFF, 0x12, 0xF2, 0x91, 0xF2, 0x90, 0xFA, - 0x60, 0x5F, 0x12, 0xFA, 0x04, 0x00, 0xC2, 0x60, 0x58, 0x4E, 0x96, 0x78, 0xFF, 0xFF, 0x03, 0x64, - 0x17, 0xFA, 0x63, 0x46, 0x05, 0x00, 0x24, 0x43, 0x02, 0x64, 0x17, 0xFA, 0x63, 0x46, 0x00, 0x00, - 0x03, 0x64, 0x3B, 0xDB, 0xCA, 0xFE, 0x47, 0xF1, 0x01, 0x65, 0x32, 0x40, 0x04, 0x27, 0x11, 0x00, - 0x2C, 0xF2, 0x64, 0x45, 0x02, 0x22, 0x0D, 0x00, 0x60, 0x40, 0x01, 0x26, 0x0A, 0x00, 0x2A, 0xF2, - 0x39, 0xF0, 0x8F, 0xB0, 0x88, 0x3A, 0x77, 0x00, 0x64, 0x44, 0x60, 0xB0, 0x20, 0x36, 0x01, 0x00, - 0x72, 0x00, 0x14, 0xF2, 0x65, 0x40, 0x01, 0x26, 0x0C, 0x00, 0x60, 0x45, 0x05, 0x64, 0x3B, 0xDB, - 0x65, 0x44, 0xCC, 0x85, 0x2C, 0x60, 0xD0, 0x64, 0xF1, 0x60, 0x78, 0x41, 0xF0, 0x78, 0xB5, 0xF1, - 0x50, 0x00, 0x60, 0x41, 0x2A, 0xF0, 0x00, 0x60, 0x0C, 0x64, 0xA0, 0x84, 0x04, 0x36, 0x02, 0x00, - 0x0C, 0x3A, 0x01, 0x00, 0x46, 0x00, 0x61, 0x45, 0x60, 0x43, 0x2C, 0x60, 0xD0, 0x64, 0xF1, 0x60, - 0x78, 0x41, 0xF0, 0x78, 0xB5, 0xF1, 0x63, 0x40, 0x08, 0x36, 0x01, 0x00, 0x3A, 0x00, 0x14, 0xF2, - 0x1C, 0x65, 0x60, 0x41, 0x00, 0x63, 0xCD, 0x81, 0xC7, 0x83, 0xFD, 0x02, 0x3F, 0xF0, 0x2C, 0xF2, - 0xC3, 0x83, 0x60, 0x40, 0x01, 0x2A, 0x0D, 0x00, 0x2C, 0x60, 0xCE, 0x64, 0xF1, 0x60, 0x78, 0x41, - 0xE4, 0x78, 0xB5, 0xF1, 0x2C, 0x60, 0xD4, 0x64, 0xF1, 0x60, 0x78, 0x41, 0xEF, 0x78, 0x63, 0x45, - 0x20, 0x00, 0x2C, 0x60, 0xCC, 0x64, 0xF1, 0x60, 0x78, 0x41, 0xE4, 0x78, 0xB5, 0xF1, 0x2C, 0x60, - 0xD2, 0x64, 0xF1, 0x60, 0x78, 0x41, 0xEF, 0x78, 0x63, 0x45, 0x15, 0xF2, 0xFF, 0xFF, 0x0F, 0xB4, - 0x00, 0xA8, 0x01, 0xA8, 0x0E, 0x03, 0x07, 0x03, 0x2C, 0x60, 0xDA, 0x64, 0xF1, 0x60, 0x78, 0x41, - 0xE4, 0x78, 0xB5, 0xF1, 0x06, 0x00, 0x2C, 0x60, 0xD8, 0x64, 0xF1, 0x60, 0x78, 0x41, 0xE4, 0x78, - 0xB5, 0xF1, 0x04, 0x64, 0x3B, 0xDB, 0x25, 0x60, 0xEC, 0x64, 0x13, 0x60, 0x0A, 0xFB, 0x3C, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x5C, 0x5C, 0xFC, 0xFC, 0xCE, 0xFE, - 0xB8, 0x60, 0x37, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0xFF, 0xFF, 0x50, 0xA8, 0x02, 0x7C, 0x09, 0x03, - 0x0F, 0xF0, 0x15, 0xF2, 0x64, 0x41, 0x01, 0x2A, 0x02, 0x00, 0xCD, 0xF1, 0x02, 0x00, 0xCC, 0xF1, - 0xFF, 0xFF, 0x64, 0x45, 0xDC, 0x84, 0xD4, 0x80, 0x15, 0xFA, 0x2D, 0x07, 0x61, 0x40, 0x01, 0x2A, - 0x08, 0x00, 0x16, 0x60, 0x80, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, 0x00, 0x36, 0x00, 0x3B, 0xA2, 0xDB, - 0x07, 0x00, 0x16, 0x60, 0x81, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, 0x00, 0x36, 0x00, 0x3B, 0xA2, 0xDB, - 0x2A, 0xF0, 0x08, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0x00, 0x64, 0x48, 0xFB, 0x19, 0x60, 0xA3, 0xF3, - 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x0C, 0x00, 0x3C, 0x46, 0x3E, 0xF2, 0x40, 0x60, 0x00, 0x65, - 0xF0, 0x84, 0xA4, 0x84, 0x3D, 0xFA, 0x2A, 0xF2, 0xBF, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0x2A, 0xFA, - 0xBA, 0x60, 0x02, 0x78, 0xFF, 0xFF, 0x00, 0x64, 0x49, 0xFB, 0x2C, 0x60, 0xDA, 0x64, 0xF1, 0x60, - 0x78, 0x41, 0xE4, 0x78, 0xB5, 0xF1, 0x2C, 0x60, 0xDC, 0x64, 0xF1, 0x60, 0x78, 0x41, 0xE4, 0x78, - 0xB5, 0xF1, 0x27, 0x44, 0xF7, 0xB4, 0x40, 0x47, 0x23, 0xF0, 0x01, 0x64, 0xB0, 0x84, 0xA2, 0xDA, - 0x98, 0x01, 0xC0, 0x60, 0x5F, 0x78, 0xFF, 0xFF, 0x21, 0x64, 0x3B, 0xDB, 0x31, 0xF3, 0x01, 0x63, - 0xC4, 0xB4, 0x31, 0xFB, 0x32, 0xFD, 0xC0, 0x60, 0x14, 0x62, 0x42, 0x40, 0xA0, 0x4C, 0x40, 0xBC, - 0x7D, 0xB4, 0xA0, 0x51, 0xA0, 0xFE, 0x1A, 0xFF, 0x25, 0x60, 0xE0, 0x64, 0x08, 0xF0, 0x07, 0xF0, - 0xD0, 0x80, 0x25, 0x60, 0xE6, 0x62, 0x13, 0x02, 0xA2, 0xD3, 0x01, 0x63, 0xAC, 0x86, 0x07, 0xF2, - 0x0E, 0x03, 0xD0, 0x80, 0x09, 0xF2, 0xFA, 0x02, 0x23, 0xFC, 0x25, 0x60, 0xEC, 0x64, 0x13, 0x60, - 0x0A, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x3C, 0x46, - 0x06, 0x64, 0xA1, 0xFF, 0x49, 0xFB, 0x83, 0x3E, 0x31, 0xF3, 0x87, 0x60, 0x80, 0x61, 0x1D, 0xF0, - 0x60, 0x40, 0x01, 0x2A, 0x0F, 0x00, 0xFE, 0xB4, 0x31, 0xFB, 0x00, 0x64, 0x49, 0xFB, 0x01, 0x64, - 0x47, 0xFB, 0x00, 0x71, 0x05, 0x64, 0x64, 0x5F, 0x0D, 0xFA, 0x40, 0x64, 0x3B, 0xDB, 0xC0, 0x60, - 0x5F, 0x78, 0xFF, 0xFF, 0x02, 0x2A, 0x18, 0x00, 0xD1, 0x91, 0x8D, 0xE2, 0x41, 0x64, 0x3B, 0xDB, - 0x31, 0xF3, 0x33, 0x60, 0xA6, 0x63, 0xFD, 0xB4, 0x31, 0xFB, 0xA3, 0xD3, 0x02, 0x63, 0x60, 0x5C, - 0x0D, 0xF2, 0x47, 0xFD, 0xFF, 0xB5, 0x60, 0x47, 0xFF, 0xB4, 0xD0, 0x80, 0xDC, 0x84, 0x1F, 0x03, - 0x60, 0x47, 0xB4, 0x84, 0x0D, 0xFA, 0x1B, 0x00, 0x08, 0x2A, 0x07, 0x00, 0x42, 0x64, 0x3B, 0xDB, - 0x31, 0xF3, 0xFF, 0xFF, 0xF7, 0xB4, 0x31, 0xFB, 0x12, 0x00, 0x10, 0x2A, 0x09, 0x00, 0x43, 0x64, - 0x3B, 0xDB, 0x31, 0xF3, 0xFF, 0xFF, 0xEF, 0xB4, 0x31, 0xFB, 0xBF, 0x60, 0xE4, 0x78, 0xFF, 0xFF, - 0x44, 0x64, 0x3B, 0xDB, 0x31, 0xF3, 0xFF, 0xFF, 0xDF, 0xB4, 0x31, 0xFB, 0x00, 0x00, 0x2A, 0x64, - 0x3B, 0xDB, 0xB7, 0x60, 0xF7, 0x64, 0x40, 0x40, 0xBD, 0x60, 0xD7, 0x78, 0xFF, 0xFF, 0x0E, 0x60, - 0xDF, 0xF3, 0xFF, 0xFF, 0x02, 0xB5, 0x04, 0xB5, 0x04, 0x03, 0x03, 0x03, 0xC1, 0x60, 0x70, 0x78, - 0xFF, 0xFF, 0x31, 0x40, 0x01, 0x26, 0x16, 0x00, 0xA0, 0x4C, 0x49, 0xBC, 0xFF, 0xB4, 0xA0, 0x51, - 0x0E, 0x60, 0xDF, 0xF3, 0xFF, 0xFF, 0x02, 0xB5, 0x04, 0xBC, 0x09, 0x03, 0x60, 0x40, 0x01, 0x26, - 0xED, 0xE2, 0xFE, 0xB4, 0xA2, 0xDB, 0xA0, 0x4C, 0x7D, 0xB4, 0xA0, 0x51, 0x03, 0x00, 0xA0, 0x4C, - 0x6D, 0xB4, 0xA0, 0x51, 0xDB, 0xF3, 0xFF, 0xFF, 0xFD, 0xA0, 0xFF, 0xFF, 0x08, 0x24, 0x59, 0x00, - 0x31, 0x40, 0x04, 0x2A, 0x38, 0x00, 0x01, 0x64, 0x19, 0x60, 0xF4, 0xFB, 0x6C, 0xF3, 0x73, 0xF3, - 0xCC, 0x83, 0x6C, 0xFD, 0xCC, 0x84, 0x73, 0xFB, 0x1E, 0x02, 0x31, 0x40, 0x02, 0x2A, 0x12, 0x00, - 0x6E, 0xF3, 0x6F, 0xF1, 0xCC, 0x84, 0x6E, 0xFB, 0x0D, 0x02, 0x6E, 0xF9, 0x31, 0x44, 0x08, 0xBC, - 0x40, 0x51, 0x71, 0xF3, 0x70, 0xF1, 0x00, 0xB8, 0x64, 0x45, 0x01, 0x03, 0x67, 0x45, 0x65, 0x50, - 0xCC, 0x84, 0x72, 0xFB, 0x16, 0x60, 0xAC, 0xF3, 0x6D, 0xF1, 0x00, 0xB8, 0x73, 0xF9, 0x03, 0x03, - 0x85, 0xF3, 0x6C, 0xFB, 0x04, 0x00, 0x6C, 0xF3, 0x85, 0xF1, 0x0D, 0x1B, 0x6C, 0xF9, 0x31, 0x40, - 0x01, 0x2A, 0x09, 0x00, 0x9D, 0xFE, 0x07, 0x05, 0xBA, 0xFE, 0x08, 0x64, 0x13, 0x60, 0x16, 0xFB, - 0x2D, 0xFF, 0xFF, 0xFF, 0xA3, 0xFE, 0x32, 0x40, 0x80, 0x2A, 0x12, 0x00, 0x31, 0x40, 0x04, 0x2A, - 0x0F, 0x00, 0x16, 0x60, 0xAC, 0xF3, 0x6C, 0xF1, 0x03, 0x1B, 0x31, 0x40, 0x02, 0x2A, 0x06, 0x00, - 0x73, 0xF3, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x01, 0x07, 0x60, 0x5C, 0x19, 0x60, 0xF5, 0xF9, - 0x00, 0x64, 0x19, 0x60, 0xF4, 0xFB, 0x0E, 0x60, 0x37, 0xF3, 0xFF, 0xFF, 0xCC, 0x84, 0xFF, 0x2B, - 0xA2, 0xDB, 0xCF, 0xF1, 0x07, 0x60, 0xE9, 0xF3, 0x64, 0x40, 0x02, 0x3A, 0x3A, 0x00, 0x0A, 0x60, - 0x18, 0xF1, 0x10, 0xB4, 0x90, 0x80, 0xFF, 0xFF, 0x34, 0x03, 0x0A, 0x60, 0x18, 0xFB, 0x01, 0x63, - 0x60, 0x40, 0x10, 0x22, 0x00, 0x63, 0x08, 0x60, 0xC1, 0xFD, 0x08, 0x60, 0xC5, 0xFD, 0x08, 0x60, - 0xC9, 0xFD, 0x08, 0x60, 0xCD, 0xFD, 0x7D, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x23, 0x21, 0x00, - 0x0B, 0x36, 0x07, 0x00, 0x0C, 0x36, 0x05, 0x00, 0x0D, 0x36, 0x03, 0x00, 0x0E, 0x36, 0x01, 0x00, - 0x18, 0x00, 0xDB, 0xF3, 0x01, 0x63, 0x0E, 0x60, 0x36, 0xFD, 0x60, 0x40, 0x03, 0x3A, 0x08, 0x00, - 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x09, 0x00, - 0x04, 0x3A, 0x07, 0x00, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x10, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x10, 0x64, 0x3B, 0xDB, 0x7E, 0xF3, 0x73, 0x45, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0xC4, 0x93, 0xC9, 0xFE, 0x49, 0xF3, 0x3C, 0x46, 0x25, 0x18, 0xCC, 0x84, 0x49, 0xFB, - 0x22, 0x02, 0xC2, 0x60, 0x45, 0x64, 0x40, 0x42, 0xFC, 0xFC, 0x00, 0x64, 0x5C, 0x5C, 0x32, 0xFB, - 0x82, 0xFF, 0x5C, 0x47, 0x84, 0xFF, 0x62, 0xFF, 0x16, 0x60, 0x7E, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, - 0x00, 0x36, 0x00, 0x3B, 0xA2, 0xDB, 0x23, 0xF0, 0x01, 0x64, 0xB0, 0x84, 0xA2, 0xDA, 0x25, 0x60, - 0xEC, 0x64, 0x13, 0x60, 0x0A, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xC1, 0xFE, 0xCE, 0xFE, 0x69, 0xF3, 0xFF, 0xFF, 0x60, 0x41, 0xFD, 0xB4, 0xA2, 0xDB, - 0x61, 0x44, 0x01, 0xB0, 0x02, 0xB0, 0x0B, 0x03, 0x0A, 0x02, 0x9D, 0xFE, 0x08, 0x04, 0x1C, 0x60, - 0xCE, 0x64, 0x13, 0x60, 0x20, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x07, 0x00, - 0x7E, 0xF3, 0x73, 0x45, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xC4, 0x93, 0x1D, 0x60, - 0xBA, 0x63, 0xA3, 0xD3, 0xAD, 0x49, 0x20, 0xB5, 0x08, 0xB1, 0x22, 0x03, 0xE1, 0x81, 0x10, 0xB5, - 0x95, 0x81, 0x60, 0x41, 0x18, 0x02, 0x1D, 0x60, 0xBC, 0x7C, 0xA4, 0xD3, 0xFF, 0xFF, 0xCC, 0x84, - 0xA4, 0xDB, 0x16, 0x02, 0x05, 0x64, 0xA4, 0xDB, 0x61, 0x44, 0x07, 0xB4, 0xFF, 0xFF, 0x10, 0x02, - 0x08, 0xB1, 0xE1, 0x81, 0x95, 0x81, 0xA3, 0xD3, 0x0B, 0x03, 0x08, 0xAC, 0x01, 0xBC, 0xA3, 0xDB, - 0xFF, 0xFF, 0x13, 0xFF, 0x05, 0x00, 0x10, 0xAC, 0xA3, 0xDB, 0x05, 0x7C, 0x0E, 0x60, 0xDE, 0xF9, - 0xB8, 0x60, 0x03, 0x78, 0xFF, 0xFF, 0x46, 0xF3, 0x45, 0xF1, 0x04, 0x1B, 0x64, 0x44, 0x02, 0x1B, - 0x07, 0x60, 0xED, 0xF3, 0x45, 0xFB, 0x00, 0x63, 0x46, 0xFD, 0x60, 0x41, 0x25, 0x64, 0x3B, 0xDB, - 0x27, 0x44, 0xEF, 0xB4, 0x40, 0x47, 0x00, 0xB9, 0x71, 0x40, 0x80, 0x27, 0x01, 0x12, 0x27, 0x03, - 0xC1, 0x60, 0xC5, 0x62, 0x84, 0xFF, 0x42, 0x42, 0x82, 0xFF, 0xA0, 0x4C, 0x14, 0xBC, 0xFF, 0xB4, - 0xA0, 0x51, 0x2D, 0x0A, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x70, 0x44, 0xAC, 0x80, 0x27, 0x0A, - 0x71, 0x40, 0x80, 0x27, 0xF7, 0x12, 0x45, 0xF3, 0x48, 0x02, 0x11, 0x18, 0x1B, 0x60, 0xEE, 0xF3, - 0x1B, 0x60, 0xEF, 0xF3, 0x07, 0x18, 0x06, 0x18, 0xAC, 0x4C, 0x80, 0x26, 0x03, 0x00, 0x00, 0x64, - 0x45, 0xFB, 0x05, 0x00, 0x45, 0xF3, 0xFF, 0xFF, 0xCC, 0x84, 0x45, 0xFB, 0xE3, 0x02, 0x06, 0x0A, - 0xA0, 0x4C, 0xFB, 0xB4, 0xA0, 0x51, 0xA4, 0x60, 0x58, 0x78, 0xFF, 0xFF, 0x84, 0xFF, 0xC1, 0x60, - 0xA3, 0x64, 0x40, 0x42, 0x82, 0xFF, 0xA0, 0x4C, 0x14, 0xBC, 0xFF, 0xB4, 0xA0, 0x51, 0xB0, 0x60, - 0x9E, 0x78, 0xFF, 0xFF, 0x3C, 0x44, 0xAC, 0x80, 0x32, 0xF1, 0x25, 0x03, 0x64, 0x40, 0x07, 0x22, - 0x22, 0x00, 0xA4, 0x60, 0x36, 0x78, 0xFF, 0xFF, 0xA0, 0x4C, 0x1C, 0xBC, 0xDF, 0xB4, 0xA0, 0x51, - 0x31, 0x40, 0x08, 0x2A, 0xEF, 0x01, 0x72, 0xF3, 0x70, 0xF1, 0x00, 0xA0, 0xDC, 0x80, 0x05, 0x03, - 0x08, 0x03, 0xCC, 0x84, 0x72, 0xFB, 0x67, 0x50, 0x08, 0x00, 0xCC, 0x84, 0x72, 0xFB, 0x64, 0x50, - 0x04, 0x00, 0x31, 0x44, 0xF7, 0xB4, 0x40, 0x51, 0x06, 0x00, 0x28, 0x64, 0x3A, 0xDB, 0xA0, 0x4C, - 0x30, 0xBC, 0xF3, 0xB4, 0xA0, 0x51, 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x28, 0x64, 0x3B, 0xDB, - 0x07, 0x60, 0xEE, 0xF3, 0x32, 0x40, 0x02, 0x27, 0x16, 0x00, 0x46, 0xFB, 0x14, 0x18, 0xC2, 0x60, - 0x33, 0x64, 0x84, 0xFF, 0x40, 0x42, 0x82, 0xFF, 0xA0, 0x4C, 0x15, 0xBC, 0xF7, 0xB4, 0xA0, 0x51, - 0xA1, 0xFF, 0xFF, 0xFF, 0x81, 0x3E, 0x70, 0x44, 0xAC, 0x80, 0x46, 0xF3, 0xB8, 0x0A, 0xDD, 0x02, - 0xCC, 0x84, 0x46, 0xFB, 0xF5, 0x02, 0x84, 0xFF, 0xC2, 0x60, 0x45, 0x64, 0x40, 0x42, 0x82, 0xFF, - 0x27, 0x44, 0x08, 0xBC, 0x40, 0x47, 0xF9, 0xE1, 0x04, 0x00, 0x78, 0xE1, 0x31, 0x40, 0x01, 0x26, - 0xF9, 0xE1, 0xA4, 0x60, 0x2D, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0xAB, 0xF1, 0x60, 0x45, 0x33, 0x60, - 0x6A, 0x61, 0xC5, 0x83, 0xA3, 0xD3, 0xFF, 0xFF, 0x60, 0x41, 0x66, 0x45, 0x24, 0x46, 0x0E, 0xF2, - 0x65, 0x46, 0x64, 0x45, 0xD5, 0x81, 0x61, 0x45, 0x00, 0x7F, 0xD4, 0x80, 0x64, 0x43, 0x08, 0x04, - 0xE3, 0x83, 0x63, 0x45, 0xC5, 0x81, 0x61, 0x45, 0xD4, 0x80, 0x02, 0x65, 0x03, 0x07, 0x03, 0x00, - 0x00, 0x65, 0x01, 0x00, 0x01, 0x65, 0x2E, 0x58, 0xFF, 0xFF, 0x66, 0x43, 0x64, 0x46, 0x8F, 0xF0, - 0x12, 0xF2, 0x91, 0xF2, 0x60, 0x40, 0x10, 0x36, 0x05, 0x00, 0x12, 0x36, 0x08, 0x00, 0x0C, 0x36, - 0x0B, 0x00, 0x0F, 0x00, 0x40, 0x61, 0xA5, 0x80, 0x0A, 0x64, 0x13, 0x02, 0xF3, 0x01, 0x10, 0x61, - 0xA5, 0x80, 0x0E, 0x64, 0x0E, 0x02, 0xEE, 0x01, 0x08, 0x61, 0xA5, 0x80, 0x10, 0x64, 0x09, 0x02, - 0xE9, 0x01, 0xE1, 0x81, 0xA5, 0x80, 0x03, 0x05, 0xC8, 0x84, 0x03, 0x02, 0xE3, 0x01, 0xFF, 0x61, - 0x02, 0x00, 0x12, 0xFA, 0x91, 0xFA, 0x63, 0x46, 0x2E, 0x58, 0xFF, 0xFF, 0x8F, 0xF0, 0x12, 0xF2, - 0x91, 0xF2, 0x60, 0x40, 0x0A, 0x36, 0x05, 0x00, 0x0E, 0x36, 0x08, 0x00, 0x10, 0x36, 0x0B, 0x00, - 0x0F, 0x00, 0x08, 0x61, 0xA5, 0x80, 0x10, 0x7E, 0x11, 0x02, 0xF3, 0x01, 0x04, 0x61, 0xA5, 0x80, - 0x12, 0x7E, 0x0C, 0x02, 0xEE, 0x01, 0x20, 0x61, 0xA5, 0x80, 0x0C, 0x7E, 0x07, 0x02, 0xE9, 0x01, - 0xE9, 0x81, 0xA5, 0x80, 0x05, 0x05, 0xD8, 0x84, 0x01, 0x02, 0xE3, 0x01, 0x12, 0xFA, 0x91, 0xFA, - 0x2E, 0x58, 0xFF, 0xFF, 0x28, 0x40, 0x08, 0x3A, 0x06, 0x00, 0x04, 0x60, 0x40, 0x62, 0x3D, 0x60, - 0x58, 0x4D, 0x3B, 0x78, 0xFF, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x2B, 0x50, 0x00, - 0x28, 0x40, 0x08, 0x3A, 0x4D, 0x00, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x19, 0x60, - 0x52, 0xFB, 0x7D, 0xF1, 0x2B, 0x60, 0x82, 0x63, 0x64, 0x40, 0x01, 0x27, 0x3C, 0xA3, 0x29, 0x40, - 0x40, 0x2B, 0x1E, 0xA3, 0xBD, 0xD1, 0x63, 0x45, 0x44, 0x4E, 0x0E, 0x61, 0xBD, 0xD1, 0xCD, 0x81, - 0xD0, 0x80, 0x01, 0x03, 0xFB, 0x04, 0xCB, 0x83, 0x19, 0x60, 0x55, 0xF3, 0x39, 0xF1, 0xD7, 0x83, - 0xEB, 0x83, 0x2E, 0x41, 0x5D, 0x93, 0xDF, 0x83, 0x19, 0x60, 0x51, 0xFD, 0x19, 0x60, 0x50, 0xFB, - 0x53, 0x93, 0xDF, 0x80, 0x10, 0x03, 0x38, 0xF3, 0xCF, 0x83, 0x08, 0x03, 0xDF, 0x83, 0x0B, 0x02, - 0xDF, 0x83, 0xDC, 0x84, 0xF0, 0xA0, 0x38, 0xFB, 0x06, 0x03, 0x03, 0x00, 0xCC, 0x84, 0x38, 0xFB, - 0x02, 0x03, 0x00, 0x63, 0x02, 0x00, 0x08, 0x64, 0x38, 0xFB, 0xE3, 0x80, 0xFB, 0x83, 0xC3, 0x83, - 0x63, 0x44, 0xFC, 0xA0, 0x02, 0x0E, 0x08, 0x07, 0x08, 0x00, 0x04, 0xA4, 0xFF, 0xFF, 0x05, 0x0D, - 0xFC, 0x64, 0xFF, 0x7F, 0x60, 0x43, 0x01, 0x00, 0x04, 0x63, 0x39, 0xFD, 0x19, 0x60, 0x54, 0xFD, - 0x2F, 0x58, 0xFF, 0xFF, 0x19, 0x60, 0x74, 0xF3, 0x40, 0x4E, 0x60, 0x46, 0x2F, 0xDB, 0x44, 0x44, - 0xA1, 0xD3, 0xD9, 0x81, 0x48, 0x94, 0x24, 0x5C, 0xD0, 0x9C, 0x66, 0x42, 0x04, 0x06, 0xD2, 0x9C, - 0x2F, 0xD9, 0x64, 0x46, 0x24, 0x44, 0xE0, 0x84, 0x44, 0xD3, 0xA3, 0xDB, 0xFF, 0xB4, 0x60, 0x5C, - 0x66, 0x44, 0x22, 0xA4, 0xD0, 0x84, 0xE0, 0xA0, 0x02, 0x0D, 0x00, 0x64, 0x02, 0x00, 0x01, 0x04, - 0x1F, 0x64, 0xA2, 0xD3, 0x60, 0x5C, 0x64, 0x5E, 0x60, 0x47, 0x2F, 0xD1, 0x28, 0xA3, 0xA3, 0xD9, - 0xD8, 0xA3, 0x2E, 0x42, 0x4E, 0x8E, 0xBD, 0xDB, 0xDB, 0x02, 0x2D, 0x58, 0xFF, 0xFF, 0x43, 0xFF, - 0x39, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x84, 0x3E, 0xFB, 0x01, 0x3D, 0x44, 0x00, 0xA8, 0xFF, 0xFF, - 0x03, 0x02, 0x40, 0xFF, 0x44, 0xFF, 0xF4, 0x01, 0xA0, 0x4C, 0x3D, 0x46, 0x2A, 0xF2, 0x46, 0x4D, - 0x92, 0xFC, 0x10, 0x25, 0x12, 0x00, 0x09, 0xE1, 0xA1, 0xFF, 0x2D, 0x46, 0x0F, 0xF2, 0x01, 0x29, - 0x06, 0x00, 0x2A, 0xF0, 0x40, 0xFF, 0x64, 0x40, 0x40, 0x2B, 0x08, 0xBC, 0x02, 0xBC, 0x0F, 0xFA, - 0x08, 0x25, 0xDD, 0x01, 0xCB, 0xFE, 0x5C, 0x5D, 0xDB, 0x01, 0x44, 0xFF, 0x31, 0xF2, 0x1D, 0x60, - 0xC0, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, - 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x31, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, - 0x61, 0x46, 0x30, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x2F, 0xF0, - 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, - 0xA6, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x07, 0xFC, 0x3F, 0xF2, 0x09, 0x60, 0xB0, 0x65, - 0xD4, 0x80, 0x2A, 0xF2, 0xC0, 0x05, 0x08, 0x25, 0xAA, 0x01, 0x5C, 0x4B, 0x0C, 0x60, 0xEA, 0x61, - 0xA1, 0xDF, 0x2D, 0x46, 0x3B, 0xF2, 0xA6, 0xF1, 0x87, 0xF4, 0x60, 0x40, 0x20, 0x2B, 0xC1, 0x00, - 0xD3, 0x80, 0x2C, 0xF0, 0xB0, 0x03, 0x07, 0xF4, 0x64, 0x40, 0x01, 0x26, 0xA6, 0xF5, 0xBA, 0xF4, - 0x2D, 0x46, 0x04, 0x64, 0x04, 0xB3, 0x22, 0xF0, 0x03, 0x03, 0xC5, 0x60, 0xE2, 0x78, 0xFF, 0xFF, - 0x10, 0x64, 0xB0, 0x9C, 0x3B, 0xF2, 0x22, 0xF8, 0x60, 0x47, 0xC0, 0xB7, 0x02, 0xFE, 0xF0, 0x84, - 0xF0, 0x84, 0xF0, 0x84, 0x00, 0xA8, 0x40, 0x4A, 0x17, 0x03, 0xE0, 0x81, 0x61, 0x43, 0x42, 0xFE, - 0x00, 0x64, 0xF0, 0x84, 0xFE, 0x1F, 0x40, 0x4A, 0xE1, 0x84, 0xE0, 0x84, 0x2D, 0x46, 0x07, 0xF4, - 0xE0, 0x81, 0x3B, 0xF0, 0x2A, 0x47, 0x0C, 0x60, 0x38, 0x63, 0xA0, 0x84, 0x47, 0x9C, 0x10, 0x03, - 0x7C, 0x44, 0x00, 0x60, 0xB2, 0x63, 0x1C, 0x00, 0x07, 0xF4, 0x3B, 0xF0, 0x66, 0x44, 0x64, 0x40, - 0x80, 0x2B, 0x06, 0x00, 0x00, 0x60, 0x78, 0x7C, 0x00, 0x60, 0xA2, 0x63, 0x43, 0x4C, 0x10, 0x00, - 0x2D, 0x46, 0xC5, 0x60, 0xD5, 0x78, 0xFF, 0xFF, 0x2D, 0x46, 0x22, 0xF2, 0x10, 0x60, 0x00, 0x7C, - 0xB0, 0x84, 0x22, 0xFA, 0x32, 0x40, 0x04, 0x26, 0x25, 0x00, 0xC5, 0x60, 0xD5, 0x78, 0xFF, 0xFF, - 0xED, 0xFB, 0xEE, 0xF9, 0xEF, 0xFD, 0xAD, 0x46, 0x3D, 0xF2, 0xAD, 0x46, 0xA3, 0xD0, 0xAD, 0x46, - 0xD0, 0x80, 0x3C, 0xF2, 0xAD, 0x46, 0x02, 0x03, 0x15, 0x07, 0xE6, 0x04, 0x5B, 0xD0, 0xAD, 0x46, - 0xD0, 0x80, 0x3A, 0xF2, 0x03, 0x03, 0xAD, 0x46, 0x0D, 0x07, 0xDE, 0x04, 0x3A, 0xF0, 0xAD, 0x46, - 0x5B, 0xD0, 0x64, 0x44, 0xD0, 0x80, 0x2B, 0x44, 0x05, 0x07, 0xD6, 0x03, 0xD0, 0x84, 0x10, 0xA4, - 0xFF, 0xFF, 0x00, 0x07, 0xEE, 0xF3, 0xED, 0xF5, 0xFE, 0xA4, 0x0F, 0x60, 0xBE, 0x61, 0x0E, 0x63, - 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x2D, 0x46, 0x8B, 0xFF, 0x2D, 0x46, 0x22, 0xF2, 0x20, 0x60, - 0x00, 0x7C, 0xB0, 0x84, 0x22, 0xFA, 0x0F, 0x60, 0xB0, 0x64, 0xC9, 0x60, 0x58, 0x4F, 0x56, 0x78, - 0xFF, 0xFF, 0x3F, 0xF2, 0x00, 0x60, 0x18, 0x70, 0x18, 0x71, 0x20, 0x72, 0x60, 0x53, 0x88, 0x75, - 0x00, 0xF2, 0x09, 0xE1, 0x60, 0x50, 0x12, 0x71, 0x6E, 0x72, 0x83, 0x75, 0xA1, 0xFF, 0xFF, 0xFF, - 0x08, 0x25, 0x1D, 0x00, 0x40, 0xFF, 0x02, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x75, 0x40, 0x03, 0x2A, - 0x03, 0x00, 0x80, 0x75, 0x0A, 0x64, 0x0B, 0x00, 0x80, 0x75, 0x1B, 0xF3, 0x8B, 0xFF, 0x02, 0x60, - 0x00, 0x75, 0xFF, 0xFF, 0x02, 0x60, 0x00, 0x75, 0xDC, 0x84, 0xA2, 0xDB, 0x02, 0x64, 0x98, 0xFF, - 0x2D, 0x46, 0x0F, 0xF0, 0xFF, 0xFF, 0xB0, 0x84, 0xA2, 0xDA, 0x88, 0xFF, 0x0B, 0x01, 0x8B, 0xFF, - 0x02, 0x60, 0x00, 0x75, 0xFF, 0xFF, 0x02, 0x60, 0x00, 0x75, 0x88, 0xFF, 0xC5, 0x60, 0xBB, 0x78, - 0xFF, 0xFF, 0x22, 0xF0, 0x22, 0x64, 0xB0, 0x84, 0x22, 0xFA, 0x3A, 0xF0, 0xFF, 0xFF, 0x64, 0x44, - 0xE0, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xE1, 0x7F, 0x5A, 0xD0, 0xA0, 0x5B, 0x64, 0x44, 0xE2, 0x7F, - 0xA0, 0x5B, 0x64, 0x47, 0x7C, 0x5F, 0xE8, 0x84, 0xE8, 0x85, 0x0D, 0x60, 0x00, 0x64, 0x44, 0xD3, - 0x5A, 0xD1, 0x03, 0x1B, 0xC5, 0x60, 0xD5, 0x78, 0xFF, 0xFF, 0x60, 0x45, 0x64, 0x44, 0xE3, 0x7F, - 0xA0, 0x5B, 0x64, 0x47, 0xE4, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, 0xE5, 0x7F, 0xA0, 0x5B, - 0x64, 0x47, 0xE6, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, 0xE7, 0x7F, 0xA0, 0x5B, 0x65, 0x40, - 0x0D, 0x3A, 0x1C, 0x00, 0x64, 0x47, 0xE8, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, 0xE9, 0x7F, - 0xA0, 0x5B, 0x64, 0x47, 0xEA, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, 0xEB, 0x7F, 0xA0, 0x5B, - 0x64, 0x47, 0xEC, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, 0xED, 0x7F, 0xA0, 0x5B, 0x64, 0x47, - 0xEE, 0x7F, 0x5A, 0xD1, 0xA0, 0x5B, 0x64, 0x44, 0xEF, 0x7F, 0xA0, 0x5B, 0x65, 0x44, 0xD8, 0x84, - 0x08, 0x25, 0x25, 0x00, 0x60, 0x7F, 0xA0, 0x5B, 0x80, 0x60, 0x00, 0xEB, 0xA0, 0x60, 0x00, 0xEB, - 0xD1, 0x60, 0x00, 0xEB, 0x22, 0xF2, 0x20, 0x60, 0x00, 0x7C, 0xB0, 0x84, 0x22, 0xFA, 0x3F, 0xF2, - 0x3B, 0xF0, 0x60, 0x43, 0xFC, 0xA4, 0x64, 0x40, 0x20, 0x2B, 0x04, 0x00, 0x08, 0xA4, 0x3F, 0xFA, - 0x08, 0xA3, 0xF8, 0xA3, 0x3F, 0xFA, 0x0A, 0xE1, 0xB3, 0xFF, 0x9A, 0xFF, 0xCB, 0x83, 0x00, 0xF4, - 0x10, 0x62, 0x6C, 0x61, 0x0E, 0xA3, 0xAB, 0x84, 0xF2, 0xA3, 0xA1, 0xFF, 0x09, 0x00, 0xDA, 0x00, - 0x00, 0xF4, 0x81, 0xF2, 0xFC, 0x18, 0x02, 0x62, 0xC9, 0x81, 0xAB, 0x84, 0x01, 0x00, 0xA2, 0xDC, - 0x7A, 0xD4, 0xFD, 0x1C, 0xA2, 0xDC, 0x08, 0x25, 0xCE, 0x00, 0xF2, 0x1D, 0x41, 0x44, 0x7C, 0xA8, - 0xD9, 0x81, 0xEE, 0x03, 0xFF, 0xB1, 0x98, 0xFF, 0x09, 0xE1, 0xA1, 0xFF, 0xFF, 0xFF, 0x64, 0x40, - 0x20, 0x27, 0x04, 0x00, 0x08, 0x25, 0xBF, 0x00, 0x7B, 0x1E, 0x6F, 0x00, 0x08, 0x25, 0xBB, 0x00, - 0x40, 0xFF, 0x42, 0x42, 0x46, 0x43, 0x06, 0x1E, 0x04, 0x02, 0x00, 0xF4, 0x02, 0x62, 0x42, 0x42, - 0x46, 0x43, 0x01, 0xA2, 0x63, 0x45, 0x01, 0xA2, 0x62, 0x43, 0x46, 0x4C, 0xC6, 0x60, 0x58, 0x4F, - 0x87, 0x78, 0xFF, 0xFF, 0x0A, 0xE1, 0x9A, 0xFF, 0x2D, 0x46, 0x12, 0xF2, 0x3B, 0xF0, 0x33, 0x1B, - 0x64, 0x40, 0x20, 0x2B, 0x38, 0x00, 0x2D, 0x5C, 0x24, 0x41, 0x02, 0xA1, 0x65, 0x43, 0x08, 0xA3, - 0x23, 0x46, 0x22, 0x42, 0x7E, 0x3A, 0x0A, 0x00, 0x00, 0xF4, 0x81, 0xF2, 0xB8, 0x18, 0x02, 0x62, - 0xC9, 0x81, 0xAB, 0x84, 0x03, 0x00, 0xA2, 0xDC, 0x7E, 0x36, 0xF6, 0x01, 0x15, 0x11, 0x7A, 0xD4, - 0xFF, 0xFF, 0xF9, 0x1C, 0xA2, 0xDC, 0xF0, 0x1D, 0xD9, 0x81, 0xFF, 0xB1, 0x41, 0x1E, 0x62, 0x40, - 0x7E, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x02, 0x62, 0x07, 0x11, 0x5A, 0xD2, 0x89, 0xFF, 0x80, 0x4F, - 0x6F, 0x44, 0xA2, 0xDA, 0x88, 0xFF, 0x34, 0x00, 0x62, 0x45, 0x33, 0xF3, 0xFF, 0xFF, 0x03, 0x1B, - 0x65, 0x42, 0xE5, 0x1D, 0xF2, 0x01, 0x98, 0xFF, 0x2D, 0x46, 0x01, 0x64, 0x12, 0xFA, 0x0F, 0xF0, - 0x0A, 0x64, 0xB0, 0x84, 0x41, 0x00, 0x24, 0x41, 0x02, 0xA1, 0x65, 0x43, 0x08, 0xA3, 0x23, 0x46, - 0x22, 0x42, 0x7E, 0x3A, 0x0A, 0x00, 0x00, 0xF4, 0x81, 0xF2, 0x5C, 0x18, 0x02, 0x62, 0xC9, 0x81, - 0xAB, 0x84, 0x03, 0x00, 0xA2, 0xDC, 0x7E, 0x36, 0xF6, 0x01, 0x7A, 0xD4, 0xFF, 0xFF, 0xFA, 0x1C, - 0xA2, 0xDC, 0xF1, 0x1D, 0xD9, 0x81, 0xFF, 0xB1, 0x0B, 0x1E, 0x62, 0x40, 0x7E, 0x3A, 0x02, 0x00, - 0x00, 0xF4, 0x02, 0x62, 0x5A, 0xD2, 0x89, 0xFF, 0x80, 0x4F, 0x6F, 0x44, 0xA2, 0xDA, 0x88, 0xFF, - 0x98, 0xFF, 0x2D, 0x46, 0x0F, 0xF0, 0x0A, 0x64, 0xB0, 0x84, 0x16, 0x14, 0xF7, 0xB4, 0xA2, 0xDA, - 0x06, 0x60, 0x75, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x0B, 0x00, 0xF0, 0xF5, 0xEF, 0xF4, - 0x0C, 0x60, 0xEA, 0x61, 0x59, 0xD1, 0x3B, 0xF8, 0x05, 0x64, 0x59, 0xD1, 0xCC, 0x84, 0xBD, 0xD8, - 0xFC, 0x02, 0xC3, 0x60, 0x6A, 0x78, 0xFF, 0xFF, 0xA2, 0xDA, 0x2D, 0x46, 0x3B, 0xF0, 0xFF, 0xFF, - 0x64, 0x40, 0x20, 0x2B, 0x1C, 0x00, 0x07, 0xF4, 0xBB, 0xF0, 0x2A, 0x44, 0xA4, 0x84, 0xFF, 0xFF, - 0x2F, 0x26, 0x15, 0x00, 0x2D, 0x46, 0x64, 0x44, 0x3A, 0xF0, 0xBC, 0xF0, 0x64, 0x5F, 0x3D, 0xF0, - 0x07, 0xF4, 0xEF, 0xF4, 0xFF, 0xFF, 0x08, 0xA3, 0x5B, 0xD8, 0x65, 0x5C, 0x5B, 0xD8, 0x5B, 0xDA, - 0x2D, 0x46, 0xED, 0xF3, 0x3C, 0xFA, 0xEE, 0xF3, 0x3D, 0xFA, 0x2A, 0x44, 0x23, 0xFA, 0xC3, 0x60, - 0x6A, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0xFF, 0x43, 0xFF, 0x40, 0xFF, 0xB0, 0xFF, 0xB1, 0xFF, - 0x2D, 0x46, 0x0C, 0x60, 0xEA, 0x61, 0xA1, 0xD3, 0x2D, 0x46, 0x60, 0x40, 0x01, 0x2A, 0x0A, 0x00, - 0xF0, 0xF5, 0xEF, 0xF4, 0x59, 0xD1, 0x3B, 0xF8, 0x05, 0x64, 0x59, 0xD1, 0xCC, 0x84, 0xBD, 0xD8, - 0xFC, 0x02, 0x2D, 0x46, 0xC3, 0x60, 0x48, 0x78, 0xFF, 0xFF, 0x98, 0xFF, 0x09, 0xE1, 0xA1, 0xFF, - 0x2D, 0x46, 0x08, 0x25, 0xE0, 0x01, 0x0F, 0xF2, 0x40, 0xFF, 0x02, 0xBC, 0xA2, 0xDA, 0xC3, 0x60, - 0x6A, 0x78, 0xFF, 0xFF, 0xB0, 0x84, 0x22, 0xFA, 0xA0, 0x60, 0x00, 0xEB, 0xB0, 0x60, 0x00, 0xEB, - 0x00, 0x63, 0x3B, 0xF2, 0x06, 0x60, 0x75, 0xFD, 0x60, 0x47, 0xC0, 0xB7, 0x02, 0xFE, 0xF0, 0x84, - 0xF0, 0x84, 0xF0, 0x84, 0x00, 0xA8, 0x40, 0x4A, 0x16, 0x03, 0xE0, 0x81, 0x61, 0x43, 0x42, 0xFE, - 0x00, 0x64, 0xF0, 0x84, 0xFE, 0x1F, 0x40, 0x4A, 0xE1, 0x84, 0xE0, 0x84, 0x2D, 0x46, 0x07, 0xF4, - 0xE0, 0x81, 0x3B, 0xF0, 0x2A, 0x47, 0x0C, 0x60, 0x38, 0x63, 0xA0, 0x84, 0x47, 0x9C, 0x10, 0x03, - 0x7C, 0x44, 0xA8, 0x63, 0x0F, 0x00, 0x07, 0xF4, 0x20, 0x64, 0x40, 0x4A, 0x3B, 0xF0, 0x66, 0x44, - 0x64, 0x40, 0x80, 0x2B, 0x05, 0x00, 0x00, 0x60, 0x78, 0x7C, 0x00, 0x60, 0x98, 0x63, 0x02, 0x00, - 0x2D, 0x46, 0xBB, 0x01, 0x2D, 0x46, 0xED, 0xFB, 0xEE, 0xF9, 0xEF, 0xFD, 0x07, 0xF2, 0xF0, 0xFB, - 0x60, 0x46, 0x3B, 0xF0, 0x2A, 0x44, 0x06, 0x60, 0x76, 0xF9, 0x5C, 0x4B, 0xA0, 0x84, 0xFF, 0xFF, - 0x3F, 0x22, 0x05, 0x00, 0x90, 0x84, 0x3B, 0xFA, 0x01, 0x64, 0x40, 0x4B, 0x2C, 0x00, 0xAD, 0x46, - 0x0A, 0xA3, 0x3D, 0xF2, 0xAD, 0x46, 0xA3, 0xD0, 0xAD, 0x46, 0xD0, 0x80, 0x3C, 0xF2, 0xAD, 0x46, - 0x02, 0x03, 0x21, 0x07, 0x14, 0x04, 0x5B, 0xD0, 0xAD, 0x46, 0xD0, 0x80, 0x3B, 0xF2, 0x03, 0x03, - 0xAD, 0x46, 0x19, 0x07, 0x0C, 0x04, 0x3A, 0xF0, 0xAD, 0x46, 0x5B, 0xD0, 0x64, 0x5F, 0xD0, 0x80, - 0x2B, 0x44, 0x22, 0x07, 0x04, 0x03, 0xD0, 0x84, 0x10, 0xA4, 0xFF, 0xFF, 0x1D, 0x07, 0x2D, 0x46, - 0x22, 0xF2, 0x10, 0x60, 0x00, 0x7C, 0xB0, 0x84, 0x22, 0xFA, 0x32, 0x40, 0x04, 0x26, 0x14, 0x00, - 0xC5, 0x60, 0xD5, 0x78, 0xFF, 0xFF, 0x01, 0x64, 0x06, 0x60, 0x75, 0xFB, 0x2D, 0x46, 0x0C, 0x60, - 0xFA, 0x62, 0x80, 0xFF, 0x78, 0x44, 0x03, 0xA4, 0xA2, 0xDB, 0xC6, 0x60, 0xBC, 0x78, 0xFF, 0xFF, - 0x85, 0xFF, 0x2D, 0x46, 0x08, 0x25, 0x4F, 0x01, 0x2D, 0x46, 0x0C, 0x60, 0xFA, 0x62, 0x80, 0xFF, - 0x78, 0x44, 0x03, 0xA4, 0xA2, 0xDB, 0xC7, 0x60, 0x44, 0x78, 0xFF, 0xFF, 0x85, 0xFF, 0x2D, 0x46, - 0x08, 0x25, 0x41, 0x01, 0x00, 0x60, 0x0F, 0x64, 0x08, 0x25, 0x3C, 0x01, 0x60, 0x7F, 0xA0, 0x5B, - 0x80, 0x60, 0x00, 0xEB, 0xD3, 0x60, 0x00, 0xEB, 0xC4, 0x60, 0xC2, 0x78, 0xFF, 0xFF, 0x2D, 0x46, - 0x3B, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x20, 0x2B, 0x23, 0x00, 0x08, 0x61, 0x23, 0x11, 0x2D, 0x46, - 0x00, 0xF4, 0x0A, 0x62, 0x56, 0x92, 0x5A, 0xD0, 0x2C, 0x46, 0x64, 0x47, 0x63, 0x40, 0x7F, 0x2A, - 0x03, 0x00, 0x00, 0xF4, 0x03, 0x63, 0x46, 0x4C, 0x60, 0xFE, 0xDE, 0xD8, 0x7F, 0x3A, 0x03, 0x00, - 0x00, 0xF4, 0x03, 0x63, 0x46, 0x4C, 0xDE, 0xDA, 0xFE, 0xA1, 0x20, 0xFE, 0xE7, 0x02, 0x63, 0x41, - 0xFD, 0xA1, 0x46, 0x4C, 0x01, 0xF2, 0x2D, 0x46, 0x61, 0x5E, 0x16, 0xFA, 0x2C, 0x44, 0x06, 0xFA, - 0x2F, 0x58, 0xFF, 0xFF, 0x2D, 0x5C, 0x3D, 0x44, 0x00, 0xA8, 0xD0, 0x80, 0xD8, 0x03, 0xD7, 0x03, - 0x2D, 0x46, 0x01, 0x64, 0x12, 0xFA, 0xF4, 0x01, 0x07, 0xF4, 0x66, 0x41, 0x03, 0xF2, 0x04, 0xF2, - 0x40, 0x42, 0x05, 0xF2, 0x40, 0x43, 0x40, 0x44, 0x61, 0x46, 0x3C, 0xF2, 0x3D, 0xF2, 0x40, 0x40, - 0x40, 0x41, 0x0D, 0x60, 0x70, 0x65, 0x00, 0x61, 0xEE, 0xF1, 0xED, 0xF5, 0x44, 0x4C, 0x2C, 0x5C, - 0xE9, 0x80, 0x00, 0x64, 0xF0, 0x84, 0xF0, 0x84, 0xC0, 0x83, 0xBD, 0xD2, 0x24, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x20, 0x44, 0x40, 0x80, 0xDB, 0x83, 0xBD, 0xD2, 0x20, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x21, 0x44, 0x40, 0x81, 0xDB, 0x83, 0xBD, 0xD2, 0x21, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x22, 0x44, 0x40, 0x82, 0xDB, 0x83, 0xBD, 0xD2, 0x22, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x23, 0x44, 0x40, 0x83, 0xF2, 0xA3, 0xBD, 0xD2, 0x23, 0x5C, 0x90, 0x9C, - 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x47, 0x90, 0x9C, 0x24, 0x44, 0xC0, 0x9C, 0x41, 0x84, 0xDD, 0x81, 0x08, 0x2A, 0xA7, 0x01, - 0x0C, 0x60, 0xEC, 0x61, 0x05, 0x64, 0xEF, 0xF4, 0xF0, 0xF5, 0xFE, 0xA3, 0x5B, 0xD0, 0xCC, 0x84, - 0x59, 0xD9, 0xFC, 0x02, 0xEF, 0xF3, 0xF0, 0xF5, 0x60, 0x42, 0x20, 0x44, 0xA2, 0xDA, 0x21, 0x44, - 0x5A, 0xDA, 0x22, 0x44, 0x5A, 0xDA, 0x23, 0x44, 0x5A, 0xDA, 0x24, 0x44, 0x5A, 0xDA, 0x61, 0x46, - 0x06, 0x60, 0x7D, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0x41, 0xEF, 0xF3, 0xF0, 0xF5, 0xA0, 0xD2, - 0x5A, 0xD0, 0x40, 0x40, 0x44, 0x41, 0x5A, 0xD2, 0x5A, 0xD0, 0x40, 0x42, 0x5A, 0xD0, 0x44, 0x43, - 0x61, 0x46, 0xBA, 0xF0, 0x3B, 0xF2, 0x44, 0x44, 0x65, 0x5F, 0x40, 0x85, 0xEE, 0xF4, 0xED, 0xF5, - 0x43, 0x4C, 0x0D, 0x60, 0x70, 0x65, 0xBD, 0xD2, 0x25, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x20, 0x44, 0x40, 0x80, 0xBD, 0xD2, 0x20, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x21, 0x44, - 0x40, 0x81, 0xBD, 0xD2, 0x21, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x22, 0x44, 0x40, 0x82, - 0xBD, 0xD2, 0x22, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x23, 0x44, 0x40, 0x83, 0xBD, 0xD2, - 0x23, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x24, 0x44, 0x40, 0x84, 0xBD, 0xD2, 0x24, 0x5C, - 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x25, 0x44, 0x40, 0x85, 0x61, 0x46, 0x3A, 0xF0, 0xFF, 0xFF, - 0x64, 0x44, 0xE0, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xE1, 0x7F, 0x5A, 0xD0, 0xA0, 0x5B, 0x64, 0x44, - 0xE2, 0x7F, 0xA0, 0x5B, 0x64, 0x47, 0xED, 0xF5, 0xBD, 0xD2, 0x25, 0x5C, 0x90, 0x84, 0xE8, 0x80, - 0xF8, 0x84, 0x20, 0x5C, 0x40, 0x80, 0x20, 0x44, 0xE4, 0x7F, 0xA0, 0x5B, 0x20, 0x47, 0xE5, 0x7F, - 0xA0, 0x5B, 0xBD, 0xD2, 0x20, 0x5C, 0x90, 0x84, 0xE8, 0x80, 0xF8, 0x84, 0x21, 0x5C, 0x40, 0x81, - 0x21, 0x44, 0xE6, 0x7F, 0xA0, 0x5B, 0x21, 0x47, 0xE7, 0x7F, 0xA0, 0x5B, 0x21, 0x44, 0xE8, 0x80, - 0xF8, 0x84, 0x22, 0x5C, 0x40, 0x82, 0x22, 0x44, 0xE8, 0x7F, 0xA0, 0x5B, 0x22, 0x47, 0xE9, 0x7F, - 0xA0, 0x5B, 0x22, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x23, 0x5C, 0x40, 0x83, 0x23, 0x44, 0xEA, 0x7F, - 0xA0, 0x5B, 0x23, 0x47, 0xEB, 0x7F, 0xA0, 0x5B, 0x23, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x24, 0x5C, - 0x40, 0x84, 0x24, 0x44, 0xEC, 0x7F, 0xA0, 0x5B, 0x24, 0x47, 0xED, 0x7F, 0xA0, 0x5B, 0x24, 0x44, - 0xE8, 0x80, 0xF8, 0x84, 0x25, 0x5C, 0x40, 0x85, 0x25, 0x44, 0xEE, 0x7F, 0xA0, 0x5B, 0x25, 0x47, - 0xEF, 0x7F, 0xA0, 0x5B, 0x2C, 0x43, 0xA3, 0xD2, 0x25, 0x5C, 0x90, 0x81, 0xE9, 0x84, 0xE3, 0x7F, - 0xA0, 0x5B, 0x06, 0x60, 0x7D, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xF3, 0x5A, 0xD3, 0x40, 0x48, - 0x5A, 0xD3, 0x40, 0x49, 0x40, 0x4A, 0x00, 0x60, 0x78, 0x7C, 0x44, 0x4D, 0x49, 0xF2, 0x4A, 0xF2, - 0x40, 0x47, 0x40, 0x46, 0x0D, 0x60, 0x70, 0x65, 0x00, 0x61, 0x2D, 0x5C, 0xE9, 0x80, 0x00, 0x64, - 0xF0, 0x84, 0xF0, 0x84, 0xC0, 0x83, 0xBD, 0xD2, 0x2A, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x26, 0x44, 0x40, 0x86, 0xDB, 0x83, 0xBD, 0xD2, 0x26, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x27, 0x44, 0x40, 0x87, 0xDB, 0x83, 0xBD, 0xD2, 0x27, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x28, 0x44, 0x40, 0x88, 0xDB, 0x83, 0xBD, 0xD2, 0x28, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x29, 0x44, 0x40, 0x89, 0xF2, 0xA3, 0xBD, 0xD2, 0x29, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x2A, 0x44, 0xC0, 0x9C, 0x41, 0x8A, 0xDD, 0x81, 0x08, 0x2A, 0xA7, 0x01, 0x26, 0x44, 0x44, 0xFA, - 0x27, 0x44, 0x45, 0xFA, 0x28, 0x44, 0x46, 0xFA, 0x29, 0x44, 0x47, 0xFA, 0x2A, 0x44, 0x48, 0xFA, - 0x06, 0x60, 0x7E, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x88, 0x7C, 0x44, 0x4D, 0x2D, 0x42, - 0xA2, 0xD2, 0x5A, 0xD0, 0x40, 0x46, 0x44, 0x47, 0x5A, 0xD2, 0x5A, 0xD0, 0x40, 0x48, 0x5A, 0xD0, - 0x44, 0x49, 0x4B, 0xF2, 0x44, 0x4A, 0x40, 0x8B, 0x60, 0x5C, 0x64, 0x47, 0xE0, 0x7F, 0xA0, 0x5A, - 0xFF, 0xB4, 0x20, 0xBC, 0x7F, 0xB4, 0xE1, 0x7F, 0xA0, 0x5A, 0x64, 0x44, 0xE2, 0x7F, 0xA0, 0x5A, - 0x00, 0x60, 0x78, 0x63, 0x0D, 0x60, 0x70, 0x65, 0xBD, 0xD2, 0x2B, 0x5C, 0x90, 0x9C, 0x64, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, - 0x90, 0x9C, 0x26, 0x44, 0x40, 0x86, 0xBD, 0xD2, 0x26, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, - 0x27, 0x44, 0x40, 0x87, 0xBD, 0xD2, 0x27, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, - 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x28, 0x44, - 0x40, 0x88, 0xBD, 0xD2, 0x28, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, - 0x64, 0x44, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x29, 0x44, 0x40, 0x89, - 0xBD, 0xD2, 0x29, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x2A, 0x44, 0x40, 0x8A, 0xBD, 0xD2, - 0x2A, 0x5C, 0x90, 0x9C, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x44, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD1, 0x64, 0x47, 0x90, 0x9C, 0x2B, 0x44, 0x40, 0x8B, 0xBD, 0xD2, 0x2B, 0x5C, - 0x90, 0x84, 0xE8, 0x80, 0xF8, 0x84, 0x26, 0x5C, 0x40, 0x86, 0x26, 0x44, 0xE4, 0x7F, 0xA0, 0x5A, - 0x26, 0x47, 0xE5, 0x7F, 0xA0, 0x5A, 0xBD, 0xD2, 0x26, 0x5C, 0x90, 0x84, 0xE8, 0x80, 0xF8, 0x84, - 0x27, 0x5C, 0x40, 0x87, 0x27, 0x44, 0xE6, 0x7F, 0xA0, 0x5A, 0x27, 0x47, 0xE7, 0x7F, 0xA0, 0x5A, - 0x27, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x28, 0x5C, 0x40, 0x88, 0x28, 0x44, 0xE8, 0x7F, 0xA0, 0x5A, - 0x28, 0x47, 0xE9, 0x7F, 0xA0, 0x5A, 0x28, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x29, 0x5C, 0x40, 0x89, - 0x29, 0x44, 0xEA, 0x7F, 0xA0, 0x5A, 0x29, 0x47, 0xEB, 0x7F, 0xA0, 0x5A, 0x29, 0x44, 0xE8, 0x80, - 0xF8, 0x84, 0x2A, 0x5C, 0x40, 0x8A, 0x2A, 0x44, 0xEC, 0x7F, 0xA0, 0x5A, 0x2A, 0x47, 0xED, 0x7F, - 0xA0, 0x5A, 0x2A, 0x44, 0xE8, 0x80, 0xF8, 0x84, 0x2B, 0x5C, 0x40, 0x8B, 0x2B, 0x44, 0xEE, 0x7F, - 0xA0, 0x5A, 0x2B, 0x47, 0xEF, 0x7F, 0xA0, 0x5A, 0x3C, 0xF0, 0x2B, 0x44, 0x90, 0x84, 0xE8, 0x84, - 0xE3, 0x7F, 0xA0, 0x5A, 0x06, 0x60, 0x7E, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x45, 0x00, 0xF0, - 0x84, 0x60, 0x00, 0xE3, 0x04, 0x71, 0x64, 0x50, 0x01, 0x2A, 0x04, 0x71, 0x5C, 0x61, 0x04, 0x63, - 0x59, 0xD0, 0x58, 0xD9, 0xFD, 0x1F, 0x3D, 0xF2, 0x60, 0x43, 0x60, 0x47, 0x5B, 0xDB, 0x3C, 0xF2, - 0xFF, 0xFF, 0x60, 0x47, 0x5B, 0xDB, 0x3A, 0xF2, 0xFF, 0xFF, 0x60, 0x47, 0x5B, 0xDB, 0x3F, 0xF2, - 0xFF, 0xFF, 0x60, 0x47, 0x5B, 0xDB, 0x81, 0x60, 0x18, 0xE3, 0x65, 0x43, 0xE3, 0x84, 0x60, 0x47, - 0x00, 0x7F, 0x60, 0x50, 0x7F, 0x64, 0x23, 0x94, 0x60, 0x51, 0x7C, 0x72, 0x04, 0x75, 0x0C, 0x60, - 0x16, 0x61, 0x16, 0x60, 0x00, 0x63, 0x59, 0xDD, 0x2A, 0xF2, 0x87, 0x60, 0x8F, 0x65, 0xA4, 0x87, - 0x40, 0xBF, 0x59, 0xDB, 0x56, 0x64, 0x0A, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x62, 0x64, - 0x04, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x35, 0xF2, 0x0F, 0x65, 0xA4, 0x9C, 0x59, 0xD9, - 0x06, 0x63, 0x59, 0xDF, 0xFE, 0x1F, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x45, 0x03, 0x2B, 0x05, 0x00, - 0x6A, 0x64, 0x04, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x65, 0x40, 0x8F, 0xB0, 0x88, 0x3A, - 0x02, 0x00, 0x39, 0xF0, 0x59, 0xD9, 0x2F, 0x58, 0xFF, 0xFF, 0x0C, 0x60, 0x16, 0x61, 0xA3, 0x46, - 0x00, 0xF4, 0x02, 0x64, 0x0A, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x59, 0xDF, 0x59, 0xDF, - 0xA0, 0x4C, 0x04, 0xBC, 0xFF, 0xB4, 0xA0, 0x51, 0x23, 0x44, 0x01, 0xA7, 0x80, 0xBF, 0x60, 0x50, - 0x80, 0x60, 0x38, 0x71, 0x80, 0x60, 0x7C, 0x72, 0x01, 0x76, 0xFF, 0xFF, 0x76, 0x44, 0x01, 0x3A, - 0xFD, 0x01, 0x40, 0x76, 0x40, 0x76, 0x42, 0xFF, 0xFF, 0xFF, 0x40, 0x76, 0x80, 0x60, 0x18, 0x70, - 0x80, 0x60, 0x18, 0x71, 0x80, 0x60, 0x7C, 0x72, 0x80, 0x60, 0x10, 0x73, 0x02, 0x76, 0x76, 0x44, - 0xFF, 0xFF, 0x76, 0x44, 0x02, 0x3A, 0xFD, 0x01, 0x40, 0x76, 0x42, 0xFF, 0x3C, 0x46, 0x00, 0xF2, - 0x80, 0x60, 0x00, 0xBC, 0x60, 0x50, 0x80, 0x60, 0x12, 0x71, 0x80, 0x60, 0x6E, 0x72, 0x3F, 0xF2, - 0xFF, 0xFF, 0xF8, 0xA7, 0x80, 0xBF, 0x60, 0x53, 0x04, 0x76, 0xFF, 0xFF, 0x88, 0xFF, 0x3C, 0x46, - 0x07, 0xF2, 0xFF, 0xFF, 0x40, 0x43, 0xA3, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x77, 0x40, 0x8B, 0xFF, - 0xA0, 0x4B, 0x04, 0xE1, 0xFF, 0xFF, 0x76, 0x44, 0x04, 0x3A, 0xFD, 0x01, 0x40, 0x76, 0x42, 0xFF, - 0xFF, 0xFF, 0x10, 0x76, 0xFF, 0xFF, 0x76, 0x44, 0x20, 0x3A, 0xFD, 0x01, 0x40, 0x76, 0x42, 0xFF, - 0x63, 0x44, 0x00, 0x7F, 0xA0, 0x51, 0x02, 0x60, 0x00, 0x75, 0x88, 0xFF, 0xA0, 0x4C, 0xFB, 0xB4, - 0xA0, 0x51, 0x06, 0x60, 0x1F, 0xE1, 0x16, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x26, 0x46, 0x3F, 0xF2, - 0xFF, 0xFF, 0xF8, 0xA4, 0x3F, 0xFA, 0x00, 0xF4, 0x60, 0x47, 0x08, 0xFA, 0xA0, 0x48, 0x08, 0x26, - 0x07, 0x00, 0xA0, 0x4C, 0x04, 0xE1, 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, 0xA0, 0x51, - 0x42, 0xFF, 0x26, 0x46, 0x8B, 0xFF, 0x02, 0x60, 0x00, 0x75, 0x3C, 0xF2, 0x40, 0x76, 0x14, 0x1B, - 0x26, 0x46, 0x3B, 0xF2, 0x0C, 0x60, 0xBA, 0x63, 0x60, 0x47, 0xC0, 0xB4, 0xE8, 0x84, 0xE8, 0x84, - 0xE8, 0x84, 0x43, 0x93, 0xE3, 0x9C, 0x64, 0x47, 0x80, 0x7C, 0x64, 0x5F, 0x60, 0x50, 0x7F, 0x64, - 0x23, 0x97, 0x80, 0xBF, 0x60, 0x51, 0x07, 0x00, 0x01, 0xA7, 0x80, 0xBF, 0x60, 0x50, 0x80, 0x60, - 0x40, 0x71, 0x80, 0x60, 0x7C, 0x72, 0x01, 0x76, 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x0C, 0x21, - 0xFC, 0x01, 0x04, 0x25, 0xD5, 0x01, 0x40, 0x76, 0x43, 0xFF, 0x0C, 0x60, 0x22, 0x61, 0x26, 0x46, - 0x00, 0xF4, 0x02, 0x64, 0x0A, 0x63, 0x58, 0xD0, 0x59, 0xD9, 0xFD, 0x1F, 0x59, 0xDF, 0x59, 0xDF, - 0x80, 0x60, 0x18, 0x70, 0x80, 0x60, 0x24, 0x71, 0x80, 0x60, 0x7C, 0x72, 0x80, 0x60, 0x10, 0x73, - 0x02, 0x76, 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x0C, 0x21, 0xFC, 0x01, 0x04, 0x25, 0xB8, 0x01, - 0x40, 0x76, 0x43, 0xFF, 0x26, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0x60, 0x47, 0x80, 0xBF, 0x60, 0x50, - 0x80, 0x60, 0x12, 0x71, 0x3F, 0xF2, 0x80, 0x60, 0x6E, 0x72, 0x60, 0x47, 0x80, 0xBF, 0x60, 0x53, - 0x04, 0x76, 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x0C, 0x21, 0xFC, 0x01, 0x04, 0x25, 0xA0, 0x01, - 0x40, 0x76, 0x43, 0xFF, 0x08, 0x76, 0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0xFF, 0x0C, 0x21, 0xFC, 0x01, - 0x04, 0x25, 0x96, 0x01, 0x76, 0x5C, 0xFF, 0xFF, 0x40, 0x76, 0x43, 0xFF, 0x88, 0xFF, 0x26, 0x46, - 0x2F, 0x58, 0xFF, 0xFF, 0xEE, 0x60, 0x60, 0x78, 0xFF, 0xFF, 0x08, 0x60, 0x08, 0xF1, 0x80, 0x60, - 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x00, 0xDB, 0xF3, 0x31, 0x41, 0x01, 0xB1, - 0x03, 0xA8, 0x2A, 0x03, 0x15, 0x02, 0x20, 0x40, 0x04, 0x2B, 0x0B, 0x00, 0xBB, 0xFE, 0xCA, 0xFE, - 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0x07, 0x00, 0x08, 0x60, 0x09, 0xF1, 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x08, 0x60, 0x1B, 0xF1, 0x00, 0x60, 0x80, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x0C, 0x00, - 0xA9, 0xFE, 0xDB, 0x05, 0xAB, 0xFE, 0x0C, 0x05, 0xA8, 0xFE, 0xCC, 0x05, 0xAA, 0xFE, 0xCD, 0x05, - 0x78, 0x43, 0x01, 0x61, 0x29, 0x60, 0xEA, 0x78, 0xA1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x3E, - 0x13, 0x60, 0x02, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x03, 0x02, 0xCA, 0x60, 0xD4, 0x78, - 0xFF, 0xFF, 0x26, 0x45, 0xD4, 0x80, 0x0F, 0xF0, 0xF9, 0x03, 0x64, 0x44, 0x70, 0xB0, 0x70, 0x2A, - 0x13, 0x00, 0x16, 0x60, 0x85, 0xF3, 0xFF, 0xFF, 0xDC, 0x84, 0x00, 0x36, 0x00, 0x3B, 0xA2, 0xDB, - 0xA2, 0xFF, 0xAC, 0xF3, 0xFF, 0xFF, 0xCC, 0x84, 0xFE, 0xA0, 0xAC, 0xFB, 0x01, 0x07, 0xD4, 0xFE, - 0xA3, 0xFF, 0xD0, 0x60, 0xB5, 0x78, 0xFF, 0xFF, 0x64, 0x40, 0x02, 0x26, 0x09, 0x00, 0x66, 0x45, - 0x09, 0xF4, 0x0F, 0xF2, 0x02, 0x18, 0x65, 0x46, 0xE4, 0x1B, 0x00, 0x64, 0x40, 0x46, 0xCC, 0x01, - 0xA2, 0xFF, 0xAC, 0xF3, 0x46, 0x46, 0xCC, 0x84, 0xFE, 0xA0, 0xAC, 0xFB, 0x01, 0x07, 0xD4, 0xFE, - 0xA3, 0xFF, 0x0F, 0xF0, 0xA3, 0xFC, 0x64, 0x44, 0x80, 0x26, 0x35, 0x00, 0x2C, 0x60, 0xEA, 0x64, - 0xF1, 0x60, 0x78, 0x41, 0xE4, 0x78, 0xB5, 0xF1, 0x32, 0x44, 0x01, 0x2A, 0x03, 0x00, 0x07, 0x60, - 0x01, 0x64, 0x22, 0x00, 0x02, 0x2A, 0x03, 0x00, 0x00, 0x60, 0x01, 0x64, 0x1D, 0x00, 0x04, 0x2A, - 0x1F, 0x00, 0x2A, 0xF2, 0xFF, 0xFF, 0x0C, 0xB0, 0x08, 0x3A, 0x1A, 0x00, 0x2C, 0xF0, 0x22, 0xF0, - 0x64, 0x40, 0x01, 0x26, 0x0B, 0x00, 0x64, 0x40, 0x40, 0x2B, 0x12, 0x00, 0x8F, 0xB0, 0x88, 0x3A, - 0x0F, 0x00, 0x39, 0xF2, 0xFF, 0xFF, 0x60, 0xB0, 0x20, 0x3A, 0x0A, 0x00, 0x23, 0xF2, 0x00, 0x60, - 0x01, 0x7C, 0xB0, 0x84, 0x23, 0xFA, 0x0C, 0x00, 0x23, 0xFA, 0xD0, 0x60, 0xC1, 0x78, 0xFF, 0xFF, - 0xD0, 0x60, 0xB5, 0x78, 0xFF, 0xFF, 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x10, 0x27, 0xF8, 0x01, - 0x0F, 0xF0, 0xFF, 0xFF, 0x64, 0x44, 0x08, 0x26, 0x64, 0x00, 0x2A, 0xF2, 0x60, 0x63, 0x60, 0x40, - 0x02, 0x2B, 0x66, 0x63, 0xBE, 0xD2, 0x81, 0xF1, 0xA3, 0xD2, 0xD0, 0x80, 0x80, 0xF1, 0x0D, 0x02, - 0xBF, 0xD2, 0xD0, 0x80, 0x7F, 0xF1, 0x09, 0x02, 0xD0, 0x80, 0xFF, 0xFF, 0x06, 0x02, 0x2C, 0x60, - 0xF6, 0x64, 0xF1, 0x60, 0x78, 0x41, 0xE4, 0x78, 0xB5, 0xF1, 0x32, 0x44, 0x01, 0x2A, 0x03, 0x00, - 0x07, 0x60, 0x02, 0x64, 0x04, 0x00, 0x02, 0x2A, 0x06, 0x00, 0x00, 0x60, 0x02, 0x64, 0x23, 0xFA, - 0xD0, 0x60, 0xC1, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0xB0, 0x3A, 0x06, 0x00, - 0x00, 0x60, 0x02, 0x64, 0x23, 0xFA, 0xCC, 0x60, 0x31, 0x78, 0xFF, 0xFF, 0x32, 0x40, 0x04, 0x2A, - 0x2D, 0x00, 0x2A, 0xF2, 0xFF, 0xFF, 0x0C, 0xB0, 0x08, 0x3A, 0x28, 0x00, 0x2C, 0xF0, 0x22, 0xF0, - 0x64, 0x40, 0x01, 0x26, 0x0B, 0x00, 0x64, 0x40, 0x40, 0x2B, 0x20, 0x00, 0x8F, 0xB0, 0x88, 0x3A, - 0x1D, 0x00, 0x39, 0xF2, 0xFF, 0xFF, 0x60, 0xB0, 0x20, 0x3A, 0x18, 0x00, 0x2C, 0xF0, 0x66, 0x45, - 0x07, 0xF4, 0x64, 0x40, 0x01, 0x26, 0xA6, 0xF5, 0x3A, 0xF2, 0x65, 0x46, 0x60, 0x40, 0x00, 0x36, - 0x0D, 0x00, 0x22, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x10, 0x2A, 0x08, 0x00, 0x20, 0x2B, 0x06, 0x00, - 0x23, 0xF2, 0x00, 0x60, 0x02, 0x7C, 0xB0, 0x84, 0x23, 0xFA, 0x03, 0x00, 0xD0, 0x60, 0xB5, 0x78, - 0xFF, 0xFF, 0x32, 0x44, 0x01, 0x2A, 0x4A, 0x00, 0x2E, 0x60, 0x40, 0x63, 0xBF, 0xD3, 0x00, 0x65, - 0xB4, 0x81, 0xDB, 0x83, 0x3D, 0x03, 0xBF, 0xD3, 0xA3, 0xD3, 0x40, 0x48, 0xBE, 0xD3, 0x40, 0x4A, - 0x2E, 0xF0, 0x40, 0x4C, 0xD0, 0x80, 0x2D, 0xF0, 0x08, 0x02, 0x2A, 0x44, 0xD0, 0x80, 0x2C, 0xF0, - 0x04, 0x02, 0x28, 0x44, 0xD0, 0x80, 0xFF, 0xFF, 0x2B, 0x03, 0x31, 0xF0, 0x2C, 0x44, 0xD0, 0x80, - 0x30, 0xF0, 0x08, 0x02, 0x2A, 0x44, 0xD0, 0x80, 0x2F, 0xF0, 0x04, 0x02, 0x28, 0x44, 0xD0, 0x80, - 0xFF, 0xFF, 0x1E, 0x03, 0x34, 0xF0, 0x2C, 0x44, 0xD0, 0x80, 0x33, 0xF0, 0x08, 0x02, 0x2A, 0x44, - 0xD0, 0x80, 0x32, 0xF0, 0x04, 0x02, 0x28, 0x44, 0xD0, 0x80, 0xFF, 0xFF, 0x11, 0x03, 0x38, 0xF0, - 0x2C, 0x44, 0xD0, 0x80, 0x37, 0xF0, 0x08, 0x02, 0x2A, 0x44, 0xD0, 0x80, 0x36, 0xF0, 0x04, 0x02, - 0x28, 0x44, 0xD0, 0x80, 0xFF, 0xFF, 0x04, 0x03, 0xFA, 0xA1, 0x06, 0xA3, 0xB7, 0x03, 0xC3, 0x01, - 0x07, 0x60, 0x00, 0x64, 0x23, 0xFA, 0xD0, 0x60, 0xC1, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x0F, 0xF0, - 0x60, 0x45, 0xA4, 0x36, 0x08, 0x00, 0x0C, 0xB4, 0x04, 0x36, 0x02, 0x00, 0x0C, 0x3A, 0x06, 0x00, - 0xD0, 0x60, 0xB5, 0x78, 0xFF, 0xFF, 0xCE, 0x60, 0x7C, 0x78, 0xFF, 0xFF, 0x0F, 0xF0, 0x65, 0x40, - 0x40, 0x2B, 0x17, 0x00, 0x32, 0x40, 0x08, 0x26, 0x14, 0x00, 0x07, 0xF4, 0x3A, 0xF2, 0xFF, 0xFF, - 0x37, 0xB4, 0x26, 0x46, 0x0E, 0x02, 0x2C, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x26, 0x06, 0x00, - 0x2C, 0x60, 0xF0, 0x64, 0xF1, 0x60, 0x78, 0x41, 0xE4, 0x78, 0xB5, 0xF1, 0xD0, 0x60, 0xB5, 0x78, - 0xFF, 0xFF, 0x2A, 0xF2, 0x64, 0x40, 0x60, 0x26, 0x03, 0x00, 0xCE, 0x60, 0x4E, 0x78, 0xFF, 0xFF, - 0x60, 0x41, 0xA6, 0xF3, 0x07, 0xFA, 0x61, 0x44, 0x80, 0x3A, 0x02, 0x00, 0x2A, 0xF2, 0x12, 0x00, - 0x60, 0x40, 0x40, 0x3A, 0x0F, 0x00, 0xDB, 0xF3, 0xFF, 0xFF, 0x07, 0xB4, 0x03, 0x3A, 0xE6, 0x01, - 0xD1, 0x60, 0x58, 0x4D, 0xA6, 0x78, 0xFF, 0xFF, 0xE1, 0x02, 0xA6, 0xF3, 0x07, 0xFA, 0xCD, 0x60, - 0xE1, 0x78, 0xFF, 0xFF, 0x5E, 0x63, 0x60, 0x40, 0x02, 0x2B, 0x64, 0x63, 0x50, 0xFE, 0xBD, 0xD2, - 0x7F, 0xF1, 0xBD, 0xD2, 0xD0, 0x80, 0x80, 0xF1, 0xBD, 0xD2, 0xD0, 0x80, 0x81, 0xF1, 0x2A, 0xF2, - 0xD0, 0x80, 0x60, 0x40, 0x08, 0x3A, 0x09, 0x00, 0x01, 0x0C, 0xC8, 0x01, 0xE9, 0x60, 0x58, 0x4F, - 0x08, 0x78, 0xFF, 0xFF, 0xCD, 0x60, 0xE1, 0x78, 0xFF, 0xFF, 0x23, 0x0C, 0xD1, 0x60, 0x58, 0x4D, - 0xA6, 0x78, 0xFF, 0xFF, 0xBB, 0x02, 0x02, 0x64, 0x10, 0x60, 0x0A, 0xFB, 0x00, 0x64, 0x10, 0x60, - 0x0E, 0xFB, 0x26, 0x60, 0x58, 0x4E, 0x65, 0x78, 0xFF, 0xFF, 0x10, 0x60, 0x05, 0xF3, 0xFF, 0xFF, - 0x60, 0x40, 0x80, 0x27, 0x07, 0x00, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x00, 0x64, 0x10, 0x60, 0x0A, 0xFB, 0xA0, 0x01, 0xCD, 0x60, 0xE1, 0x78, - 0xFF, 0xFF, 0xDB, 0xF3, 0xFF, 0xFF, 0x07, 0xB4, 0xFD, 0xA0, 0xFF, 0xFF, 0x03, 0x03, 0x20, 0x40, - 0x10, 0x22, 0xF4, 0x01, 0x08, 0x60, 0x07, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x36, 0x07, 0x00, - 0x01, 0x64, 0xA2, 0xDB, 0x01, 0x65, 0xF1, 0x60, 0x58, 0x4E, 0xC3, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0x31, 0xF2, 0x1D, 0x60, 0xC0, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, - 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x31, 0xF0, 0x63, 0x46, 0xD0, 0x80, - 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x30, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, - 0x61, 0x46, 0x2F, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, - 0x63, 0x46, 0xE8, 0x1B, 0xA6, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0xA6, 0xF1, 0x43, 0x43, - 0xD3, 0x80, 0xFF, 0xFF, 0x03, 0x03, 0xCD, 0x60, 0xD9, 0x78, 0xFF, 0xFF, 0xD0, 0x60, 0x58, 0x4F, - 0xFC, 0x78, 0xFF, 0xFF, 0x03, 0x4B, 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x43, 0xF4, 0xA3, 0x00, 0x60, - 0x1D, 0x61, 0x00, 0x60, 0x01, 0x65, 0x01, 0x60, 0xFF, 0x64, 0x40, 0x4C, 0xFD, 0x60, 0x58, 0x4E, - 0x7A, 0x78, 0xFF, 0xFF, 0x00, 0xBB, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x64, 0x40, 0x4A, 0x60, 0xFE, - 0x02, 0x60, 0x00, 0x63, 0xBD, 0xD3, 0xBD, 0xD3, 0x60, 0x41, 0xFE, 0x60, 0x58, 0x4E, 0x2C, 0x78, - 0xFF, 0xFF, 0x20, 0xFE, 0x00, 0x65, 0x00, 0x64, 0x19, 0x60, 0x3B, 0xFB, 0x02, 0x00, 0x20, 0xFE, - 0xFF, 0x65, 0x02, 0x60, 0x00, 0x63, 0x60, 0xFE, 0xBD, 0xD3, 0xBD, 0xD3, 0x60, 0x41, 0x20, 0xFE, - 0xCD, 0x81, 0x60, 0x40, 0x80, 0x2A, 0x39, 0x00, 0x7F, 0xB4, 0x02, 0x3A, 0x02, 0x00, 0x01, 0x64, - 0x2E, 0x00, 0x04, 0x3A, 0x02, 0x00, 0x02, 0x64, 0x2A, 0x00, 0x0B, 0x3A, 0x02, 0x00, 0x04, 0x64, - 0x26, 0x00, 0x16, 0x3A, 0x02, 0x00, 0x08, 0x64, 0x22, 0x00, 0x0C, 0x3A, 0x02, 0x00, 0x10, 0x64, - 0x1E, 0x00, 0x12, 0x3A, 0x02, 0x00, 0x20, 0x64, 0x1A, 0x00, 0x18, 0x3A, 0x02, 0x00, 0x40, 0x64, - 0x16, 0x00, 0x24, 0x3A, 0x02, 0x00, 0x80, 0x64, 0x12, 0x00, 0x30, 0x3A, 0x02, 0x00, 0x01, 0x67, - 0x0E, 0x00, 0x48, 0x3A, 0x02, 0x00, 0x02, 0x67, 0x0A, 0x00, 0x60, 0x3A, 0x02, 0x00, 0x04, 0x67, - 0x06, 0x00, 0x6C, 0x3A, 0x02, 0x00, 0x08, 0x67, 0x02, 0x00, 0x00, 0x64, 0x00, 0x00, 0x19, 0x60, - 0x3B, 0xF1, 0xFF, 0xFF, 0xB0, 0x84, 0x19, 0x60, 0x3B, 0xFB, 0x61, 0x40, 0x00, 0x36, 0x05, 0x00, - 0x60, 0xFE, 0xBD, 0xD3, 0xFF, 0xFF, 0x20, 0xFE, 0xBB, 0x01, 0x65, 0x40, 0x00, 0x3A, 0x1E, 0x00, - 0x26, 0x46, 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x43, 0xF4, 0xA3, 0x00, 0x60, 0x1D, 0x61, 0x00, 0x60, - 0x32, 0x65, 0x01, 0x60, 0xFF, 0x64, 0x40, 0x4C, 0xFD, 0x60, 0x58, 0x4E, 0x7A, 0x78, 0xFF, 0xFF, - 0x00, 0xBB, 0xFF, 0xFF, 0x0B, 0x03, 0x60, 0xFE, 0x02, 0x60, 0x00, 0x63, 0xBD, 0xD3, 0xBD, 0xD3, - 0x60, 0x41, 0xFE, 0x60, 0x58, 0x4E, 0x2C, 0x78, 0xFF, 0xFF, 0x91, 0x01, 0x20, 0xFE, 0x00, 0x65, - 0xFC, 0x60, 0x58, 0x4E, 0xC7, 0x78, 0xFF, 0xFF, 0xA1, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x27, - 0x04, 0x00, 0xFD, 0x60, 0x58, 0x4E, 0x11, 0x78, 0xFF, 0xFF, 0x20, 0xFE, 0x37, 0x60, 0xF8, 0x61, - 0xA1, 0xD1, 0xA1, 0xF3, 0x01, 0x60, 0xAC, 0x63, 0x60, 0x45, 0x2A, 0x44, 0x79, 0xFB, 0xA3, 0xD5, - 0x65, 0x40, 0x01, 0x27, 0x5B, 0xD5, 0x65, 0x40, 0x01, 0x27, 0x59, 0xD1, 0x66, 0x41, 0xA0, 0x84, - 0x24, 0x94, 0x2B, 0x46, 0x0F, 0xFA, 0x7A, 0xFB, 0x16, 0x64, 0x12, 0xFA, 0x01, 0x64, 0x11, 0xFA, - 0x66, 0x5C, 0xC2, 0x60, 0x58, 0x4E, 0x6D, 0x78, 0xFF, 0xFF, 0x7D, 0xF3, 0xFF, 0xFF, 0x60, 0x40, - 0x01, 0x27, 0x28, 0x00, 0x19, 0x60, 0x44, 0xF3, 0x32, 0x60, 0x88, 0x63, 0xA3, 0xD3, 0xFF, 0xFF, - 0x60, 0x40, 0x01, 0x2A, 0x0C, 0x00, 0x0F, 0x64, 0xFC, 0x60, 0x58, 0x4E, 0x34, 0x78, 0xFF, 0xFF, - 0xFF, 0x60, 0xFF, 0x63, 0x1A, 0x60, 0xB3, 0xFD, 0x1A, 0x60, 0xC3, 0xFD, 0x1C, 0x00, 0x19, 0x60, - 0x39, 0xF3, 0x3F, 0x40, 0x01, 0x27, 0x08, 0x00, 0x0F, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0xFC, 0x60, - 0x58, 0x4E, 0x34, 0x78, 0xFF, 0xFF, 0x0F, 0x00, 0x0F, 0xB4, 0xFC, 0x60, 0x58, 0x4E, 0x34, 0x78, - 0xFF, 0xFF, 0x09, 0x00, 0x19, 0x60, 0x3A, 0xF3, 0x0F, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0xFC, 0x60, - 0x58, 0x4E, 0x34, 0x78, 0xFF, 0xFF, 0xD3, 0x60, 0x58, 0x4E, 0x78, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0x23, 0x43, 0x32, 0x40, 0x08, 0x2A, 0x05, 0x00, 0x63, 0x46, 0x80, 0x60, 0x02, 0x64, 0x06, 0xFA, - 0x26, 0x46, 0x2C, 0x60, 0xE4, 0x64, 0xF1, 0x60, 0x78, 0x41, 0xE4, 0x78, 0xB5, 0xF1, 0x27, 0xF2, - 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x3B, 0x07, 0x00, 0x2C, 0x60, 0xF2, 0x64, 0xF1, 0x60, 0x78, 0x41, - 0xE4, 0x78, 0xB5, 0xF1, 0x08, 0x00, 0x02, 0x3B, 0x06, 0x00, 0x2C, 0x60, 0xF4, 0x64, 0xF1, 0x60, - 0x78, 0x41, 0xE4, 0x78, 0xB5, 0xF1, 0x1B, 0xF2, 0xFF, 0xFF, 0xE4, 0xA4, 0x3E, 0xFA, 0x2A, 0xF2, - 0x28, 0x41, 0x40, 0xA8, 0x01, 0xB1, 0x02, 0x02, 0x46, 0x02, 0x76, 0x00, 0x60, 0x40, 0x08, 0x2A, - 0x0F, 0x00, 0x2C, 0x60, 0xE2, 0x64, 0xF1, 0x60, 0x78, 0x41, 0xE4, 0x78, 0xB5, 0xF1, 0x1B, 0xF2, - 0xFF, 0xFF, 0x60, 0x45, 0x2C, 0x60, 0xE8, 0x64, 0xF1, 0x60, 0x78, 0x41, 0xF0, 0x78, 0xB5, 0xF1, - 0x0F, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x40, 0x26, 0x28, 0x00, 0x32, 0x44, 0x02, 0x26, 0x25, 0x00, - 0x10, 0x2B, 0x29, 0x00, 0x2E, 0x60, 0x40, 0x63, 0xBF, 0xD3, 0x2C, 0xF0, 0x00, 0xA8, 0x60, 0x41, - 0x0D, 0x03, 0x50, 0xFE, 0xBD, 0xD3, 0x2D, 0xF0, 0xD0, 0x80, 0xBD, 0xD3, 0x2E, 0xF0, 0xD0, 0x80, - 0xBD, 0xD3, 0x2C, 0xF0, 0xD0, 0x80, 0xFA, 0xA1, 0x10, 0x0C, 0xF3, 0x02, 0x50, 0xFE, 0x60, 0x60, - 0x01, 0x64, 0xD0, 0x80, 0x2D, 0xF0, 0x1D, 0x64, 0xD0, 0x80, 0x2E, 0xF0, 0x01, 0x64, 0xD0, 0x80, - 0xFF, 0xFF, 0x03, 0x0C, 0xD0, 0x60, 0xB5, 0x78, 0xFF, 0xFF, 0x32, 0x40, 0x40, 0x2A, 0x03, 0x00, - 0x1C, 0x60, 0x12, 0x78, 0xFF, 0xFF, 0xD0, 0x60, 0x6B, 0x78, 0xFF, 0xFF, 0x32, 0x40, 0x40, 0x26, - 0xF7, 0x01, 0x2A, 0xF0, 0xFF, 0xFF, 0x64, 0x40, 0x08, 0x2A, 0x2A, 0x00, 0xDB, 0xF3, 0xFF, 0xFF, - 0x07, 0xB4, 0x03, 0xA8, 0xFF, 0xFF, 0x03, 0x03, 0x32, 0x40, 0x02, 0x2A, 0x1D, 0x00, 0x03, 0x67, - 0xA0, 0x84, 0x00, 0x37, 0x64, 0x63, 0x60, 0x40, 0x02, 0x37, 0x5E, 0x63, 0x60, 0x40, 0x01, 0x37, - 0x58, 0x63, 0x60, 0x40, 0x03, 0x37, 0x0D, 0x00, 0xBD, 0xD2, 0x7F, 0xF1, 0xBD, 0xD2, 0xD0, 0x80, - 0x80, 0xF1, 0x07, 0x02, 0xD0, 0x80, 0xBD, 0xD2, 0x81, 0xF1, 0x03, 0x02, 0xD0, 0x80, 0xFF, 0xFF, - 0x03, 0x03, 0xD0, 0x60, 0xB5, 0x78, 0xFF, 0xFF, 0xE9, 0x60, 0x58, 0x4F, 0x08, 0x78, 0xFF, 0xFF, - 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x26, 0x06, 0x00, 0x20, 0x40, 0x10, 0x2B, 0x03, 0x00, - 0xD0, 0x60, 0x6B, 0x78, 0xFF, 0xFF, 0x87, 0xF4, 0xA6, 0xF1, 0x27, 0x1B, 0x31, 0xF2, 0x1D, 0x60, - 0xC0, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, - 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, 0x31, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, - 0x61, 0x46, 0x30, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x2F, 0xF0, - 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, - 0xA6, 0xF3, 0x08, 0xFE, 0x60, 0x43, 0x61, 0x46, 0x03, 0x00, 0xD3, 0x80, 0xFF, 0xFF, 0xD6, 0x03, - 0x43, 0x43, 0xDB, 0xF3, 0x32, 0x40, 0x02, 0x26, 0x04, 0x00, 0x07, 0xB4, 0x03, 0xA8, 0x2A, 0xF2, - 0x45, 0x02, 0xA6, 0xF1, 0x23, 0x43, 0xD3, 0x80, 0xFF, 0xFF, 0x40, 0x02, 0xD0, 0x60, 0x58, 0x4F, - 0xFC, 0x78, 0xFF, 0xFF, 0x32, 0x40, 0x02, 0x2A, 0x05, 0x00, 0x63, 0x46, 0x02, 0x64, 0x06, 0xFA, - 0x26, 0x46, 0x34, 0x00, 0x32, 0x40, 0x08, 0x2A, 0x05, 0x00, 0x63, 0x46, 0x80, 0x60, 0x02, 0x64, - 0x06, 0xFA, 0x26, 0x46, 0x43, 0x43, 0x7D, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x27, 0x09, 0x00, - 0x19, 0x60, 0x44, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x03, 0x00, 0x23, 0x46, 0x0F, 0x64, - 0x10, 0x00, 0x37, 0x60, 0xF8, 0x61, 0xA1, 0xD1, 0xA1, 0xF3, 0x01, 0x60, 0xAC, 0x63, 0x60, 0x45, - 0xA3, 0xD3, 0x65, 0x40, 0x01, 0x27, 0x5B, 0xD3, 0x65, 0x40, 0x01, 0x27, 0x59, 0xD1, 0x23, 0x46, - 0xA0, 0x84, 0x0F, 0xFA, 0x7A, 0xFB, 0x79, 0xFB, 0x16, 0x64, 0x12, 0xFA, 0x01, 0x64, 0x11, 0xFA, - 0x66, 0x5C, 0xC2, 0x60, 0x58, 0x4E, 0x6D, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x07, 0xFC, 0x43, 0x43, - 0x2A, 0xF2, 0x63, 0x45, 0x0C, 0xB4, 0x08, 0x3A, 0x0A, 0x00, 0xDB, 0xF3, 0x23, 0x46, 0x07, 0xB4, - 0xFD, 0xA0, 0x06, 0xF2, 0x26, 0x46, 0x03, 0x03, 0x60, 0x40, 0x02, 0x2A, 0x0D, 0x00, 0x2A, 0xF2, - 0x35, 0xF0, 0x60, 0x40, 0xA4, 0x36, 0x0B, 0x00, 0x08, 0x2B, 0x0C, 0x00, 0x23, 0x46, 0x26, 0xF2, - 0x26, 0x46, 0xD0, 0x80, 0xFF, 0xFF, 0x06, 0x02, 0xD0, 0x60, 0xB5, 0x78, 0xFF, 0xFF, 0xD0, 0x60, - 0x6B, 0x78, 0xFF, 0xFF, 0x23, 0x46, 0x22, 0xF2, 0x26, 0x46, 0x44, 0x4C, 0x0F, 0x26, 0x1D, 0x00, - 0x00, 0xBC, 0x40, 0x45, 0x0B, 0x03, 0x00, 0x64, 0x23, 0x46, 0x22, 0xFA, 0x26, 0x46, 0xA2, 0xFF, - 0xB6, 0x60, 0x58, 0x4E, 0xF5, 0x78, 0xFF, 0xFF, 0xA3, 0xFF, 0x26, 0x46, 0x2A, 0xF0, 0x2C, 0x44, - 0x64, 0x40, 0x04, 0x27, 0x0A, 0x00, 0x23, 0x46, 0x26, 0xFA, 0x26, 0x46, 0x1B, 0xF2, 0xFF, 0xFF, - 0xE4, 0xA4, 0x3E, 0xFA, 0xD0, 0x60, 0x22, 0x78, 0xFF, 0xFF, 0x3F, 0xF2, 0x02, 0xFA, 0xA2, 0xFF, - 0x16, 0xF0, 0xFF, 0xFF, 0x64, 0x44, 0x01, 0x26, 0xDC, 0x9C, 0xB0, 0xF3, 0x2A, 0xF2, 0xDC, 0x83, - 0xB0, 0xFD, 0x06, 0xF4, 0x01, 0xF8, 0x26, 0x46, 0x60, 0x40, 0x40, 0x2B, 0x18, 0x00, 0x64, 0x44, - 0x00, 0x65, 0xFF, 0xB4, 0xFC, 0xA4, 0x06, 0xF0, 0x03, 0x03, 0x64, 0x46, 0x0C, 0x0D, 0x02, 0x65, - 0x26, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x02, 0x03, 0x60, 0x46, 0xF9, 0x01, - 0x01, 0xF2, 0xFF, 0xFF, 0xD4, 0x84, 0x01, 0xFA, 0x66, 0x44, 0x26, 0x46, 0x06, 0xFA, 0x06, 0xF4, - 0x00, 0xF2, 0x80, 0xFC, 0x40, 0x45, 0xB6, 0x60, 0x58, 0x4E, 0xF5, 0x78, 0xFF, 0xFF, 0xA3, 0xFF, - 0x26, 0x46, 0x2C, 0x44, 0x0F, 0x26, 0x13, 0x00, 0x23, 0x46, 0x26, 0xFA, 0x26, 0x44, 0x22, 0xFA, - 0x26, 0x46, 0x1B, 0xF2, 0xFF, 0xFF, 0xE4, 0xA4, 0x3E, 0xFA, 0x00, 0x64, 0x13, 0x60, 0x0D, 0xFB, - 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x6E, 0x00, 0xA3, 0x46, - 0x26, 0xF2, 0x60, 0x45, 0xDC, 0x84, 0xD4, 0x80, 0x26, 0xFA, 0xA3, 0x46, 0x6B, 0x02, 0x2A, 0xF0, - 0xA3, 0x46, 0x22, 0xF2, 0xA3, 0x46, 0x00, 0xBC, 0x00, 0xF2, 0x01, 0x02, 0x63, 0x00, 0x44, 0x4C, - 0x3F, 0xF0, 0x60, 0x43, 0x23, 0x46, 0x22, 0xF4, 0x09, 0x60, 0x00, 0x65, 0x3F, 0xF2, 0x26, 0x46, - 0xC0, 0x84, 0xD4, 0x80, 0x60, 0x45, 0x56, 0x07, 0x80, 0xFC, 0x1B, 0xF2, 0x06, 0xF2, 0x60, 0x41, - 0x23, 0x46, 0x22, 0xF4, 0x1B, 0xF0, 0x06, 0xF0, 0xC1, 0x81, 0x06, 0xFA, 0x05, 0xFA, 0x9B, 0xFA, - 0x65, 0x44, 0x3F, 0xFA, 0x64, 0x46, 0x00, 0xFC, 0x63, 0x46, 0x01, 0xF2, 0x10, 0x61, 0xF2, 0xA4, - 0x01, 0xFA, 0xC8, 0x83, 0x02, 0x64, 0x59, 0xD0, 0x58, 0xD8, 0xFD, 0x1F, 0x06, 0x45, 0x00, 0x64, - 0x13, 0x60, 0x0D, 0xFB, 0x25, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xA2, 0xFF, 0x00, 0xF4, 0x01, 0xF0, 0x0A, 0x18, 0x70, 0x67, 0xA0, 0x80, 0xF0, 0x67, 0x06, 0x03, - 0xC0, 0x84, 0x01, 0xFA, 0x25, 0x46, 0x25, 0x44, 0x80, 0xFC, 0x05, 0xFA, 0xB6, 0x60, 0x58, 0x4E, - 0xF5, 0x78, 0xFF, 0xFF, 0xD4, 0xFE, 0xA3, 0xFF, 0x2C, 0x44, 0x04, 0x27, 0x16, 0x00, 0x23, 0x46, - 0x22, 0xF2, 0xA2, 0xFC, 0x60, 0x46, 0x46, 0x46, 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x47, 0x08, 0xFA, - 0x26, 0x46, 0x2C, 0x43, 0x2A, 0xFC, 0x06, 0xF4, 0x00, 0x64, 0x00, 0xFA, 0x01, 0xF0, 0x80, 0x60, - 0x00, 0x64, 0xB0, 0x84, 0x01, 0xFA, 0x26, 0x46, 0x1D, 0x00, 0x00, 0x66, 0x46, 0x46, 0xCA, 0x60, - 0xD8, 0x78, 0xFF, 0xFF, 0xA3, 0x46, 0x22, 0xF0, 0xA2, 0xFC, 0x00, 0x63, 0x33, 0x85, 0xA3, 0x46, - 0x0D, 0x03, 0xA3, 0x46, 0x26, 0xF2, 0x0F, 0x65, 0xA4, 0x85, 0xD4, 0x84, 0x26, 0xFA, 0xA3, 0x46, - 0xA2, 0xFF, 0xB6, 0x60, 0x58, 0x4E, 0xF5, 0x78, 0xFF, 0xFF, 0xA3, 0xFF, 0x26, 0x46, 0xD0, 0x60, - 0xB5, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x32, 0xF0, 0x60, 0x40, 0x08, 0x2A, 0x24, 0x00, 0x01, 0x2B, - 0x13, 0x00, 0x64, 0x40, 0x01, 0x2A, 0x10, 0x00, 0x2C, 0x60, 0xE2, 0x64, 0xF1, 0x60, 0x78, 0x41, - 0xE4, 0x78, 0xB5, 0xF1, 0x1B, 0xF2, 0xFF, 0xFF, 0x60, 0x45, 0x2C, 0x60, 0xE8, 0x64, 0xF1, 0x60, - 0x78, 0x41, 0xF0, 0x78, 0xB5, 0xF1, 0x0F, 0x00, 0x2C, 0x60, 0xE0, 0x64, 0xF1, 0x60, 0x78, 0x41, - 0xE4, 0x78, 0xB5, 0xF1, 0x1B, 0xF2, 0xFF, 0xFF, 0x60, 0x45, 0x2C, 0x60, 0xE6, 0x64, 0xF1, 0x60, - 0x78, 0x41, 0xF0, 0x78, 0xB5, 0xF1, 0x07, 0xF4, 0xFF, 0xFF, 0x26, 0xF2, 0x26, 0x46, 0x0F, 0xB4, - 0xDC, 0x85, 0x2C, 0x60, 0xE4, 0x64, 0xF1, 0x60, 0x78, 0x41, 0xF0, 0x78, 0xB5, 0xF1, 0x27, 0xF2, - 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x3B, 0x07, 0x00, 0x2C, 0x60, 0xF2, 0x64, 0xF1, 0x60, 0x78, 0x41, - 0xE4, 0x78, 0xB5, 0xF1, 0x08, 0x00, 0x02, 0x3B, 0x06, 0x00, 0x2C, 0x60, 0xF4, 0x64, 0xF1, 0x60, - 0x78, 0x41, 0xE4, 0x78, 0xB5, 0xF1, 0x07, 0xF2, 0x26, 0xF0, 0x41, 0x18, 0x60, 0x46, 0xFF, 0x67, - 0x20, 0x88, 0x64, 0x5F, 0x40, 0x4A, 0x15, 0xF0, 0x28, 0x44, 0xD0, 0x84, 0x03, 0xA4, 0x03, 0x0E, - 0xE8, 0x84, 0xE8, 0x84, 0x04, 0x00, 0xFA, 0xA4, 0xE8, 0x84, 0xE8, 0x87, 0xC0, 0xBF, 0xC0, 0x84, - 0x15, 0xFA, 0x40, 0x48, 0x14, 0xF0, 0x2A, 0x44, 0xD0, 0x84, 0x1F, 0xA4, 0x06, 0x0E, 0xE8, 0x84, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x07, 0x00, 0xC2, 0xA4, 0xE8, 0x84, 0xE8, 0x84, - 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x87, 0xF8, 0xBF, 0xC0, 0x84, 0x14, 0xFA, 0x33, 0x60, 0x4C, 0x63, - 0xBD, 0xDB, 0x60, 0x5C, 0x2F, 0x67, 0xD0, 0x80, 0x60, 0x45, 0x02, 0x28, 0x64, 0x45, 0x28, 0x5C, - 0xBD, 0xD9, 0x8B, 0x67, 0xD0, 0x80, 0x60, 0x41, 0x02, 0x24, 0x64, 0x41, 0xD5, 0x84, 0x80, 0x65, - 0xC4, 0x87, 0x01, 0x05, 0x00, 0x64, 0xFF, 0xB4, 0x0E, 0xFA, 0xA3, 0xDB, 0x26, 0x46, 0xD1, 0x60, - 0xDB, 0x78, 0xFF, 0xFF, 0xCA, 0x60, 0xD8, 0x78, 0xFF, 0xFF, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, - 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xCA, 0x60, 0xD8, 0x78, - 0xFF, 0xFF, 0x25, 0x60, 0xFE, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF8, 0xFE, 0x00, 0x66, 0x46, 0x46, 0xCA, 0x60, 0xD8, 0x78, - 0xFF, 0xFF, 0x2A, 0xF2, 0x58, 0x63, 0x60, 0x47, 0x01, 0x27, 0x64, 0x63, 0x61, 0x5C, 0x1B, 0x60, - 0xFB, 0xF9, 0xBD, 0xD0, 0xBD, 0xD0, 0x64, 0x45, 0x64, 0x41, 0xBD, 0xD0, 0x00, 0xF4, 0x04, 0xF8, - 0x83, 0xFA, 0x82, 0xF8, 0xA6, 0x46, 0x02, 0xB0, 0x5E, 0x63, 0x04, 0x03, 0x64, 0x63, 0x03, 0xB0, - 0x02, 0x3A, 0x6C, 0x63, 0x3F, 0xF2, 0xBD, 0xD0, 0xBD, 0xD0, 0x64, 0x45, 0x64, 0x41, 0xBD, 0xD0, - 0xA6, 0x46, 0x07, 0xF8, 0x86, 0xFA, 0x85, 0xF8, 0x60, 0x47, 0x08, 0xFA, 0x1B, 0x60, 0xFB, 0xF1, - 0x26, 0x46, 0x64, 0x41, 0x2F, 0x58, 0xFF, 0xFF, 0xA6, 0xF5, 0x00, 0xF2, 0x26, 0x46, 0x31, 0xF0, - 0x39, 0x18, 0x66, 0x41, 0x1D, 0x60, 0xC0, 0x65, 0x64, 0x47, 0x00, 0x7F, 0xA6, 0xF1, 0xE0, 0x84, - 0x44, 0xD3, 0x64, 0x43, 0x11, 0x18, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xFC, 0x1B, 0x66, 0x44, - 0x64, 0x46, 0x80, 0xF0, 0x60, 0x46, 0x80, 0xF8, 0x65, 0x46, 0x65, 0x43, 0x80, 0xF0, 0x01, 0xFA, - 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x0B, 0x00, 0x64, 0x46, 0x62, 0x43, 0x00, 0xF2, 0xA3, 0xDB, - 0x60, 0x46, 0x80, 0xF0, 0x81, 0xFC, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x60, 0x43, 0x61, 0x46, - 0x1F, 0x60, 0xC2, 0x61, 0xA1, 0xD3, 0x20, 0x60, 0x04, 0x7C, 0xD0, 0x80, 0xFF, 0xFF, 0x07, 0x03, - 0xA0, 0xDD, 0xDA, 0x9C, 0xA1, 0xD9, 0x49, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xA1, 0xDB, 0xD1, 0x60, - 0x97, 0x78, 0xFF, 0xFF, 0x20, 0x7C, 0x72, 0x44, 0xFF, 0xB4, 0xD0, 0x80, 0xFF, 0xFF, 0x02, 0x04, - 0xD0, 0x84, 0xFB, 0x01, 0xE0, 0x83, 0xA6, 0xF3, 0x02, 0xA3, 0x43, 0x93, 0xA6, 0xF3, 0xFF, 0xFF, - 0x02, 0xA5, 0xD7, 0x80, 0x04, 0xA5, 0x08, 0x24, 0x65, 0x43, 0x66, 0x41, 0x63, 0x46, 0x05, 0xF2, - 0x00, 0xF0, 0x81, 0xF0, 0x02, 0x18, 0x64, 0x46, 0x81, 0xF8, 0x07, 0x1B, 0x1D, 0x60, 0xC0, 0x65, - 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD9, 0x02, 0x00, 0x65, 0x46, 0x00, 0xF8, 0xA6, 0xF3, - 0x63, 0x45, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x18, 0xFA, 0x04, 0x80, 0xF8, - 0x65, 0x46, 0x00, 0xFA, 0x06, 0xF2, 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, 0x61, 0x46, 0x31, 0xF0, - 0x66, 0x41, 0x1D, 0x60, 0xC0, 0x65, 0x64, 0x47, 0x00, 0x7F, 0xA6, 0xF1, 0xE0, 0x84, 0x44, 0xD3, - 0x64, 0x43, 0x11, 0x18, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xFC, 0x1B, 0x66, 0x44, 0x64, 0x46, - 0x80, 0xF0, 0x60, 0x46, 0x80, 0xF8, 0x65, 0x46, 0x65, 0x43, 0x80, 0xF0, 0x01, 0xFA, 0x80, 0xFC, - 0x64, 0x46, 0x80, 0xF8, 0x0B, 0x00, 0x64, 0x46, 0x62, 0x43, 0x00, 0xF2, 0xA3, 0xDB, 0x60, 0x46, - 0x80, 0xF0, 0x81, 0xFC, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x60, 0x43, 0x61, 0x46, 0x2F, 0xF2, - 0x30, 0xF0, 0x31, 0xF0, 0x64, 0x45, 0x46, 0x43, 0x63, 0x46, 0x03, 0xFA, 0x06, 0xF2, 0x84, 0xF8, - 0x00, 0x7E, 0x06, 0xFA, 0x05, 0xF8, 0xA3, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0xDB, 0xF3, 0x2A, 0xF2, - 0x07, 0xB0, 0x03, 0x3A, 0x2A, 0x00, 0x00, 0xF4, 0x09, 0xF2, 0x60, 0x45, 0x80, 0x3A, 0x05, 0x00, - 0x0E, 0xF2, 0xFF, 0xFF, 0x02, 0xB0, 0x0F, 0xF2, 0x20, 0x03, 0x60, 0x47, 0x00, 0x3A, 0x1D, 0x00, - 0x60, 0x41, 0x00, 0x36, 0x13, 0x00, 0xDA, 0x85, 0x33, 0x60, 0xBE, 0x63, 0xBD, 0xD1, 0xFF, 0xFF, - 0xD1, 0x80, 0xFF, 0xFF, 0x12, 0x02, 0x60, 0xFE, 0xBD, 0xD3, 0xA5, 0xD0, 0xDE, 0x85, 0xD0, 0x80, - 0xCD, 0x81, 0x0B, 0x02, 0xF9, 0x02, 0x20, 0xFE, 0x00, 0x64, 0x09, 0x00, 0x26, 0x46, 0x48, 0xFE, - 0x65, 0x40, 0x40, 0x3A, 0x02, 0x00, 0x01, 0x64, 0x02, 0x00, 0x28, 0xFE, 0x00, 0x64, 0x40, 0x48, - 0x26, 0x46, 0x2D, 0x58, 0xFF, 0xFF, 0x19, 0x60, 0xA3, 0xF3, 0x3D, 0xF2, 0x60, 0x40, 0x01, 0x26, - 0x2A, 0xFA, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x26, 0x03, 0x00, 0xD2, 0x60, 0xB5, 0x78, - 0xFF, 0xFF, 0x3F, 0xF0, 0x32, 0x40, 0x10, 0x2A, 0x0E, 0x00, 0x2C, 0xF0, 0x64, 0x41, 0x60, 0x40, - 0x40, 0x27, 0x09, 0x00, 0xCD, 0x81, 0xDD, 0x81, 0x06, 0x03, 0x05, 0x03, 0x64, 0x40, 0x01, 0x26, - 0x02, 0x00, 0x01, 0x61, 0x01, 0x00, 0x00, 0x61, 0x60, 0x40, 0x18, 0x36, 0x1F, 0x00, 0xD0, 0x60, - 0x58, 0x4F, 0xD1, 0x78, 0xFF, 0xFF, 0x0F, 0xF0, 0xEA, 0xF1, 0x64, 0x44, 0x60, 0x22, 0x19, 0x00, - 0xDB, 0xF3, 0xFF, 0xFF, 0x07, 0xB4, 0xFD, 0xA0, 0x2A, 0xF2, 0x03, 0x02, 0x08, 0xB0, 0xFF, 0xFF, - 0x10, 0x02, 0x32, 0xF2, 0x33, 0xF2, 0xD0, 0x80, 0xEB, 0xF1, 0x0B, 0x02, 0xD0, 0x80, 0x34, 0xF2, - 0x08, 0x02, 0xEC, 0xF1, 0xFF, 0xFF, 0xD0, 0x80, 0x0F, 0xF0, 0x03, 0x02, 0xD3, 0x60, 0x10, 0x78, - 0xFF, 0xFF, 0x00, 0xF4, 0xAA, 0x60, 0xAA, 0x65, 0x09, 0xF2, 0x5A, 0xD0, 0xD4, 0x80, 0x03, 0x64, - 0x57, 0x02, 0xD0, 0x80, 0x00, 0x64, 0x5A, 0xD0, 0x53, 0x02, 0x64, 0x45, 0xD4, 0x80, 0xF8, 0x7F, - 0x08, 0x02, 0x5A, 0xD0, 0x26, 0x46, 0x64, 0x45, 0x23, 0xF0, 0x20, 0x67, 0xB0, 0x84, 0xA2, 0xDA, - 0x0B, 0x00, 0xD4, 0x80, 0x1D, 0x60, 0x60, 0x64, 0x16, 0x02, 0x5A, 0xD0, 0x26, 0x46, 0x64, 0x45, - 0x23, 0xF0, 0x40, 0x67, 0xB0, 0x84, 0xA2, 0xDA, 0x65, 0x44, 0x88, 0x3A, 0x07, 0x00, 0x77, 0x37, - 0x08, 0x00, 0x78, 0x37, 0x06, 0x00, 0x8E, 0x37, 0x04, 0x00, 0x32, 0x00, 0x81, 0x3A, 0x30, 0x00, - 0x80, 0x37, 0x00, 0x61, 0x2D, 0x00, 0xD4, 0x80, 0x01, 0x60, 0x00, 0x64, 0x5A, 0xD0, 0x28, 0x02, - 0xD0, 0x80, 0x5A, 0xD0, 0x25, 0x02, 0x26, 0x46, 0x64, 0x47, 0x7F, 0xB4, 0xFD, 0xA0, 0x09, 0x03, - 0x1F, 0x07, 0x32, 0x40, 0x02, 0x26, 0x44, 0x00, 0x23, 0xF0, 0x60, 0x67, 0xB0, 0x84, 0xA2, 0xDA, - 0x3F, 0x00, 0x0F, 0xF2, 0x32, 0x40, 0x02, 0x26, 0x3B, 0x00, 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, - 0x08, 0x2A, 0x07, 0x00, 0x60, 0x40, 0x48, 0x36, 0x04, 0x00, 0xF1, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, - 0xF1, 0xFB, 0xF4, 0x60, 0x58, 0x4F, 0x1D, 0x78, 0xFF, 0xFF, 0xD3, 0x60, 0x1A, 0x78, 0xFF, 0xFF, - 0x26, 0x46, 0x61, 0x40, 0x01, 0x2A, 0x07, 0x00, 0x2C, 0x60, 0xF8, 0x64, 0xF1, 0x60, 0x78, 0x41, - 0xE4, 0x78, 0xB5, 0xF1, 0x85, 0x00, 0x0F, 0xF2, 0x7F, 0xF1, 0x2A, 0xF2, 0x60, 0x40, 0x20, 0x2A, - 0x12, 0x00, 0x5E, 0x63, 0x60, 0x40, 0x02, 0x2B, 0x64, 0x63, 0xBD, 0xD2, 0xBD, 0xD2, 0xD0, 0x80, - 0x80, 0xF1, 0x08, 0x02, 0xD0, 0x80, 0xA3, 0xD2, 0x81, 0xF1, 0x04, 0x02, 0xD0, 0x80, 0xFF, 0xFF, - 0x01, 0x02, 0x06, 0x00, 0x6D, 0x00, 0x2A, 0xF2, 0xFF, 0xFF, 0xFF, 0xFF, 0x48, 0x36, 0x68, 0x00, - 0x2A, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x2A, 0x07, 0x00, 0x60, 0x40, 0x48, 0x36, 0x04, 0x00, - 0xF1, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0xF1, 0xFB, 0x68, 0x00, 0x26, 0x46, 0x2A, 0xF2, 0xFF, 0xFF, - 0xFF, 0xFF, 0x0C, 0x26, 0x55, 0x00, 0xB0, 0x36, 0x15, 0x00, 0x10, 0x36, 0x13, 0x00, 0x30, 0x36, - 0x11, 0x00, 0xC0, 0x36, 0x02, 0x00, 0xA0, 0x3A, 0x12, 0x00, 0x7F, 0xF1, 0x32, 0xF2, 0x33, 0xF2, - 0xD0, 0x80, 0x80, 0xF1, 0x45, 0x02, 0xD0, 0x80, 0x34, 0xF2, 0x81, 0xF1, 0x41, 0x02, 0xD0, 0x80, - 0xFF, 0xFF, 0x3E, 0x02, 0xE6, 0x60, 0x58, 0x4F, 0x3D, 0x78, 0xFF, 0xFF, 0x35, 0x00, 0x50, 0x3A, - 0x05, 0x00, 0xF8, 0x60, 0x58, 0x4F, 0xE1, 0x78, 0xFF, 0xFF, 0x2E, 0x00, 0x40, 0x3A, 0x05, 0x00, - 0xF0, 0x60, 0x58, 0x4F, 0x99, 0x78, 0xFF, 0xFF, 0x27, 0x00, 0x80, 0x3A, 0x24, 0x00, 0x7F, 0xF1, - 0x32, 0xF2, 0x33, 0xF2, 0xD0, 0x80, 0x80, 0xF1, 0x23, 0x02, 0xD0, 0x80, 0x34, 0xF2, 0x81, 0xF1, - 0x1F, 0x02, 0xD0, 0x80, 0xFF, 0xFF, 0x1C, 0x02, 0xE9, 0x60, 0x58, 0x4F, 0x30, 0x78, 0xFF, 0xFF, - 0x7D, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x27, 0x0A, 0x00, 0x19, 0x60, 0x4C, 0xF3, 0xFF, 0xFF, - 0x60, 0x40, 0x08, 0x26, 0x04, 0x00, 0xEE, 0x60, 0x58, 0x4F, 0x81, 0x78, 0xFF, 0xFF, 0x24, 0x60, - 0x58, 0x4F, 0xE3, 0x78, 0xFF, 0xFF, 0x04, 0x00, 0x66, 0x44, 0x00, 0xA8, 0xFF, 0xFF, 0x0A, 0x03, - 0x26, 0x46, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, - 0x00, 0x66, 0x46, 0x46, 0xD0, 0x60, 0xB2, 0x78, 0xFF, 0xFF, 0x2A, 0xF2, 0x3B, 0xF0, 0x60, 0x40, - 0x40, 0x2B, 0x06, 0x00, 0xC0, 0x60, 0x00, 0x64, 0x64, 0x40, 0x20, 0x2B, 0x01, 0x00, 0x03, 0x00, - 0xD3, 0x60, 0x4C, 0x78, 0xFF, 0xFF, 0x22, 0xF2, 0xFF, 0xFF, 0x04, 0xB4, 0xFF, 0xFF, 0xF8, 0x03, - 0x23, 0xF2, 0x07, 0xF4, 0xBB, 0xF0, 0x26, 0x46, 0xA4, 0x84, 0xFF, 0xFF, 0x60, 0x40, 0x2F, 0x26, - 0xD7, 0x01, 0x12, 0xF0, 0xFF, 0xFF, 0x10, 0x1B, 0xCA, 0x60, 0x58, 0x4F, 0x16, 0x78, 0xFF, 0xFF, - 0x64, 0x40, 0x18, 0x36, 0x09, 0x00, 0x04, 0x65, 0xF1, 0x60, 0x58, 0x4E, 0x96, 0x78, 0xFF, 0xFF, - 0x26, 0x46, 0xD3, 0x60, 0x10, 0x78, 0xFF, 0xFF, 0x25, 0x60, 0xFE, 0x64, 0x13, 0x60, 0x0D, 0xFB, - 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xF8, 0xFE, 0xC0, 0x01, - 0x1C, 0x60, 0x92, 0x63, 0x00, 0x64, 0xA3, 0xDB, 0x06, 0xA3, 0x10, 0x60, 0x94, 0x64, 0xBD, 0xDB, - 0xBD, 0xDB, 0x06, 0x64, 0xA3, 0xDB, 0x00, 0x63, 0x08, 0x60, 0x77, 0xFD, 0xD9, 0x60, 0xA5, 0x64, - 0x08, 0x60, 0x49, 0xFB, 0xD9, 0x60, 0x6A, 0x64, 0x08, 0x60, 0x35, 0xFB, 0x00, 0x60, 0x02, 0x64, - 0x08, 0x60, 0x16, 0xFB, 0xD3, 0x60, 0x9C, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x7D, 0xF3, 0x33, 0x60, 0x20, 0x63, 0x60, 0x40, 0x01, 0x27, 0x03, 0x00, 0x19, 0x60, 0x3B, 0xF3, - 0x02, 0x00, 0x19, 0x60, 0x3C, 0xF3, 0x08, 0x61, 0x60, 0xFE, 0xA3, 0xD1, 0xFF, 0xFF, 0x20, 0xFE, - 0x00, 0xA8, 0xE8, 0x84, 0x0F, 0x03, 0x60, 0xFE, 0x02, 0x28, 0xF6, 0x01, 0x80, 0x62, 0xB2, 0x9C, - 0xBD, 0xD9, 0x7B, 0xF9, 0xCD, 0x81, 0x00, 0x36, 0x01, 0x00, 0xEE, 0x01, 0x36, 0x60, 0x0A, 0x63, - 0x08, 0x61, 0xEA, 0x01, 0x2E, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0xBA, 0xFE, 0x16, 0x60, 0x87, 0xF3, 0xFF, 0xFF, 0x03, 0xA8, 0x02, 0xA8, 0x04, 0x03, 0x28, 0x02, - 0xD9, 0x60, 0x41, 0x78, 0xFF, 0xFF, 0xD8, 0x60, 0xD4, 0x78, 0xFF, 0xFF, 0x08, 0x60, 0x15, 0xF1, - 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x11, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xAC, 0xF3, - 0xFF, 0xFF, 0xFE, 0xA0, 0xFF, 0xFF, 0x0A, 0x07, 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, - 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x20, 0x60, 0x20, 0x65, - 0xA5, 0xDF, 0x00, 0x64, 0x08, 0x60, 0x27, 0xFB, 0x5A, 0xDB, 0xD4, 0x60, 0xF6, 0x78, 0xFF, 0xFF, - 0x01, 0x63, 0x0E, 0x60, 0x36, 0xFD, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x64, - 0x08, 0x60, 0x15, 0xFB, 0x5A, 0xDB, 0xBA, 0xFE, 0x02, 0x64, 0xDB, 0xFB, 0xF1, 0xF3, 0xFF, 0xFF, - 0x01, 0xBC, 0xF1, 0xFB, 0x44, 0x60, 0x44, 0x64, 0x7F, 0xFB, 0x80, 0xFB, 0x81, 0xFB, 0x08, 0x60, - 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x08, 0x60, 0x77, 0xF3, 0xFF, 0xFF, 0x15, 0x18, 0xA2, 0xDF, - 0x40, 0x60, 0x58, 0x4E, 0x7D, 0x78, 0xFF, 0xFF, 0x1F, 0x60, 0xC4, 0x64, 0x0F, 0x60, 0xE1, 0xFB, - 0x4A, 0xDF, 0x01, 0x60, 0xFE, 0x63, 0x1D, 0x60, 0xBE, 0x61, 0x00, 0x64, 0x59, 0xDB, 0xFE, 0x1F, - 0x10, 0x60, 0x0E, 0x62, 0xA2, 0xDF, 0x5B, 0x00, 0xCF, 0xF3, 0xFF, 0xFF, 0x52, 0x1B, 0x10, 0x60, - 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x24, 0x40, 0x02, 0x22, 0x26, 0x00, 0x08, 0x60, 0x1E, 0xF1, - 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, 0x00, 0x64, 0x08, 0x60, - 0x16, 0xFB, 0xD4, 0x60, 0x1F, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, - 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x08, 0x60, 0x1E, 0xF1, 0x00, 0x60, 0x40, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD4, 0x60, 0x59, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x24, 0x40, 0x01, 0x26, 0x11, 0x00, 0x08, 0x60, - 0x1E, 0xF1, 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, 0x00, 0x64, - 0x08, 0x60, 0x16, 0xFB, 0xD4, 0x60, 0x59, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x08, 0x60, 0x1E, 0xF1, 0x00, 0x60, 0x40, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, - 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD4, 0x60, 0x59, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0xFD, 0x60, 0x89, 0x65, 0xF3, 0x60, 0x58, 0x4E, 0x27, 0x78, 0xFF, 0xFF, 0x10, 0x60, - 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x64, 0x08, 0x60, 0x15, 0xFB, 0x5A, 0xDB, 0x10, 0x60, - 0x4E, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xF7, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x08, 0x60, - 0x08, 0xF1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xBB, 0xFE, 0xFD, 0x60, - 0x40, 0x65, 0xF3, 0x60, 0x58, 0x4E, 0x27, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x03, 0x64, 0x08, 0x60, - 0x28, 0xFB, 0xD4, 0x60, 0x87, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, - 0x27, 0xF1, 0x00, 0x60, 0x02, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x07, 0x03, 0xA0, 0x84, 0xA2, 0xDB, - 0x10, 0x60, 0x4E, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xE2, 0x01, 0x10, 0x60, 0x4E, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x00, 0x64, 0x08, 0x60, 0x27, 0xFB, 0x5A, 0xDB, 0x20, 0x40, 0x04, 0x2B, 0x14, 0x00, - 0x9B, 0xFE, 0x08, 0x04, 0xBB, 0xFE, 0x08, 0x60, 0x08, 0xF1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x80, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD4, 0x60, 0x95, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, - 0x16, 0x60, 0xCC, 0xF3, 0x00, 0x61, 0x60, 0x40, 0x00, 0x36, 0x00, 0xB9, 0x60, 0x40, 0x01, 0x36, - 0x01, 0xB9, 0x60, 0x40, 0x02, 0x36, 0x06, 0xB9, 0x60, 0x40, 0x03, 0x36, 0x07, 0xB9, 0x41, 0x44, - 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0A, 0x04, 0x40, 0x60, 0x00, 0x64, - 0x08, 0x60, 0x16, 0xFB, 0xD4, 0x60, 0xC8, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x7D, 0xF1, 0x13, 0x60, 0x1A, 0xF9, 0x0C, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x20, 0x60, - 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD4, 0x60, 0xE9, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xBE, 0xFE, 0x08, 0x60, 0x08, 0xF1, - 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x75, 0x00, 0x10, 0x60, 0x2A, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0xBA, 0xFE, 0x02, 0x64, 0xDB, 0xFB, 0xF1, 0xF3, 0xFF, 0xFF, 0x01, 0xBC, - 0xF1, 0xFB, 0x44, 0x60, 0x44, 0x64, 0x7F, 0xFB, 0x80, 0xFB, 0x81, 0xFB, 0xFF, 0xFF, 0x20, 0x40, - 0x04, 0x2B, 0x14, 0x00, 0x9B, 0xFE, 0x08, 0x04, 0xBB, 0xFE, 0x08, 0x60, 0x08, 0xF1, 0x80, 0x60, - 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x80, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, - 0xD5, 0x60, 0x07, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x00, 0x65, - 0x20, 0x44, 0x34, 0x80, 0x08, 0x60, 0x07, 0xF1, 0x02, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, - 0x64, 0x40, 0x01, 0x2A, 0x06, 0x00, 0xA2, 0xDF, 0x02, 0x65, 0xF1, 0x60, 0x58, 0x4E, 0xC3, 0x78, - 0xFF, 0xFF, 0xCF, 0xF3, 0x20, 0x60, 0x20, 0x65, 0x36, 0x1B, 0xA5, 0xD3, 0x24, 0x40, 0x01, 0x26, - 0x16, 0x00, 0x60, 0x40, 0x20, 0x26, 0x2F, 0x00, 0x01, 0xBC, 0xA5, 0xDB, 0x08, 0x60, 0x1E, 0xF1, - 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, 0x00, 0x64, 0x08, 0x60, - 0x16, 0xFB, 0xD5, 0x60, 0x65, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x60, 0x40, - 0x10, 0x26, 0x19, 0x00, 0x01, 0xBC, 0xA5, 0xDB, 0x08, 0x60, 0x1E, 0xF1, 0x00, 0x60, 0x40, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD5, 0x60, - 0x65, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xFD, 0x60, 0x89, 0x65, 0xF3, 0x60, - 0x58, 0x4E, 0x27, 0x78, 0xFF, 0xFF, 0xCF, 0xF1, 0x07, 0x60, 0xE9, 0xF3, 0x64, 0x40, 0x02, 0x3A, - 0x0C, 0x00, 0x01, 0x63, 0x60, 0x40, 0x10, 0x22, 0x00, 0x63, 0x08, 0x60, 0xC1, 0xFD, 0x08, 0x60, - 0xC5, 0xFD, 0x08, 0x60, 0xC9, 0xFD, 0x08, 0x60, 0xCD, 0xFD, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x01, 0x64, 0x53, 0xFB, 0x2F, 0x60, 0x02, 0x64, 0x54, 0xFB, 0x24, 0x40, 0x01, 0x26, - 0x11, 0x00, 0x08, 0x60, 0x12, 0xF1, 0x00, 0x60, 0x10, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x10, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD5, 0x60, 0xAB, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x12, 0xF1, 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x10, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD5, 0x60, 0xAB, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xFD, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x08, 0x60, - 0x08, 0xF1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, 0x2A, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x86, 0xF1, 0x1B, 0x60, 0xB2, 0x63, 0xD3, 0x80, 0x20, 0x44, 0x03, 0x03, - 0xD8, 0x60, 0xD0, 0x78, 0xFF, 0xFF, 0x87, 0xF3, 0xFF, 0xFF, 0xD0, 0x80, 0xFF, 0xFF, 0x1B, 0x02, - 0x24, 0x44, 0x04, 0x22, 0x12, 0x00, 0x24, 0x44, 0x01, 0xAC, 0xFB, 0xB4, 0x40, 0x44, 0xF7, 0x60, - 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x08, 0x60, 0x08, 0xF1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0xD4, 0x60, 0xF6, 0x78, 0xFF, 0xFF, 0xD2, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, - 0xFF, 0xFF, 0x1F, 0x02, 0x87, 0x00, 0x20, 0x44, 0x10, 0xBC, 0x40, 0x40, 0x64, 0x42, 0x5A, 0xD1, - 0x06, 0x63, 0xA4, 0xD1, 0xC3, 0x83, 0x7D, 0xF9, 0xBD, 0xD1, 0x7F, 0xF9, 0xBD, 0xD1, 0xFF, 0xFF, - 0x80, 0xF9, 0xBD, 0xD1, 0x81, 0xF9, 0x04, 0xA3, 0xBD, 0xD1, 0x33, 0x60, 0xBE, 0x64, 0x64, 0x41, - 0xDD, 0x81, 0xFE, 0xB1, 0xA0, 0xD9, 0x04, 0x03, 0xBD, 0xD1, 0xC9, 0x81, 0x58, 0xD9, 0xFC, 0x02, - 0x39, 0x00, 0xE4, 0xF3, 0x7D, 0xFB, 0x66, 0x41, 0x60, 0x40, 0x01, 0x27, 0x06, 0x00, 0x10, 0x60, - 0xF0, 0x63, 0x11, 0x60, 0x44, 0x65, 0x06, 0x66, 0x05, 0x00, 0x11, 0x60, 0x60, 0x63, 0x12, 0x60, - 0x40, 0x65, 0x08, 0x66, 0xA3, 0xD1, 0x4B, 0x93, 0xD0, 0x80, 0xD7, 0x80, 0x02, 0x03, 0xFA, 0x04, - 0x04, 0x00, 0x5B, 0x93, 0x02, 0xA3, 0x01, 0x64, 0xA3, 0xDB, 0x61, 0x46, 0x2F, 0x60, 0x02, 0x61, - 0xA1, 0xD3, 0xFF, 0xFF, 0x00, 0xA8, 0x33, 0x60, 0xBE, 0x63, 0x02, 0x02, 0x2D, 0x60, 0x10, 0x61, - 0xA1, 0xD3, 0xBD, 0xDB, 0xDC, 0x84, 0xFE, 0xB4, 0x59, 0xD1, 0xC8, 0x84, 0xBD, 0xD9, 0xFC, 0x02, - 0xEC, 0xF3, 0x72, 0x45, 0xEB, 0xF3, 0x94, 0x83, 0x81, 0xFD, 0x94, 0x83, 0x80, 0xFD, 0x65, 0x5F, - 0x02, 0x64, 0x7F, 0xFB, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0A, 0x04, - 0x40, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD6, 0x60, 0x3A, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x7D, 0xF1, 0x13, 0x60, 0x1A, 0xF9, 0x0E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x2D, 0xFF, 0x20, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD6, 0x60, 0x5B, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xBE, 0xFE, - 0x08, 0x60, 0x08, 0xF1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xD7, 0x60, - 0x7B, 0x78, 0xFF, 0xFF, 0xFF, 0x60, 0xEF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x02, 0x64, 0xDB, 0xFB, - 0xF1, 0xF3, 0xFF, 0xFF, 0x01, 0xBC, 0xF1, 0xFB, 0xF7, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, - 0x08, 0x60, 0x08, 0xF1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, - 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x24, 0x44, 0x02, 0x22, 0x03, 0x00, 0x01, 0xAC, 0x04, 0xBC, - 0x40, 0x44, 0x32, 0x40, 0x80, 0x2A, 0x8C, 0x00, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0xDE, 0xFE, 0x0A, 0x04, 0x40, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD6, 0x60, 0x8C, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x95, 0xF3, 0xFF, 0xFF, 0x7F, 0xB4, 0x95, 0xFB, 0x26, 0x60, 0x34, 0x62, 0x06, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x2D, 0xFF, 0xFF, 0xFF, 0xBE, 0xFE, 0x08, 0x60, 0x08, 0xF1, 0x40, 0x60, 0x00, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xDA, 0xFE, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x12, 0x60, 0xFF, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x05, 0x03, 0x0E, 0xF2, 0xFF, 0xFF, - 0x60, 0x40, 0x01, 0x2A, 0x22, 0x00, 0x13, 0x60, 0x02, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, - 0x03, 0x03, 0x0F, 0xF2, 0xFF, 0xFF, 0x19, 0x1B, 0x08, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, - 0xD6, 0x60, 0xE5, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x01, 0x64, 0x19, 0x60, 0xF1, 0xFB, 0x19, 0x60, - 0xF6, 0xF1, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x26, 0x05, 0x00, 0x89, 0xFF, 0x08, 0x60, 0x00, 0x75, - 0x88, 0xFF, 0x01, 0x00, 0x10, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0xDE, 0xFE, 0x0A, 0x04, 0x40, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD6, 0x60, - 0xE5, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x7D, 0xF1, 0x13, 0x60, 0x1A, 0xF9, 0x08, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, - 0x20, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD7, 0x60, 0x0A, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0xBE, 0xFE, 0x08, 0x60, 0x08, 0xF1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0xBA, 0xFE, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x1E, 0x00, - 0xDA, 0xFE, 0xC1, 0xFE, 0x0E, 0x60, 0x36, 0xF1, 0x0E, 0x60, 0x4B, 0xF9, 0x1C, 0x60, 0x92, 0x64, - 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x60, 0x06, 0x64, - 0x08, 0x60, 0x16, 0xFB, 0xD7, 0x60, 0x4E, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x00, 0x60, 0x02, 0x64, - 0x08, 0x60, 0x28, 0xFB, 0xD7, 0x60, 0x55, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x1C, 0x60, 0x6C, 0x61, - 0x75, 0x60, 0x30, 0x65, 0xA1, 0xD3, 0xFF, 0xFF, 0xFF, 0xA0, 0xE0, 0x84, 0x02, 0x02, 0x03, 0x60, - 0xE8, 0x64, 0xD4, 0x80, 0xFF, 0xFF, 0x01, 0x04, 0x65, 0x44, 0xA1, 0xDB, 0x32, 0x40, 0x80, 0x2A, - 0x03, 0x00, 0xD4, 0x60, 0xF6, 0x78, 0xFF, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x08, 0x60, - 0x27, 0xFB, 0x5A, 0xDB, 0xD4, 0x60, 0xF6, 0x78, 0xFF, 0xFF, 0x20, 0x40, 0x06, 0x23, 0x10, 0x00, - 0x08, 0x60, 0x27, 0xF1, 0x7F, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x80, 0x60, 0x00, 0x64, - 0x08, 0x60, 0x28, 0xFB, 0xD7, 0x60, 0x55, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x10, 0x60, 0x4E, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x64, 0x08, 0x60, 0x27, 0xFB, 0x5A, 0xDB, - 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0xD3, 0x60, 0xD0, 0x78, 0xFF, 0xFF, 0x78, 0xF3, 0x79, 0xFB, 0x20, 0x60, 0x14, 0x62, 0xA2, 0xDF, - 0xFF, 0x60, 0xDF, 0x65, 0x20, 0x44, 0x24, 0x80, 0xBC, 0xF1, 0x0E, 0x60, 0x4B, 0xF9, 0x1C, 0x60, - 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0xF7, 0x60, - 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x10, 0x26, 0x38, 0x00, 0x00, 0x64, 0xB2, 0xFB, 0xB3, 0xFB, - 0xB4, 0xFB, 0x00, 0x75, 0x00, 0x72, 0xBA, 0xF1, 0x7E, 0xF9, 0x64, 0x44, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0xE0, 0x93, 0xE5, 0xF1, 0x84, 0xF9, 0x7D, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x27, - 0x1E, 0x00, 0x19, 0x60, 0x44, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2A, 0x0A, 0x00, 0x0F, 0x64, - 0xFC, 0x60, 0x58, 0x4E, 0x34, 0x78, 0xFF, 0xFF, 0x67, 0x43, 0x1A, 0x60, 0xB3, 0xFD, 0x1A, 0x60, - 0xC3, 0xFD, 0xD3, 0x60, 0x58, 0x4E, 0x78, 0x78, 0xFF, 0xFF, 0x00, 0x65, 0xFC, 0x60, 0x58, 0x4E, - 0xC7, 0x78, 0xFF, 0xFF, 0xFD, 0x60, 0x58, 0x4E, 0x11, 0x78, 0xFF, 0xFF, 0x05, 0x00, 0xFF, 0x65, - 0xFC, 0x60, 0x58, 0x4E, 0xC7, 0x78, 0xFF, 0xFF, 0x44, 0x00, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x00, 0x60, 0x84, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD7, 0x60, 0xDB, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x80, 0x64, 0xA0, 0x80, - 0x9C, 0x84, 0x2B, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x08, 0x60, 0x15, 0xF1, 0xFF, 0x60, 0x7F, 0x61, - 0xA1, 0x84, 0x5A, 0xD1, 0x4A, 0xDB, 0xA1, 0x84, 0x5A, 0xDB, 0x2E, 0x60, 0x2E, 0x64, 0x2D, 0x60, - 0x8A, 0x63, 0xA0, 0xD1, 0xA3, 0xD9, 0x64, 0x41, 0x58, 0xD1, 0x5B, 0xD9, 0x7D, 0xF3, 0x66, 0x45, - 0xA6, 0xF5, 0x60, 0x40, 0x01, 0x27, 0x08, 0x00, 0x91, 0xFA, 0x61, 0x44, 0xFD, 0x60, 0x58, 0x4E, - 0xAC, 0x78, 0xFF, 0xFF, 0x12, 0xFA, 0x07, 0x00, 0x11, 0xF8, 0x64, 0x44, 0xFD, 0x60, 0x58, 0x4E, - 0xAC, 0x78, 0xFF, 0xFF, 0x12, 0xFA, 0x65, 0x46, 0x04, 0x00, 0xBB, 0xFE, 0xD4, 0x60, 0xF6, 0x78, - 0xFF, 0xFF, 0x16, 0x60, 0xC2, 0xF1, 0x00, 0x65, 0x64, 0x40, 0x01, 0x36, 0x22, 0x65, 0x64, 0x40, - 0x07, 0x36, 0x01, 0x65, 0x64, 0x40, 0x0A, 0x36, 0x01, 0x65, 0x64, 0x40, 0x0B, 0x36, 0x22, 0x65, - 0xA6, 0xF3, 0x66, 0x5C, 0x60, 0x46, 0x1F, 0x63, 0xE3, 0x83, 0xBA, 0xF8, 0x02, 0xA6, 0x66, 0x44, - 0xFC, 0x1F, 0x16, 0x60, 0xC2, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x07, 0x36, 0x03, 0x00, 0x0A, 0x36, - 0x06, 0x00, 0x09, 0x00, 0xA6, 0xF3, 0x04, 0x65, 0x60, 0x46, 0xBA, 0xF8, 0x04, 0x00, 0xA6, 0xF3, - 0x10, 0x65, 0x60, 0x46, 0xBA, 0xF8, 0x64, 0x46, 0xA6, 0xF3, 0x32, 0x41, 0x60, 0x45, 0x08, 0xB1, - 0x66, 0x41, 0x16, 0x03, 0x65, 0x46, 0x17, 0x60, 0x80, 0xF3, 0x06, 0xF0, 0xE0, 0x84, 0xE0, 0x84, - 0xE0, 0x84, 0xE0, 0x84, 0x80, 0xBF, 0xB0, 0x84, 0x06, 0xFA, 0x66, 0x43, 0x02, 0xA3, 0x63, 0x46, - 0x06, 0xF0, 0xFF, 0xFF, 0xB0, 0x84, 0x06, 0xFA, 0x61, 0x46, 0x32, 0x44, 0x10, 0xBC, 0x40, 0x52, - 0x01, 0x64, 0x10, 0x60, 0x0A, 0xFB, 0x0F, 0x4E, 0xEF, 0x60, 0x58, 0x4F, 0x3A, 0x78, 0xFF, 0xFF, - 0x0E, 0x4F, 0x08, 0x60, 0x15, 0xF1, 0xFF, 0x60, 0xFB, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x00, 0x60, - 0x04, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD3, 0x60, 0xAE, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x1C, 0x60, - 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0xBB, 0xFE, - 0x20, 0x44, 0x04, 0x27, 0x11, 0x00, 0x10, 0x26, 0x02, 0x00, 0xDB, 0xFE, 0x14, 0x00, 0x08, 0x60, - 0x07, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x36, 0x07, 0x00, 0x01, 0x64, 0xA2, 0xDB, 0x01, 0x65, - 0xF1, 0x60, 0x58, 0x4E, 0xC3, 0x78, 0xFF, 0xFF, 0x08, 0x60, 0x08, 0xF1, 0x80, 0x60, 0x00, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x01, 0x64, 0x8A, 0xFB, 0xFF, 0x60, 0xEF, 0x65, 0x20, 0x44, - 0x24, 0x80, 0x03, 0x64, 0xDB, 0xFB, 0xF1, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0xF1, 0xFB, 0xC1, 0xFE, - 0x00, 0x60, 0x02, 0x64, 0x08, 0x60, 0x28, 0xFB, 0xD8, 0x60, 0xAA, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x20, 0x40, 0x06, 0x23, 0x10, 0x00, 0x08, 0x60, 0x27, 0xF1, 0x7F, 0x60, - 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x80, 0x60, 0x00, 0x64, 0x08, 0x60, 0x28, 0xFB, 0xD8, 0x60, - 0xAA, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x4E, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x00, 0x64, 0x08, 0x60, 0x27, 0xFB, 0x5A, 0xDB, 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, - 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0xD3, 0x60, 0xD0, 0x78, 0xFF, 0xFF, - 0xBB, 0xFE, 0xD9, 0x60, 0xB0, 0x78, 0xFF, 0xFF, 0x16, 0x60, 0xC2, 0xF1, 0x00, 0x65, 0x64, 0x40, - 0x01, 0x36, 0x22, 0x65, 0xA6, 0xF3, 0x66, 0x5C, 0x60, 0x46, 0x1F, 0x63, 0xE3, 0x83, 0xBA, 0xF8, - 0x02, 0xA6, 0x66, 0x44, 0xFC, 0x1F, 0x64, 0x46, 0xA6, 0xF1, 0x02, 0x64, 0xC0, 0x85, 0x0C, 0x61, - 0x32, 0x40, 0x08, 0x2A, 0x14, 0x00, 0x17, 0x60, 0x80, 0xF3, 0x66, 0x41, 0x65, 0x46, 0x06, 0xF0, - 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0x80, 0xBF, 0xB0, 0x83, 0x06, 0xFC, 0x66, 0x42, - 0xFE, 0xA2, 0x62, 0x46, 0x06, 0xF0, 0xFF, 0xFF, 0xB0, 0x84, 0x06, 0xFA, 0x61, 0x46, 0x0B, 0x64, - 0xDB, 0xFB, 0xF1, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0xF1, 0xFB, 0x01, 0x65, 0xF1, 0x60, 0x58, 0x4E, - 0xC3, 0x78, 0xFF, 0xFF, 0xE4, 0xF1, 0x7D, 0xF9, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0xDE, 0xFE, 0x0A, 0x04, 0x40, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD9, 0x60, 0x0C, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x7D, 0xF1, 0x13, 0x60, 0x1A, 0xF9, 0x0E, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x20, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD9, 0x60, - 0x2D, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x08, 0x60, 0x15, 0xFB, - 0x5A, 0xDB, 0xBE, 0xFE, 0x08, 0x60, 0x08, 0xF1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x01, 0x64, 0x8A, 0xFB, 0xFF, 0x60, 0xDF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x2F, 0x58, - 0xFF, 0xFF, 0x06, 0x64, 0xDB, 0xFB, 0xF1, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0xF1, 0xFB, 0xE4, 0xF1, - 0x7D, 0xF9, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x01, 0x64, 0x8A, 0xFB, 0xFF, 0x60, - 0xDF, 0x65, 0x20, 0x44, 0x24, 0x80, 0xA6, 0xF1, 0x66, 0x45, 0x64, 0x46, 0x66, 0x43, 0x02, 0xA3, - 0x63, 0x46, 0x02, 0x64, 0x06, 0xFA, 0x04, 0x63, 0x04, 0x61, 0x01, 0x60, 0xCC, 0x64, 0x58, 0xD1, - 0x59, 0xD8, 0xFD, 0x1F, 0x65, 0x46, 0x01, 0x65, 0xF1, 0x60, 0x58, 0x4E, 0xC3, 0x78, 0xFF, 0xFF, - 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x67, 0xFB, 0x68, 0xFB, 0xA6, 0xF1, 0x0E, 0x64, 0x66, 0x41, - 0x64, 0x42, 0x02, 0xA2, 0x62, 0x46, 0x06, 0xF0, 0xFF, 0x60, 0xFC, 0x64, 0xA0, 0x84, 0x06, 0xFA, - 0x61, 0x46, 0xDB, 0xF3, 0xFF, 0xFF, 0x04, 0xA8, 0x10, 0x60, 0x0E, 0x64, 0x07, 0x03, 0xA0, 0xD1, - 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x2A, 0x02, 0x00, 0x00, 0x63, 0xA0, 0xDD, 0x01, 0x64, 0xDB, 0xFB, - 0xF1, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0xF1, 0xFB, 0x00, 0x63, 0x08, 0x60, 0x77, 0xFD, 0x10, 0x60, - 0x4E, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x64, 0x08, 0x60, 0x27, 0xFB, 0x5A, 0xDB, 0x10, 0x60, - 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x60, 0x02, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD3, 0x60, - 0x9C, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, - 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x2E, 0x58, 0xFF, 0xFF, - 0x40, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0xB9, 0xF1, 0x0E, 0x60, 0x4B, 0xF9, 0x5F, 0xF5, 0xEA, 0xF1, - 0x2F, 0xF8, 0xEB, 0xF1, 0x30, 0xF8, 0xEC, 0xF1, 0x31, 0xF8, 0xB9, 0xF1, 0x19, 0xF8, 0xF8, 0x60, - 0x80, 0x64, 0x0E, 0xFA, 0x00, 0x64, 0x3E, 0xFA, 0xA6, 0xF1, 0x07, 0xF8, 0x1B, 0x60, 0xB0, 0x64, - 0x00, 0x60, 0x67, 0xFB, 0x44, 0x60, 0x44, 0x64, 0x7F, 0xFB, 0x80, 0xFB, 0x81, 0xFB, 0x31, 0x44, - 0xF9, 0xB4, 0x40, 0x51, 0x00, 0x60, 0xCE, 0x63, 0x01, 0x60, 0x0C, 0x65, 0xA3, 0xD3, 0xA5, 0xD1, - 0x04, 0xA4, 0xA3, 0xDB, 0xD0, 0x80, 0xA0, 0xD1, 0x0A, 0x06, 0x41, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xD6, 0x60, 0x6A, 0x78, 0xFF, 0xFF, 0x44, 0x47, - 0x16, 0x60, 0xC2, 0xF3, 0xFF, 0xFF, 0xFF, 0xA4, 0xFF, 0xFF, 0x09, 0x07, 0x0E, 0x61, 0x41, 0xD3, - 0x32, 0x40, 0x08, 0x26, 0x04, 0x00, 0x10, 0xB0, 0xFF, 0xFF, 0x01, 0x03, 0xD3, 0x01, 0x42, 0x64, - 0x3B, 0x42, 0x5A, 0xDB, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0A, 0x04, - 0x40, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xD9, 0x60, 0xFA, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x27, 0xD1, 0x7D, 0xF9, 0x13, 0x60, 0x1A, 0xF9, 0x0E, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x2D, 0xFF, 0x20, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xDA, 0x60, 0x1C, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0xBE, 0xFE, 0x08, 0x60, 0x08, 0xF1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x07, 0x60, 0xD0, 0x64, 0x0E, 0x60, 0x4B, 0xFB, 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, - 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x27, 0x43, 0x06, 0xA3, 0xBD, 0xD3, 0x7F, 0xFB, - 0xBD, 0xD3, 0x80, 0xFB, 0xA3, 0xD3, 0x81, 0xFB, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x01, 0x60, 0x04, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xDA, 0x60, 0x4A, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0xB9, 0xF1, 0x0E, 0x60, 0x4B, 0xF9, 0x08, 0x60, 0x15, 0xF1, 0xFE, 0x60, - 0xFF, 0x61, 0xA1, 0x84, 0x5A, 0xD1, 0x4A, 0xDB, 0xA1, 0x84, 0x5A, 0xDB, 0x08, 0x60, 0x15, 0xF1, - 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xD9, 0x60, - 0xCA, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x08, 0x65, 0x20, 0x44, 0x34, 0x80, 0x7D, 0xF1, 0x32, 0x60, - 0x7A, 0x61, 0xA1, 0xD3, 0x64, 0x40, 0x01, 0x27, 0x59, 0xD3, 0x32, 0x60, 0x7E, 0x61, 0xFD, 0x60, - 0x58, 0x4E, 0xAC, 0x78, 0xFF, 0xFF, 0xA1, 0xDB, 0x5E, 0xF5, 0xEA, 0xF1, 0x2F, 0xF8, 0xEB, 0xF1, - 0x30, 0xF8, 0xEC, 0xF1, 0x31, 0xF8, 0xB9, 0xF1, 0x19, 0xF8, 0x80, 0x7E, 0xF8, 0x7F, 0x0E, 0xFA, - 0x00, 0x64, 0x3E, 0xFA, 0xA6, 0xF1, 0x07, 0xF8, 0x2B, 0xFA, 0xB0, 0x64, 0x2A, 0xFA, 0x27, 0x43, - 0x06, 0xA3, 0xBD, 0xD1, 0x2C, 0xF8, 0x32, 0xF8, 0xBD, 0xD1, 0x2D, 0xF8, 0x33, 0xF8, 0xA3, 0xD1, - 0x2E, 0xF8, 0x34, 0xF8, 0x06, 0x63, 0x3F, 0xFC, 0x20, 0x60, 0x16, 0x61, 0xDB, 0xF3, 0xA1, 0xD3, - 0x03, 0xA8, 0xAC, 0x83, 0x0E, 0x02, 0x0D, 0x03, 0x20, 0x60, 0x18, 0x61, 0xA1, 0xD1, 0x66, 0x45, - 0x00, 0xF4, 0x09, 0xFC, 0x01, 0x64, 0x0A, 0xFA, 0x0B, 0xF8, 0x20, 0x60, 0x16, 0x61, 0xA1, 0xDF, - 0x25, 0x00, 0x16, 0x60, 0xC3, 0xF3, 0x66, 0x45, 0x00, 0xF4, 0x60, 0x40, 0x01, 0x36, 0x15, 0x00, - 0x02, 0x36, 0xBD, 0x00, 0x03, 0x36, 0x07, 0x00, 0x04, 0x36, 0x0F, 0x00, 0x05, 0x36, 0xB7, 0x00, - 0x06, 0x36, 0x01, 0x00, 0x0A, 0x00, 0x80, 0x64, 0x09, 0xFA, 0x01, 0x63, 0x0A, 0xFC, 0x00, 0x64, - 0x0B, 0xFA, 0x80, 0x60, 0xF4, 0x62, 0xA2, 0xDF, 0x09, 0x00, 0x00, 0x64, 0x09, 0xFA, 0x01, 0x63, - 0x0A, 0xFC, 0x00, 0x64, 0x0B, 0xFA, 0x80, 0x60, 0xF4, 0x62, 0xA2, 0xDF, 0x25, 0x60, 0xCE, 0x64, - 0x13, 0x60, 0x0D, 0xFB, 0x65, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0x00, 0x66, 0xDB, 0xF3, 0x46, 0x46, 0xFD, 0xA0, 0xC1, 0xFE, 0x02, 0x02, 0x2F, 0x58, 0xFF, 0xFF, - 0x01, 0x64, 0x68, 0xFB, 0x43, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0E, 0x60, 0x38, 0xF3, 0xFF, 0xFF, - 0x64, 0xA4, 0xA2, 0xDB, 0x0E, 0x60, 0x38, 0xF1, 0x0E, 0x60, 0x4B, 0xF9, 0x1C, 0x60, 0x92, 0x64, - 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x60, 0x0C, 0x64, - 0x08, 0x60, 0x16, 0xFB, 0xDB, 0x60, 0x00, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x08, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x55, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0x00, 0x64, 0x68, 0xFB, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x26, 0x46, - 0x00, 0xF4, 0x09, 0xF2, 0x0A, 0xF2, 0x00, 0xA8, 0x0B, 0xF2, 0x02, 0xA8, 0x16, 0x02, 0x00, 0xA8, - 0x1A, 0x02, 0x19, 0x02, 0x26, 0x46, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, - 0x08, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x20, 0x40, 0x08, 0x2A, 0x03, 0x00, 0xDC, 0x60, - 0xF6, 0x78, 0xFF, 0xFF, 0xE3, 0x60, 0x69, 0x78, 0xFF, 0xFF, 0x09, 0xF2, 0x0A, 0xF2, 0x80, 0xA8, - 0x0B, 0xF2, 0x02, 0xA8, 0xE4, 0x03, 0x44, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0B, 0xF2, 0x26, 0x46, - 0x40, 0x59, 0x02, 0x60, 0x00, 0x61, 0x2F, 0xF2, 0xA1, 0xDB, 0x30, 0xF2, 0x41, 0x58, 0x59, 0xDB, - 0x31, 0xF2, 0x59, 0xDB, 0x26, 0x46, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, - 0x08, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x03, 0x65, 0xF1, 0x60, 0x58, 0x4E, 0x96, 0x78, - 0xFF, 0xFF, 0xE7, 0x60, 0x0B, 0x78, 0xFF, 0xFF, 0xFF, 0x60, 0xFB, 0x64, 0xA0, 0x84, 0xA2, 0xDB, - 0x00, 0x64, 0x68, 0xFB, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x20, 0x40, 0x08, 0x2A, - 0x03, 0x00, 0xD9, 0x60, 0xCA, 0x78, 0xFF, 0xFF, 0xE2, 0x60, 0x73, 0x78, 0xFF, 0xFF, 0x01, 0x63, - 0x09, 0xFC, 0x32, 0x40, 0x08, 0x26, 0x14, 0x00, 0x16, 0x60, 0xC2, 0xF3, 0xFF, 0xFF, 0x60, 0x40, - 0x0B, 0x36, 0x03, 0x00, 0xDA, 0x60, 0xC5, 0x78, 0xFF, 0xFF, 0x01, 0x64, 0xA2, 0xDB, 0x0B, 0x64, - 0x19, 0x60, 0xA4, 0xFB, 0xA6, 0xF1, 0x66, 0x41, 0x64, 0x46, 0x22, 0x64, 0x3A, 0xFA, 0x61, 0x46, - 0x01, 0x64, 0x0A, 0xFA, 0x00, 0x64, 0x0B, 0xFA, 0x01, 0x64, 0x40, 0x60, 0x7A, 0xFB, 0x01, 0x64, - 0x68, 0xFB, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, - 0x0D, 0xFB, 0x65, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x00, 0x66, - 0xDB, 0xF3, 0x46, 0x46, 0xFD, 0xA0, 0xC1, 0xFE, 0x02, 0x02, 0x2F, 0x58, 0xFF, 0xFF, 0x1C, 0x60, - 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x60, - 0x0C, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xDB, 0x60, 0xB9, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x08, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x3A, 0x03, - 0xA0, 0x84, 0xA2, 0xDB, 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x64, 0x68, 0xFB, 0x26, 0x46, 0x00, 0xF4, 0x09, 0xF2, 0x0A, 0xF2, - 0x01, 0xA8, 0x0B, 0xF2, 0x02, 0xA8, 0x04, 0x02, 0x00, 0xA8, 0x02, 0x02, 0x01, 0x02, 0x31, 0x00, - 0xDC, 0x60, 0x58, 0x4D, 0xB9, 0x78, 0xFF, 0xFF, 0x0B, 0xF2, 0x26, 0x46, 0x40, 0x59, 0x02, 0x60, - 0x00, 0x61, 0x2F, 0xF2, 0xA1, 0xDB, 0x30, 0xF2, 0x41, 0x58, 0x59, 0xDB, 0x31, 0xF2, 0x59, 0xDB, - 0x26, 0x46, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, - 0x00, 0x66, 0x46, 0x46, 0x03, 0x65, 0xF1, 0x60, 0x58, 0x4E, 0x96, 0x78, 0xFF, 0xFF, 0xE7, 0x60, - 0x0B, 0x78, 0xFF, 0xFF, 0xDC, 0x60, 0x58, 0x4D, 0xB9, 0x78, 0xFF, 0xFF, 0x00, 0x64, 0x68, 0xFB, - 0x20, 0x40, 0x08, 0x2A, 0x03, 0x00, 0xD9, 0x60, 0xCA, 0x78, 0xFF, 0xFF, 0xE2, 0x60, 0x73, 0x78, - 0xFF, 0xFF, 0x26, 0x46, 0x40, 0x60, 0x00, 0x65, 0x2A, 0xF2, 0x2F, 0xF0, 0xB4, 0x84, 0x2A, 0xFA, - 0x2C, 0xF8, 0x32, 0xF8, 0x30, 0xF2, 0x2D, 0xFA, 0x33, 0xFA, 0x31, 0xF2, 0x2E, 0xFA, 0x34, 0xFA, - 0xEA, 0xF3, 0x2F, 0xFA, 0xEB, 0xF3, 0x30, 0xFA, 0xEC, 0xF3, 0x31, 0xFA, 0xC9, 0xF1, 0x19, 0xF8, - 0x1C, 0xF0, 0x13, 0xF8, 0x00, 0x64, 0x3E, 0xFA, 0x00, 0xF4, 0x03, 0x64, 0x0A, 0xFA, 0x00, 0x64, - 0x0B, 0xFA, 0x01, 0x63, 0x68, 0xFD, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x25, 0x60, - 0xCE, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0x00, 0x66, 0xDB, 0xF3, 0x46, 0x46, 0xFD, 0xA0, 0xC1, 0xFE, 0x02, 0x02, 0x2F, 0x58, - 0xFF, 0xFF, 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0x00, 0x60, 0x0C, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xDC, 0x60, 0x53, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x08, 0x64, 0xA0, 0x80, - 0x9C, 0x84, 0x50, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, - 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x64, 0x68, 0xFB, 0x26, 0x46, 0x00, 0xF4, - 0x09, 0xF2, 0x0A, 0xF2, 0x01, 0xA8, 0x0B, 0xF2, 0x04, 0xA8, 0x1A, 0x02, 0x00, 0xA8, 0x18, 0x02, - 0x17, 0x02, 0xDC, 0x60, 0x58, 0x4D, 0xB9, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x26, 0x60, 0x1A, 0x64, - 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x20, 0x40, - 0x08, 0x2A, 0x03, 0x00, 0xDC, 0x60, 0xF6, 0x78, 0xFF, 0xFF, 0xE3, 0x60, 0x69, 0x78, 0xFF, 0xFF, - 0xDC, 0x60, 0x58, 0x4D, 0xB9, 0x78, 0xFF, 0xFF, 0x0B, 0xF2, 0x26, 0x46, 0x40, 0x59, 0x02, 0x60, - 0x00, 0x61, 0x2F, 0xF2, 0xA1, 0xDB, 0x30, 0xF2, 0x41, 0x58, 0x59, 0xDB, 0x31, 0xF2, 0x59, 0xDB, - 0x26, 0x46, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, - 0x00, 0x66, 0x46, 0x46, 0x03, 0x65, 0xF1, 0x60, 0x58, 0x4E, 0x96, 0x78, 0xFF, 0xFF, 0xE7, 0x60, - 0x0B, 0x78, 0xFF, 0xFF, 0xDC, 0x60, 0x58, 0x4D, 0xB9, 0x78, 0xFF, 0xFF, 0x00, 0x64, 0x68, 0xFB, - 0x20, 0x40, 0x08, 0x2A, 0x03, 0x00, 0xD9, 0x60, 0xCA, 0x78, 0xFF, 0xFF, 0xE2, 0x60, 0x73, 0x78, - 0xFF, 0xFF, 0x19, 0x60, 0xA4, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x0B, 0x3A, 0x06, 0x00, 0x0B, 0x64, - 0x16, 0x60, 0xC2, 0xFB, 0x33, 0x60, 0x48, 0x62, 0xA2, 0xDF, 0x2D, 0x58, 0xFF, 0xFF, 0x16, 0x60, - 0xC2, 0xF1, 0xA5, 0xD2, 0x64, 0x40, 0x0B, 0x2A, 0x20, 0x00, 0x85, 0x36, 0x0B, 0x00, 0x32, 0x3A, - 0x1E, 0x00, 0x60, 0x47, 0xFF, 0xB4, 0x02, 0xA4, 0xC4, 0x85, 0xA5, 0xD2, 0xFF, 0xFF, 0x60, 0x40, - 0x85, 0x3A, 0x15, 0x00, 0x65, 0x44, 0x0A, 0xA4, 0xA0, 0xD0, 0x33, 0x60, 0x46, 0x62, 0x64, 0x40, - 0x18, 0x26, 0x09, 0x00, 0xA2, 0xDF, 0x01, 0x64, 0x16, 0x60, 0xC2, 0xFB, 0x32, 0x41, 0x08, 0x65, - 0xB5, 0x81, 0x41, 0x52, 0x02, 0x00, 0x01, 0x64, 0xA2, 0xDB, 0x2D, 0x58, 0xFF, 0xFF, 0x33, 0x60, - 0x46, 0x62, 0xA2, 0xDF, 0x01, 0x64, 0x16, 0x60, 0xC2, 0xFB, 0xF7, 0x01, 0x45, 0x64, 0x3B, 0x42, - 0x5A, 0xDB, 0x35, 0x60, 0xAA, 0x7C, 0x35, 0x60, 0x98, 0x63, 0xA3, 0xD9, 0x64, 0x41, 0x2F, 0x60, - 0x02, 0x63, 0xBD, 0xD3, 0x00, 0x7C, 0x03, 0x1B, 0x27, 0x43, 0x10, 0xA3, 0xBD, 0xD3, 0xFF, 0xFF, - 0x60, 0x45, 0x64, 0x5F, 0xA1, 0xDB, 0x65, 0x44, 0xBD, 0xD1, 0xC8, 0x84, 0x59, 0xD8, 0xFC, 0x05, - 0x27, 0x41, 0x10, 0xA1, 0xA1, 0xD1, 0xFF, 0xFF, 0xC1, 0x81, 0x01, 0x26, 0xDD, 0x81, 0x41, 0x4C, - 0x59, 0xD1, 0x7C, 0x44, 0xB0, 0x84, 0x59, 0xD1, 0x59, 0xD1, 0xB0, 0x84, 0xB0, 0x84, 0xFF, 0xFF, - 0x02, 0x02, 0x67, 0x44, 0xC2, 0x00, 0x34, 0x60, 0x5C, 0x63, 0xD9, 0x81, 0x59, 0xD3, 0x38, 0x60, - 0x10, 0x62, 0x00, 0xBC, 0xA2, 0xDF, 0x09, 0x03, 0x01, 0x7C, 0xA2, 0xD9, 0x30, 0x60, 0x14, 0x64, - 0xBD, 0xDA, 0x00, 0x60, 0x01, 0x64, 0xBD, 0xDA, 0x58, 0x00, 0xDD, 0x60, 0x18, 0x64, 0xBD, 0xDA, - 0x50, 0x60, 0x00, 0x64, 0xBD, 0xDA, 0x01, 0x60, 0xF2, 0x64, 0xBD, 0xDA, 0x00, 0x60, 0x01, 0x64, - 0xBD, 0xDA, 0x2C, 0x41, 0x59, 0xD3, 0x50, 0x60, 0x00, 0x7C, 0x60, 0x40, 0x02, 0x2A, 0x03, 0x00, - 0x01, 0x60, 0xF2, 0x64, 0x0E, 0x00, 0x04, 0x2A, 0x03, 0x00, 0x02, 0x60, 0xF2, 0x64, 0x09, 0x00, - 0x10, 0x2A, 0x03, 0x00, 0x04, 0x60, 0xF2, 0x64, 0x04, 0x00, 0x20, 0x2A, 0x04, 0x00, 0x05, 0x60, - 0xF2, 0x64, 0xBD, 0xD9, 0xBD, 0xDB, 0x01, 0x64, 0xBD, 0xDB, 0x59, 0xD3, 0x50, 0x60, 0x00, 0x7C, - 0x60, 0x40, 0x02, 0x2A, 0x03, 0x00, 0x01, 0x60, 0xF2, 0x64, 0x0E, 0x00, 0x04, 0x2A, 0x03, 0x00, - 0x02, 0x60, 0xF2, 0x64, 0x09, 0x00, 0x10, 0x2A, 0x03, 0x00, 0x04, 0x60, 0xF2, 0x64, 0x04, 0x00, - 0x20, 0x2A, 0x04, 0x00, 0x05, 0x60, 0xF2, 0x64, 0xBD, 0xD9, 0xBD, 0xDB, 0x01, 0x64, 0xBD, 0xDB, - 0x59, 0xD3, 0x50, 0x60, 0x00, 0x7C, 0x60, 0x40, 0x01, 0x2A, 0x03, 0x00, 0x00, 0x60, 0xF2, 0x64, - 0x09, 0x00, 0x02, 0x2A, 0x03, 0x00, 0x01, 0x60, 0xF2, 0x64, 0x04, 0x00, 0x04, 0x2A, 0x02, 0x00, - 0x02, 0x60, 0xF2, 0x64, 0xBD, 0xD9, 0xBD, 0xDB, 0x4B, 0x00, 0x2C, 0x41, 0x59, 0xD3, 0x0F, 0x60, - 0x00, 0x7C, 0x60, 0x40, 0x02, 0x2A, 0x03, 0x00, 0x01, 0x60, 0xAC, 0x64, 0x0E, 0x00, 0x04, 0x2A, - 0x03, 0x00, 0x02, 0x60, 0xAC, 0x64, 0x09, 0x00, 0x10, 0x2A, 0x03, 0x00, 0x04, 0x60, 0xAC, 0x64, - 0x04, 0x00, 0x20, 0x2A, 0x04, 0x00, 0x05, 0x60, 0xAC, 0x64, 0xBD, 0xD9, 0xBD, 0xDB, 0x01, 0x64, - 0xBD, 0xDB, 0x59, 0xD3, 0x0F, 0x60, 0x00, 0x7C, 0x60, 0x40, 0x02, 0x2A, 0x03, 0x00, 0x01, 0x60, - 0xAC, 0x64, 0x0E, 0x00, 0x04, 0x2A, 0x03, 0x00, 0x02, 0x60, 0xAC, 0x64, 0x09, 0x00, 0x10, 0x2A, - 0x03, 0x00, 0x04, 0x60, 0xAC, 0x64, 0x04, 0x00, 0x20, 0x2A, 0x04, 0x00, 0x05, 0x60, 0xAC, 0x64, - 0xBD, 0xD9, 0xBD, 0xDB, 0x01, 0x64, 0xBD, 0xDB, 0x59, 0xD3, 0x0F, 0x60, 0x00, 0x7C, 0x60, 0x40, - 0x01, 0x2A, 0x03, 0x00, 0x00, 0x60, 0xAC, 0x64, 0x09, 0x00, 0x02, 0x2A, 0x03, 0x00, 0x01, 0x60, - 0xAC, 0x64, 0x04, 0x00, 0x04, 0x2A, 0x02, 0x00, 0x02, 0x60, 0xAC, 0x64, 0xBD, 0xD9, 0xBD, 0xDB, - 0x1C, 0x60, 0x08, 0xF3, 0xFF, 0xFF, 0x03, 0x18, 0x1A, 0x60, 0x2D, 0xF3, 0x03, 0x00, 0x1A, 0x60, - 0x1D, 0xF3, 0xFF, 0xFF, 0xBD, 0xDA, 0x34, 0x60, 0x5C, 0x64, 0x1A, 0x60, 0xCF, 0xFB, 0x5F, 0xF5, - 0x00, 0x64, 0x2B, 0xFA, 0x00, 0x64, 0x2A, 0xFA, 0x27, 0x43, 0x06, 0xA3, 0xBD, 0xD1, 0x2C, 0xF8, - 0x32, 0xF8, 0xBD, 0xD1, 0x2D, 0xF8, 0x33, 0xF8, 0xA3, 0xD1, 0x2E, 0xF8, 0x34, 0xF8, 0x00, 0xF4, - 0x01, 0x63, 0x32, 0x40, 0x08, 0x26, 0x10, 0xBB, 0x16, 0x60, 0xC2, 0xF1, 0xFF, 0xFF, 0x64, 0x40, - 0xFE, 0x26, 0x10, 0xBB, 0x7D, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x27, 0x0A, 0x00, 0x19, 0x60, - 0x45, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x02, 0x22, 0x20, 0xBB, 0x63, 0x44, 0xFF, 0xFF, 0x04, 0x7F, - 0x60, 0x43, 0x09, 0xFC, 0x27, 0x42, 0x0C, 0xA2, 0x2D, 0x60, 0x5A, 0x63, 0xA2, 0xD3, 0xA3, 0xD3, - 0x00, 0xBD, 0x01, 0x63, 0xAC, 0x81, 0x09, 0x03, 0x08, 0x03, 0xB8, 0x60, 0x58, 0x4D, 0x15, 0x78, - 0xFF, 0xFF, 0x00, 0xB8, 0x01, 0x63, 0x01, 0x03, 0x60, 0x43, 0x0E, 0x60, 0x35, 0xFD, 0x12, 0x61, - 0x59, 0xDC, 0x16, 0x60, 0xC2, 0xF3, 0xFF, 0x60, 0xFF, 0x7C, 0x60, 0x40, 0x0B, 0x2A, 0x02, 0x00, - 0x33, 0x60, 0x28, 0x7C, 0x1A, 0x60, 0xD0, 0xF9, 0x35, 0x60, 0x98, 0x64, 0x40, 0x48, 0xD9, 0x81, - 0xFF, 0x60, 0xF2, 0x64, 0xF1, 0x60, 0x58, 0x4D, 0x34, 0x78, 0xFF, 0xFF, 0x5F, 0xF5, 0x3F, 0xFC, - 0xDB, 0x83, 0x1A, 0x60, 0x4C, 0xFD, 0x00, 0x7C, 0x5A, 0xD9, 0x63, 0x41, 0x34, 0x60, 0x9C, 0x63, - 0x12, 0x65, 0x00, 0xF4, 0xCD, 0x84, 0x4C, 0x91, 0x60, 0x43, 0x60, 0xFE, 0xA5, 0xD2, 0xDE, 0x85, - 0x7F, 0x26, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x5D, 0x93, 0xA3, 0xDB, 0x5D, 0x93, 0xA5, 0xD2, - 0xF6, 0x1F, 0x5D, 0x93, 0x20, 0xFE, 0xDF, 0x83, 0x5F, 0xF5, 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, - 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x00, 0x66, - 0x46, 0x46, 0xC1, 0xFE, 0x06, 0x64, 0x68, 0xFB, 0x46, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x1C, 0x60, - 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x60, - 0x1C, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xDE, 0x60, 0x84, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0xDE, 0x60, 0xCA, 0x78, 0xFF, 0xFF, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x08, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0xF6, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, - 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x26, 0x46, 0x00, 0xF4, 0x0A, 0xF2, 0x00, 0x63, 0x00, 0xA8, 0x68, 0xFD, 0x06, 0x02, - 0x09, 0xF2, 0xFF, 0xFF, 0x01, 0xB0, 0x01, 0x7C, 0x5A, 0x02, 0x0A, 0xF8, 0x0A, 0xF2, 0x26, 0x46, - 0x40, 0x59, 0x02, 0x60, 0x00, 0x61, 0x2F, 0xF2, 0xA1, 0xDB, 0x30, 0xF2, 0x41, 0x58, 0x59, 0xDB, - 0x31, 0xF2, 0x59, 0xDB, 0x26, 0x46, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, - 0x08, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x05, 0x65, 0xF1, 0x60, 0x58, 0x4E, 0x96, 0x78, - 0xFF, 0xFF, 0xE7, 0x60, 0x0B, 0x78, 0xFF, 0xFF, 0x47, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0xD9, 0x60, - 0xCA, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x20, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0x26, 0x46, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, - 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x00, 0x64, 0x68, 0xFB, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x49, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0xDA, 0x60, 0x62, 0x78, 0xFF, 0xFF, 0xFF, 0x60, - 0xFB, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x00, 0x64, 0x68, 0xFB, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x4A, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0xD9, 0x60, 0xCA, 0x78, 0xFF, 0xFF, 0x48, 0x64, - 0x3B, 0x42, 0x5A, 0xDB, 0x0C, 0xF2, 0xFF, 0xFF, 0x60, 0x41, 0xFF, 0xB1, 0xFF, 0xA1, 0x60, 0x47, - 0xFF, 0xB4, 0x9B, 0x02, 0x9A, 0x03, 0x34, 0x60, 0xF4, 0x63, 0x10, 0x64, 0xBD, 0xDB, 0x66, 0x45, - 0x26, 0x46, 0x3F, 0xF2, 0x34, 0x60, 0xF2, 0x61, 0xC2, 0xA0, 0xFF, 0xFF, 0x01, 0x04, 0x3E, 0x64, - 0x65, 0x46, 0x02, 0xA4, 0xA1, 0xDB, 0xC8, 0x81, 0x12, 0x65, 0xCD, 0x84, 0x4C, 0x91, 0x60, 0x43, - 0x60, 0xFE, 0xA5, 0xD2, 0xDE, 0x85, 0x7F, 0x26, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x5D, 0x93, - 0xA3, 0xDB, 0x5D, 0x93, 0xA5, 0xD2, 0xF6, 0x1F, 0x5D, 0x93, 0x20, 0xFE, 0xDF, 0x83, 0x0C, 0xF2, - 0xFF, 0xFF, 0x1A, 0x65, 0x60, 0x47, 0xFF, 0xB4, 0xC4, 0x85, 0xDC, 0x60, 0x58, 0x4D, 0xC7, 0x78, - 0xFF, 0xFF, 0x0B, 0xF2, 0xFF, 0xFF, 0x07, 0xB4, 0x01, 0x61, 0x03, 0x03, 0xCC, 0x84, 0xE1, 0x81, - 0xFD, 0x02, 0x61, 0x44, 0x94, 0xFB, 0x27, 0x45, 0x02, 0x62, 0x46, 0xD3, 0x5A, 0xD1, 0x60, 0x47, - 0x56, 0xFB, 0x64, 0x47, 0x55, 0xFB, 0x00, 0x64, 0x5B, 0xFB, 0x0C, 0x62, 0x46, 0xD3, 0x7E, 0xFB, - 0x0B, 0xF0, 0x0F, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0x83, 0xFB, 0x26, 0x46, 0x32, 0xF0, 0x7F, 0xF9, - 0x33, 0xF0, 0x0E, 0x63, 0xC7, 0x81, 0x80, 0xF9, 0x34, 0xF0, 0x81, 0xF9, 0x59, 0xD1, 0xFF, 0xFF, - 0x64, 0x44, 0x01, 0x2A, 0xC8, 0x84, 0x60, 0x43, 0x33, 0x60, 0xBC, 0x64, 0x58, 0xD9, 0x59, 0xD1, - 0x58, 0xD9, 0xFD, 0x1F, 0x16, 0x60, 0xC2, 0xF1, 0x59, 0xD3, 0x64, 0x40, 0x01, 0x36, 0x22, 0x64, - 0x64, 0x40, 0x00, 0x36, 0x50, 0x94, 0xA6, 0xF1, 0xFF, 0xFF, 0x44, 0x47, 0xA7, 0x46, 0x3A, 0xFA, - 0xBB, 0xFC, 0xA7, 0x46, 0x0E, 0x60, 0x35, 0xF3, 0x85, 0xFB, 0x2E, 0x60, 0x2E, 0x64, 0x2D, 0x60, - 0x8A, 0x63, 0xA0, 0xD1, 0xA3, 0xD9, 0x64, 0x41, 0x58, 0xD1, 0x5B, 0xD9, 0x7D, 0xF3, 0x66, 0x45, - 0xA6, 0xF5, 0x60, 0x40, 0x01, 0x27, 0x08, 0x00, 0x91, 0xFA, 0x61, 0x44, 0xFD, 0x60, 0x58, 0x4E, - 0xAC, 0x78, 0xFF, 0xFF, 0x12, 0xFA, 0x07, 0x00, 0x11, 0xF8, 0x64, 0x44, 0xFD, 0x60, 0x58, 0x4E, - 0xAC, 0x78, 0xFF, 0xFF, 0x12, 0xFA, 0x65, 0x46, 0x31, 0xF2, 0x1D, 0x60, 0xC0, 0x65, 0x60, 0x47, - 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, - 0x61, 0x46, 0x31, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x30, 0xF0, - 0x63, 0x46, 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x2F, 0xF0, 0x63, 0x46, 0xD0, 0x80, - 0xFF, 0xFF, 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0xA6, 0xF3, 0x08, 0xFE, - 0x60, 0x43, 0x61, 0x46, 0xA6, 0xF1, 0xFF, 0xFF, 0xD3, 0x80, 0x31, 0xF2, 0x27, 0x02, 0x66, 0x41, - 0x1D, 0x60, 0xC0, 0x65, 0x60, 0x47, 0x00, 0x7F, 0xA6, 0xF1, 0xE0, 0x84, 0x44, 0xD3, 0x64, 0x43, - 0x11, 0x18, 0x60, 0x46, 0x00, 0xF2, 0xFF, 0xFF, 0xFC, 0x1B, 0x66, 0x44, 0x64, 0x46, 0x80, 0xF0, - 0x60, 0x46, 0x80, 0xF8, 0x65, 0x46, 0x65, 0x43, 0x80, 0xF0, 0x01, 0xFA, 0x80, 0xFC, 0x64, 0x46, - 0x80, 0xF8, 0x0B, 0x00, 0x64, 0x46, 0x62, 0x43, 0x00, 0xF2, 0xA3, 0xDB, 0x60, 0x46, 0x80, 0xF0, - 0x81, 0xFC, 0x80, 0xFC, 0x64, 0x46, 0x80, 0xF8, 0x60, 0x43, 0x61, 0x46, 0x43, 0x4B, 0x01, 0x65, - 0xFD, 0x60, 0x58, 0x4E, 0xDD, 0x78, 0xFF, 0xFF, 0x43, 0x47, 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x43, - 0xFA, 0xA3, 0x00, 0x60, 0x17, 0x61, 0x00, 0x60, 0x01, 0x65, 0x01, 0x60, 0xFF, 0x64, 0x40, 0x4C, - 0xFD, 0x60, 0x58, 0x4E, 0x7A, 0x78, 0xFF, 0xFF, 0x00, 0xBB, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x64, - 0x40, 0x4A, 0x60, 0xFE, 0x02, 0x60, 0x00, 0x63, 0xBD, 0xD3, 0xBD, 0xD3, 0x60, 0x41, 0xFE, 0x60, - 0x58, 0x4E, 0x2C, 0x78, 0xFF, 0xFF, 0x20, 0xFE, 0x00, 0x65, 0x00, 0x64, 0x19, 0x60, 0x3B, 0xFB, - 0x02, 0x00, 0x20, 0xFE, 0xFF, 0x65, 0x02, 0x60, 0x00, 0x63, 0x60, 0xFE, 0xBD, 0xD3, 0xBD, 0xD3, - 0x60, 0x41, 0x20, 0xFE, 0xCD, 0x81, 0x60, 0x40, 0x80, 0x2A, 0x39, 0x00, 0x7F, 0xB4, 0x02, 0x3A, - 0x02, 0x00, 0x01, 0x64, 0x2E, 0x00, 0x04, 0x3A, 0x02, 0x00, 0x02, 0x64, 0x2A, 0x00, 0x0B, 0x3A, - 0x02, 0x00, 0x04, 0x64, 0x26, 0x00, 0x16, 0x3A, 0x02, 0x00, 0x08, 0x64, 0x22, 0x00, 0x0C, 0x3A, - 0x02, 0x00, 0x10, 0x64, 0x1E, 0x00, 0x12, 0x3A, 0x02, 0x00, 0x20, 0x64, 0x1A, 0x00, 0x18, 0x3A, - 0x02, 0x00, 0x40, 0x64, 0x16, 0x00, 0x24, 0x3A, 0x02, 0x00, 0x80, 0x64, 0x12, 0x00, 0x30, 0x3A, - 0x02, 0x00, 0x01, 0x67, 0x0E, 0x00, 0x48, 0x3A, 0x02, 0x00, 0x02, 0x67, 0x0A, 0x00, 0x60, 0x3A, - 0x02, 0x00, 0x04, 0x67, 0x06, 0x00, 0x6C, 0x3A, 0x02, 0x00, 0x08, 0x67, 0x02, 0x00, 0x00, 0x64, - 0x00, 0x00, 0x19, 0x60, 0x3B, 0xF1, 0xFF, 0xFF, 0xB0, 0x84, 0x19, 0x60, 0x3B, 0xFB, 0x61, 0x40, - 0x00, 0x36, 0x05, 0x00, 0x60, 0xFE, 0xBD, 0xD3, 0xFF, 0xFF, 0x20, 0xFE, 0xBB, 0x01, 0x65, 0x40, - 0x00, 0x3A, 0x1E, 0x00, 0x26, 0x46, 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x43, 0xFA, 0xA3, 0x00, 0x60, - 0x17, 0x61, 0x00, 0x60, 0x32, 0x65, 0x01, 0x60, 0xFF, 0x64, 0x40, 0x4C, 0xFD, 0x60, 0x58, 0x4E, - 0x7A, 0x78, 0xFF, 0xFF, 0x00, 0xBB, 0xFF, 0xFF, 0x0B, 0x03, 0x60, 0xFE, 0x02, 0x60, 0x00, 0x63, - 0xBD, 0xD3, 0xBD, 0xD3, 0x60, 0x41, 0xFE, 0x60, 0x58, 0x4E, 0x2C, 0x78, 0xFF, 0xFF, 0x91, 0x01, - 0x20, 0xFE, 0x00, 0x65, 0xFC, 0x60, 0x58, 0x4E, 0xC7, 0x78, 0xFF, 0xFF, 0xA1, 0xF3, 0xFF, 0xFF, - 0x60, 0x40, 0x01, 0x27, 0x04, 0x00, 0xFD, 0x60, 0x58, 0x4E, 0x11, 0x78, 0xFF, 0xFF, 0x20, 0xFE, - 0x37, 0x60, 0xF8, 0x61, 0xA1, 0xD1, 0xA1, 0xF3, 0x01, 0x60, 0xAC, 0x63, 0x60, 0x45, 0x2A, 0x44, - 0x79, 0xFB, 0xA3, 0xD5, 0x65, 0x40, 0x01, 0x27, 0x5B, 0xD5, 0x65, 0x40, 0x01, 0x27, 0x59, 0xD1, - 0x66, 0x41, 0xA0, 0x84, 0x24, 0x94, 0x2B, 0x46, 0x0F, 0xFA, 0x7A, 0xFB, 0x16, 0x64, 0x12, 0xFA, - 0x01, 0x64, 0x11, 0xFA, 0x66, 0x5C, 0xC2, 0x60, 0x58, 0x4E, 0x6D, 0x78, 0xFF, 0xFF, 0x1A, 0x60, - 0x22, 0xF3, 0x1A, 0x60, 0x21, 0xF1, 0x60, 0x47, 0xB0, 0x84, 0x1C, 0x60, 0x08, 0xF1, 0xFF, 0xFF, - 0x01, 0x18, 0x80, 0xBC, 0x16, 0x60, 0xC2, 0xF1, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x36, 0x22, 0x64, - 0x64, 0x40, 0x00, 0x36, 0x50, 0x94, 0xA7, 0x46, 0x3A, 0xFA, 0xBB, 0xFC, 0xA7, 0x46, 0x80, 0x60, - 0x03, 0x65, 0x32, 0x40, 0x08, 0x2A, 0x03, 0x65, 0xA7, 0x46, 0x06, 0xF0, 0x7F, 0x60, 0xFF, 0x64, - 0xA0, 0x84, 0xB4, 0x84, 0x06, 0xFA, 0xBB, 0xFC, 0xA7, 0x46, 0x26, 0x46, 0x2F, 0xF0, 0x30, 0xF0, - 0x64, 0x43, 0x31, 0xF2, 0x27, 0x46, 0x03, 0xFC, 0x04, 0xF8, 0x05, 0xFA, 0x26, 0x46, 0xD9, 0x60, - 0x58, 0x4E, 0xAE, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, - 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0x01, 0x64, 0x8A, 0xFB, 0x16, 0x60, - 0xC9, 0xF3, 0x20, 0x41, 0x00, 0xBC, 0x20, 0xB9, 0x01, 0x03, 0x41, 0x40, 0x20, 0x60, 0x14, 0x61, - 0xA1, 0xDF, 0x04, 0x64, 0xC1, 0xFE, 0xDB, 0xFB, 0xF1, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0xF1, 0xFB, - 0xF7, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x08, 0x60, 0x08, 0xF1, 0x80, 0x60, 0x00, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x01, 0x65, 0xF1, 0x60, 0x58, 0x4E, 0xC3, 0x78, 0xFF, 0xFF, - 0x33, 0x60, 0xE6, 0x65, 0xA5, 0xDF, 0x08, 0x60, 0x0C, 0xF1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x0C, 0x64, 0x68, 0xFB, 0x00, 0x60, 0x31, 0x64, 0x08, 0x60, 0x16, 0xFB, - 0xE1, 0x60, 0x36, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x00, 0x60, 0x02, 0x64, 0x08, 0x60, 0x28, 0xFB, - 0xE1, 0x60, 0xF7, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x08, 0x60, - 0x27, 0xFB, 0x5A, 0xDB, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x01, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x0F, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1B, 0x60, 0xFE, 0xF3, 0xFF, 0xFF, 0x03, 0x1B, 0xE7, 0x60, - 0x2E, 0x78, 0xFF, 0xFF, 0xE7, 0x60, 0x2E, 0x78, 0xFF, 0xFF, 0xE1, 0x60, 0xE7, 0x78, 0xFF, 0xFF, - 0x00, 0x60, 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0xF8, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xA6, 0xF3, - 0xFF, 0xFF, 0x02, 0xA4, 0x60, 0x43, 0x66, 0x41, 0x63, 0x46, 0x05, 0xF2, 0x00, 0xF0, 0x81, 0xF0, - 0x02, 0x18, 0x64, 0x46, 0x81, 0xF8, 0x07, 0x1B, 0x1D, 0x60, 0xC0, 0x65, 0x60, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD9, 0x02, 0x00, 0x65, 0x46, 0x00, 0xF8, 0xA6, 0xF3, 0x63, 0x45, 0x60, 0x46, - 0x00, 0xF2, 0xFF, 0xFF, 0xD4, 0x80, 0x01, 0x18, 0xFA, 0x04, 0x80, 0xF8, 0x65, 0x46, 0x00, 0xFA, - 0x06, 0xF2, 0xFF, 0xFF, 0x00, 0x7E, 0x06, 0xFA, 0x61, 0x46, 0x4B, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x60, 0x95, 0xF3, 0xFF, 0xFF, 0x10, 0xB0, - 0xFF, 0xFF, 0x11, 0x03, 0x04, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xE1, 0x60, 0x9B, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x08, 0x60, 0x1B, 0xF1, 0x01, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x69, 0xF3, 0xFF, 0xFF, 0x01, 0xB0, 0xFF, 0xFF, 0x11, 0x03, - 0x08, 0x60, 0x0C, 0xF1, 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x02, 0x60, - 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xE1, 0x60, 0xB1, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x64, 0x68, 0xFB, 0xE2, 0x60, - 0x58, 0x4E, 0x13, 0x78, 0xFF, 0xFF, 0x02, 0x64, 0x8A, 0xFB, 0x02, 0x64, 0xC1, 0xFE, 0xDB, 0xFB, - 0xF1, 0xF3, 0xFF, 0xFF, 0x01, 0xBC, 0xF1, 0xFB, 0x02, 0x65, 0xF1, 0x60, 0x58, 0x4E, 0xC3, 0x78, - 0xFF, 0xFF, 0x03, 0x60, 0xE8, 0x63, 0x0E, 0x60, 0x36, 0xFD, 0x08, 0x60, 0x77, 0xF3, 0xFF, 0xFF, - 0x13, 0x1B, 0x16, 0x60, 0xCC, 0xF3, 0x00, 0x61, 0x60, 0x40, 0x00, 0x36, 0x00, 0xB9, 0x60, 0x40, - 0x01, 0x36, 0x01, 0xB9, 0x60, 0x40, 0x02, 0x36, 0x06, 0xB9, 0x60, 0x40, 0x03, 0x36, 0x07, 0xB9, - 0x41, 0x44, 0xD4, 0x60, 0xF6, 0x78, 0xFF, 0xFF, 0xD3, 0x60, 0xD0, 0x78, 0xFF, 0xFF, 0x00, 0x60, - 0x20, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0xFF, 0xFF, 0x08, 0x24, 0x46, 0x01, 0xA0, 0x84, 0xA2, 0xDB, - 0x00, 0x63, 0x68, 0xFD, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x30, 0x00, 0x20, 0x40, - 0x06, 0x23, 0x10, 0x00, 0x08, 0x60, 0x27, 0xF1, 0x7F, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, - 0x80, 0x60, 0x00, 0x64, 0x08, 0x60, 0x28, 0xFB, 0xE1, 0x60, 0xF7, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x08, 0x60, 0x27, 0xFB, 0x5A, 0xDB, 0x10, 0x60, 0x4E, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x44, 0x01, 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x64, 0x68, 0xFB, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x01, 0x64, 0x8A, 0xFB, 0xFF, 0xFF, 0xC1, 0xFE, 0x2E, 0x58, 0xFF, 0xFF, 0x50, 0x64, - 0x3B, 0x42, 0x5A, 0xDB, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x60, 0x95, 0xF3, - 0xFF, 0xFF, 0x10, 0xB0, 0xFF, 0xFF, 0x11, 0x03, 0x08, 0x60, 0x1B, 0xF1, 0x01, 0x60, 0x00, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x04, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xE2, 0x60, - 0x2A, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xB9, 0xF1, 0x0E, 0x60, 0x4B, 0xF9, - 0x7D, 0xF1, 0x7C, 0xF9, 0x02, 0x64, 0x8A, 0xFB, 0xFF, 0xFF, 0xC1, 0xFE, 0x8A, 0xF3, 0x00, 0x65, - 0xD4, 0x80, 0xFF, 0xFF, 0x0E, 0x03, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x80, 0x60, - 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xE2, 0x60, 0x4A, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x51, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x1B, 0x60, 0xB0, 0x64, 0x67, 0xFB, 0x1C, 0x60, 0x72, 0x63, 0x7F, 0xF3, 0xBD, 0xDB, 0x80, 0xF3, - 0xBD, 0xDB, 0x81, 0xF3, 0xA3, 0xDB, 0x67, 0xF3, 0x00, 0x60, 0x86, 0xF1, 0x04, 0xA4, 0x67, 0xFB, - 0xD0, 0x80, 0xA0, 0xD3, 0x1F, 0x07, 0x40, 0x47, 0x60, 0x41, 0x0E, 0x65, 0x45, 0xD3, 0x16, 0x60, - 0xC2, 0xF1, 0xFF, 0xFF, 0x03, 0x1B, 0x10, 0xB0, 0xFF, 0xFF, 0xED, 0x02, 0x27, 0x44, 0x06, 0xA4, - 0x60, 0x41, 0xA1, 0xD1, 0x7F, 0xF3, 0x80, 0xF1, 0xD0, 0x80, 0x59, 0xD3, 0x08, 0x02, 0xD0, 0x80, - 0x81, 0xF3, 0x59, 0xD1, 0x04, 0x02, 0xD0, 0x80, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x00, 0xE2, 0x60, - 0xE6, 0x78, 0xFF, 0xFF, 0x1C, 0x60, 0x72, 0x63, 0xBD, 0xD3, 0x7F, 0xFB, 0xBD, 0xD3, 0x80, 0xFB, - 0xA3, 0xD3, 0x81, 0xFB, 0x53, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0xDE, 0xFE, 0x0A, 0x04, 0x40, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xE2, 0x60, - 0x9A, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x7C, 0xF1, 0x7D, 0xF9, 0x13, 0x60, - 0x1A, 0xF9, 0x0E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x20, 0x60, 0x00, 0x64, 0x08, 0x60, - 0x16, 0xFB, 0xE2, 0x60, 0xC7, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, - 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xBE, 0xFE, 0x08, 0x60, 0x08, 0xF1, 0x40, 0x60, 0x00, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x01, 0x63, 0x8A, 0xFD, 0x08, 0x60, 0x0C, 0xF1, 0x00, 0x60, - 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xC1, 0xFE, 0x54, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x31, 0x44, 0xF9, 0xB4, 0x40, 0x51, 0xE1, 0x60, 0x22, 0x78, 0xFF, 0xFF, 0x27, 0x43, 0x33, 0x60, - 0xBE, 0x65, 0xA5, 0xD3, 0x65, 0x41, 0x10, 0xA3, 0x01, 0xA4, 0xFE, 0xB4, 0xC4, 0x85, 0xFE, 0xA1, - 0xBD, 0xD3, 0x59, 0xD1, 0xFF, 0xFF, 0xD0, 0x80, 0xD5, 0x80, 0x02, 0x02, 0x04, 0x03, 0xF8, 0x01, - 0xE2, 0x60, 0x73, 0x78, 0xFF, 0xFF, 0x55, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x10, 0x60, 0x2A, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0A, 0x04, 0x40, 0x60, 0x00, 0x64, 0x08, 0x60, 0x16, 0xFB, - 0xE2, 0x60, 0xFE, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x27, 0xD1, 0x7D, 0xF9, - 0x13, 0x60, 0x1A, 0xF9, 0x0E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x20, 0x60, 0x00, 0x64, - 0x08, 0x60, 0x16, 0xFB, 0xE3, 0x60, 0x20, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xBE, 0xFE, 0x08, 0x60, 0x08, 0xF1, 0x40, 0x60, - 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x07, 0x60, 0xD0, 0x64, 0x0E, 0x60, 0x4B, 0xFB, - 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, - 0x27, 0x43, 0x06, 0xA3, 0xBD, 0xD3, 0x7F, 0xFB, 0xBD, 0xD3, 0x80, 0xFB, 0xA3, 0xD3, 0x81, 0xFB, - 0x31, 0x44, 0xF9, 0xB4, 0x40, 0x51, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x01, 0x60, - 0x04, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xE3, 0x60, 0x51, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0xB9, 0xF1, 0x0E, 0x60, 0x4B, 0xF9, 0x08, 0x60, 0x15, 0xF1, 0xFE, 0x60, 0xFF, 0x61, - 0xA1, 0x84, 0x5A, 0xD1, 0x4A, 0xDB, 0xA1, 0x84, 0x5A, 0xDB, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, - 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xE2, 0x60, 0x73, 0x78, - 0xFF, 0xFF, 0x7D, 0xF1, 0x32, 0x60, 0x7A, 0x61, 0xA1, 0xD3, 0x64, 0x40, 0x01, 0x27, 0x59, 0xD3, - 0x32, 0x60, 0x7E, 0x61, 0xFD, 0x60, 0x58, 0x4E, 0xAC, 0x78, 0xFF, 0xFF, 0xA1, 0xDB, 0x27, 0x42, - 0x0C, 0xA2, 0xA2, 0xD3, 0x16, 0x60, 0xAD, 0xF3, 0x00, 0xBD, 0x01, 0x63, 0xAC, 0x81, 0x09, 0x03, - 0x08, 0x03, 0xB8, 0x60, 0x58, 0x4D, 0x15, 0x78, 0xFF, 0xFF, 0x00, 0xB8, 0x01, 0x63, 0x01, 0x03, - 0x60, 0x43, 0x0E, 0x60, 0x35, 0xFD, 0x5F, 0xF5, 0x00, 0x64, 0x2B, 0xFA, 0x20, 0x64, 0x2A, 0xFA, - 0x27, 0x43, 0x06, 0xA3, 0xBD, 0xD1, 0x2C, 0xF8, 0x32, 0xF8, 0xBD, 0xD1, 0x2D, 0xF8, 0x33, 0xF8, - 0xA3, 0xD1, 0x2E, 0xF8, 0x34, 0xF8, 0xEA, 0xF1, 0x2F, 0xF8, 0xEB, 0xF1, 0x30, 0xF8, 0xEC, 0xF1, - 0x31, 0xF8, 0xB9, 0xF1, 0x19, 0xF8, 0xF8, 0x60, 0x80, 0x64, 0x0E, 0xFA, 0x00, 0xF4, 0x01, 0x63, - 0x32, 0x40, 0x08, 0x26, 0x10, 0xBB, 0x16, 0x60, 0xC2, 0xF1, 0xFF, 0xFF, 0x64, 0x40, 0xFE, 0x26, - 0x10, 0xBB, 0x7D, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x27, 0x0A, 0x00, 0x19, 0x60, 0x45, 0xF3, - 0xFF, 0xFF, 0x60, 0x40, 0x02, 0x22, 0x20, 0xBB, 0x63, 0x44, 0xFF, 0xFF, 0x04, 0x7F, 0x60, 0x43, - 0x09, 0xFC, 0x0E, 0x60, 0x35, 0xF3, 0x12, 0x61, 0x59, 0xDA, 0x1C, 0x60, 0x72, 0x63, 0xBD, 0xD1, - 0x59, 0xD8, 0xBD, 0xD1, 0x59, 0xD8, 0xA3, 0xD1, 0x59, 0xD8, 0x35, 0x60, 0x98, 0x64, 0x40, 0x48, - 0xD9, 0x81, 0xFF, 0x60, 0xF2, 0x64, 0xF1, 0x60, 0x58, 0x4D, 0x34, 0x78, 0xFF, 0xFF, 0x5F, 0xF5, - 0x3F, 0xFC, 0xDB, 0x83, 0x1A, 0x60, 0x4C, 0xFD, 0x20, 0x7C, 0x5A, 0xD9, 0x63, 0x41, 0x34, 0x60, - 0x9C, 0x63, 0x12, 0x65, 0x00, 0xF4, 0xCD, 0x84, 0x4C, 0x91, 0x60, 0x43, 0x60, 0xFE, 0xA5, 0xD2, - 0xDE, 0x85, 0x7F, 0x26, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x5D, 0x93, 0xA3, 0xDB, 0x5D, 0x93, - 0xA5, 0xD2, 0xF6, 0x1F, 0x5D, 0x93, 0x20, 0xFE, 0xDF, 0x83, 0x5F, 0xF5, 0x25, 0x60, 0xCE, 0x64, - 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0x00, 0x66, 0x46, 0x46, 0xC1, 0xFE, 0x16, 0x64, 0x68, 0xFB, 0x56, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x0E, 0x60, 0x38, 0xF3, 0xFF, 0xFF, 0x64, 0xA4, 0xA2, 0xDB, 0x0E, 0x60, 0x38, 0xF1, 0x0E, 0x60, - 0x4B, 0xF9, 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0x00, 0x60, 0x1C, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xE4, 0x60, 0x23, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, - 0x9C, 0x84, 0x0E, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x57, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x00, 0x64, - 0x68, 0xFB, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xE2, 0x60, 0x73, 0x78, 0xFF, 0xFF, - 0x00, 0x60, 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x16, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1C, 0x60, - 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x58, 0x64, - 0x3B, 0x42, 0x5A, 0xDB, 0x00, 0x64, 0x68, 0xFB, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0xE6, 0x60, 0x36, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x08, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x3D, 0x03, - 0xA0, 0x84, 0xA2, 0xDB, 0x1C, 0x60, 0x92, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x64, 0x68, 0xFB, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x26, 0x46, 0x00, 0xF4, 0x0A, 0xF2, 0x09, 0xF2, 0x04, 0x1B, 0x01, 0xB0, 0x01, 0x7C, 0x2D, 0x02, - 0x0A, 0xF8, 0x59, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0x0A, 0xF2, 0x26, 0x46, 0x40, 0x59, 0x02, 0x60, - 0x00, 0x61, 0x2F, 0xF2, 0xA1, 0xDB, 0x30, 0xF2, 0x41, 0x58, 0x59, 0xDB, 0x31, 0xF2, 0x59, 0xDB, - 0x26, 0x46, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, - 0x00, 0x66, 0x46, 0x46, 0x05, 0x65, 0xF1, 0x60, 0x58, 0x4E, 0x96, 0x78, 0xFF, 0xFF, 0xE7, 0x60, - 0x0B, 0x78, 0xFF, 0xFF, 0xE2, 0x60, 0x73, 0x78, 0xFF, 0xFF, 0x5A, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x78, 0x43, 0x02, 0x61, 0x29, 0x60, 0xEA, 0x78, 0xFF, 0xFF, 0x5B, 0x64, 0x3B, 0x42, 0x5A, 0xDB, - 0x0C, 0xF2, 0xFF, 0xFF, 0x60, 0x41, 0xFF, 0xB1, 0xFF, 0xA1, 0x60, 0x47, 0xFF, 0xB4, 0xC8, 0x02, - 0xC7, 0x03, 0x34, 0x60, 0xF4, 0x63, 0x30, 0x64, 0xBD, 0xDB, 0x66, 0x45, 0x26, 0x46, 0x3F, 0xF2, - 0x34, 0x60, 0xF2, 0x61, 0xC2, 0xA0, 0xFF, 0xFF, 0x01, 0x04, 0x3E, 0x64, 0x65, 0x46, 0x02, 0xA4, - 0xA1, 0xDB, 0xC8, 0x81, 0x12, 0x65, 0xCD, 0x84, 0x4C, 0x91, 0x60, 0x43, 0x60, 0xFE, 0xA5, 0xD2, - 0xDE, 0x85, 0x7F, 0x26, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x5D, 0x93, 0xA3, 0xDB, 0x5D, 0x93, - 0xA5, 0xD2, 0xF6, 0x1F, 0x5D, 0x93, 0x20, 0xFE, 0xDF, 0x83, 0x0C, 0xF2, 0xFF, 0xFF, 0x1A, 0x65, - 0x60, 0x47, 0xFF, 0xB4, 0xC4, 0x85, 0xDC, 0x60, 0x58, 0x4D, 0xC7, 0x78, 0xFF, 0xFF, 0x0B, 0xF2, - 0xFF, 0xFF, 0x07, 0xB4, 0x01, 0x61, 0x03, 0x03, 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x02, 0x61, 0x44, - 0x94, 0xFB, 0x27, 0x45, 0x02, 0x62, 0x46, 0xD3, 0x5A, 0xD1, 0x60, 0x47, 0x56, 0xFB, 0x64, 0x47, - 0x55, 0xFB, 0x00, 0x64, 0x5B, 0xFB, 0x0C, 0x62, 0x46, 0xD3, 0x7E, 0xFB, 0x0B, 0xF0, 0x0F, 0x60, - 0xFF, 0x64, 0xA0, 0x84, 0x83, 0xFB, 0x1C, 0x60, 0x6A, 0x62, 0xA2, 0xD3, 0x85, 0xFB, 0x26, 0x46, - 0x32, 0xF0, 0x7F, 0xF9, 0x33, 0xF0, 0x80, 0xF9, 0x34, 0xF0, 0x81, 0xF9, 0x2E, 0x60, 0x2E, 0x64, - 0x2D, 0x60, 0x8A, 0x63, 0xA0, 0xD1, 0xA3, 0xD9, 0x64, 0x41, 0x58, 0xD1, 0x5B, 0xD9, 0x7D, 0xF3, - 0x66, 0x45, 0xA6, 0xF5, 0x60, 0x40, 0x01, 0x27, 0x08, 0x00, 0x91, 0xFA, 0x61, 0x44, 0xFD, 0x60, - 0x58, 0x4E, 0xAC, 0x78, 0xFF, 0xFF, 0x12, 0xFA, 0x07, 0x00, 0x11, 0xF8, 0x64, 0x44, 0xFD, 0x60, - 0x58, 0x4E, 0xAC, 0x78, 0xFF, 0xFF, 0x12, 0xFA, 0x65, 0x46, 0xA6, 0xF3, 0xFF, 0xFF, 0x02, 0xA4, - 0x40, 0x4B, 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x43, 0xFA, 0xA3, 0x00, 0x60, 0x17, 0x61, 0x00, 0x60, - 0x01, 0x65, 0x01, 0x60, 0xFF, 0x64, 0x40, 0x4C, 0xFD, 0x60, 0x58, 0x4E, 0x7A, 0x78, 0xFF, 0xFF, - 0x00, 0xBB, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x64, 0x40, 0x4A, 0x60, 0xFE, 0x02, 0x60, 0x00, 0x63, - 0xBD, 0xD3, 0xBD, 0xD3, 0x60, 0x41, 0xFE, 0x60, 0x58, 0x4E, 0x2C, 0x78, 0xFF, 0xFF, 0x20, 0xFE, - 0x00, 0x65, 0x00, 0x64, 0x19, 0x60, 0x3B, 0xFB, 0x02, 0x00, 0x20, 0xFE, 0xFF, 0x65, 0x02, 0x60, - 0x00, 0x63, 0x60, 0xFE, 0xBD, 0xD3, 0xBD, 0xD3, 0x60, 0x41, 0x20, 0xFE, 0xCD, 0x81, 0x60, 0x40, - 0x80, 0x2A, 0x39, 0x00, 0x7F, 0xB4, 0x02, 0x3A, 0x02, 0x00, 0x01, 0x64, 0x2E, 0x00, 0x04, 0x3A, - 0x02, 0x00, 0x02, 0x64, 0x2A, 0x00, 0x0B, 0x3A, 0x02, 0x00, 0x04, 0x64, 0x26, 0x00, 0x16, 0x3A, - 0x02, 0x00, 0x08, 0x64, 0x22, 0x00, 0x0C, 0x3A, 0x02, 0x00, 0x10, 0x64, 0x1E, 0x00, 0x12, 0x3A, - 0x02, 0x00, 0x20, 0x64, 0x1A, 0x00, 0x18, 0x3A, 0x02, 0x00, 0x40, 0x64, 0x16, 0x00, 0x24, 0x3A, - 0x02, 0x00, 0x80, 0x64, 0x12, 0x00, 0x30, 0x3A, 0x02, 0x00, 0x01, 0x67, 0x0E, 0x00, 0x48, 0x3A, - 0x02, 0x00, 0x02, 0x67, 0x0A, 0x00, 0x60, 0x3A, 0x02, 0x00, 0x04, 0x67, 0x06, 0x00, 0x6C, 0x3A, - 0x02, 0x00, 0x08, 0x67, 0x02, 0x00, 0x00, 0x64, 0x00, 0x00, 0x19, 0x60, 0x3B, 0xF1, 0xFF, 0xFF, - 0xB0, 0x84, 0x19, 0x60, 0x3B, 0xFB, 0x61, 0x40, 0x00, 0x36, 0x05, 0x00, 0x60, 0xFE, 0xBD, 0xD3, - 0xFF, 0xFF, 0x20, 0xFE, 0xBB, 0x01, 0x65, 0x40, 0x00, 0x3A, 0x1E, 0x00, 0x26, 0x46, 0x3F, 0xF2, - 0x00, 0xF4, 0x60, 0x43, 0xFA, 0xA3, 0x00, 0x60, 0x17, 0x61, 0x00, 0x60, 0x32, 0x65, 0x01, 0x60, - 0xFF, 0x64, 0x40, 0x4C, 0xFD, 0x60, 0x58, 0x4E, 0x7A, 0x78, 0xFF, 0xFF, 0x00, 0xBB, 0xFF, 0xFF, - 0x0B, 0x03, 0x60, 0xFE, 0x02, 0x60, 0x00, 0x63, 0xBD, 0xD3, 0xBD, 0xD3, 0x60, 0x41, 0xFE, 0x60, - 0x58, 0x4E, 0x2C, 0x78, 0xFF, 0xFF, 0x91, 0x01, 0x20, 0xFE, 0x00, 0x65, 0xFC, 0x60, 0x58, 0x4E, - 0xC7, 0x78, 0xFF, 0xFF, 0xA1, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x27, 0x04, 0x00, 0xFD, 0x60, - 0x58, 0x4E, 0x11, 0x78, 0xFF, 0xFF, 0x20, 0xFE, 0x37, 0x60, 0xF8, 0x61, 0xA1, 0xD1, 0xA1, 0xF3, - 0x01, 0x60, 0xAC, 0x63, 0x60, 0x45, 0x2A, 0x44, 0x79, 0xFB, 0xA3, 0xD5, 0x65, 0x40, 0x01, 0x27, - 0x5B, 0xD5, 0x65, 0x40, 0x01, 0x27, 0x59, 0xD1, 0x66, 0x41, 0xA0, 0x84, 0x24, 0x94, 0x2B, 0x46, - 0x0F, 0xFA, 0x7A, 0xFB, 0x16, 0x64, 0x12, 0xFA, 0x01, 0x64, 0x11, 0xFA, 0x66, 0x5C, 0xC2, 0x60, - 0x58, 0x4E, 0x6D, 0x78, 0xFF, 0xFF, 0xA6, 0xF3, 0xFF, 0xFF, 0x02, 0xA4, 0x40, 0x4B, 0x60, 0x46, - 0x00, 0x64, 0x17, 0xFA, 0x00, 0x64, 0x16, 0xFA, 0x13, 0xFA, 0x00, 0x65, 0x26, 0x46, 0xFD, 0x60, - 0x58, 0x4E, 0xDD, 0x78, 0xFF, 0xFF, 0xA6, 0xF3, 0x1D, 0x60, 0xC0, 0x65, 0x02, 0xA4, 0x60, 0x46, - 0x05, 0xF0, 0x60, 0x41, 0x64, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x00, 0x7C, 0x44, 0xD9, 0x26, 0x46, - 0x31, 0xF2, 0x61, 0x5C, 0x60, 0x47, 0x00, 0x7F, 0xE0, 0x84, 0x44, 0xD9, 0x26, 0x46, 0x2F, 0xF0, - 0x61, 0x46, 0x03, 0xF8, 0x26, 0x46, 0x30, 0xF0, 0x61, 0x46, 0x04, 0xF8, 0x26, 0x46, 0x31, 0xF0, - 0x61, 0x46, 0x05, 0xF8, 0x26, 0x46, 0xD9, 0x60, 0x58, 0x4E, 0xAE, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, 0x00, 0x66, - 0x46, 0x46, 0x03, 0x65, 0xF1, 0x60, 0x58, 0x4E, 0xC3, 0x78, 0xFF, 0xFF, 0x01, 0x63, 0x8A, 0xFD, - 0x08, 0x60, 0x0C, 0xF1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xC1, 0xFE, - 0x5C, 0x64, 0x3B, 0x42, 0x5A, 0xDB, 0xE1, 0x60, 0x22, 0x78, 0xFF, 0xFF, 0xFF, 0x60, 0xF7, 0x65, - 0x20, 0x44, 0x24, 0x80, 0xDA, 0x60, 0x74, 0x78, 0xFF, 0xFF, 0xDB, 0xF3, 0xFF, 0xFF, 0xFD, 0xA0, - 0x2A, 0xF2, 0x03, 0x03, 0xE6, 0x60, 0xDE, 0x78, 0xFF, 0xFF, 0x60, 0x40, 0xB0, 0x36, 0x11, 0x00, - 0xC0, 0x36, 0x02, 0x00, 0x2F, 0x58, 0xFF, 0xFF, 0x26, 0x46, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, - 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xDA, 0x60, 0x74, 0x78, - 0xFF, 0xFF, 0x66, 0x45, 0x00, 0xF4, 0x0A, 0xF2, 0x0B, 0xF2, 0xFE, 0xA0, 0xF3, 0xA0, 0x67, 0x02, - 0x60, 0x41, 0x09, 0xF2, 0x1D, 0x03, 0x00, 0xA0, 0xFF, 0xA0, 0x4B, 0x03, 0x5D, 0x03, 0x00, 0xA0, - 0xFF, 0xFF, 0x47, 0x03, 0x01, 0x64, 0x10, 0x60, 0x0B, 0xFB, 0x0D, 0x64, 0x10, 0x60, 0x0C, 0xFB, - 0x03, 0x64, 0x10, 0x60, 0x0D, 0xFB, 0x26, 0x46, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, - 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xDA, 0x60, 0x74, 0x78, 0xFF, 0xFF, - 0x16, 0x60, 0xC3, 0xF3, 0xFF, 0xFF, 0xFE, 0xA0, 0x20, 0x60, 0x16, 0x61, 0x15, 0x02, 0x01, 0x64, - 0xA1, 0xDB, 0x00, 0x64, 0x10, 0x60, 0x0C, 0xFB, 0x01, 0x64, 0x10, 0x60, 0x0D, 0xFB, 0x26, 0x46, - 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, 0x00, 0x66, - 0x46, 0x46, 0xDA, 0x60, 0x74, 0x78, 0xFF, 0xFF, 0x02, 0x64, 0xA1, 0xDB, 0x00, 0x64, 0x10, 0x60, - 0x0C, 0xFB, 0x01, 0x64, 0x10, 0x60, 0x0D, 0xFB, 0x26, 0x46, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, - 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, 0x00, 0x66, 0x46, 0x46, 0xDA, 0x60, 0x74, 0x78, - 0xFF, 0xFF, 0x65, 0x46, 0x07, 0xF4, 0x06, 0xF2, 0xFF, 0xFF, 0x01, 0x7E, 0x06, 0xFA, 0x65, 0x46, - 0x26, 0x46, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, - 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0xDC, 0x60, 0x09, 0x78, 0xFF, 0xFF, 0x0A, 0xF2, - 0x09, 0xF2, 0xFC, 0xA0, 0xFF, 0xA0, 0x11, 0x02, 0x0A, 0x02, 0x0B, 0xF2, 0x65, 0x46, 0x0A, 0x1B, - 0x66, 0x41, 0x07, 0xF4, 0x06, 0xF2, 0xFF, 0xFF, 0x01, 0x7E, 0x06, 0xFA, 0x61, 0x46, 0xDA, 0x60, - 0x74, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x65, 0x46, 0x68, 0xF1, 0x2A, 0xF2, - 0x64, 0x41, 0x60, 0x40, 0xA0, 0x3A, 0x02, 0x00, 0x08, 0xB1, 0x04, 0x00, 0xC0, 0x3A, 0x0B, 0x00, - 0x04, 0xB1, 0xFF, 0xFF, 0x1E, 0x03, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x10, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x16, 0x00, 0xB0, 0x3A, 0x02, 0x00, 0x01, 0x65, 0x07, 0x00, 0x10, 0x3A, - 0x02, 0x00, 0x02, 0x65, 0x03, 0x00, 0x30, 0x3A, 0x0C, 0x00, 0x10, 0x65, 0xA5, 0x80, 0xFF, 0xFF, - 0x08, 0x03, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x08, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x00, 0x66, 0x2F, 0x58, 0xFF, 0xFF, 0x16, 0x60, 0xC3, 0xF3, 0xFF, 0xFF, 0xFC, 0xA0, 0xFF, 0xFF, - 0x14, 0x04, 0x00, 0x60, 0x02, 0x64, 0x08, 0x60, 0x16, 0xFB, 0xE7, 0x60, 0x1B, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x19, 0x60, 0xA5, 0xF1, 0x01, 0x60, 0x00, 0x64, 0xA0, 0x80, - 0xFF, 0xFF, 0x03, 0x03, 0xDA, 0x60, 0x74, 0x78, 0xFF, 0xFF, 0x20, 0x40, 0x08, 0x2A, 0x03, 0x00, - 0xD9, 0x60, 0xCA, 0x78, 0xFF, 0xFF, 0xE2, 0x60, 0x73, 0x78, 0xFF, 0xFF, 0x4E, 0x64, 0x3B, 0x42, - 0x5A, 0xDB, 0x2E, 0xF5, 0xFF, 0xFF, 0x27, 0xF2, 0x1D, 0x60, 0xC0, 0x65, 0x60, 0x47, 0x00, 0x7F, - 0xE0, 0x84, 0x44, 0xD3, 0x66, 0x41, 0x60, 0x46, 0x60, 0x43, 0x05, 0xF2, 0x16, 0x18, 0x61, 0x46, - 0x27, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0x04, 0xF2, 0x0C, 0x02, 0x61, 0x46, 0x26, 0xF0, 0x63, 0x46, - 0xD0, 0x80, 0x03, 0xF2, 0x06, 0x02, 0x61, 0x46, 0x25, 0xF0, 0x63, 0x46, 0xD0, 0x80, 0xFF, 0xFF, - 0x07, 0x03, 0x80, 0xF4, 0xFF, 0xFF, 0x63, 0x46, 0xE8, 0x1B, 0xA6, 0xF3, 0x08, 0xFE, 0x60, 0x43, - 0x61, 0x46, 0x25, 0xF2, 0x26, 0xF0, 0xA7, 0xF2, 0xA8, 0xF0, 0x65, 0xF5, 0xFF, 0xFF, 0x00, 0xF4, - 0xFF, 0xFF, 0x89, 0xF8, 0x65, 0xF5, 0xFF, 0xFF, 0x07, 0xFC, 0x2C, 0xFA, 0x2D, 0xF8, 0xAE, 0xFA, - 0xEA, 0xF3, 0x2F, 0xFA, 0xEB, 0xF3, 0x30, 0xFA, 0xEC, 0xF3, 0x31, 0xFA, 0x7F, 0xF3, 0x32, 0xFA, - 0x80, 0xF3, 0x33, 0xFA, 0x81, 0xF3, 0x34, 0xFA, 0x1B, 0x60, 0xFE, 0xF3, 0xFF, 0xFF, 0x03, 0x1B, - 0x00, 0x60, 0xA0, 0x64, 0x02, 0x00, 0x00, 0x60, 0xC0, 0x64, 0x2A, 0xFA, 0x02, 0x63, 0x3F, 0xFC, - 0xAB, 0xFC, 0x00, 0x64, 0x3E, 0xFA, 0xC9, 0xF1, 0x19, 0xF8, 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, - 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x00, 0x66, - 0x46, 0x46, 0xC1, 0xFE, 0x10, 0x60, 0x2A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xE1, 0x60, 0x34, 0x78, - 0xFF, 0xFF, 0x00, 0x60, 0x3A, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x22, 0x78, 0xFF, 0xFF, 0x66, 0x44, - 0x61, 0xFB, 0xA6, 0xF3, 0x07, 0xFA, 0x0C, 0x60, 0x80, 0x64, 0xB9, 0xF1, 0x19, 0xF8, 0x0E, 0xFA, - 0x00, 0x64, 0x3E, 0xFA, 0x3F, 0xFA, 0x00, 0x60, 0x3A, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x22, 0x78, - 0xFF, 0xFF, 0x66, 0x44, 0x60, 0xFB, 0xA6, 0xF3, 0x07, 0xFA, 0x0C, 0x60, 0x80, 0x64, 0x0E, 0xFA, - 0xB9, 0xF1, 0x19, 0xF8, 0x00, 0x64, 0x3E, 0xFA, 0x3F, 0xFA, 0xE8, 0x60, 0xEA, 0x64, 0x08, 0x60, - 0x33, 0xFB, 0x00, 0x60, 0x80, 0x64, 0x08, 0x60, 0x10, 0xFB, 0xE7, 0x60, 0xCB, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x16, 0x60, 0x87, 0xF3, 0xFF, 0xFF, 0x01, 0xA8, 0x03, 0xA8, - 0x04, 0x03, 0x03, 0x03, 0xE8, 0x60, 0xDC, 0x78, 0xFF, 0xFF, 0x04, 0x60, 0x00, 0x65, 0x20, 0x44, - 0x34, 0x80, 0x10, 0x60, 0x1E, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x9B, 0xFE, 0x03, 0x05, 0x20, 0x40, - 0x4B, 0x23, 0x0A, 0x00, 0x80, 0x60, 0x00, 0x64, 0x08, 0x60, 0x10, 0xFB, 0xE7, 0x60, 0xD9, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x13, 0xF3, 0xFF, 0xFF, 0x60, 0x40, - 0x01, 0x2A, 0x07, 0x00, 0x90, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x00, 0x64, 0xA2, 0xDB, - 0x04, 0x00, 0x10, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x8A, 0xF3, 0x58, 0xFB, 0x82, 0xF1, - 0xBA, 0xFE, 0x01, 0xA8, 0x59, 0xF9, 0x04, 0x02, 0x02, 0x64, 0x8A, 0xFB, 0xFF, 0xFF, 0xC1, 0xFE, - 0x64, 0x47, 0xDB, 0xF3, 0x10, 0xB0, 0x04, 0xA8, 0x2B, 0x02, 0x2A, 0x02, 0x61, 0xF5, 0xEA, 0xF1, - 0x2F, 0xF8, 0xEB, 0xF1, 0x30, 0xF8, 0xEC, 0xF1, 0x31, 0xF8, 0x7F, 0xF1, 0x2C, 0xF8, 0x32, 0xF8, - 0x80, 0xF1, 0x2D, 0xF8, 0x33, 0xF8, 0x81, 0xF1, 0x2E, 0xF8, 0x34, 0xF8, 0x10, 0x60, 0x48, 0x64, - 0x2A, 0xFA, 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x60, 0x01, 0x64, 0x08, 0x60, 0x10, 0xFB, - 0xE8, 0x60, 0x36, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x67, 0x82, 0xFB, - 0x8A, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0xFF, 0xFF, 0x0A, 0x03, 0x80, 0x60, 0x00, 0x64, 0x08, 0x60, - 0x10, 0xFB, 0xE8, 0x60, 0x38, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, - 0x1E, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x05, 0x7C, 0x53, 0xF9, 0x2F, 0x60, 0x24, 0x64, 0x54, 0xFB, - 0x19, 0x60, 0x40, 0xF3, 0xFF, 0xFF, 0x15, 0x18, 0x10, 0x60, 0x1E, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x08, 0x60, 0x12, 0xF1, 0x00, 0x60, 0x10, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, - 0x00, 0x64, 0x08, 0x60, 0x10, 0xFB, 0xE8, 0x60, 0x69, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x19, 0x60, 0x41, 0xF3, 0xFF, 0x60, 0x80, 0x65, 0xA4, 0x80, 0x5A, 0xD3, 0x05, 0x02, - 0x04, 0x1B, 0x5A, 0xD3, 0xFF, 0xFF, 0x01, 0x1B, 0x15, 0x00, 0x10, 0x60, 0x1E, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x08, 0x60, 0x12, 0xF1, 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x10, 0x60, 0x00, 0x64, 0x08, 0x60, 0x10, 0xFB, 0xE8, 0x60, 0x8A, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0x59, 0xF3, 0x82, 0xFB, 0x60, 0x40, 0x10, 0x27, 0xDA, 0xFE, - 0xDB, 0xF3, 0x00, 0xA8, 0x04, 0xA8, 0x23, 0x02, 0x22, 0x02, 0x60, 0xF5, 0xEA, 0xF1, 0x2F, 0xF8, - 0xEB, 0xF1, 0x30, 0xF8, 0xEC, 0xF1, 0x31, 0xF8, 0x7F, 0xF1, 0x2C, 0xF8, 0x80, 0xF1, 0x2D, 0xF8, - 0x81, 0xF1, 0x2E, 0xF8, 0xA4, 0x64, 0x2A, 0xFA, 0x83, 0xF1, 0xC0, 0x67, 0xB0, 0x84, 0x2B, 0xFA, - 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x20, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x00, 0x60, - 0x04, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x22, 0x78, 0xFF, 0xFF, 0x01, 0x64, 0x23, 0xFA, 0xF1, 0x60, - 0x02, 0x64, 0x24, 0xFA, 0x26, 0x60, 0x0A, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0xEB, 0x60, 0xFF, 0x65, 0x20, 0x44, - 0x24, 0x80, 0x08, 0x60, 0x08, 0xF1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x58, 0xF3, 0x8A, 0xFB, 0xFF, 0xFF, 0xC1, 0xFE, 0x10, 0x60, 0x1E, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x00, 0x60, 0x80, 0x64, 0x08, 0x60, 0x10, 0xFB, 0xE7, 0x60, 0xCB, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x9C, 0xF1, 0x00, 0x64, 0xB0, 0x86, 0x9C, 0xFB, 0x07, 0x03, 0x26, 0x60, - 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, 0xFF, 0xFF, 0xEB, 0x60, 0xFF, 0x65, - 0x20, 0x44, 0x24, 0x80, 0x10, 0x60, 0x1E, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x60, 0x80, 0x64, - 0x08, 0x60, 0x10, 0xFB, 0xE7, 0x60, 0xCB, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x95, 0xF3, 0x26, 0x46, 0x60, 0x43, 0x01, 0x2A, 0x20, 0x00, 0x0F, 0xF2, 0x2A, 0xF0, 0x60, 0x40, - 0x10, 0x2A, 0x0F, 0x00, 0x64, 0x40, 0x04, 0x27, 0x18, 0x00, 0xFD, 0xB3, 0x64, 0x40, 0x20, 0x27, - 0x02, 0xBB, 0x08, 0x60, 0x1B, 0xF1, 0x00, 0x60, 0x08, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x0B, 0x00, 0xFB, 0xB3, 0x64, 0x40, 0x20, 0x27, 0x04, 0xBB, 0x08, 0x60, 0x1B, 0xF1, 0x00, 0x60, - 0x10, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x95, 0xFD, 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, - 0xDB, 0xF3, 0x3F, 0xF2, 0x04, 0xA8, 0x57, 0xFB, 0x02, 0x03, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0xF4, - 0x1E, 0x63, 0x08, 0x64, 0x40, 0x48, 0xBD, 0xD2, 0xFF, 0xFF, 0x60, 0x47, 0x05, 0x36, 0x0B, 0x00, - 0xFF, 0xB5, 0xC7, 0x83, 0x01, 0x2A, 0xF7, 0x01, 0x4F, 0xD2, 0x5B, 0xD2, 0x60, 0x40, 0x05, 0x37, - 0x0B, 0x00, 0xDF, 0x83, 0xF5, 0x01, 0xFF, 0xB5, 0x65, 0x41, 0xA3, 0xD2, 0x47, 0x8A, 0x60, 0x47, - 0x40, 0x4C, 0x5B, 0xD2, 0xDF, 0x83, 0x08, 0x00, 0x40, 0x4C, 0x00, 0x7F, 0xDC, 0x85, 0x47, 0x8A, - 0x60, 0x41, 0x5B, 0xD2, 0xDB, 0x83, 0x60, 0x47, 0x01, 0xB0, 0xFE, 0xB5, 0x02, 0x03, 0x02, 0x64, - 0x40, 0x48, 0x2C, 0x47, 0xFF, 0xB4, 0x73, 0xF1, 0x08, 0x28, 0x73, 0xFB, 0x83, 0xF1, 0x65, 0x44, - 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0xFD, 0xA1, 0xE1, 0x81, 0xE1, 0x81, 0xE1, 0x85, 0xC4, 0x81, - 0xD0, 0x84, 0xD1, 0x80, 0x28, 0x07, 0x27, 0x06, 0x9C, 0x84, 0xDC, 0x84, 0xE8, 0x84, 0xE8, 0x84, - 0xE8, 0x85, 0x94, 0xF3, 0xC7, 0x83, 0x01, 0x26, 0x60, 0x47, 0xAB, 0x83, 0xFC, 0xA3, 0x02, 0x00, - 0x03, 0x04, 0x00, 0xF4, 0x84, 0xA3, 0xFC, 0x01, 0x80, 0x65, 0x47, 0xD0, 0x28, 0x41, 0xA0, 0x80, - 0xFE, 0xA1, 0x14, 0x03, 0x08, 0x02, 0x08, 0x60, 0x2D, 0xF1, 0x00, 0x60, 0x10, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x1B, 0x00, 0x08, 0x60, 0x2D, 0xF1, 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x13, 0x00, 0x28, 0x41, 0xFE, 0xA1, 0xFF, 0xFF, 0x08, 0x03, 0x08, 0x60, - 0x2D, 0xF1, 0x00, 0x60, 0x08, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x07, 0x00, 0x08, 0x60, - 0x2D, 0xF1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x08, 0x60, 0x1B, 0xF1, - 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, - 0x08, 0x60, 0x1B, 0xF1, 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x08, 0x60, 0x1B, 0xF1, 0x02, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x63, 0x95, 0xFD, 0x1C, 0x60, 0x9E, 0x63, 0x00, 0x64, 0xA3, 0xDB, - 0x06, 0xA3, 0x10, 0x60, 0x98, 0x64, 0xBD, 0xDB, 0xBD, 0xDB, 0x06, 0x64, 0xA3, 0xDB, 0xE9, 0x60, - 0xB8, 0x64, 0x08, 0x60, 0x4B, 0xFB, 0xCE, 0xF1, 0x0E, 0x60, 0x51, 0xF9, 0x1C, 0x60, 0xAA, 0x63, - 0x00, 0x64, 0xA3, 0xDB, 0x06, 0xA3, 0x10, 0x60, 0x9C, 0x64, 0xBD, 0xDB, 0xBD, 0xDB, 0x06, 0x64, - 0xA3, 0xDB, 0xE9, 0x60, 0xC1, 0x64, 0x08, 0x60, 0x4D, 0xFB, 0x16, 0x60, 0xAE, 0xF1, 0x0E, 0x60, - 0x57, 0xF9, 0x00, 0x60, 0x3A, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x22, 0x78, 0xFF, 0xFF, 0x66, 0x44, - 0x63, 0xFB, 0xA6, 0xF3, 0x07, 0xFA, 0xB9, 0xF3, 0x19, 0xFA, 0xF8, 0x60, 0x80, 0x64, 0x0E, 0xFA, - 0x00, 0x64, 0x3E, 0xFA, 0x3F, 0xFA, 0x00, 0x60, 0x3A, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x22, 0x78, - 0xFF, 0xFF, 0x66, 0x44, 0x64, 0xFB, 0xA6, 0xF3, 0x07, 0xFA, 0xB9, 0xF3, 0x19, 0xFA, 0x24, 0x60, - 0x80, 0x64, 0x0E, 0xFA, 0x00, 0x64, 0x3E, 0xFA, 0x3F, 0xFA, 0x00, 0x64, 0x08, 0x60, 0x2D, 0xFB, - 0x5A, 0xDB, 0xEA, 0x60, 0x1F, 0x64, 0x08, 0x60, 0x37, 0xFB, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x63, - 0x95, 0xFD, 0xBA, 0xFE, 0xFE, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x82, 0xFD, 0x08, 0x60, - 0x15, 0xF1, 0x04, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x00, 0x64, 0x08, 0x60, - 0x1B, 0xFB, 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x16, 0x60, 0xAB, 0xF3, 0xFF, 0xFF, 0x01, 0xA8, - 0xFF, 0xFF, 0x05, 0x03, 0x19, 0x60, 0xF0, 0xF1, 0x0E, 0x60, 0x57, 0xF9, 0x04, 0x00, 0x16, 0x60, - 0xAE, 0xF1, 0x0E, 0x60, 0x57, 0xF9, 0x16, 0x60, 0xAB, 0xF3, 0xFF, 0xFF, 0x09, 0x1B, 0x00, 0x64, - 0x82, 0xFB, 0xBA, 0xFE, 0x00, 0x64, 0x08, 0x60, 0x1B, 0xFB, 0x5A, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, - 0xBA, 0xFE, 0x95, 0xF3, 0x00, 0x63, 0x82, 0xFD, 0x10, 0xBC, 0x95, 0xFB, 0xFE, 0x60, 0xFF, 0x65, - 0x20, 0x44, 0x24, 0x80, 0x08, 0x60, 0x08, 0xF1, 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0x00, 0x60, 0x64, 0x63, 0x0E, 0x60, 0x37, 0xFD, 0x10, 0x60, 0x36, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x01, 0x60, 0x04, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xEA, 0x60, 0x73, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x1B, 0xF1, 0x01, 0x60, 0x00, 0x64, 0xA0, 0x80, - 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xA2, 0x01, 0x31, 0x40, 0x04, 0x2A, 0xE5, 0x01, - 0x20, 0x40, 0x12, 0x23, 0x11, 0x00, 0x10, 0x60, 0x36, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x10, 0x60, - 0x5A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x81, 0x60, 0x00, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xEA, 0x60, - 0x73, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0xDD, 0x01, 0x10, 0x60, 0x36, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x01, 0x60, 0x00, 0x65, 0x20, 0x44, 0x34, 0x80, 0x64, 0xF5, 0xB9, 0xF1, 0x19, 0xF8, 0x7F, 0xF1, - 0x2C, 0xF8, 0x32, 0xF8, 0x80, 0xF1, 0x2D, 0xF8, 0x33, 0xF8, 0x81, 0xF1, 0x2E, 0xF8, 0x34, 0xF8, - 0xEA, 0xF1, 0x2F, 0xF8, 0xEB, 0xF1, 0x30, 0xF8, 0xEC, 0xF1, 0x31, 0xF8, 0x11, 0x60, 0x48, 0x64, - 0x2A, 0xFA, 0x00, 0x64, 0x2B, 0xFA, 0x23, 0xFA, 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, 0x0D, 0xFB, - 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x60, - 0x01, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xEA, 0x60, 0xC9, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x64, 0xF5, 0x23, 0xF2, 0xFF, 0xFF, 0x01, 0x18, 0x82, 0x01, 0x10, 0x67, 0x82, 0xFB, - 0x03, 0x64, 0x96, 0xFB, 0xFE, 0x60, 0xFF, 0x65, 0x20, 0x44, 0x24, 0x80, 0x08, 0x60, 0x08, 0xF1, - 0x80, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x10, 0x60, 0x36, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0x81, 0x60, 0x00, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xEA, 0x60, 0xEA, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x0C, 0x00, 0x08, 0x60, 0x1B, 0xF1, 0x01, 0x60, 0x00, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xEA, 0x60, 0x1F, 0x78, 0xFF, 0xFF, 0x06, 0x60, 0x00, 0x65, - 0x20, 0x41, 0x8C, 0xF3, 0xA5, 0x80, 0x01, 0xB0, 0x01, 0x02, 0x06, 0x00, 0x10, 0x60, 0x36, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x1C, 0x60, 0x6E, 0x65, 0xA5, 0xD3, 0x01, 0x63, - 0x8A, 0xFD, 0x26, 0x1B, 0x00, 0x60, 0x64, 0x64, 0xA5, 0xDB, 0x64, 0xF5, 0xB9, 0xF1, 0x19, 0xF8, - 0x7F, 0xF1, 0x2C, 0xF8, 0x32, 0xF8, 0x80, 0xF1, 0x2D, 0xF8, 0x33, 0xF8, 0x81, 0xF1, 0x2E, 0xF8, - 0x34, 0xF8, 0xEA, 0xF1, 0x2F, 0xF8, 0xEB, 0xF1, 0x30, 0xF8, 0xEC, 0xF1, 0x31, 0xF8, 0x11, 0x60, - 0x48, 0x64, 0x2A, 0xFA, 0x00, 0x64, 0x2B, 0xFA, 0x23, 0xFA, 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, - 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x06, 0x00, - 0x95, 0xF3, 0x32, 0x40, 0x02, 0x26, 0x02, 0x00, 0x40, 0x2A, 0xDA, 0xFE, 0xC1, 0xFE, 0x10, 0x60, - 0x36, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x01, 0x60, 0x82, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xEB, 0x60, - 0x45, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x1B, 0xF1, 0x01, 0x60, - 0x00, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xEA, 0x60, 0x1F, 0x78, - 0xFF, 0xFF, 0x00, 0x60, 0x02, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x06, 0x03, 0xA0, 0x84, 0xA2, 0xDB, - 0xBA, 0xFE, 0xED, 0x60, 0x6D, 0x78, 0xFF, 0xFF, 0x02, 0x64, 0x8A, 0xFB, 0x01, 0x60, 0x00, 0x65, - 0x20, 0x44, 0x34, 0x80, 0xBA, 0xFE, 0xC1, 0xFE, 0x10, 0x60, 0x36, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x10, 0x60, 0x5A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x01, 0x60, 0x46, 0x64, 0x08, 0x60, 0x1C, 0xFB, - 0xEB, 0x60, 0x76, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x1B, 0xF1, - 0x01, 0x60, 0x00, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xEA, 0x60, - 0x1F, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x45, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x08, 0x60, 0x2D, 0xF1, 0x00, 0x60, 0x08, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0F, 0x03, - 0xA0, 0x84, 0xA2, 0xDB, 0x08, 0x60, 0x1B, 0xF1, 0x00, 0x60, 0x02, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xED, 0x60, 0x6D, 0x78, 0xFF, 0xFF, 0x31, 0x01, 0x00, 0x60, - 0x02, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0B, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x16, 0x60, 0xAC, 0xF1, - 0x95, 0xF3, 0x00, 0x61, 0xD1, 0x80, 0xF7, 0xB4, 0xF1, 0x03, 0x95, 0xFB, 0x33, 0x00, 0x00, 0x60, - 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0E, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x16, 0x60, 0xAC, 0xF1, - 0x95, 0xF3, 0x00, 0x61, 0xD1, 0x80, 0x08, 0xBC, 0x03, 0x02, 0xEC, 0x60, 0x9C, 0x78, 0xFF, 0xFF, - 0x95, 0xFB, 0x20, 0x00, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0xEC, 0x60, 0x9C, 0x78, 0xFF, 0xFF, 0x08, 0x60, 0x1B, 0xF1, 0x00, 0x60, 0x40, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xC8, 0x01, 0x00, 0x60, 0x02, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x05, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xED, 0x60, 0x6D, 0x78, 0xFF, 0xFF, - 0x2F, 0x58, 0xFF, 0xFF, 0x02, 0x63, 0x95, 0xF3, 0x8A, 0xFD, 0x01, 0xBC, 0xC1, 0xFE, 0x95, 0xFB, - 0xCE, 0xF1, 0x0E, 0x60, 0x51, 0xF9, 0x10, 0x60, 0x36, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x10, 0x60, - 0x5A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x01, 0x60, 0x34, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xEC, 0x60, - 0x05, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x1C, 0x60, 0x9E, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x1B, 0xF1, 0x01, 0x60, - 0x00, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0D, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1C, 0x60, 0x9E, 0x64, - 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0xEA, 0x60, 0x1F, 0x78, - 0xFF, 0xFF, 0x00, 0x60, 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x22, 0x03, 0xA0, 0x84, 0xA2, 0xDB, - 0x95, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x04, 0x2A, 0x01, 0x00, 0xD5, 0x01, 0x1C, 0x60, 0x9E, 0x64, - 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x95, 0xF3, 0xFF, 0xFF, - 0x60, 0x40, 0x08, 0x2A, 0x01, 0x00, 0x68, 0x00, 0x08, 0x60, 0x1B, 0xF1, 0x00, 0x60, 0x02, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x59, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xED, 0x60, 0x6D, 0x78, 0xFF, 0xFF, - 0x08, 0x60, 0x2D, 0xF1, 0x00, 0x60, 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x08, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x95, 0xF3, 0xFF, 0xFF, 0x08, 0xBC, 0x95, 0xFB, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x60, - 0x02, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xA4, 0x01, 0x00, 0x60, - 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0B, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1C, 0x60, 0x9E, 0x64, - 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x35, 0x00, 0x00, 0x60, - 0x08, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0B, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1C, 0x60, 0x9E, 0x64, - 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x1E, 0x00, 0x08, 0x60, - 0x1B, 0xF1, 0x00, 0x60, 0x20, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x14, 0x03, 0xA0, 0x84, 0xA2, 0xDB, - 0x95, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x08, 0x2A, 0x01, 0x00, 0x16, 0x00, 0x08, 0x60, 0x1B, 0xF1, - 0x00, 0x60, 0x02, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x08, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xED, 0x60, - 0x6D, 0x78, 0xFF, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x00, 0x95, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, - 0x95, 0xFB, 0xEA, 0x60, 0xD0, 0x78, 0xFF, 0xFF, 0x16, 0x60, 0xAB, 0xF3, 0xFF, 0xFF, 0x01, 0xA8, - 0xFF, 0xFF, 0x03, 0x02, 0xED, 0x60, 0x76, 0x78, 0xFF, 0xFF, 0x95, 0xF3, 0x01, 0x63, 0x8A, 0xFD, - 0x21, 0xBC, 0x95, 0xFB, 0x63, 0xF5, 0x7F, 0xF1, 0x2C, 0xF8, 0x80, 0xF1, 0x2D, 0xF8, 0x81, 0xF1, - 0x2E, 0xF8, 0x83, 0xF1, 0xC0, 0x67, 0xB0, 0x84, 0x2B, 0xFA, 0xB9, 0xF1, 0x19, 0xF8, 0xEA, 0xF1, - 0x2F, 0xF8, 0xEB, 0xF1, 0x30, 0xF8, 0xEC, 0xF1, 0x31, 0xF8, 0x10, 0x60, 0xA4, 0x64, 0x2A, 0xFA, - 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x60, 0x50, 0x64, 0x0E, 0x60, 0x51, 0xFB, 0x1C, 0x60, - 0x9E, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x10, 0x60, - 0x36, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x10, 0x60, 0x5A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x01, 0x60, - 0x2C, 0x64, 0x08, 0x60, 0x1C, 0xFB, 0xEC, 0x60, 0xE9, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x08, 0x60, 0x1B, 0xF1, 0x01, 0x60, 0x00, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0D, 0x03, - 0xA0, 0x84, 0xA2, 0xDB, 0x1C, 0x60, 0x9E, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, - 0xFF, 0xFF, 0x04, 0xFF, 0xEA, 0x60, 0x1F, 0x78, 0xFF, 0xFF, 0x08, 0x60, 0x2D, 0xF1, 0x00, 0x60, - 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x95, 0x01, 0x08, 0x60, - 0x1B, 0xF1, 0x00, 0x60, 0x08, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x08, 0x03, 0xA0, 0x84, 0xA2, 0xDB, - 0x95, 0xF3, 0xFF, 0xFF, 0x02, 0xB0, 0xFF, 0xFF, 0x49, 0x03, 0x86, 0x01, 0x00, 0x60, 0x08, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x40, 0x00, 0x00, 0x60, 0x02, 0x64, - 0xA0, 0x80, 0x9C, 0x84, 0x14, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1C, 0x60, 0x9E, 0x64, 0x13, 0x60, - 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x16, 0x60, 0xAC, 0xF3, 0x95, 0xF3, - 0x00, 0xA8, 0xF7, 0xB4, 0x2B, 0x03, 0x95, 0xFB, 0xEB, 0x60, 0xE2, 0x78, 0xFF, 0xFF, 0x00, 0x60, - 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x15, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x1C, 0x60, 0x9E, 0x64, - 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x16, 0x60, 0xAC, 0xF3, - 0x95, 0xF3, 0x00, 0xA8, 0x08, 0xBC, 0x01, 0x02, 0x4F, 0x01, 0x95, 0xFB, 0xEB, 0x60, 0xE2, 0x78, - 0xFF, 0xFF, 0x08, 0x60, 0x1B, 0xF1, 0x00, 0x60, 0x20, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, - 0xA0, 0x84, 0xA2, 0xDB, 0x02, 0x00, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x00, 0x1C, 0x60, 0x9E, 0x64, - 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x95, 0xF3, 0xFF, 0xFF, - 0xFE, 0xB4, 0x95, 0xFB, 0xEA, 0x60, 0xD0, 0x78, 0xFF, 0xFF, 0x95, 0xF3, 0x01, 0x63, 0x8A, 0xFD, - 0x01, 0xBC, 0x95, 0xFB, 0x00, 0x64, 0x82, 0xFB, 0xC1, 0xFE, 0x28, 0x00, 0x95, 0xF3, 0x01, 0x63, - 0x8A, 0xFD, 0x01, 0xBC, 0x95, 0xFB, 0x00, 0x64, 0x82, 0xFB, 0x63, 0xF5, 0x7F, 0xF1, 0x2C, 0xF8, - 0x80, 0xF1, 0x2D, 0xF8, 0x81, 0xF1, 0x2E, 0xF8, 0x83, 0xF1, 0xC0, 0x67, 0xB0, 0x84, 0x2B, 0xFA, - 0xB9, 0xF1, 0x19, 0xF8, 0xEA, 0xF1, 0x2F, 0xF8, 0xEB, 0xF1, 0x30, 0xF8, 0xEC, 0xF1, 0x31, 0xF8, - 0x00, 0x60, 0xA4, 0x64, 0x2A, 0xFA, 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x1C, 0x60, 0xAA, 0x64, - 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x10, 0x60, 0x36, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x10, 0x60, 0x5A, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x03, 0x60, 0x0E, 0x64, - 0x08, 0x60, 0x1C, 0xFB, 0xED, 0x60, 0xB8, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x08, 0x60, 0x1B, 0xF1, 0x01, 0x60, 0x00, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0D, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x1C, 0x60, 0xAA, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0xEA, 0x60, 0x1F, 0x78, 0xFF, 0xFF, 0x00, 0x60, 0x0A, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xCA, 0x01, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, - 0x14, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x08, 0x60, 0x2D, 0xF1, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, - 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x91, 0x01, 0x00, 0x60, 0x12, 0x64, 0xA0, 0x80, - 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0xB1, 0x01, 0x08, 0x60, 0x1B, 0xF1, 0x02, 0x60, - 0x00, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0xB2, 0x03, 0xA0, 0x84, 0xA2, 0xDB, 0x10, 0x67, 0x82, 0xFB, - 0x10, 0x60, 0x36, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x10, 0x60, 0x5A, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x64, 0xF5, 0xB9, 0xF1, 0x19, 0xF8, 0x7F, 0xF1, 0x2C, 0xF8, 0x32, 0xF8, 0x80, 0xF1, 0x2D, 0xF8, - 0x33, 0xF8, 0x81, 0xF1, 0x2E, 0xF8, 0x34, 0xF8, 0xEA, 0xF1, 0x2F, 0xF8, 0xEB, 0xF1, 0x30, 0xF8, - 0xEC, 0xF1, 0x31, 0xF8, 0x11, 0x60, 0x48, 0x64, 0x2A, 0xFA, 0x00, 0x64, 0x2B, 0xFA, 0x23, 0xFA, - 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0x95, 0xF3, 0xC1, 0xFE, 0xFE, 0xB4, 0x95, 0xFB, 0x00, 0x60, 0x03, 0x64, - 0x08, 0x60, 0x1C, 0xFB, 0xEE, 0x60, 0x30, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x08, 0x60, 0x1B, 0xF1, 0x00, 0x60, 0x02, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x33, 0x01, 0x64, 0xF5, 0x23, 0xF2, 0x96, 0xF3, 0x04, 0x18, 0xCC, 0x84, 0x96, 0xFB, - 0x01, 0x03, 0x2B, 0x01, 0xEA, 0x60, 0xD0, 0x78, 0xFF, 0xFF, 0x16, 0x60, 0xAB, 0xF3, 0x82, 0xF1, - 0x02, 0xA8, 0x2A, 0xF2, 0x03, 0x02, 0xB0, 0x84, 0x2A, 0xFA, 0x07, 0x00, 0x08, 0x60, 0x1B, 0xF1, - 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x25, 0x60, 0xC8, 0x64, 0x13, 0x60, - 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, - 0x12, 0x60, 0xED, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0xDF, 0x02, 0xCA, 0x60, 0xD4, 0x78, - 0xFF, 0xFF, 0x10, 0x60, 0x48, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x00, 0x60, 0x06, 0x64, 0x08, 0x60, - 0x25, 0xFB, 0xEE, 0x60, 0x77, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x60, - 0x18, 0x64, 0x08, 0x60, 0x25, 0xFB, 0xEE, 0x60, 0x77, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x26, 0x46, 0x00, 0xF4, 0xDB, 0xF3, 0xFF, 0xFF, 0x07, 0xB4, 0x03, 0x36, 0x1B, 0x00, - 0x0E, 0xF0, 0x19, 0x60, 0x7B, 0xF3, 0xFF, 0xFF, 0xEF, 0xB4, 0x60, 0x44, 0x64, 0x40, 0x04, 0x27, - 0x07, 0x00, 0xA2, 0xDB, 0x13, 0x64, 0xCB, 0xFB, 0x01, 0x60, 0x67, 0x64, 0x37, 0xFB, 0x0B, 0x00, - 0x10, 0xBC, 0xA2, 0xDB, 0x08, 0x64, 0xCB, 0xFB, 0xA1, 0xF3, 0x01, 0x60, 0x67, 0x7C, 0x60, 0x40, - 0x01, 0x27, 0x5B, 0x7C, 0x37, 0xF9, 0x26, 0x46, 0x3F, 0xF2, 0x00, 0xF4, 0x60, 0x43, 0xF4, 0xA3, - 0x00, 0x60, 0x1D, 0x61, 0x00, 0x60, 0x2A, 0x65, 0x01, 0x60, 0xFF, 0x64, 0x40, 0x4C, 0xFD, 0x60, - 0x58, 0x4E, 0x7A, 0x78, 0xFF, 0xFF, 0x00, 0xBB, 0xFF, 0xFF, 0x01, 0x02, 0x3B, 0x00, 0x02, 0x60, - 0x01, 0x63, 0xA3, 0xD1, 0xDB, 0xF3, 0xFF, 0xFF, 0x07, 0xB4, 0x03, 0x36, 0x1F, 0x00, 0x19, 0x60, - 0x45, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x26, 0x09, 0x00, 0x19, 0x60, 0x7B, 0xF3, 0xFF, 0xFF, - 0xFD, 0xB4, 0x60, 0x44, 0x64, 0x40, 0x02, 0x27, 0x02, 0xBC, 0xA2, 0xDB, 0x19, 0x60, 0x45, 0xF3, - 0xFF, 0xFF, 0x60, 0x40, 0x02, 0x26, 0x1C, 0x00, 0x19, 0x60, 0x7B, 0xF3, 0xFF, 0xFF, 0xFB, 0xB4, - 0x60, 0x44, 0x64, 0x40, 0x04, 0x27, 0x04, 0xBC, 0xA2, 0xDB, 0x12, 0x00, 0x64, 0x40, 0x02, 0x2B, - 0x06, 0x00, 0x19, 0x60, 0x7B, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0x60, 0x44, 0xA2, 0xDB, 0x64, 0x40, - 0x04, 0x2B, 0x06, 0x00, 0x19, 0x60, 0x7B, 0xF3, 0xFF, 0xFF, 0x04, 0xBC, 0x60, 0x44, 0xA2, 0xDB, - 0x2F, 0x58, 0xFF, 0xFF, 0x0E, 0xF0, 0xDB, 0xF3, 0xFF, 0xFF, 0x07, 0xB4, 0x03, 0x36, 0x18, 0x00, - 0x19, 0x60, 0x7B, 0xF3, 0xFF, 0xFF, 0x02, 0xBC, 0x60, 0x44, 0xFB, 0xB4, 0x60, 0x44, 0x64, 0x40, - 0x20, 0x2A, 0x0A, 0x00, 0x60, 0x43, 0x19, 0x60, 0x45, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x02, 0x26, - 0x02, 0x00, 0x63, 0x44, 0x02, 0x00, 0x63, 0x44, 0x04, 0xBC, 0x19, 0x60, 0x7B, 0xFB, 0x09, 0x00, - 0x64, 0x40, 0x20, 0x26, 0x06, 0x00, 0x19, 0x60, 0x7B, 0xF3, 0xFF, 0xFF, 0x04, 0xBC, 0x60, 0x44, - 0xA2, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x60, 0xB0, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x25, 0x78, - 0xFF, 0xFF, 0x66, 0x44, 0x5C, 0xFB, 0x04, 0x64, 0x03, 0xFA, 0x80, 0x64, 0x2A, 0xFA, 0xC9, 0xF1, - 0x19, 0xF8, 0x00, 0x64, 0x3E, 0xFA, 0x00, 0x60, 0x80, 0x64, 0x0E, 0xFA, 0xA6, 0xF1, 0x07, 0xF8, - 0x67, 0x44, 0x2C, 0xFA, 0x2D, 0xFA, 0x2E, 0xFA, 0xF1, 0x60, 0x2C, 0x64, 0x08, 0x60, 0x31, 0xFB, - 0x2F, 0x58, 0xFF, 0xFF, 0x5C, 0xF5, 0xEA, 0xF1, 0x2F, 0xF8, 0xEB, 0xF1, 0x30, 0xF8, 0xEC, 0xF1, - 0x31, 0xF8, 0x7F, 0xF1, 0x32, 0xF8, 0x80, 0xF1, 0x33, 0xF8, 0x81, 0xF1, 0x34, 0xF8, 0x16, 0x60, - 0xC2, 0xF1, 0x02, 0x64, 0x64, 0x40, 0xFE, 0x26, 0x10, 0xBC, 0x32, 0x40, 0x08, 0x26, 0x10, 0xBC, - 0x20, 0xBC, 0xFB, 0x60, 0xFF, 0x65, 0x60, 0x44, 0xA4, 0x84, 0x1B, 0x60, 0x09, 0xFB, 0x16, 0x60, - 0xC1, 0xF1, 0x33, 0x60, 0xBE, 0x64, 0x02, 0x18, 0x2D, 0x60, 0x32, 0x64, 0x1A, 0x60, 0xAD, 0xFB, - 0x1A, 0x60, 0xBD, 0xFB, 0x34, 0x60, 0x18, 0x61, 0x17, 0x60, 0x14, 0xF3, 0x35, 0x60, 0x36, 0x65, - 0xFE, 0xA4, 0xE0, 0x84, 0x06, 0x05, 0x67, 0x44, 0x1A, 0x60, 0xB5, 0xFB, 0x1A, 0x60, 0xC5, 0xFB, - 0x4B, 0x00, 0xE0, 0x84, 0xC4, 0x85, 0x1A, 0x60, 0x1F, 0xF3, 0xA5, 0xD1, 0xDA, 0x85, 0xA0, 0x83, - 0x1A, 0x60, 0x1B, 0xFD, 0xA5, 0xD1, 0x34, 0x60, 0x34, 0x62, 0xA0, 0x83, 0xA2, 0xDD, 0x67, 0x44, - 0x1A, 0x60, 0xB5, 0xFB, 0x1A, 0x60, 0xC5, 0xFB, 0x1A, 0x60, 0x2C, 0xF3, 0xFF, 0xFF, 0x21, 0x18, - 0x33, 0x60, 0xF4, 0x61, 0x0F, 0x60, 0x00, 0x7C, 0x00, 0x60, 0xAC, 0x65, 0xEF, 0x60, 0x58, 0x4D, - 0xC1, 0x78, 0xFF, 0xFF, 0x1A, 0x60, 0x2D, 0xF1, 0x59, 0xD9, 0x33, 0x60, 0xF2, 0x65, 0xD5, 0x84, - 0x30, 0x7F, 0xA5, 0xDB, 0x65, 0x44, 0x1A, 0x60, 0xB5, 0xFB, 0x1A, 0x60, 0xC5, 0xFB, 0x1A, 0x60, - 0x2C, 0xF3, 0xFF, 0xFF, 0xFE, 0xA4, 0xFF, 0xFF, 0x08, 0x24, 0x03, 0x00, 0xFF, 0x60, 0xFF, 0x64, - 0x13, 0x00, 0x34, 0x60, 0x18, 0x61, 0x50, 0x60, 0x00, 0x7C, 0x00, 0x60, 0xF2, 0x65, 0xEF, 0x60, - 0x58, 0x4D, 0xC1, 0x78, 0xFF, 0xFF, 0x1A, 0x60, 0x1D, 0xF1, 0x59, 0xD9, 0x34, 0x60, 0x12, 0x65, - 0xD5, 0x84, 0xDD, 0x7F, 0xA5, 0xDB, 0x65, 0x44, 0x1A, 0x60, 0xB2, 0xFB, 0x1A, 0x60, 0xC2, 0xFB, - 0x79, 0x00, 0x1A, 0x60, 0x1E, 0xF3, 0x34, 0x60, 0x34, 0x62, 0xFD, 0xA0, 0xA2, 0xD3, 0xEE, 0x03, - 0x60, 0x40, 0x02, 0x2A, 0x02, 0x00, 0x01, 0x63, 0x0B, 0x00, 0x04, 0x2A, 0x02, 0x00, 0x02, 0x63, - 0x07, 0x00, 0x10, 0x2A, 0x02, 0x00, 0x04, 0x63, 0x03, 0x00, 0x20, 0x2A, 0x01, 0x00, 0x05, 0x63, - 0x63, 0x47, 0xB4, 0x83, 0x59, 0xD9, 0x59, 0xDD, 0x1A, 0x60, 0x1E, 0xF3, 0x1A, 0x60, 0x1B, 0xF3, - 0xFE, 0xA0, 0x40, 0x4C, 0xD3, 0x03, 0x00, 0x60, 0x00, 0x63, 0x59, 0xDD, 0x41, 0x4A, 0x2C, 0x40, - 0x01, 0x2A, 0x05, 0x00, 0x00, 0x63, 0x63, 0x47, 0xB4, 0x83, 0x59, 0xD9, 0x59, 0xDD, 0x2C, 0x40, - 0x02, 0x2A, 0x03, 0x00, 0x01, 0x63, 0x59, 0xD9, 0x59, 0xDD, 0x2C, 0x40, 0x04, 0x2A, 0x05, 0x00, - 0x02, 0x63, 0x63, 0x47, 0xB4, 0x83, 0x59, 0xD9, 0x59, 0xDD, 0x2C, 0x40, 0x10, 0x2A, 0x05, 0x00, - 0x04, 0x63, 0x63, 0x47, 0xB4, 0x83, 0x59, 0xD9, 0x59, 0xDD, 0x2C, 0x40, 0x20, 0x2A, 0x05, 0x00, - 0x05, 0x63, 0x63, 0x47, 0xB4, 0x83, 0x59, 0xD9, 0x59, 0xDD, 0x2A, 0x44, 0x51, 0x93, 0xEB, 0x83, - 0xEB, 0x83, 0xA0, 0xDD, 0x1A, 0x60, 0x1E, 0xF3, 0x1A, 0x60, 0x1C, 0xF3, 0xFF, 0xA0, 0x40, 0x4C, - 0x9D, 0x03, 0x59, 0xDF, 0x41, 0x4A, 0x2C, 0x40, 0x01, 0x2A, 0x05, 0x00, 0x00, 0x63, 0x63, 0x47, - 0xB4, 0x83, 0x59, 0xD9, 0x59, 0xDD, 0x2C, 0x40, 0x02, 0x2A, 0x05, 0x00, 0x01, 0x63, 0x63, 0x47, - 0xB4, 0x83, 0x59, 0xD9, 0x59, 0xDD, 0x2C, 0x40, 0x04, 0x2A, 0x05, 0x00, 0x02, 0x63, 0x63, 0x47, - 0xB4, 0x83, 0x59, 0xD9, 0x59, 0xDD, 0x2A, 0x44, 0x51, 0x93, 0xEB, 0x83, 0xEB, 0x83, 0xA0, 0xDD, - 0x2D, 0x58, 0xFF, 0xFF, 0x00, 0x60, 0x04, 0x64, 0x08, 0x60, 0x0A, 0xFB, 0xF0, 0x60, 0x44, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x12, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0x7D, 0xF1, 0x35, 0x60, 0xCC, 0x64, 0x64, 0x40, 0x01, 0x2B, 0x01, 0x00, 0x67, 0x44, 0x1A, 0x60, - 0xAF, 0xFB, 0x1A, 0x60, 0xBF, 0xFB, 0x1A, 0x60, 0xE7, 0xF9, 0x35, 0x60, 0x62, 0x65, 0xF1, 0x60, - 0x58, 0x4D, 0x74, 0x78, 0xFF, 0xFF, 0x7D, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x2B, 0x05, 0x00, - 0xFF, 0x60, 0xFF, 0x63, 0x1A, 0x60, 0xB3, 0xFD, 0x08, 0x00, 0x36, 0x60, 0x04, 0x63, 0x1A, 0x60, - 0xB3, 0xFD, 0xF1, 0x60, 0x58, 0x4D, 0x8C, 0x78, 0xFF, 0xFF, 0x5C, 0xF5, 0x00, 0xF4, 0x7E, 0xF1, - 0x06, 0xF8, 0x1B, 0x60, 0x09, 0xF3, 0x19, 0x60, 0x7B, 0xF1, 0xFB, 0x60, 0xFF, 0x65, 0x60, 0x44, - 0xA4, 0x84, 0x60, 0x47, 0x64, 0x40, 0x10, 0x26, 0x04, 0xBC, 0x60, 0x47, 0x07, 0xFA, 0x35, 0x60, - 0x5A, 0x64, 0x40, 0x48, 0x10, 0x61, 0x00, 0x60, 0x00, 0x64, 0xF1, 0x60, 0x58, 0x4D, 0x34, 0x78, - 0xFF, 0xFF, 0x5C, 0xF5, 0x3F, 0xFC, 0xDB, 0xFE, 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, 0x0D, 0xFB, - 0x66, 0x44, 0x5A, 0xDB, 0x04, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0xDB, 0xF3, 0x9B, 0xFE, 0xFD, 0xA0, 0x25, 0x04, 0x24, 0x02, 0x04, 0x64, 0x03, 0xFA, - 0x00, 0xF4, 0x09, 0xF2, 0xFF, 0xFF, 0x60, 0x47, 0x00, 0x3A, 0x1C, 0x00, 0x60, 0x43, 0x00, 0x36, - 0x1C, 0x00, 0xE0, 0xA0, 0xDA, 0x85, 0x16, 0x07, 0x33, 0x60, 0xBE, 0x61, 0xA1, 0xD1, 0xFF, 0xFF, - 0xD3, 0x80, 0xCB, 0x83, 0x0F, 0x02, 0x07, 0x0E, 0x59, 0xD3, 0xA5, 0xD0, 0xDA, 0x85, 0xD0, 0x80, - 0xFF, 0xFF, 0x08, 0x02, 0xF9, 0x1F, 0x12, 0x1E, 0xA5, 0xD0, 0x59, 0xD3, 0xFF, 0xFF, 0x90, 0x80, - 0xFF, 0x22, 0x0C, 0x00, 0xF1, 0x60, 0x2A, 0x78, 0xFF, 0xFF, 0x16, 0x60, 0xC1, 0xF3, 0xFF, 0xFF, - 0x60, 0x40, 0x01, 0x2A, 0x03, 0x00, 0x2D, 0x60, 0x32, 0x64, 0x02, 0x00, 0x33, 0x60, 0xBE, 0x64, - 0x1A, 0x60, 0xBD, 0xFB, 0x26, 0x46, 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, 0x31, 0xF2, - 0x2E, 0xFA, 0xEA, 0xF1, 0x2F, 0xF8, 0xEB, 0xF1, 0x30, 0xF8, 0xEC, 0xF1, 0x31, 0xF8, 0x7F, 0xF1, - 0x32, 0xF8, 0x80, 0xF1, 0x33, 0xF8, 0x81, 0xF1, 0x34, 0xF8, 0x00, 0x65, 0xFD, 0x60, 0x58, 0x4E, - 0xDD, 0x78, 0xFF, 0xFF, 0x61, 0x44, 0x19, 0x60, 0x3F, 0xFB, 0x50, 0x63, 0x2A, 0xFC, 0xC9, 0xF3, - 0x19, 0xFA, 0x00, 0x64, 0x3E, 0xFA, 0xA6, 0xF3, 0x07, 0xFA, 0x00, 0xF4, 0x7E, 0xF1, 0x06, 0xF8, - 0x1B, 0x60, 0x09, 0xF3, 0x19, 0x60, 0x7B, 0xF1, 0xFB, 0x60, 0xFF, 0xB7, 0x64, 0x40, 0x10, 0x26, - 0x04, 0xBC, 0x60, 0x47, 0x07, 0xFA, 0x35, 0x60, 0x82, 0x65, 0xF1, 0x60, 0x58, 0x4D, 0x74, 0x78, - 0xFF, 0xFF, 0x7D, 0xF3, 0x36, 0x60, 0x04, 0x63, 0x60, 0x40, 0x01, 0x27, 0x67, 0x43, 0x1A, 0x60, - 0xC3, 0xFD, 0x35, 0x60, 0x7A, 0x64, 0x40, 0x48, 0x10, 0x61, 0x00, 0x60, 0x00, 0x64, 0xF1, 0x60, - 0x58, 0x4D, 0x34, 0x78, 0xFF, 0xFF, 0x26, 0x46, 0x3F, 0xFC, 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, - 0x0D, 0xFB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, - 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x08, 0x60, 0x09, 0xFB, 0x5A, 0xDB, - 0x00, 0x64, 0x92, 0xFB, 0x2F, 0x58, 0xFF, 0xFF, 0x1B, 0x60, 0x0A, 0xFB, 0xCD, 0x81, 0x28, 0xD3, - 0x5A, 0x88, 0xDC, 0x83, 0x31, 0x18, 0xFB, 0x03, 0x61, 0x40, 0x7F, 0x3A, 0x06, 0x00, 0x1B, 0x60, - 0x0A, 0xF3, 0x03, 0x61, 0x7C, 0xA4, 0xA2, 0xDB, 0x00, 0xF4, 0x60, 0xFE, 0xA3, 0xD1, 0x5D, 0xD8, - 0x61, 0x40, 0x7F, 0x3A, 0x08, 0x00, 0x20, 0xFE, 0x1B, 0x60, 0x0A, 0xF3, 0x03, 0x61, 0x7C, 0xA4, - 0xA2, 0xDB, 0x00, 0xF4, 0x60, 0xFE, 0xBF, 0xD3, 0x5D, 0xDA, 0xFF, 0xB4, 0x00, 0x7F, 0x12, 0x03, - 0xDF, 0x83, 0x61, 0x40, 0x7F, 0x3A, 0x0A, 0x00, 0x20, 0xFE, 0x60, 0x45, 0x1B, 0x60, 0x0A, 0xF3, - 0x03, 0x61, 0x7C, 0xA4, 0xA2, 0xDB, 0x65, 0x44, 0x00, 0xF4, 0x60, 0xFE, 0xBD, 0xD1, 0xCC, 0x84, - 0x5D, 0xD8, 0xEF, 0x02, 0x20, 0xFE, 0xCB, 0x01, 0x1B, 0x60, 0x0A, 0xF1, 0xFD, 0xA1, 0xFF, 0xB1, - 0xC1, 0x83, 0xA2, 0xDD, 0x2D, 0x58, 0xFF, 0xFF, 0x67, 0x5C, 0x1C, 0x60, 0xE6, 0x61, 0xA1, 0xD3, - 0xA5, 0xD9, 0x10, 0x18, 0x60, 0x43, 0x35, 0x60, 0xD4, 0x64, 0xA5, 0xDB, 0x60, 0xFE, 0xA0, 0xDD, - 0x20, 0xFE, 0xDC, 0x84, 0xCF, 0x83, 0xE3, 0x83, 0x59, 0xD1, 0xDC, 0x84, 0x60, 0xFE, 0xA0, 0xD9, - 0x20, 0xFE, 0xFA, 0x1F, 0x2D, 0x58, 0xFF, 0xFF, 0x19, 0x60, 0x7B, 0xF3, 0x36, 0x60, 0x06, 0x62, - 0x07, 0xB4, 0x60, 0xFE, 0xA2, 0xDB, 0x20, 0xFE, 0x2D, 0x58, 0xFF, 0xFF, 0x0E, 0x57, 0x32, 0x40, - 0x40, 0x26, 0x27, 0x00, 0x45, 0x48, 0x00, 0x60, 0x10, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x22, 0x78, - 0xFF, 0xFF, 0x1F, 0x03, 0xF2, 0x60, 0x02, 0x64, 0x24, 0xFA, 0x00, 0x60, 0x48, 0x61, 0x28, 0x44, - 0x59, 0xDA, 0x03, 0x64, 0x38, 0x43, 0xBD, 0xD1, 0xCC, 0x84, 0x59, 0xD8, 0xFC, 0x02, 0x39, 0x44, - 0x59, 0xDA, 0x16, 0x60, 0xC3, 0xF3, 0x59, 0xDA, 0x07, 0x64, 0x23, 0xFA, 0x26, 0x60, 0x0A, 0x64, - 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, - 0xFA, 0xFE, 0x37, 0x58, 0xFF, 0xFF, 0x0E, 0x57, 0x32, 0x40, 0x40, 0x26, 0x1B, 0x00, 0x45, 0x48, - 0x00, 0x60, 0x06, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x22, 0x78, 0xFF, 0xFF, 0x13, 0x03, 0x02, 0x64, - 0x23, 0xFA, 0xF2, 0x60, 0x00, 0x64, 0x5A, 0xDA, 0x28, 0x44, 0x5A, 0xDA, 0xFF, 0xFF, 0x26, 0x60, - 0x0A, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xFA, 0xFE, 0x37, 0x58, 0xFF, 0xFF, 0xA0, 0xD3, 0xFF, 0xFF, 0xDC, 0x84, 0xDC, 0x80, - 0xD0, 0x80, 0x03, 0x03, 0xA2, 0xDB, 0x08, 0x24, 0xC6, 0xFE, 0xDD, 0x98, 0xFF, 0xFF, 0xB5, 0xF1, - 0xA0, 0xD3, 0xFF, 0xFF, 0xD8, 0x80, 0xC4, 0x84, 0x0C, 0x03, 0x08, 0x05, 0xDC, 0x80, 0xD0, 0x80, - 0x05, 0x03, 0xA2, 0xDB, 0x02, 0x24, 0xC6, 0xFE, 0xDD, 0x98, 0xFF, 0xFF, 0xFF, 0x60, 0xFE, 0x64, - 0xA2, 0xDB, 0xDD, 0x98, 0xFF, 0xFF, 0xA2, 0xFF, 0x32, 0x40, 0x40, 0x26, 0x3C, 0x00, 0x9B, 0xF3, - 0x67, 0x43, 0xDC, 0x84, 0xCC, 0x84, 0x37, 0x03, 0x60, 0x46, 0x0A, 0x02, 0x9B, 0xFD, 0x00, 0x60, - 0x46, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x22, 0x78, 0xFF, 0xFF, 0x66, 0x44, 0x9B, 0xFB, 0x2C, 0x03, - 0x46, 0x4B, 0x2C, 0x60, 0xCA, 0x61, 0x18, 0x64, 0x23, 0xFA, 0xF1, 0x60, 0x00, 0x64, 0x24, 0xFA, - 0x4A, 0x65, 0xA2, 0xFF, 0x2C, 0x63, 0x59, 0xD1, 0xA2, 0xDF, 0xA5, 0xD8, 0xDA, 0x85, 0x80, 0x3A, - 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF7, 0x1F, 0x12, 0x63, 0x59, 0xD1, 0xA5, 0xD8, 0xDA, 0x85, - 0x80, 0x3A, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0xF8, 0x1F, 0x26, 0x60, 0x0A, 0x64, 0x13, 0x60, - 0x0D, 0xFB, 0x2B, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, - 0xA6, 0xFE, 0x00, 0x64, 0x9B, 0xFB, 0xA3, 0xFF, 0xCA, 0x60, 0xD4, 0x78, 0xFF, 0xFF, 0xA6, 0xFE, - 0xBA, 0x05, 0xA7, 0xFE, 0x11, 0x05, 0xA5, 0xFE, 0x03, 0x04, 0xF2, 0x60, 0xD8, 0x78, 0xFF, 0xFF, - 0xA4, 0xFE, 0xF2, 0x04, 0x08, 0x60, 0x0F, 0xF1, 0x00, 0x60, 0x80, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0xCA, 0x60, 0xD4, 0x78, 0xFF, 0xFF, 0x36, 0x45, 0x20, 0x60, 0xA8, 0x64, 0x44, 0xD7, - 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xF3, 0xFF, 0xFF, 0x01, 0xB0, 0x00, 0x64, 0x2F, 0x03, 0x9D, 0xFB, - 0x31, 0x44, 0xE8, 0xB4, 0x40, 0x51, 0x6A, 0x44, 0xFF, 0xFF, 0x80, 0x26, 0xFC, 0x01, 0x61, 0xFF, - 0x62, 0xFF, 0x08, 0x60, 0x30, 0xF1, 0x00, 0x60, 0x20, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x40, 0x60, 0x58, 0x4E, 0x7D, 0x78, 0xFF, 0xFF, 0x1F, 0x60, 0xC4, 0x64, 0x0F, 0x60, 0xE1, 0xFB, - 0x4A, 0xDF, 0x01, 0x60, 0xFE, 0x63, 0x1D, 0x60, 0xBE, 0x61, 0x00, 0x64, 0x59, 0xDB, 0xFE, 0x1F, - 0x0E, 0x60, 0xDD, 0xF3, 0xFF, 0xFF, 0x04, 0xB0, 0xFF, 0xFF, 0x05, 0x03, 0x02, 0x65, 0xF1, 0x60, - 0x58, 0x4E, 0xC3, 0x78, 0xFF, 0xFF, 0xCA, 0x60, 0xD4, 0x78, 0xFF, 0xFF, 0xF2, 0x60, 0xD8, 0x78, - 0xFF, 0xFF, 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x01, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x37, 0x00, 0x2D, 0x60, 0xAA, 0x63, 0xBD, 0xD3, 0xBD, 0xD1, 0xBD, 0xD1, 0xB0, 0x84, 0xB0, 0x84, - 0xFF, 0xFF, 0x07, 0x02, 0x8A, 0xFB, 0x31, 0x44, 0xFE, 0xB4, 0x40, 0x51, 0x0D, 0x64, 0x05, 0xFB, - 0x27, 0x00, 0x28, 0xF3, 0x9D, 0xF1, 0x60, 0x47, 0x64, 0x41, 0x07, 0xB1, 0x07, 0xB4, 0x50, 0xFB, - 0x01, 0x61, 0x03, 0x03, 0xCC, 0x84, 0xE1, 0x81, 0xFD, 0x02, 0xA1, 0x80, 0xB1, 0x83, 0x18, 0x02, - 0x9D, 0xFD, 0x16, 0x60, 0xCF, 0xF3, 0xE4, 0xFB, 0x7D, 0xFB, 0x13, 0x60, 0x02, 0xF3, 0xFF, 0xFF, - 0x00, 0xA8, 0x60, 0x46, 0x46, 0x5E, 0x31, 0x44, 0x01, 0xBC, 0x40, 0x51, 0xED, 0xE2, 0x0F, 0x4E, - 0x1D, 0x60, 0x58, 0x4F, 0x9F, 0x78, 0xFF, 0xFF, 0x0E, 0x4F, 0xCA, 0x60, 0xD4, 0x78, 0xFF, 0xFF, - 0xD7, 0xFE, 0xCA, 0x60, 0xD4, 0x78, 0xFF, 0xFF, 0xF2, 0x60, 0xE4, 0x64, 0x08, 0x60, 0x3B, 0xFB, - 0x2F, 0x58, 0xFF, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x00, 0x64, 0x08, 0x60, 0x27, 0xFB, 0x5A, 0xDB, - 0x10, 0x60, 0x4E, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, 0x28, 0xF3, - 0xFF, 0xFF, 0x01, 0xB0, 0xFF, 0xFF, 0x1D, 0x03, 0x20, 0x40, 0x06, 0x23, 0x10, 0x00, 0x08, 0x60, - 0x27, 0xF1, 0x7F, 0x60, 0xFF, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x80, 0x60, 0x00, 0x64, 0x08, 0x60, - 0x28, 0xFB, 0xF2, 0x60, 0xF4, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x1D, 0x60, - 0xA9, 0x78, 0xFF, 0xFF, 0x08, 0x60, 0x27, 0xF1, 0x00, 0x60, 0x01, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0xC6, 0x01, 0x08, 0x60, 0x27, 0xF1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, - 0xCF, 0xFE, 0xDB, 0xF3, 0x01, 0x63, 0xFD, 0xA0, 0x08, 0x60, 0x77, 0xFD, 0x07, 0x02, 0x08, 0x60, - 0x30, 0xF1, 0x00, 0x60, 0x01, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xB1, 0x01, 0x0E, 0x57, - 0x32, 0x40, 0x40, 0x26, 0x1B, 0x00, 0x45, 0x48, 0x00, 0x60, 0x06, 0x61, 0xB6, 0x60, 0x58, 0x4D, - 0x22, 0x78, 0xFF, 0xFF, 0x13, 0x03, 0x02, 0x64, 0x23, 0xFA, 0xF2, 0x60, 0x04, 0x64, 0x5A, 0xDA, - 0x28, 0x44, 0x5A, 0xDA, 0xFF, 0xFF, 0x26, 0x60, 0x0A, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, - 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0x37, 0x58, 0xFF, 0xFF, - 0x08, 0x60, 0x15, 0xF1, 0x00, 0x60, 0x02, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x88, 0x01, - 0x12, 0x60, 0xF6, 0xF3, 0xFF, 0xFF, 0x00, 0xA8, 0x60, 0x46, 0x0E, 0xF2, 0x4B, 0x03, 0x60, 0x40, - 0xF0, 0x37, 0x38, 0x00, 0xFF, 0x37, 0x2D, 0x00, 0xFD, 0x37, 0x25, 0x00, 0xF8, 0x37, 0x0A, 0x00, - 0x60, 0x47, 0xFF, 0xB5, 0x10, 0x60, 0x12, 0x62, 0x46, 0xD1, 0x00, 0x60, 0x01, 0x64, 0xB0, 0x84, - 0xA2, 0xDB, 0xCF, 0xFE, 0x00, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xDC, 0x01, 0x06, 0xB4, 0xFD, 0x7F, 0x0E, 0xFA, 0x25, 0x60, - 0xF2, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, - 0x2B, 0xFF, 0xF9, 0xFE, 0xCD, 0x01, 0x23, 0xF0, 0x60, 0x40, 0x04, 0x26, 0xED, 0x1B, 0x02, 0x26, - 0xEB, 0x18, 0xA2, 0xFF, 0x02, 0xF0, 0x09, 0x60, 0x08, 0x64, 0xD0, 0x80, 0xAD, 0xF3, 0x02, 0x02, - 0xCC, 0x84, 0xAD, 0xFB, 0x26, 0x60, 0x1A, 0x64, 0x40, 0x4B, 0x34, 0x60, 0x58, 0x4D, 0x08, 0x78, - 0xFF, 0xFF, 0xB6, 0x01, 0xAC, 0xFE, 0x09, 0x05, 0xAD, 0xFE, 0x0F, 0x05, 0xAE, 0xFE, 0xB0, 0x05, - 0xAF, 0xFE, 0x37, 0x05, 0xCA, 0x60, 0xD4, 0x78, 0xFF, 0xFF, 0x08, 0x60, 0x08, 0xF1, 0x20, 0x60, - 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0xF5, 0x01, 0x10, 0x60, 0x7A, 0x65, 0x0D, 0x61, - 0x07, 0x00, 0xA2, 0xDD, 0x58, 0x4F, 0x64, 0x58, 0xFF, 0xFF, 0x00, 0xB9, 0xFF, 0xFF, 0x08, 0x03, - 0x00, 0x63, 0xA5, 0xD1, 0x5A, 0xD3, 0xDA, 0x85, 0x00, 0xA8, 0xCD, 0x81, 0xF2, 0x02, 0xF8, 0x02, - 0xE1, 0x01, 0x10, 0x60, 0x0E, 0x62, 0x10, 0x60, 0x58, 0x65, 0xF3, 0x60, 0xD7, 0x63, 0x5A, 0xDF, - 0xD6, 0x80, 0xFF, 0xFF, 0x04, 0x03, 0x5A, 0xDF, 0x5A, 0xDF, 0x5A, 0xDD, 0xF9, 0x01, 0x10, 0x60, - 0x78, 0x65, 0x5A, 0xDF, 0xD6, 0x80, 0xFF, 0xFF, 0x02, 0x03, 0x5A, 0xDD, 0xFB, 0x01, 0x2F, 0x58, - 0xFF, 0xFF, 0x10, 0x60, 0x12, 0x64, 0x40, 0x41, 0x10, 0x60, 0x10, 0x63, 0xA3, 0xD1, 0x00, 0x64, - 0xD0, 0x80, 0x0C, 0x61, 0x08, 0x03, 0xBD, 0xDB, 0xA3, 0xD3, 0xFF, 0xFF, 0xB0, 0x84, 0xCD, 0x81, - 0xA3, 0xDB, 0x06, 0xA3, 0xF9, 0x02, 0x10, 0x60, 0x60, 0x63, 0xA3, 0xD1, 0x00, 0x64, 0xD0, 0x80, - 0x0D, 0x61, 0x19, 0x03, 0xBD, 0xDB, 0x64, 0x44, 0xFE, 0xA3, 0x02, 0xA3, 0xCD, 0x81, 0xE8, 0x84, - 0xE3, 0x03, 0x02, 0x05, 0xE1, 0x03, 0xF9, 0x01, 0x97, 0xFB, 0x99, 0xFD, 0x61, 0x5C, 0xA3, 0xD3, - 0x98, 0xF9, 0x03, 0x18, 0x58, 0x4F, 0x60, 0x58, 0xFF, 0xFF, 0x99, 0xF3, 0x98, 0xF1, 0x60, 0x43, - 0x97, 0xF3, 0x64, 0x41, 0xEA, 0x01, 0x21, 0x43, 0x10, 0x60, 0x5A, 0x65, 0xD7, 0x80, 0xBD, 0xD1, - 0xBD, 0xD3, 0x03, 0x02, 0xCA, 0x60, 0xD4, 0x78, 0xFF, 0xFF, 0xA0, 0x84, 0xBD, 0xD1, 0x43, 0x41, - 0xF5, 0x03, 0xF3, 0x60, 0xDC, 0x64, 0x64, 0x58, 0x40, 0x4F, 0x2A, 0xF0, 0x83, 0x60, 0xFF, 0x65, - 0x64, 0x47, 0x03, 0x2B, 0x01, 0x00, 0x14, 0x00, 0x03, 0x26, 0x03, 0xAC, 0x60, 0x47, 0xA4, 0x84, - 0x2A, 0xFA, 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, 0x31, 0xF2, 0x2E, 0xFA, 0x64, 0x41, - 0xEA, 0xF3, 0x2F, 0xFA, 0x60, 0x43, 0xEB, 0xF3, 0x30, 0xFA, 0xEC, 0xF1, 0x31, 0xF8, 0x19, 0x00, - 0x60, 0x47, 0xA4, 0x84, 0x2A, 0xFA, 0x2F, 0xF2, 0x2C, 0xFA, 0x30, 0xF2, 0x2D, 0xFA, 0x31, 0xF2, - 0x2E, 0xFA, 0x36, 0xF2, 0x32, 0xFA, 0x37, 0xF2, 0x33, 0xFA, 0x38, 0xF2, 0x34, 0xFA, 0xEA, 0xF3, - 0x2F, 0xFA, 0x36, 0xFA, 0xEB, 0xF3, 0x30, 0xFA, 0x37, 0xFA, 0xEC, 0xF3, 0x31, 0xFA, 0x38, 0xFA, - 0x64, 0x41, 0x1C, 0xF2, 0x13, 0xFA, 0x00, 0xF4, 0x0D, 0xF2, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x2B, - 0x17, 0x00, 0x81, 0x67, 0xA2, 0xDA, 0xF4, 0x60, 0x58, 0x4E, 0xCF, 0x78, 0xFF, 0xFF, 0x26, 0x46, - 0x3F, 0xFC, 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, - 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xC1, 0xFE, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, - 0x26, 0x46, 0x3F, 0xF0, 0x42, 0x64, 0xD0, 0x80, 0xFF, 0xFF, 0x01, 0x04, 0x3F, 0xFA, 0x07, 0xF2, - 0xA6, 0xF1, 0x01, 0x1B, 0x07, 0xF8, 0x1C, 0xF2, 0x13, 0xFA, 0x26, 0xF2, 0x27, 0xF0, 0x60, 0x47, - 0x00, 0xF4, 0x1F, 0xFA, 0x64, 0x47, 0x20, 0xFA, 0x61, 0x44, 0x21, 0xFA, 0x01, 0x67, 0x0D, 0xFA, - 0x10, 0x61, 0x2D, 0x60, 0x5E, 0x64, 0x1E, 0x63, 0x58, 0xD1, 0xCD, 0x81, 0xBD, 0xD8, 0xFC, 0x02, - 0xB8, 0xF1, 0xD6, 0xF1, 0x64, 0x5E, 0x64, 0x5F, 0x44, 0x63, 0xBD, 0xDA, 0x16, 0x60, 0xAC, 0xF3, - 0xFF, 0xFF, 0xE0, 0x84, 0xE0, 0x84, 0xE0, 0x84, 0x4A, 0xD3, 0x60, 0x45, 0x60, 0x40, 0x01, 0x36, - 0x03, 0x64, 0x02, 0x36, 0x01, 0x64, 0xB4, 0x84, 0x06, 0xA2, 0xA2, 0xD1, 0xBD, 0xDA, 0x64, 0x47, - 0xBD, 0xDA, 0xD3, 0xF3, 0xD4, 0xF1, 0x60, 0x47, 0xBD, 0xDA, 0x64, 0x47, 0xE2, 0xF1, 0xBD, 0xDA, - 0x64, 0x44, 0xBD, 0xDA, 0x26, 0x46, 0x00, 0x64, 0x23, 0xF0, 0x3B, 0xF0, 0x64, 0x40, 0x10, 0x2A, - 0x06, 0x00, 0xC0, 0x67, 0xA0, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0xE8, 0x84, 0x10, 0xBC, 0x3E, 0xFA, - 0x25, 0x60, 0xDA, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x26, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, - 0xFF, 0xFF, 0x2B, 0xFF, 0xC8, 0xFE, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0xB1, 0xF3, - 0x1F, 0xFA, 0x32, 0x47, 0x07, 0xFA, 0x24, 0x7E, 0x01, 0x7F, 0x08, 0xFA, 0xD6, 0xF1, 0x09, 0xF8, - 0x01, 0x60, 0x01, 0x64, 0x0A, 0xFA, 0x01, 0x64, 0x0B, 0xFA, 0x18, 0x64, 0x13, 0x60, 0x0D, 0xFB, - 0x66, 0x44, 0x5A, 0xDB, 0x0A, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x52, 0x63, 0x2E, 0x58, - 0xFF, 0xFF, 0x00, 0x60, 0x2A, 0x61, 0xB6, 0x60, 0x58, 0x4D, 0x25, 0x78, 0xFF, 0xFF, 0x66, 0x44, - 0x5D, 0xFB, 0x04, 0x64, 0x03, 0xFA, 0x67, 0x44, 0x2C, 0xFA, 0x2D, 0xFA, 0x2E, 0xFA, 0x32, 0xFA, - 0x33, 0xFA, 0x34, 0xFA, 0x12, 0x60, 0x80, 0x64, 0xA6, 0xF1, 0x0E, 0xFA, 0x07, 0xF8, 0x00, 0x64, - 0x3E, 0xFA, 0x0E, 0x60, 0x3D, 0xFB, 0x06, 0xA2, 0x10, 0x60, 0x80, 0x64, 0xA2, 0xDB, 0x04, 0x64, - 0x5A, 0xDB, 0x06, 0x64, 0x5A, 0xDB, 0xF8, 0x60, 0xCF, 0x64, 0x08, 0x60, 0x3F, 0xFB, 0x00, 0x64, - 0x0E, 0x60, 0x43, 0xFB, 0x06, 0xA2, 0x10, 0x60, 0x84, 0x64, 0xA2, 0xDB, 0x08, 0x64, 0x5A, 0xDB, - 0x06, 0x64, 0x5A, 0xDB, 0xF8, 0x60, 0xD8, 0x64, 0x08, 0x60, 0x41, 0xFB, 0xF8, 0x60, 0xB4, 0x64, - 0x08, 0x60, 0x34, 0xFB, 0x00, 0x60, 0x30, 0x64, 0x08, 0x60, 0x13, 0xFB, 0xF5, 0x60, 0x31, 0x64, - 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0xF7, 0x60, 0x6C, 0x78, - 0xFF, 0xFF, 0x5D, 0xF5, 0xEA, 0xF1, 0x2F, 0xF8, 0xEB, 0xF1, 0x30, 0xF8, 0xEC, 0xF1, 0x31, 0xF8, - 0xC9, 0xF1, 0x19, 0xF8, 0x00, 0x63, 0x88, 0xFD, 0x1B, 0x60, 0xB2, 0x63, 0x86, 0xFD, 0x87, 0xFD, - 0x20, 0x40, 0x10, 0x2B, 0x00, 0x00, 0x5D, 0xF5, 0x40, 0x64, 0x2A, 0xFA, 0x7D, 0xF3, 0x7C, 0xFB, - 0x08, 0x60, 0x12, 0xF1, 0x00, 0x60, 0x10, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x03, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x03, 0x00, 0xF6, 0x60, 0xC6, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0x3D, 0xF3, 0xFD, 0x60, - 0x58, 0x4E, 0xAC, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0x3F, 0xFB, 0x19, 0x60, 0x39, 0xF3, 0x3F, 0x40, - 0x01, 0x27, 0x08, 0x00, 0x0F, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0xFC, 0x60, 0x58, 0x4E, 0x34, 0x78, - 0xFF, 0xFF, 0x05, 0x00, 0x0F, 0xB4, 0xFC, 0x60, 0x58, 0x4E, 0x34, 0x78, 0xFF, 0xFF, 0x5D, 0xF5, - 0x35, 0x60, 0x70, 0x64, 0x00, 0xF4, 0x40, 0x48, 0x2F, 0x60, 0x24, 0x64, 0x20, 0x40, 0x10, 0x27, - 0x02, 0x00, 0x2F, 0x60, 0x02, 0x64, 0x28, 0xDB, 0x04, 0x61, 0x00, 0x60, 0x00, 0x64, 0xF1, 0x60, - 0x58, 0x4D, 0x34, 0x78, 0xFF, 0xFF, 0x5D, 0xF5, 0x3F, 0xFC, 0x01, 0x64, 0x54, 0xF1, 0x10, 0x60, - 0x12, 0xFB, 0x7D, 0xFB, 0xA4, 0xD3, 0x04, 0x65, 0x53, 0xF3, 0x01, 0x18, 0x0C, 0x65, 0xF3, 0xB4, - 0xB4, 0x84, 0x53, 0xFB, 0x0D, 0x00, 0xF7, 0x60, 0x6C, 0x78, 0xFF, 0xFF, 0x53, 0xF1, 0x7D, 0xF3, - 0xFF, 0xFF, 0xF3, 0xA0, 0x04, 0xA4, 0x01, 0x04, 0xF1, 0xA4, 0x10, 0x36, 0xF4, 0x01, 0x7D, 0xFB, - 0x20, 0x40, 0x10, 0x2B, 0x10, 0x00, 0x7D, 0xF3, 0x32, 0x60, 0x80, 0x61, 0xA1, 0xD1, 0xCC, 0x84, - 0x01, 0x61, 0x08, 0x24, 0x03, 0x00, 0xE1, 0x81, 0xCC, 0x84, 0xFB, 0x01, 0xA1, 0x84, 0x53, 0xF1, - 0xE6, 0x03, 0x10, 0x60, 0x12, 0xFB, 0x7D, 0xF3, 0x10, 0x60, 0xF2, 0x61, 0xCC, 0x84, 0xFF, 0xFF, - 0x02, 0x03, 0x06, 0xA1, 0xFB, 0x01, 0xA1, 0xD3, 0x53, 0xF1, 0x01, 0xB0, 0x02, 0xB0, 0xD7, 0x03, - 0x64, 0x40, 0x01, 0x26, 0x05, 0x00, 0x20, 0x40, 0x10, 0x27, 0x02, 0x00, 0xD0, 0x03, 0x00, 0x00, - 0x9D, 0xFE, 0x3D, 0x05, 0xBA, 0xFE, 0x10, 0x60, 0x24, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, - 0x0A, 0x04, 0x40, 0x60, 0x00, 0x64, 0x08, 0x60, 0x13, 0xFB, 0xF5, 0x60, 0xCB, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x24, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x7D, 0xF1, - 0x13, 0x60, 0x1A, 0xF9, 0x08, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x20, 0x60, 0x00, 0x64, - 0x08, 0x60, 0x13, 0xFB, 0xF5, 0x60, 0xF0, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0xBE, 0xFE, 0x08, 0x60, 0x08, 0xF1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x1B, 0x60, 0xF3, 0xF1, 0xAD, 0x4F, 0x00, 0x7F, 0xFA, 0xB4, 0x64, 0x41, 0x7D, 0xF1, 0x02, 0xB1, - 0x04, 0x65, 0x02, 0x02, 0x64, 0x40, 0x01, 0x2B, 0x01, 0x65, 0xB4, 0x84, 0xA0, 0x5D, 0x10, 0x60, - 0x24, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0xDE, 0xFE, 0x0A, 0x04, 0x40, 0x60, 0x00, 0x64, 0x08, 0x60, - 0x13, 0xFB, 0xF5, 0x60, 0xC8, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x7D, 0xF1, - 0x13, 0x60, 0x1A, 0xF9, 0x0E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x20, 0x60, 0x00, 0x64, - 0x08, 0x60, 0x13, 0xFB, 0xF6, 0x60, 0x28, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0xBE, 0xFE, 0x08, 0x60, 0x08, 0xF1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, - 0x10, 0x60, 0x24, 0x62, 0x00, 0x64, 0xA2, 0xDB, 0x5D, 0xF5, 0x25, 0x60, 0xCE, 0x64, 0x13, 0x60, - 0x0D, 0xFB, 0x66, 0x44, 0x5A, 0xDB, 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0x00, 0x64, - 0x51, 0xFB, 0x00, 0x60, 0x01, 0x64, 0x08, 0x60, 0x13, 0xFB, 0xF6, 0x60, 0x4C, 0x64, 0x5A, 0xDB, - 0xCF, 0xFE, 0xC1, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x10, 0x60, 0x24, 0x62, 0x00, 0x64, 0xA2, 0xDB, - 0xC3, 0xF1, 0x0E, 0x60, 0x3F, 0xF9, 0x1C, 0x60, 0x7A, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0xC4, 0xF1, 0x0E, 0x60, 0x45, 0xF9, 0x26, 0x60, 0x42, 0x62, - 0xA2, 0xD3, 0xFF, 0xFF, 0xFD, 0x1B, 0x1C, 0x60, 0x86, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, - 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x60, 0x08, 0x64, 0x08, 0x60, 0x13, 0xFB, 0xF6, 0x60, - 0x75, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x51, 0xF1, 0x10, 0x60, 0x24, 0x62, - 0x00, 0x64, 0xA2, 0xDB, 0x64, 0x40, 0xFF, 0x26, 0x0B, 0x00, 0x53, 0xF3, 0xFF, 0xFF, 0x80, 0xB0, - 0xFF, 0xFF, 0x03, 0x03, 0xF7, 0x60, 0x65, 0x78, 0xFF, 0xFF, 0xF5, 0x60, 0x96, 0x78, 0xFF, 0xFF, - 0x02, 0x0A, 0x00, 0x64, 0x51, 0xFB, 0xC5, 0xF1, 0x0E, 0x60, 0x45, 0xF9, 0x00, 0x60, 0x0C, 0x64, - 0x08, 0x60, 0x13, 0xFB, 0xF6, 0x60, 0xA0, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x1C, 0x60, 0x86, 0x64, - 0x13, 0x60, 0x22, 0xFB, 0x02, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, - 0x08, 0x60, 0x12, 0xF1, 0x00, 0x60, 0x04, 0x64, 0xA0, 0x80, 0x9C, 0x84, 0x0B, 0x03, 0xA0, 0x84, - 0xA2, 0xDB, 0x1C, 0x60, 0x86, 0x64, 0x13, 0x60, 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, - 0x04, 0xFF, 0x13, 0x00, 0xFF, 0x60, 0xF7, 0x64, 0xA0, 0x84, 0xA2, 0xDB, 0x51, 0xF3, 0xDE, 0x0A, - 0x00, 0xA0, 0x00, 0x64, 0x02, 0x03, 0x51, 0xFB, 0xD9, 0x01, 0x1C, 0x60, 0x7A, 0x64, 0x13, 0x60, - 0x22, 0xFB, 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0xB7, 0x01, 0x19, 0x60, 0x3E, 0xF3, - 0xFD, 0x60, 0x58, 0x4E, 0xAC, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0x3F, 0xFB, 0x19, 0x60, 0x3A, 0xF3, - 0x0F, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0xFC, 0x60, 0x58, 0x4E, 0x34, 0x78, 0xFF, 0xFF, 0x5D, 0xF5, - 0x35, 0x60, 0x70, 0x64, 0x00, 0xF4, 0x40, 0x48, 0x2F, 0x60, 0x24, 0x64, 0x20, 0x40, 0x10, 0x27, - 0x02, 0x00, 0x2F, 0x60, 0x02, 0x64, 0x28, 0xDB, 0x04, 0x61, 0x00, 0x60, 0x00, 0x64, 0xF1, 0x60, - 0x58, 0x4D, 0x34, 0x78, 0xFF, 0xFF, 0x5D, 0xF5, 0x3F, 0xFC, 0x53, 0xF3, 0x20, 0x40, 0x10, 0x23, - 0x02, 0x00, 0x20, 0xBC, 0x04, 0x00, 0x60, 0x40, 0x01, 0x22, 0x40, 0xBC, 0x04, 0xBC, 0x80, 0xBC, - 0x53, 0xFB, 0x11, 0x60, 0x62, 0x64, 0x08, 0x60, 0x6C, 0xFB, 0x06, 0x64, 0x08, 0x60, 0x73, 0xFB, - 0x19, 0x60, 0x43, 0xF3, 0xFF, 0xFF, 0x07, 0xB4, 0xA2, 0xDB, 0x53, 0xF3, 0x08, 0x60, 0x6C, 0xF1, - 0x60, 0x40, 0x20, 0x26, 0x03, 0x00, 0x01, 0x26, 0x32, 0x00, 0x45, 0x00, 0x08, 0x60, 0x73, 0xF3, - 0xFF, 0xFF, 0xDD, 0xA0, 0x01, 0xA4, 0x58, 0x03, 0xA2, 0xDB, 0x32, 0x60, 0x82, 0x61, 0xE0, 0xA0, - 0xF0, 0xA0, 0x05, 0x05, 0x01, 0x05, 0x05, 0x00, 0x02, 0xA1, 0xF0, 0xA4, 0x02, 0x00, 0x04, 0xA1, - 0xE0, 0xA4, 0xA1, 0xD1, 0x01, 0x61, 0xDC, 0x84, 0xCC, 0x84, 0xFF, 0xFF, 0x02, 0x03, 0xE1, 0x81, - 0xFB, 0x01, 0xA1, 0x80, 0x10, 0x60, 0xE6, 0x64, 0x01, 0x02, 0xE0, 0x01, 0xA0, 0xD3, 0x11, 0x60, - 0x5A, 0x63, 0xFA, 0xA4, 0xCC, 0x84, 0x08, 0xA3, 0xFD, 0x02, 0xCF, 0xF1, 0xA3, 0xD3, 0x01, 0x18, - 0xD5, 0x18, 0xFE, 0xA3, 0xA3, 0xD3, 0x7D, 0xFB, 0xF5, 0x60, 0xC8, 0x78, 0xFF, 0xFF, 0x12, 0x60, - 0x40, 0x65, 0x64, 0x41, 0xA1, 0xD3, 0xD5, 0x80, 0x00, 0xB8, 0x26, 0x07, 0x02, 0x02, 0x08, 0xA1, - 0xF9, 0x01, 0x61, 0x44, 0x08, 0x60, 0x6C, 0xFB, 0x01, 0x64, 0xA1, 0xDB, 0x49, 0xD3, 0x7D, 0xFB, - 0xF5, 0x60, 0xC8, 0x78, 0xFF, 0xFF, 0x12, 0x60, 0x40, 0x65, 0x64, 0x41, 0xA1, 0xD3, 0xD5, 0x80, - 0x04, 0xB0, 0x12, 0x07, 0x02, 0x02, 0x08, 0xA1, 0xF9, 0x01, 0x61, 0x44, 0x08, 0x60, 0x6C, 0xFB, - 0x49, 0xD3, 0x7D, 0xFB, 0xF5, 0x60, 0xC8, 0x78, 0xFF, 0xFF, 0x10, 0x60, 0xD8, 0x65, 0xA5, 0xD3, - 0xFF, 0xFF, 0x08, 0xA4, 0xA5, 0xDB, 0x99, 0x01, 0x1C, 0x60, 0x7A, 0x64, 0x13, 0x60, 0x22, 0xFB, - 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x53, 0xF3, 0xFF, 0xFF, 0xE3, 0xB4, 0x53, 0xFB, - 0x10, 0x60, 0x10, 0xF3, 0xFF, 0xFF, 0xFE, 0xB4, 0xA2, 0xDB, 0x10, 0x60, 0x24, 0x62, 0x00, 0x64, - 0xA2, 0xDB, 0xDE, 0xFE, 0x0A, 0x04, 0x40, 0x60, 0x00, 0x64, 0x08, 0x60, 0x13, 0xFB, 0xF7, 0x60, - 0x7D, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x7C, 0xF1, 0x7D, 0xF9, 0x13, 0x60, - 0x1A, 0xF9, 0x0E, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x2D, 0xFF, 0x20, 0x60, 0x00, 0x64, 0x08, 0x60, - 0x13, 0xFB, 0xF7, 0x60, 0x9F, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0xBE, 0xFE, - 0x08, 0x60, 0x08, 0xF1, 0x40, 0x60, 0x00, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x53, 0xF3, - 0xFF, 0xFF, 0x80, 0xB0, 0xFF, 0xFF, 0x54, 0x02, 0x1C, 0x60, 0x32, 0x63, 0x1C, 0x61, 0xCD, 0x81, - 0xBD, 0xDF, 0xFD, 0x02, 0x14, 0x60, 0x32, 0x61, 0x88, 0xF3, 0x61, 0x43, 0xC4, 0xA5, 0x47, 0xD1, - 0x0F, 0x04, 0xBE, 0xD5, 0x1C, 0x60, 0x2E, 0x63, 0xC3, 0x83, 0xC3, 0x83, 0xC3, 0x83, 0x43, 0xD3, - 0xBE, 0xD1, 0xDC, 0x84, 0xA3, 0xDB, 0x66, 0x44, 0xC0, 0x84, 0xBE, 0xDB, 0x65, 0x44, 0xED, 0x01, - 0x1C, 0x60, 0x32, 0x63, 0x0E, 0x61, 0x41, 0x4B, 0xBD, 0xD3, 0xBD, 0xD1, 0x00, 0xBD, 0x64, 0x41, - 0x19, 0x03, 0x01, 0xA8, 0x61, 0x44, 0x02, 0xA8, 0x15, 0x03, 0x02, 0x02, 0xE9, 0x84, 0x12, 0x00, - 0x65, 0x47, 0x60, 0x45, 0x61, 0x44, 0x09, 0x61, 0xCD, 0x81, 0xE0, 0x84, 0xFF, 0x23, 0xFC, 0x01, - 0x02, 0x24, 0xC4, 0x84, 0x02, 0x28, 0xD4, 0x84, 0xCD, 0x81, 0x01, 0x0E, 0x01, 0xBC, 0x02, 0x03, - 0xE0, 0x84, 0xF6, 0x01, 0x00, 0x7F, 0x2B, 0x41, 0x4D, 0x8B, 0xBF, 0xDB, 0xDD, 0x02, 0x14, 0x60, - 0x32, 0x61, 0x88, 0xF3, 0x61, 0x43, 0xC4, 0xA5, 0x47, 0xD1, 0x0A, 0x04, 0xDA, 0x86, 0x1C, 0x60, - 0x30, 0x63, 0xC3, 0x83, 0xC3, 0x83, 0xC3, 0x83, 0x43, 0xD1, 0xA6, 0xD9, 0x65, 0x44, 0xF2, 0x01, - 0x53, 0xF3, 0x88, 0xF1, 0xF3, 0xB4, 0x53, 0xFB, 0x14, 0x60, 0x32, 0x63, 0xC3, 0x85, 0x45, 0x4A, - 0x1B, 0x60, 0xB2, 0x65, 0x87, 0xF3, 0x45, 0x4C, 0x40, 0x48, 0x2A, 0x45, 0xD7, 0x80, 0x02, 0x65, - 0x17, 0x05, 0x47, 0xD1, 0x02, 0x65, 0x47, 0xD3, 0x0A, 0x65, 0xD0, 0x81, 0x47, 0xD3, 0x01, 0x05, - 0x00, 0x61, 0xF2, 0xA3, 0x01, 0xB0, 0x61, 0x44, 0x05, 0x03, 0x2C, 0xDB, 0x5A, 0xDD, 0x5A, 0x8C, - 0x3C, 0xA3, 0xEB, 0x01, 0x28, 0x42, 0x4A, 0xDD, 0x4A, 0xDB, 0x42, 0x48, 0x3C, 0xA3, 0xE5, 0x01, - 0x28, 0x44, 0x86, 0xFB, 0x86, 0xF1, 0x1B, 0x60, 0xB2, 0x63, 0x44, 0x48, 0x28, 0x45, 0xD7, 0x80, - 0xA3, 0xD1, 0x15, 0x05, 0x04, 0x65, 0x46, 0xD3, 0x28, 0x45, 0xD6, 0x80, 0xD0, 0x80, 0x02, 0x04, - 0x04, 0xA3, 0xF5, 0x01, 0xF7, 0x06, 0x62, 0x46, 0xA2, 0xD9, 0xA3, 0xDB, 0x5B, 0xD3, 0x66, 0x42, - 0x5A, 0xD1, 0xA2, 0xDB, 0xA3, 0xD9, 0xFE, 0xA3, 0xA3, 0xD1, 0x66, 0x42, 0xEB, 0x01, 0x86, 0xF3, - 0x87, 0xF1, 0x60, 0x43, 0x44, 0x48, 0x28, 0x45, 0xD7, 0x80, 0xA3, 0xD1, 0x15, 0x05, 0x04, 0x65, - 0x46, 0xD3, 0x28, 0x45, 0xD6, 0x80, 0xD0, 0x80, 0x02, 0x04, 0x04, 0xA3, 0xF5, 0x01, 0xF7, 0x06, - 0x62, 0x46, 0xA2, 0xD9, 0xA3, 0xDB, 0x5B, 0xD3, 0x66, 0x42, 0x5A, 0xD1, 0xA2, 0xDB, 0xA3, 0xD9, - 0xFE, 0xA3, 0xA3, 0xD1, 0x66, 0x42, 0xEB, 0x01, 0x08, 0x60, 0x08, 0xF1, 0x10, 0x60, 0x00, 0x64, - 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x7D, 0xF1, 0x19, 0x60, 0x3D, 0xF3, 0x64, 0x40, 0x01, 0x27, - 0x27, 0x00, 0xFD, 0x60, 0x58, 0x4E, 0xAC, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0x3F, 0xFB, 0x19, 0x60, - 0x39, 0xF3, 0x3F, 0x40, 0x01, 0x27, 0x16, 0x00, 0x0F, 0x60, 0xFF, 0x65, 0x60, 0x41, 0xDB, 0xF3, - 0xFF, 0xFF, 0x60, 0x40, 0x03, 0x36, 0x07, 0x00, 0x19, 0x60, 0x44, 0xF3, 0xFF, 0xFF, 0x60, 0x40, - 0x01, 0x2A, 0x01, 0x00, 0x0F, 0x61, 0x61, 0x44, 0xA4, 0x84, 0xFC, 0x60, 0x58, 0x4E, 0x34, 0x78, - 0xFF, 0xFF, 0x16, 0x00, 0x0F, 0xB4, 0xFC, 0x60, 0x58, 0x4E, 0x34, 0x78, 0xFF, 0xFF, 0x10, 0x00, - 0x5A, 0xD3, 0xFD, 0x60, 0x58, 0x4E, 0xAC, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0x3F, 0xFB, 0x19, 0x60, - 0x3A, 0xF3, 0x0F, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0xFC, 0x60, 0x58, 0x4E, 0x34, 0x78, 0xFF, 0xFF, - 0x00, 0x60, 0x30, 0x64, 0x08, 0x60, 0x13, 0xFB, 0xF5, 0x60, 0x31, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, - 0x2F, 0x58, 0xFF, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x1C, 0x60, 0x7A, 0x64, 0x13, 0x60, 0x22, 0xFB, - 0x03, 0x64, 0x4A, 0xDB, 0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x64, 0x53, 0xFB, 0x00, 0x64, 0x08, 0x60, - 0x12, 0xFB, 0x5A, 0xDB, 0xBE, 0xFE, 0x00, 0x60, 0x30, 0x64, 0x08, 0x60, 0x13, 0xFB, 0xF5, 0x60, - 0x31, 0x64, 0x5A, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, 0x2F, 0x58, 0xFF, 0xFF, 0x08, 0x60, - 0x12, 0xF1, 0x00, 0x60, 0x04, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, 0xFF, 0xFF, - 0x08, 0x60, 0x12, 0xF1, 0x00, 0x60, 0x08, 0x64, 0xB0, 0x84, 0xA2, 0xDB, 0xCF, 0xFE, 0x2F, 0x58, - 0xFF, 0xFF, 0x20, 0x40, 0x90, 0x2B, 0x03, 0x00, 0xFB, 0x60, 0xFC, 0x78, 0xFF, 0xFF, 0x53, 0xF3, - 0x88, 0xF1, 0x04, 0xB0, 0x07, 0x60, 0x80, 0x64, 0xD0, 0x80, 0x20, 0x03, 0x1F, 0x06, 0x26, 0x46, - 0x88, 0xF1, 0x14, 0x60, 0x32, 0x63, 0xC3, 0x83, 0x7D, 0xF3, 0x26, 0xF0, 0xBD, 0xDB, 0x64, 0x44, - 0x00, 0x7F, 0xBD, 0xDB, 0x64, 0x47, 0x00, 0x7F, 0xBD, 0xDB, 0x32, 0xF0, 0xBD, 0xD9, 0x33, 0xF0, - 0xBD, 0xD9, 0x34, 0xF0, 0xBD, 0xD9, 0x00, 0xF4, 0x0D, 0xF0, 0xBD, 0xD9, 0x0E, 0xF0, 0xBD, 0xD9, - 0x0F, 0xF0, 0xA3, 0xDF, 0x64, 0x47, 0x60, 0x45, 0x00, 0x37, 0x03, 0x00, 0xFB, 0x60, 0xF7, 0x78, - 0xFF, 0xFF, 0xBD, 0xDB, 0xE0, 0xA0, 0x1F, 0x61, 0x00, 0xB8, 0xF8, 0x07, 0xF7, 0x03, 0x60, 0xFE, - 0x5D, 0xD0, 0xCC, 0x84, 0xBD, 0xD9, 0xFC, 0x02, 0x65, 0x40, 0x01, 0x26, 0xDF, 0x83, 0x5D, 0xD0, - 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x3A, 0x03, 0x00, 0x5D, 0xD0, 0xFF, 0xFF, 0xC1, 0x81, 0x5D, 0xD0, - 0xFF, 0xFF, 0x64, 0x40, 0x03, 0x36, 0x07, 0x00, 0x53, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x2A, - 0xDD, 0x01, 0xCD, 0x81, 0x13, 0x00, 0x53, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x2A, 0x04, 0x00, - 0x5D, 0xD0, 0xFF, 0xFF, 0xC1, 0x81, 0x0A, 0x00, 0x59, 0xD0, 0x7D, 0xF3, 0xFF, 0xFF, 0xD0, 0x80, - 0x20, 0xFE, 0x08, 0x24, 0x03, 0x00, 0xFB, 0x60, 0xF7, 0x78, 0xFF, 0xFF, 0x7C, 0x44, 0x1A, 0x60, - 0x24, 0xFB, 0x1A, 0x60, 0x25, 0xFB, 0x1A, 0x60, 0x26, 0xFB, 0x1A, 0x60, 0x27, 0xFB, 0x1C, 0x60, - 0x08, 0xFB, 0x1C, 0x60, 0x04, 0xFB, 0x00, 0x64, 0x1C, 0x60, 0x04, 0xFB, 0x20, 0xFE, 0x37, 0x60, - 0xFE, 0x64, 0x40, 0x4A, 0xF9, 0x60, 0x58, 0x4D, 0xC3, 0x78, 0xFF, 0xFF, 0x1C, 0x60, 0x04, 0xF3, - 0xFF, 0xFF, 0x09, 0x18, 0xFF, 0xFF, 0x1C, 0x60, 0x06, 0xF3, 0x1C, 0x60, 0x07, 0xF5, 0x60, 0x41, - 0x00, 0x64, 0x1C, 0x60, 0x04, 0xFB, 0x20, 0xFE, 0x2A, 0xD1, 0xDA, 0x85, 0x64, 0x44, 0x01, 0xA0, - 0xFF, 0xFF, 0x01, 0x02, 0x79, 0x00, 0x45, 0x4A, 0x7C, 0x44, 0x60, 0xFE, 0xA1, 0xD2, 0xFF, 0xFF, - 0xD0, 0x80, 0x20, 0xFE, 0x01, 0x03, 0xEF, 0x01, 0x1C, 0x60, 0x04, 0xF3, 0xFF, 0xFF, 0x02, 0x18, - 0xDD, 0x81, 0x35, 0x00, 0x60, 0xFE, 0x5D, 0xD2, 0xFF, 0xFF, 0x60, 0x5C, 0x41, 0x94, 0x81, 0xA0, - 0x20, 0xFE, 0x2D, 0x04, 0x01, 0x64, 0x1C, 0x60, 0x04, 0xFB, 0xC1, 0x84, 0x84, 0xA4, 0x1C, 0x60, - 0x06, 0xFB, 0x00, 0xF2, 0x1C, 0x60, 0x07, 0xFB, 0x1C, 0x60, 0x05, 0xFD, 0x02, 0x60, 0x00, 0x63, - 0xCD, 0x85, 0x64, 0x44, 0xD8, 0x81, 0xCD, 0x84, 0x4C, 0x91, 0x60, 0x43, 0x60, 0xFE, 0xA5, 0xD2, - 0xDE, 0x85, 0x7F, 0x26, 0x02, 0x00, 0x00, 0xF4, 0x04, 0x65, 0x5D, 0x93, 0xA3, 0xDB, 0x5D, 0x93, - 0xA5, 0xD2, 0xF6, 0x1F, 0x5D, 0x93, 0x20, 0xFE, 0xDF, 0x83, 0x00, 0x60, 0x01, 0x61, 0x02, 0x60, - 0x00, 0x64, 0xE0, 0x87, 0x60, 0x46, 0x1C, 0x60, 0x05, 0xF3, 0xFF, 0xFF, 0x60, 0x43, 0x60, 0xFE, - 0xCD, 0x81, 0x20, 0xFE, 0x2A, 0x44, 0x38, 0x60, 0x00, 0x7C, 0xD0, 0x84, 0x38, 0x60, 0x04, 0x65, - 0x44, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x1C, 0x60, 0x04, 0xF3, 0xFF, 0xFF, 0x08, 0x18, 0x1C, 0x60, - 0x06, 0xF3, 0x1C, 0x60, 0x07, 0xF5, 0x60, 0x41, 0x00, 0x64, 0x1C, 0x60, 0x04, 0xFB, 0x26, 0x44, - 0x01, 0xA4, 0x58, 0x90, 0xFF, 0xFF, 0x03, 0x02, 0x61, 0x44, 0x0B, 0xA5, 0x04, 0x00, 0x61, 0x44, - 0xFC, 0xA4, 0x8B, 0x7C, 0xC0, 0x85, 0xDD, 0x81, 0x66, 0x44, 0x1C, 0x60, 0x07, 0xFB, 0x26, 0x46, - 0x1B, 0xF0, 0x1C, 0x60, 0x07, 0xF5, 0x64, 0x44, 0xD4, 0x80, 0xFF, 0xFF, 0x02, 0x06, 0x2D, 0x58, - 0xFF, 0xFF, 0xFA, 0x60, 0xE7, 0x78, 0xFF, 0xFF, 0x60, 0xFE, 0x5D, 0xD2, 0xFF, 0xFF, 0x20, 0xFE, - 0xFF, 0xB4, 0x41, 0x94, 0x81, 0xA0, 0xFF, 0xFF, 0x02, 0x04, 0x00, 0xF4, 0x84, 0xA4, 0x60, 0x41, - 0x5D, 0x01, 0x1A, 0x60, 0x2C, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x01, 0x3A, 0x6C, 0x01, 0x61, 0x5C, - 0x1A, 0x60, 0x2B, 0xF9, 0x60, 0xFE, 0x5D, 0xD2, 0xFF, 0xFF, 0xFE, 0xA4, 0xFF, 0xFF, 0x04, 0x20, - 0x02, 0x00, 0xFF, 0xA1, 0x60, 0x01, 0x5D, 0xD0, 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x36, 0x02, 0x00, - 0xFE, 0xA1, 0x59, 0x01, 0x5D, 0xD0, 0xFF, 0xFF, 0x64, 0x40, 0x00, 0x36, 0x02, 0x00, 0xFD, 0xA1, - 0x52, 0x01, 0x01, 0x7C, 0x1C, 0x60, 0x08, 0xF9, 0x4C, 0x00, 0x1A, 0x60, 0x2C, 0xF3, 0xFF, 0xFF, - 0x01, 0x18, 0x49, 0x01, 0x00, 0x7C, 0x1C, 0x60, 0x08, 0xF9, 0x61, 0x5C, 0x1A, 0x60, 0x2B, 0xF9, - 0x60, 0xFE, 0x5D, 0xD2, 0xFF, 0xFF, 0xFA, 0xA4, 0xFF, 0xFF, 0x04, 0x20, 0x04, 0x00, 0xFF, 0xA1, - 0xF9, 0x60, 0x6B, 0x78, 0xFF, 0xFF, 0x5D, 0xD0, 0xFF, 0xFF, 0x64, 0x40, 0x00, 0x36, 0x04, 0x00, - 0xC9, 0x81, 0xF9, 0x60, 0x6B, 0x78, 0xFF, 0xFF, 0x5D, 0xD0, 0xFF, 0xFF, 0x64, 0x40, 0x50, 0x36, - 0x04, 0x00, 0xFD, 0xA1, 0xF9, 0x60, 0x6B, 0x78, 0xFF, 0xFF, 0x5D, 0xD0, 0xFF, 0xFF, 0x64, 0x40, - 0xF2, 0x36, 0x04, 0x00, 0xFC, 0xA1, 0xF9, 0x60, 0x6B, 0x78, 0xFF, 0xFF, 0x5D, 0xD0, 0xFF, 0xFF, - 0x64, 0x40, 0x01, 0x36, 0x04, 0x00, 0xFB, 0xA1, 0xF9, 0x60, 0x6B, 0x78, 0xFF, 0xFF, 0x5D, 0xD0, - 0xFF, 0xFF, 0x64, 0x40, 0x01, 0x36, 0x04, 0x00, 0xFA, 0xA1, 0xF9, 0x60, 0x6B, 0x78, 0xFF, 0xFF, - 0x5D, 0xD0, 0xFF, 0xFF, 0x64, 0x40, 0x00, 0x36, 0x04, 0x00, 0xF9, 0xA1, 0xF9, 0x60, 0x6B, 0x78, - 0xFF, 0xFF, 0x60, 0x5C, 0x00, 0x36, 0x32, 0x00, 0x00, 0x64, 0xFB, 0x60, 0x58, 0x4E, 0x66, 0x78, - 0xFF, 0xFF, 0x65, 0x40, 0x08, 0x26, 0xF7, 0x01, 0x1A, 0x60, 0x24, 0xFB, 0x64, 0x40, 0x00, 0x36, - 0x2A, 0x00, 0x5D, 0xD2, 0xDD, 0x81, 0xFB, 0x60, 0x58, 0x4E, 0x66, 0x78, 0xFF, 0xFF, 0x65, 0x40, - 0x08, 0x26, 0xF6, 0x01, 0x1A, 0x60, 0x25, 0xFB, 0x64, 0x40, 0x00, 0x36, 0x21, 0x00, 0x5D, 0xD2, - 0xDD, 0x81, 0xFB, 0x60, 0x58, 0x4E, 0x66, 0x78, 0xFF, 0xFF, 0x65, 0x40, 0x08, 0x26, 0xF6, 0x01, - 0x1A, 0x60, 0x26, 0xFB, 0x64, 0x40, 0x00, 0x36, 0x18, 0x00, 0x5D, 0xD0, 0x34, 0x60, 0x4E, 0x62, - 0xA2, 0xD9, 0x5D, 0xD0, 0x34, 0x60, 0x4F, 0x62, 0xA2, 0xD9, 0x14, 0x00, 0x20, 0xFE, 0x00, 0x60, - 0x04, 0x64, 0x1A, 0x60, 0x24, 0xFB, 0x20, 0xFE, 0x00, 0x60, 0x04, 0x64, 0x1A, 0x60, 0x25, 0xFB, - 0x20, 0xFE, 0x00, 0x60, 0x02, 0x64, 0x1A, 0x60, 0x26, 0xFB, 0x20, 0xFE, 0x00, 0x60, 0x00, 0x64, - 0x1A, 0x60, 0x27, 0xFB, 0x20, 0xFE, 0x1C, 0x60, 0x08, 0xF1, 0xFF, 0xFF, 0x03, 0x18, 0x01, 0x7C, - 0x1C, 0x60, 0x08, 0xF9, 0x1A, 0x60, 0x2B, 0xF1, 0xA2, 0xDD, 0x61, 0x44, 0x1A, 0x60, 0x28, 0xFB, - 0xD1, 0x84, 0xDC, 0x84, 0x64, 0x45, 0x34, 0x60, 0x10, 0x63, 0xBD, 0xDB, 0x60, 0x41, 0xCD, 0x84, - 0x4C, 0x91, 0x60, 0x43, 0x60, 0xFE, 0xA5, 0xD2, 0xDE, 0x85, 0x7F, 0x26, 0x02, 0x00, 0x00, 0xF4, - 0x04, 0x65, 0x5D, 0x93, 0xA3, 0xDB, 0x5D, 0x93, 0xA5, 0xD2, 0xF6, 0x1F, 0x5D, 0x93, 0x20, 0xFE, - 0xDF, 0x83, 0x1A, 0x60, 0x09, 0xF3, 0xFF, 0xFF, 0x60, 0x47, 0xA2, 0xDB, 0x1A, 0x60, 0x28, 0xF3, - 0x1A, 0x60, 0x2B, 0xF1, 0x60, 0x41, 0x64, 0x43, 0xF9, 0x60, 0x56, 0x78, 0xFF, 0xFF, 0x20, 0xFE, - 0x7C, 0x44, 0x1A, 0x60, 0x20, 0xFB, 0x1A, 0x60, 0x1A, 0xF1, 0x1A, 0x60, 0x24, 0xF3, 0xFF, 0xFF, - 0xA0, 0x84, 0xFF, 0xFF, 0x10, 0x26, 0x07, 0x00, 0x04, 0x26, 0x07, 0x00, 0x20, 0x26, 0x07, 0x00, - 0x02, 0x26, 0x07, 0x00, 0x3F, 0x00, 0x10, 0x7C, 0x05, 0x00, 0x04, 0x7C, 0x03, 0x00, 0x20, 0x7C, - 0x01, 0x00, 0x02, 0x7C, 0x1A, 0x60, 0x20, 0xF9, 0x7C, 0x44, 0x1A, 0x60, 0x21, 0xFB, 0x1A, 0x60, - 0x1B, 0xF1, 0x1A, 0x60, 0x25, 0xF3, 0x34, 0x60, 0x40, 0x61, 0xA0, 0x84, 0xA1, 0xD1, 0xFF, 0xFF, - 0x10, 0x26, 0x05, 0x00, 0x04, 0x26, 0x05, 0x00, 0x01, 0x26, 0x08, 0x00, 0x23, 0x00, 0x10, 0x7C, - 0x06, 0x00, 0x64, 0x40, 0x10, 0x26, 0x1E, 0x00, 0x04, 0x7C, 0x01, 0x00, 0x01, 0x7C, 0x1A, 0x60, - 0x21, 0xF9, 0x7C, 0x44, 0x1A, 0x60, 0x22, 0xFB, 0x1A, 0x60, 0x1C, 0xF1, 0x1A, 0x60, 0x26, 0xF3, - 0xFF, 0xFF, 0xA0, 0x84, 0x60, 0x40, 0x02, 0x26, 0x05, 0x00, 0x04, 0x26, 0x05, 0x00, 0x01, 0x26, - 0x05, 0x00, 0x08, 0x00, 0x02, 0x7C, 0x03, 0x00, 0x04, 0x7C, 0x01, 0x00, 0x20, 0x7C, 0x1A, 0x60, - 0x22, 0xF9, 0x09, 0x00, 0x7C, 0x44, 0x1A, 0x60, 0x20, 0xFB, 0x1A, 0x60, 0x21, 0xFB, 0x1A, 0x60, - 0x22, 0xFB, 0x1A, 0x60, 0x23, 0xFB, 0x7C, 0x44, 0x1A, 0x60, 0x20, 0xF1, 0xBD, 0xD9, 0x1A, 0x60, - 0x21, 0xF1, 0xB0, 0x84, 0xBD, 0xD9, 0x1A, 0x60, 0x22, 0xF1, 0xB0, 0x84, 0xBD, 0xD9, 0x1A, 0x60, - 0x1D, 0xF1, 0xB0, 0x84, 0xBD, 0xD9, 0x04, 0x03, 0x1C, 0x60, 0x08, 0xF1, 0xBD, 0xD9, 0x72, 0x00, - 0x16, 0x60, 0xC2, 0xF3, 0xFF, 0xFF, 0xFF, 0xA0, 0xFF, 0xFF, 0x0C, 0x24, 0x6B, 0x00, 0x60, 0x40, - 0x0B, 0x36, 0x68, 0x00, 0x20, 0x40, 0x10, 0x27, 0x65, 0x00, 0x91, 0x00, 0x20, 0xFE, 0x00, 0x65, - 0x60, 0xFE, 0x1A, 0x60, 0x28, 0xFB, 0xE0, 0x84, 0xE0, 0x84, 0x08, 0x20, 0x03, 0x00, 0x01, 0x64, - 0xA2, 0xDB, 0x02, 0x64, 0x02, 0xA5, 0x64, 0x44, 0xD4, 0x9C, 0xD4, 0x80, 0x34, 0x60, 0x52, 0x62, - 0x02, 0x05, 0x08, 0x65, 0x4D, 0x00, 0xA2, 0xD9, 0x7C, 0x44, 0x34, 0x60, 0x54, 0x62, 0xA2, 0xDB, - 0x20, 0xFE, 0x00, 0x64, 0x60, 0xFE, 0x1C, 0x60, 0x08, 0xF3, 0xFF, 0xFF, 0x00, 0xA0, 0x5D, 0xD0, - 0x00, 0x65, 0x04, 0x03, 0x64, 0x40, 0x00, 0x3A, 0x01, 0x65, 0x03, 0x00, 0x64, 0x40, 0x00, 0x3A, - 0x01, 0x65, 0x5D, 0xD0, 0x04, 0x03, 0x64, 0x40, 0x0F, 0x3A, 0x01, 0x65, 0x03, 0x00, 0x64, 0x40, - 0x50, 0x3A, 0x01, 0x65, 0x5D, 0xD0, 0x04, 0x03, 0x64, 0x40, 0xAC, 0x3A, 0x01, 0x65, 0x03, 0x00, - 0x64, 0x40, 0xF2, 0x3A, 0x01, 0x65, 0x5D, 0xD0, 0x65, 0x40, 0x00, 0x3A, 0x17, 0x00, 0x00, 0x60, - 0x00, 0x65, 0x64, 0x40, 0x00, 0x36, 0x01, 0x65, 0x64, 0x40, 0x01, 0x36, 0x02, 0x65, 0x64, 0x40, - 0x02, 0x36, 0x04, 0x65, 0x64, 0x40, 0x04, 0x36, 0x10, 0x65, 0x64, 0x40, 0x05, 0x36, 0x20, 0x65, - 0x65, 0x5C, 0x1A, 0x60, 0x2A, 0xF3, 0xFF, 0xFF, 0xB0, 0x84, 0xA2, 0xDB, 0x1A, 0x60, 0x28, 0xF3, - 0x00, 0x65, 0xFF, 0xA4, 0xA2, 0xDB, 0xBC, 0x02, 0x1A, 0x60, 0x2A, 0xF3, 0x1A, 0x60, 0x29, 0xF1, - 0x2E, 0x58, 0xFF, 0xFF, 0x20, 0xFE, 0x88, 0xF3, 0xFF, 0xFF, 0x3C, 0xA4, 0x88, 0xFB, 0x87, 0xF3, - 0x7D, 0xF1, 0x04, 0xA4, 0x87, 0xFB, 0x53, 0xF3, 0xFF, 0xFF, 0x60, 0x40, 0x80, 0x26, 0x0D, 0x00, - 0x7D, 0xF3, 0x10, 0x60, 0xF2, 0x61, 0xCC, 0x84, 0xFF, 0xFF, 0x02, 0x03, 0x06, 0xA1, 0xFB, 0x01, - 0xA1, 0xD3, 0xFF, 0xFF, 0x02, 0xBC, 0xA1, 0xDB, 0x12, 0x00, 0x7D, 0xF3, 0x11, 0x60, 0x60, 0x63, - 0x01, 0x60, 0xFF, 0x65, 0xA4, 0x84, 0x12, 0x60, 0x40, 0x65, 0xA3, 0xD1, 0xD7, 0x80, 0xD0, 0x80, - 0x06, 0x03, 0x02, 0x03, 0x08, 0xA3, 0xF9, 0x01, 0x02, 0xA3, 0x04, 0x64, 0xA3, 0xDB, 0x20, 0xFE, - 0x26, 0x46, 0x31, 0x40, 0x20, 0x2A, 0x35, 0x00, 0x3F, 0xF2, 0x47, 0x65, 0xC4, 0x84, 0xE8, 0x84, - 0x23, 0xFA, 0xF1, 0x60, 0x02, 0x64, 0x24, 0xFA, 0x7D, 0xF3, 0x01, 0x60, 0xFF, 0x65, 0xA4, 0x84, - 0x01, 0x23, 0x14, 0x00, 0x11, 0x60, 0x60, 0x61, 0x12, 0x60, 0x40, 0x65, 0xA1, 0xD1, 0xD5, 0x80, - 0xD0, 0x80, 0x0B, 0x03, 0x02, 0x03, 0x08, 0xA1, 0xF9, 0x01, 0x04, 0xA1, 0xA1, 0xD3, 0x01, 0x60, - 0x00, 0x65, 0x60, 0x47, 0xFF, 0xB4, 0xB4, 0x84, 0x01, 0x00, 0x01, 0x64, 0x00, 0xF4, 0x08, 0xFA, - 0xFF, 0xFF, 0x26, 0x46, 0x26, 0x60, 0x0A, 0x64, 0x13, 0x60, 0x0D, 0xFB, 0x26, 0x44, 0x5A, 0xDB, - 0x02, 0x64, 0x5A, 0xDB, 0xFF, 0xFF, 0x2B, 0xFF, 0xFA, 0xFE, 0x00, 0x66, 0x46, 0x46, 0x2F, 0x58, - 0xFF, 0xFF, 0x26, 0x46, 0x2F, 0x58, 0xFF, 0xFF, 0x78, 0xFB, 0xAC, 0x85, 0x60, 0x41, 0x55, 0x03, - 0x32, 0x60, 0x00, 0x63, 0x1B, 0x60, 0x04, 0xFD, 0x62, 0x43, 0x1A, 0x60, 0xB4, 0xFD, 0x1A, 0x60, - 0xBA, 0xFD, 0x1A, 0x60, 0xC4, 0xFD, 0x1A, 0x60, 0xCE, 0xFD, 0x00, 0x63, 0xE9, 0x81, 0x08, 0x64, - 0x02, 0x24, 0xDF, 0x83, 0xFB, 0x02, 0x53, 0x94, 0x32, 0x7F, 0x03, 0x06, 0x1B, 0x60, 0x04, 0xFB, - 0x08, 0x63, 0x63, 0x5E, 0x01, 0x7F, 0x19, 0x60, 0x8A, 0xFB, 0x65, 0x41, 0x33, 0x60, 0x16, 0x65, - 0x0F, 0x60, 0xF4, 0x64, 0xE9, 0x81, 0x58, 0xD1, 0xFD, 0x04, 0xCF, 0x83, 0xA5, 0xD9, 0x0C, 0x03, - 0xE9, 0x81, 0x58, 0xD1, 0xFD, 0x04, 0x40, 0x48, 0xA5, 0xD1, 0x64, 0x5F, 0x64, 0x5E, 0xA5, 0xDB, - 0xDA, 0x85, 0xCF, 0x83, 0x28, 0x44, 0xEE, 0x02, 0x00, 0xB9, 0xD8, 0x83, 0x15, 0x03, 0x36, 0x60, - 0x0A, 0x65, 0xE9, 0x81, 0xBD, 0xD1, 0x02, 0x05, 0xFC, 0x02, 0x17, 0x00, 0xA5, 0xD9, 0x15, 0x03, - 0xE9, 0x81, 0xBD, 0xD1, 0x02, 0x05, 0xFC, 0x02, 0x10, 0x00, 0xA5, 0xD3, 0xFF, 0xFF, 0x64, 0x5F, - 0xA5, 0xDB, 0xDA, 0x85, 0xEE, 0x02, 0x09, 0x00, 0x67, 0x43, 0x1A, 0x60, 0xB4, 0xFD, 0x1A, 0x60, - 0xBA, 0xFD, 0x1A, 0x60, 0xC4, 0xFD, 0x1A, 0x60, 0xCE, 0xFD, 0x2E, 0x45, 0x25, 0x60, 0x46, 0x64, - 0xD4, 0x80, 0xFF, 0xFF, 0x10, 0x03, 0x20, 0x40, 0x10, 0x27, 0x0D, 0x00, 0x33, 0x60, 0x1E, 0x61, - 0x19, 0x60, 0x8A, 0xF3, 0xA1, 0xDB, 0xFF, 0xB4, 0xCC, 0x84, 0xA8, 0x83, 0x33, 0x60, 0x14, 0x64, - 0x58, 0xD1, 0x59, 0xD9, 0xFD, 0x1F, 0x7D, 0xF3, 0x33, 0x60, 0x20, 0x63, 0x60, 0x40, 0x01, 0x27, - 0x03, 0x00, 0x19, 0x60, 0x3B, 0xF3, 0x02, 0x00, 0x19, 0x60, 0x3C, 0xF3, 0x08, 0x61, 0x60, 0xFE, - 0xA3, 0xD1, 0xFF, 0xFF, 0x20, 0xFE, 0x00, 0xA8, 0xE8, 0x84, 0x0F, 0x03, 0x60, 0xFE, 0x02, 0x28, - 0xF6, 0x01, 0x80, 0x62, 0xB2, 0x9C, 0xBD, 0xD9, 0x7B, 0xF9, 0xCD, 0x81, 0x00, 0x36, 0x01, 0x00, - 0xEE, 0x01, 0x36, 0x60, 0x0A, 0x63, 0x08, 0x61, 0xEA, 0x01, 0x2E, 0x58, 0xFF, 0xFF, 0x32, 0x60, - 0x76, 0x63, 0x65, 0x40, 0xFF, 0x36, 0x02, 0xA3, 0xA3, 0xD3, 0xFF, 0xFF, 0xE8, 0x84, 0xE8, 0x84, - 0xE8, 0x84, 0xE8, 0x84, 0x40, 0x26, 0x7F, 0xB4, 0x20, 0x26, 0x3F, 0xB4, 0x60, 0x45, 0x80, 0x63, - 0xFD, 0x60, 0x58, 0x4D, 0x34, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0x7D, 0xFB, 0x40, 0x63, 0xFD, 0x60, - 0x58, 0x4D, 0x34, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0x7E, 0xFB, 0x20, 0x63, 0xFD, 0x60, 0x58, 0x4D, - 0x34, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0x7F, 0xFB, 0x10, 0x63, 0xFD, 0x60, 0x58, 0x4D, 0x34, 0x78, - 0xFF, 0xFF, 0x19, 0x60, 0x80, 0xFB, 0x08, 0x63, 0xFD, 0x60, 0x58, 0x4D, 0x34, 0x78, 0xFF, 0xFF, - 0x19, 0x60, 0x81, 0xFB, 0x04, 0x63, 0xFD, 0x60, 0x58, 0x4D, 0x34, 0x78, 0xFF, 0xFF, 0x19, 0x60, - 0x82, 0xFB, 0x02, 0x63, 0xFD, 0x60, 0x58, 0x4D, 0x34, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0x83, 0xFB, - 0x01, 0x63, 0xFD, 0x60, 0x58, 0x4D, 0x34, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0x84, 0xFB, 0x2E, 0x58, - 0xFF, 0xFF, 0x19, 0x60, 0x3B, 0xF3, 0xFF, 0xFF, 0x0F, 0xB4, 0x60, 0x45, 0x08, 0x63, 0xFD, 0x60, - 0x58, 0x4D, 0x5F, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0x85, 0xFB, 0x04, 0x63, 0xFD, 0x60, 0x58, 0x4D, - 0x5F, 0x78, 0xFF, 0xFF, 0x19, 0x60, 0x86, 0xFB, 0x02, 0x63, 0xFD, 0x60, 0x58, 0x4D, 0x5F, 0x78, - 0xFF, 0xFF, 0x19, 0x60, 0x87, 0xFB, 0x01, 0x63, 0xFD, 0x60, 0x58, 0x4D, 0x5F, 0x78, 0xFF, 0xFF, - 0x19, 0x60, 0x88, 0xFB, 0x2E, 0x58, 0xFF, 0xFF, 0x63, 0x5C, 0xA7, 0x84, 0xEB, 0x83, 0x14, 0x02, - 0x01, 0x03, 0xFB, 0x01, 0x64, 0x44, 0x01, 0x36, 0x0B, 0x64, 0x02, 0x36, 0x0B, 0x64, 0x04, 0x36, - 0x0A, 0x64, 0x08, 0x36, 0x0A, 0x64, 0x10, 0x36, 0x09, 0x64, 0x20, 0x36, 0x09, 0x64, 0x40, 0x36, - 0x09, 0x64, 0x80, 0x36, 0x09, 0x64, 0x11, 0x00, 0x60, 0x40, 0x01, 0x36, 0x0B, 0x64, 0x02, 0x36, - 0x0F, 0x64, 0x04, 0x36, 0x0A, 0x64, 0x08, 0x36, 0x0E, 0x64, 0x10, 0x36, 0x09, 0x64, 0x20, 0x36, - 0x0D, 0x64, 0x40, 0x36, 0x08, 0x64, 0x80, 0x36, 0x0C, 0x64, 0x2D, 0x58, 0xFF, 0xFF, 0x63, 0x5C, - 0xA7, 0x84, 0xEB, 0x83, 0x0C, 0x02, 0x01, 0x03, 0xFB, 0x01, 0x64, 0x44, 0x01, 0x36, 0x0A, 0x64, - 0x02, 0x36, 0x14, 0x64, 0x04, 0x36, 0x37, 0x64, 0x08, 0x36, 0x6E, 0x64, 0x09, 0x00, 0x60, 0x40, - 0x01, 0x36, 0x0A, 0x64, 0x02, 0x36, 0x14, 0x64, 0x04, 0x36, 0x37, 0x64, 0x08, 0x36, 0x6E, 0x64, - 0x2D, 0x58, 0xFF, 0xFF, 0x60, 0xFE, 0x81, 0xA1, 0x7F, 0xA1, 0x02, 0x06, 0x00, 0xF4, 0x03, 0x61, - 0x5D, 0xD2, 0xCF, 0x83, 0xD4, 0x80, 0x25, 0x03, 0x16, 0x03, 0xCF, 0x83, 0x61, 0x44, 0x80, 0xA0, - 0x20, 0x03, 0x02, 0x02, 0x00, 0xF4, 0x03, 0x61, 0x5D, 0xD2, 0xCF, 0x83, 0x81, 0xA1, 0x19, 0x03, - 0x05, 0x07, 0x7F, 0xA1, 0xCC, 0x84, 0xDD, 0x81, 0xE6, 0x03, 0xF7, 0x01, 0x00, 0xF4, 0x00, 0xB8, - 0x04, 0x61, 0xE6, 0x03, 0xF2, 0x01, 0x2C, 0x43, 0x5D, 0xD0, 0xDE, 0xD9, 0x64, 0x44, 0x5D, 0xD0, - 0xDE, 0xD9, 0xCC, 0x84, 0x81, 0xA1, 0x05, 0x03, 0x7F, 0xA1, 0xF9, 0x04, 0x00, 0xF4, 0x03, 0x61, - 0xF6, 0x01, 0x20, 0xFE, 0x2E, 0x58, 0xFF, 0xFF, 0x01, 0x3A, 0x02, 0x00, 0x16, 0x64, 0x2B, 0x00, - 0x02, 0x3A, 0x02, 0x00, 0x14, 0x64, 0x27, 0x00, 0x04, 0x3A, 0x02, 0x00, 0x12, 0x64, 0x23, 0x00, - 0x08, 0x3A, 0x02, 0x00, 0x10, 0x64, 0x1F, 0x00, 0x10, 0x3A, 0x02, 0x00, 0x0E, 0x64, 0x1B, 0x00, - 0x20, 0x3A, 0x02, 0x00, 0x0C, 0x64, 0x17, 0x00, 0x40, 0x3A, 0x02, 0x00, 0x0A, 0x64, 0x13, 0x00, - 0x80, 0x3A, 0x02, 0x00, 0x08, 0x64, 0x0F, 0x00, 0x01, 0x3B, 0x02, 0x00, 0x06, 0x64, 0x0B, 0x00, - 0x02, 0x3B, 0x02, 0x00, 0x04, 0x64, 0x07, 0x00, 0x04, 0x3B, 0x02, 0x00, 0x02, 0x64, 0x03, 0x00, - 0x08, 0x3B, 0xFF, 0x01, 0x00, 0x64, 0x2E, 0x58, 0xFF, 0xFF, 0x27, 0xF2, 0xFF, 0xFF, 0x60, 0x40, - 0x36, 0x3A, 0x02, 0x00, 0x00, 0x61, 0x30, 0x00, 0x30, 0x3A, 0x02, 0x00, 0x02, 0x61, 0x2C, 0x00, - 0x24, 0x3A, 0x02, 0x00, 0x04, 0x61, 0x28, 0x00, 0x18, 0x3A, 0x02, 0x00, 0x06, 0x61, 0x24, 0x00, - 0x12, 0x3A, 0x02, 0x00, 0x08, 0x61, 0x20, 0x00, 0x0C, 0x3A, 0x02, 0x00, 0x0A, 0x61, 0x1C, 0x00, - 0x09, 0x3A, 0x02, 0x00, 0x0C, 0x61, 0x18, 0x00, 0x06, 0x3A, 0x02, 0x00, 0x0E, 0x61, 0x14, 0x00, - 0x6E, 0x3A, 0x02, 0x00, 0x10, 0x61, 0x10, 0x00, 0x37, 0x3A, 0x02, 0x00, 0x12, 0x61, 0x0C, 0x00, - 0x14, 0x3A, 0x02, 0x00, 0x14, 0x61, 0x08, 0x00, 0x0A, 0x3A, 0x02, 0x00, 0x16, 0x61, 0x04, 0x00, - 0x78, 0x43, 0x03, 0x61, 0x29, 0x60, 0xEA, 0x78, 0x65, 0x40, 0x01, 0x3A, 0x13, 0x00, 0x66, 0x45, - 0x2B, 0x46, 0x92, 0xFA, 0x65, 0x46, 0x26, 0xF2, 0xFF, 0xFF, 0x60, 0x41, 0x00, 0x7F, 0x60, 0x45, - 0x61, 0x47, 0x00, 0x7F, 0xD4, 0x84, 0x66, 0x41, 0x2B, 0x46, 0x0E, 0xF2, 0x60, 0x45, 0x65, 0x5E, - 0x0E, 0xFA, 0x61, 0x46, 0x2E, 0x58, 0xFF, 0xFF, 0xCD, 0x81, 0x7F, 0xB4, 0x02, 0x3A, 0x02, 0x00, - 0x01, 0x64, 0x32, 0x00, 0x04, 0x3A, 0x02, 0x00, 0x02, 0x64, 0x2E, 0x00, 0x0B, 0x3A, 0x02, 0x00, - 0x04, 0x64, 0x2A, 0x00, 0x16, 0x3A, 0x02, 0x00, 0x08, 0x64, 0x26, 0x00, 0x0C, 0x3A, 0x02, 0x00, - 0x10, 0x64, 0x22, 0x00, 0x12, 0x3A, 0x02, 0x00, 0x20, 0x64, 0x1E, 0x00, 0x18, 0x3A, 0x02, 0x00, - 0x40, 0x64, 0x1A, 0x00, 0x24, 0x3A, 0x02, 0x00, 0x80, 0x64, 0x16, 0x00, 0x30, 0x3A, 0x03, 0x00, - 0x00, 0x7E, 0x01, 0x7F, 0x11, 0x00, 0x48, 0x3A, 0x03, 0x00, 0x00, 0x7E, 0x02, 0x7F, 0x0C, 0x00, - 0x60, 0x3A, 0x03, 0x00, 0x00, 0x7E, 0x04, 0x7F, 0x07, 0x00, 0x6C, 0x3A, 0x03, 0x00, 0x00, 0x7E, - 0x08, 0x7F, 0x02, 0x00, 0x00, 0x64, 0x00, 0x00, 0x20, 0xFE, 0x2A, 0x45, 0x34, 0x8A, 0x60, 0xFE, - 0x61, 0x40, 0x00, 0x36, 0x02, 0x00, 0xBD, 0xD3, 0xBF, 0x01, 0x2E, 0x58, 0xFF, 0xFF, - -}; /* fw_image_4_data */ - -static const CFG_IDENTITY_STRCT fw_image_infoidentity[] = { - { - sizeof( CFG_IDENTITY_STRCT ) / sizeof(hcf_16) - 1, - CFG_FW_IDENTITY, - COMP_ID_FW_STA, - 4, //Variant - 1, //Major - 36 //Minor - }, - { 0000, 0000, 0000, 0000, 0000, 0000 } //endsentinel -}; - -static const CFG_PROG_STRCT fw_image_code[] = { - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, // mode - 0x0184, // sizeof(fw_image_1_data), - 0x00000060, // Target address in NIC Memory - 0x0000, // CRC: yes/no TYPE: primary/station/tertiary - (hcf_8 FAR *) fw_image_1_data - }, - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, // mode - 0x2c0e, // sizeof(fw_image_2_data), - 0x00000C16, // Target address in NIC Memory - 0x0000, // CRC: yes/no TYPE: primary/station/tertiary - (hcf_8 FAR *) fw_image_2_data - }, - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, // mode - 0x54de, // sizeof(fw_image_3_data), - 0x001E3824, // Target address in NIC Memory - 0x0000, // CRC: yes/no TYPE: primary/station/tertiary - (hcf_8 FAR *) fw_image_3_data - }, - { - 8, - CFG_PROG, - CFG_PROG_VOLATILE, // mode - 0xbcde, // sizeof(fw_image_4_data), - 0x001F4000, // Target address in NIC Memory - 0x0000, // CRC: yes/no TYPE: primary/station/tertiary - (hcf_8 FAR *) fw_image_4_data - }, - { - 5, - CFG_PROG, - CFG_PROG_STOP, // mode - 0000, - 0x000F429B, // Start execution address - }, - { 0000, 0000, 0000, 0000, 00000000, 0000, NULL} -}; - -static const CFG_RANGE20_STRCT fw_image_infocompat[] = { - { 3 + ((20 * sizeof(CFG_RANGE_SPEC_STRCT)) / sizeof(hcf_16)), - CFG_FW_SUP_RANGE, - COMP_ROLE_SUPL, - COMP_ID_STA, - { - { 4, 1, 2 } //variant, bottom, top - } - }, - { 3 + ((20 * sizeof(CFG_RANGE_SPEC_STRCT)) / sizeof(hcf_16)), - CFG_MFI_ACT_RANGES_STA, - COMP_ROLE_ACT, - COMP_ID_MFI, - { - { 7, 3, 3 }, //variant, bottom, top - { 8, 1, 1 } //variant, bottom, top - } - }, - { 3 + ((20 * sizeof(CFG_RANGE_SPEC_STRCT)) / sizeof(hcf_16)), - CFG_CFI_ACT_RANGES_STA, - COMP_ROLE_ACT, - COMP_ID_CFI, - { - { 4, 1, 2 } //variant, bottom, top - } - }, - { 0000, 0000, 0000, 0000, { { 0000, 0000, 0000 } } } //endsentinel -}; - -memimage fw_image = { - "FUPU7D37dhfwci\001C", //signature, , C/Bin type - (CFG_PROG_STRCT *) fw_image_code, - 0x000F429B, - NULL, //(dummy) pdaplug - NULL, //(dummy) priplug - (CFG_RANGE20_STRCT *) fw_image_infocompat, - (CFG_IDENTITY_STRCT *) fw_image_infoidentity, -}; - diff --git a/drivers/staging/wlags49_h2/wl_cs.c b/drivers/staging/wlags49_h2/wl_cs.c deleted file mode 100644 index efbbefa1abc4..000000000000 --- a/drivers/staging/wlags49_h2/wl_cs.c +++ /dev/null @@ -1,441 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * This file contains processing and initialization specific to Card Services - * devices (PCMCIA, CF). - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright (c) 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -/******************************************************************************* - * include files - ******************************************************************************/ -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -/******************************************************************************* - * wl_adapter_attach() - ******************************************************************************* - * - * DESCRIPTION: - * - * Creates an instance of the driver, allocating local data structures for - * one device. The device is registered with Card Services. - * - * PARAMETERS: - * - * none - * - * RETURNS: - * - * pointer to an allocated dev_link_t structure - * NULL on failure - * - ******************************************************************************/ -static int wl_adapter_attach(struct pcmcia_device *link) -{ - struct net_device *dev; - struct wl_private *lp; - int ret; - - dev = wl_device_alloc(); - if (dev == NULL) { - DBG_ERROR(DbgInfo, "wl_device_alloc returned NULL\n"); - return -ENOMEM; - } - - link->resource[0]->end = HCF_NUM_IO_PORTS; - link->resource[0]->flags = IO_DATA_PATH_WIDTH_16; - link->config_flags |= CONF_ENABLE_IRQ; - link->config_index = 5; - link->config_regs = PRESENT_OPTION; - - link->priv = dev; - lp = wl_priv(dev); - lp->link = link; - - ret = wl_adapter_insert(link); - if (ret != 0) - wl_device_dealloc(dev); - - return ret; -} /* wl_adapter_attach */ -/*============================================================================*/ - - - -static void wl_adapter_detach(struct pcmcia_device *link) -{ - struct net_device *dev = link->priv; - - DBG_PARAM(DbgInfo, "link", "0x%p", link); - - wl_adapter_release(link); - - if (dev) { - unregister_netdev(dev); - wl_device_dealloc(dev); - } -} /* wl_adapter_detach */ -/*============================================================================*/ - - -void wl_adapter_release(struct pcmcia_device *link) -{ - DBG_PARAM(DbgInfo, "link", "0x%p", link); - - /* Stop hardware */ - wl_remove(link->priv); - - pcmcia_disable_device(link); -} /* wl_adapter_release */ -/*============================================================================*/ - -static int wl_adapter_suspend(struct pcmcia_device *link) -{ - struct net_device *dev = link->priv; - - /* if (link->open) { */ - netif_device_detach(dev); - wl_suspend(dev); - /* CHECK! pcmcia_release_configuration(link->handle); */ - /* } */ - - return 0; -} /* wl_adapter_suspend */ - -static int wl_adapter_resume(struct pcmcia_device *link) -{ - struct net_device *dev = link->priv; - - wl_resume(dev); - - netif_device_attach(dev); - - return 0; -} /* wl_adapter_resume */ - -int wl_adapter_insert(struct pcmcia_device *link) -{ - struct net_device *dev; - int ret; - - DBG_PARAM(DbgInfo, "link", "0x%p", link); - - dev = link->priv; - - /* Do we need to allocate an interrupt? */ - link->config_flags |= CONF_ENABLE_IRQ; - link->io_lines = 6; - - ret = pcmcia_request_io(link); - if (ret != 0) - goto failed; - - ret = pcmcia_request_irq(link, (void *) wl_isr); - if (ret != 0) - goto failed; - - ret = pcmcia_enable_device(link); - if (ret != 0) - goto failed; - - dev->irq = link->irq; - dev->base_addr = link->resource[0]->start; - - SET_NETDEV_DEV(dev, &link->dev); - ret = register_netdev(dev); - if (ret != 0) { - printk("%s: register_netdev() failed\n", KBUILD_MODNAME); - goto failed; - } - - printk(KERN_INFO "%s: Wireless, io_addr %#03lx, irq %d, mac_address" - " %pM\n", dev->name, dev->base_addr, dev->irq, dev->dev_addr); - - return 0; - -failed: - wl_adapter_release(link); - return ret; -} /* wl_adapter_insert */ -/*============================================================================*/ - - -/******************************************************************************* - * wl_adapter_open() - ******************************************************************************* - * - * DESCRIPTION: - * - * Open the device. - * - * PARAMETERS: - * - * dev - a pointer to a net_device structure representing the network - * device to open. - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -int wl_adapter_open(struct net_device *dev) -{ - struct wl_private *lp = wl_priv(dev); - struct pcmcia_device *link = lp->link; - int result = 0; - int hcf_status = HCF_SUCCESS; - - DBG_PRINT("%s\n", VERSION_INFO); - DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev); - - if (!pcmcia_dev_present(link)) - return -ENODEV; - - link->open++; - - hcf_status = wl_open(dev); - - if (hcf_status != HCF_SUCCESS) { - link->open--; - result = -ENODEV; - } - - return result; -} /* wl_adapter_open */ -/*============================================================================*/ - - -/******************************************************************************* - * wl_adapter_close() - ******************************************************************************* - * - * DESCRIPTION: - * - * Close the device. - * - * PARAMETERS: - * - * dev - a pointer to a net_device structure representing the network - * device to close. - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -int wl_adapter_close(struct net_device *dev) -{ - struct wl_private *lp = wl_priv(dev); - struct pcmcia_device *link = lp->link; - - DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev); - - if (link == NULL) - return -ENODEV; - - DBG_TRACE(DbgInfo, "%s: Shutting down adapter.\n", dev->name); - wl_close(dev); - - link->open--; - - return 0; -} /* wl_adapter_close */ -/*============================================================================*/ - -static const struct pcmcia_device_id wl_adapter_ids[] = { -#if !((HCF_TYPE) & HCF_TYPE_HII5) - PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0003), - PCMCIA_DEVICE_PROD_ID12("Agere Systems", "Wireless PC Card Model 0110", - 0x33103a9b, 0xe175b0dd), -#else - PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0004), - PCMCIA_DEVICE_PROD_ID12("Linksys", - "WCF54G_Wireless-G_CompactFlash_Card", 0x0733cc81, - 0x98a599e1), -#endif /* (HCF_TYPE) & HCF_TYPE_HII5 */ - PCMCIA_DEVICE_NULL, -}; -MODULE_DEVICE_TABLE(pcmcia, wl_adapter_ids); - -static struct pcmcia_driver wlags49_driver = { - .owner = THIS_MODULE, - .name = DRIVER_NAME, - .probe = wl_adapter_attach, - .remove = wl_adapter_detach, - .id_table = wl_adapter_ids, - .suspend = wl_adapter_suspend, - .resume = wl_adapter_resume, -}; - - - -/******************************************************************************* - * wl_adapter_init_module() - ******************************************************************************* - * - * DESCRIPTION: - * - * Called by init_module() to perform PCMCIA driver initialization. - * - * PARAMETERS: - * - * N/A - * - * RETURNS: - * - * 0 on success - * -1 on error - * - ******************************************************************************/ -int wl_adapter_init_module(void) -{ - return pcmcia_register_driver(&wlags49_driver); -} /* wl_adapter_init_module */ -/*============================================================================*/ - - -/******************************************************************************* - * wl_adapter_cleanup_module() - ******************************************************************************* - * - * DESCRIPTION: - * - * Called by cleanup_module() to perform driver uninitialization. - * - * PARAMETERS: - * - * N/A - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_adapter_cleanup_module(void) -{ - pcmcia_unregister_driver(&wlags49_driver); -} /* wl_adapter_cleanup_module */ -/*============================================================================*/ - - -/******************************************************************************* - * wl_adapter_is_open() - ******************************************************************************* - * - * DESCRIPTION: - * - * Check with Card Services to determine if this device is open. - * - * PARAMETERS: - * - * dev - a pointer to the net_device structure whose open status will be - * checked - * - * RETURNS: - * - * nonzero if device is open - * 0 otherwise - * - ******************************************************************************/ -int wl_adapter_is_open(struct net_device *dev) -{ - struct wl_private *lp = wl_priv(dev); - struct pcmcia_device *link = lp->link; - - if (!pcmcia_dev_present(link)) - return 0; - - return link->open; -} /* wl_adapter_is_open */ -/*============================================================================*/ diff --git a/drivers/staging/wlags49_h2/wl_cs.h b/drivers/staging/wlags49_h2/wl_cs.h deleted file mode 100644 index 9a597a9f145f..000000000000 --- a/drivers/staging/wlags49_h2/wl_cs.h +++ /dev/null @@ -1,89 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * Header describing information required for the driver to support PCMCIA. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -#ifndef __WL_CS_H__ -#define __WL_CS_H__ - - - - -/******************************************************************************* - * function prototypes - ******************************************************************************/ - -int wl_adapter_insert(struct pcmcia_device *link); - -void wl_adapter_release(struct pcmcia_device *link); - -int wl_adapter_init_module( void ); - -void wl_adapter_cleanup_module( void ); - -int wl_adapter_open(struct net_device *dev); - -int wl_adapter_close(struct net_device *dev); - -int wl_adapter_is_open(struct net_device *dev); - -const char *DbgEvent( int mask ); - - - -#endif /* __WL_CS_H__ */ diff --git a/drivers/staging/wlags49_h2/wl_enc.c b/drivers/staging/wlags49_h2/wl_enc.c deleted file mode 100644 index 389c23bdc28f..000000000000 --- a/drivers/staging/wlags49_h2/wl_enc.c +++ /dev/null @@ -1,217 +0,0 @@ - -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * This file defines functions related to WEP key coding/decoding. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -/******************************************************************************* - * include files - ******************************************************************************/ -#include -#include - -#include -#include - -#include - -/******************************************************************************* - * wl_wep_code() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function encodes a set of wep keys for privacy - * - * PARAMETERS: - * - * szCrypt - - * szDest - - * Data - - * nLen - - * - * RETURNS: - * - * OK - * - ******************************************************************************/ -int wl_wep_code(char *szCrypt, char *szDest, void *Data, int nLen) -{ - int i; - int t; - int k ; - char bits; - char *szData = (char *) Data; - /*------------------------------------------------------------------------*/ - - - for (i = bits = 0; i < MACADDRESS_STR_LEN; i++) { - bits ^= szCrypt[i]; - bits += szCrypt[i]; - } - - for (i = t = *szDest = 0; i < nLen; i++, t++) { - k = szData[i] ^ (bits + i); - - - switch (i % 3) { - - case 0: - - szDest[t] = ((k & 0xFC) >> 2) + CH_START ; - szDest[t+1] = ((k & 0x03) << 4) + CH_START ; - szDest[t+2] = '\0'; - - break; - - - case 1: - - szDest[t] += ((k & 0xF0) >> 4); - szDest[t+1] = ((k & 0x0F) << 2) + CH_START ; - szDest[t+2] = '\0'; - - break; - - - case 2: - - szDest[t] += ((k & 0xC0) >> 6); - szDest[t+1] = (k & 0x3F) + CH_START ; - szDest[t+2] = '\0'; - t++; - - break; - } - } - - return strlen(szDest); - -} -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_wep_decode() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function decodes a set of WEP keys for use by the card. - * - * PARAMETERS: - * - * szCrypt - - * szDest - - * Data - - * - * RETURNS: - * - * OK - * - ******************************************************************************/ -int wl_wep_decode(char *szCrypt, void *Dest, char *szData) -{ - int i; - int t; - int nLen; - char bits; - char *szDest = Dest; - /*------------------------------------------------------------------------*/ - - - for (i = bits = 0; i < 12; i++) { - bits ^= szCrypt[i] ; - bits += szCrypt[i] ; - } - - nLen = (strlen(szData) * 3) / 4 ; - - for (i = t = 0; i < nLen; i++, t++) { - switch (i % 3) { - case 0: - - szDest[i] = (((szData[t] - CH_START) & 0x3f) << 2) + - (((szData[t+1] - CH_START) & 0x30) >> 4); - break; - - - case 1: - szDest[i] = (((szData[t] - CH_START) & 0x0f) << 4) + - (((szData[t+1] - CH_START) & 0x3c) >> 2); - break; - - - case 2: - szDest[i] = (((szData[t] - CH_START) & 0x03) << 6) + - ((szData[t+1] - CH_START) & 0x3f); - t++; - break; - } - - szDest[i] ^= (bits + i); - - } - - return i; - -} -/*============================================================================*/ - diff --git a/drivers/staging/wlags49_h2/wl_enc.h b/drivers/staging/wlags49_h2/wl_enc.h deleted file mode 100644 index 03a52fbd3c09..000000000000 --- a/drivers/staging/wlags49_h2/wl_enc.h +++ /dev/null @@ -1,118 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * Header for performing coding/decoding of the WEP keys. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -#ifndef __WAVELAN2_ENCRYPTION_H__ -#define __WAVELAN2_ENCRYPTION_H__ - - - - -/******************************************************************************* - * constant definitions - ******************************************************************************/ -#define CRYPT_CODE "57617665A5D6" -#define ENCRYPTION_LEN 102 -#define ENCRYPTION_MAGIC 0x48576877L /* HWhw */ -#define DEF_CRYPT_STR "G?TIUEA]d5MAdZV'eUb&&6.)'&:,'VF/(FR2)6^5*'*8*W6;+GB>,7NA-'ZD-X&G.H2J/8>M0(JP0XVS1HbV29.Y3):\\3YF_4IRb56" - -#define DEFAULT_CRYPT_MAC "W\x01\x6B\x66\xA5\x5A" -#define CH_START '&' -#define MACADDRESS_STR_LEN 12 - -#define KEY_LEN 14 -#define NUM_KEYS 4 - -#define KEY_LENGTH_NONE_ASCII 0 -#define KEY_LENGTH_64_BIT_ASCII 5 -#define KEY_LENGTH_128_BIT_ASCII 13 - -#define KEY_LENGTH_NONE_HEX ( KEY_LENGTH_NONE_ASCII * sizeof( unsigned short )) -#define KEY_LENGTH_64_BIT_HEX ( KEY_LENGTH_64_BIT_ASCII * sizeof( unsigned short )) -#define KEY_LENGTH_128_BIT_HEX ( KEY_LENGTH_128_BIT_ASCII * sizeof( unsigned short )) - - - - -/******************************************************************************* - * type definitions - ******************************************************************************/ -typedef struct _encstct -{ - hcf_32 dwMagic; - hcf_16 wTxKeyID; - hcf_16 wEnabled; - CFG_DEFAULT_KEYS_STRCT EncStr; -} -ENCSTRCT, *PENCSTRCT; - - - - -/******************************************************************************* - * function prototypes - ******************************************************************************/ -int wl_wep_code( char *szCrypt, char *szDest, void *Data, int nLen ); - -int wl_wep_decode( char *szCrypt, void *Dest, char *szData ); - - - - -#endif /* __WAVELAN2_ENCRYPTION_H__ */ diff --git a/drivers/staging/wlags49_h2/wl_if.h b/drivers/staging/wlags49_h2/wl_if.h deleted file mode 100644 index 425d3733b362..000000000000 --- a/drivers/staging/wlags49_h2/wl_if.h +++ /dev/null @@ -1,221 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * Driver common header for info needed by driver source and user-space - * processes communicating with the driver. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -#ifndef __WAVELAN2_IF_H__ -#define __WAVELAN2_IF_H__ - - - - -/******************************************************************************* - * constant definitions - ******************************************************************************/ -#define MAX_LTV_BUF_SIZE (512 - (sizeof(hcf_16) * 2)) - -#define HCF_TALLIES_SIZE (sizeof(CFG_HERMES_TALLIES_STRCT) + \ - (sizeof(hcf_16) * 2)) - -#define HCF_MAX_MULTICAST 16 -#define HCF_MAX_NAME_LEN 32 -#define MAX_LINE_SIZE 256 -#define HCF_NUM_IO_PORTS 0x80 -#define TX_TIMEOUT ((800 * HZ) / 1000) - - -/* PE1DNN - * Better data from the real world. Not scientific but empirical data gathered - * from a Thomson Speedtouch 110 which is identified as: - * PCMCIA Info: "Agere Systems" "Wireless PC Card Model 0110" - * Manufacture ID: 0156,0003 - * Lowest measurment for noise floor seen is value 54 - * Highest signal strength in close proximity to the AP seen is value 118 - * Very good must be around 100 (otherwise its never "full scale" - * All other constants are derrived from these. This makes the signal gauge - * work for me... - */ -#define HCF_MIN_SIGNAL_LEVEL 54 -#define HCF_MAX_SIGNAL_LEVEL 100 -#define HCF_MIN_NOISE_LEVEL HCF_MIN_SIGNAL_LEVEL -#define HCF_MAX_NOISE_LEVEL HCF_MAX_SIGNAL_LEVEL -#define HCF_0DBM_OFFSET (HCF_MAX_SIGNAL_LEVEL + 1) -#define HCF_MIN_COMM_QUALITY 0 -#define HCF_MAX_COMM_QUALITY (HCF_MAX_SIGNAL_LEVEL - \ - HCF_MIN_NOISE_LEVEL + 1) - - -/* For encryption (WEP) */ -#define MIN_KEY_SIZE 5 /* 40 bits RC4 - WEP */ -#define MAX_KEY_SIZE 13 /* 104 bits */ -#define MAX_KEYS 4 - -#define RADIO_CHANNELS 14 -#define RADIO_SENSITIVITY_LEVELS 3 -#define RADIO_TX_POWER_MWATT 32 -#define RADIO_TX_POWER_DBM 15 - -#define MIN_RTS_BYTES 0 -#define MAX_RTS_BYTES 2347 - -#define MAX_RATES 8 -#define MEGABIT (1024 * 1024) - -#define HCF_FAILURE 0xFF -#define UIL_FAILURE 0xFF -#define CFG_UIL_CONNECT 0xA123 /* Define differently? */ -#define CFG_UIL_CONNECT_ACK_CODE 0x5653435A /* VSCZ */ -#define WVLAN2_UIL_CONNECTED (0x01L << 0) -#define WVLAN2_UIL_BUSY (0x01L << 1) - - - - -/******************************************************************************* - * driver ioctl interface - ******************************************************************************/ -#define WVLAN2_IOCTL_UIL SIOCDEVPRIVATE - -/* The UIL Interface used in conjunction with the WVLAN2_IOCTL_UIL code above - is defined in mdd.h. A quick reference of the UIL codes is listed below */ -/* -UIL_FUN_CONNECT -UIL_FUN_DISCONNECT -UIL_FUN_ACTION - UIL_ACT_BLOCK - UIL_ACT_UNBLOCK - UIL_ACT_SCA - UIL_ACT_DIAG - UIL_ACT_APPLY -UIL_FUN_SEND_DIAG_MSG -UIL_FUN_GET_INFO -UIL_FUN_PUT_INFO -*/ - -#define SIOCSIWNETNAME (SIOCDEVPRIVATE + 1) -#define SIOCGIWNETNAME (SIOCDEVPRIVATE + 2) -#define SIOCSIWSTANAME (SIOCDEVPRIVATE + 3) -#define SIOCGIWSTANAME (SIOCDEVPRIVATE + 4) -#define SIOCSIWPORTTYPE (SIOCDEVPRIVATE + 5) -#define SIOCGIWPORTTYPE (SIOCDEVPRIVATE + 6) - -/* IOCTL code for the RTS interface */ -#define WL_IOCTL_RTS (SIOCDEVPRIVATE + 7) - -/* IOCTL subcodes for WL_IOCTL_RTS */ -#define WL_IOCTL_RTS_READ 1 -#define WL_IOCTL_RTS_WRITE 2 -#define WL_IOCTL_RTS_BATCH_READ 3 -#define WL_IOCTL_RTS_BATCH_WRITE 4 - - -/******************************************************************************* - * STRUCTURE DEFINITIONS - ******************************************************************************/ -typedef struct { - __u16 length; - __u8 name[HCF_MAX_NAME_LEN]; -} -wvName_t; - - -typedef struct { - hcf_16 len; - hcf_16 typ; - union { - hcf_8 u8[MAX_LTV_BUF_SIZE / sizeof(hcf_8)]; - hcf_16 u16[MAX_LTV_BUF_SIZE / sizeof(hcf_16)]; - hcf_32 u32[MAX_LTV_BUF_SIZE / sizeof(hcf_32)]; - } u; -} -ltv_t; - - -struct uilreq { - union { - char ifrn_name[IFNAMSIZ]; - } ifr_ifrn; - - IFBP hcfCtx; - __u8 command; - __u8 result; - - /* The data field in this structure is typically an LTV of some type. - The len field is the size of the buffer in bytes, as opposed to words - (like the L-field in the LTV */ - __u16 len; - void *data; -}; - - -struct rtsreq { - union { - char ifrn_name[IFNAMSIZ]; - } - ifr_ifrn; - - __u16 typ; - __u16 reg; - __u16 len; - __u16 *data; -}; - - -#endif /* __WAVELAN2_IF_H__ */ - diff --git a/drivers/staging/wlags49_h2/wl_internal.h b/drivers/staging/wlags49_h2/wl_internal.h deleted file mode 100644 index 1ecb5cb44bd5..000000000000 --- a/drivers/staging/wlags49_h2/wl_internal.h +++ /dev/null @@ -1,1040 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * Header for definitions and macros internal to the drvier. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -#ifndef __WAVELAN2_H__ -#define __WAVELAN2_H__ - - - - -/******************************************************************************* - * include files - ******************************************************************************/ -#ifdef BUS_PCMCIA -#include -#include -#include -#include -#endif // BUS_PCMCIA - -#include -#include - -#include - -#include - - - - -/******************************************************************************* - * constant definitions - ******************************************************************************/ -#define p_u8 __u8 -#define p_s8 __s8 -#define p_u16 __u16 -#define p_s16 __s16 -#define p_u32 __u32 -#define p_s32 __s32 -#define p_char char - -#define MAX_KEY_LEN (2 + (13 * 2)) // 0x plus 13 hex digit pairs -#define MB_SIZE 1024 -#define MAX_ENC_LEN 104 - -#define MAX_SCAN_TIME_SEC 8 -#define MAX_NAPS 32 - -#define CFG_MB_INFO 0x0820 //Mail Box Info Block - -#define NUM_WDS_PORTS 6 - -#define WVLAN_MAX_LOOKAHEAD (HCF_MAX_MSG+46) /* as per s0005MIC_4.doc */ - - -/* Min/Max/Default Parameter Values */ -#if 0 //;? (HCF_TYPE) & HCF_TYPE_AP -//;? why this difference depending on compile option, seems to me it should depend on runtime if anything -#define PARM_DEFAULT_SSID "LinuxAP" -#else -#define PARM_DEFAULT_SSID "ANY" -#endif // HCF_TYPE_AP - -#define PARM_MIN_NAME_LEN 1 -#define PARM_MAX_NAME_LEN 32 - - -/* The following definitions pertain to module and profile parameters */ -// #define PARM_AP_MODE APMode -// #define PARM_NAME_AP_MODE TEXT("APMode") -// #define PARM_DEFAULT_AP_MODE FALSE - -#define PARM_AUTHENTICATION Authentication -#define PARM_NAME_AUTHENTICATION TEXT("Authentication") -#define PARM_MIN_AUTHENTICATION 1 -#define PARM_MAX_AUTHENTICATION 2 -#define PARM_DEFAULT_AUTHENTICATION 1 - -#define PARM_AUTH_KEY_MGMT_SUITE AuthKeyMgmtSuite -#define PARM_NAME_AUTH_KEY_MGMT_SUITE TEXT("AuthKeyMgmtSuite") -#define PARM_MIN_AUTH_KEY_MGMT_SUITE 0 -#define PARM_MAX_AUTH_KEY_MGMT_SUITE 4 -#define PARM_DEFAULT_AUTH_KEY_MGMT_SUITE 0 - -#define PARM_BRSC_2GHZ BRSC2GHz -#define PARM_NAME_BRSC_2GHZ TEXT("BRSC2GHz") -#define PARM_MIN_BRSC 0x0000 -#define PARM_MAX_BRSC 0x0FFF -#define PARM_DEFAULT_BRSC_2GHZ 0x000F - -#define PARM_BRSC_5GHZ BRSC5GHz -#define PARM_NAME_BRSC_5GHZ TEXT("BRSC5GHz") -#define PARM_DEFAULT_BRSC_5GHZ 0x0150 - -#define PARM_COEXISTENCE Coexistence -#define PARM_NAME_COEXISTENCE TEXT("Coexistence") -#define PARM_MIN_COEXISTENCE 0x0000 -#define PARM_MAX_COEXISTENCE 0x0007 -#define PARM_DEFAULT_COEXISTENCE 0x0000 - -#define PARM_CONFIGURED Configured -#define PARM_NAME_CONFIGURED TEXT("Configured") - -#define PARM_CONNECTION_CONTROL ConnectionControl -#define PARM_NAME_CONNECTION_CONTROL TEXT("ConnectionControl") -#define PARM_MIN_CONNECTION_CONTROL 0 -#define PARM_MAX_CONNECTION_CONTROL 3 -#define PARM_DEFAULT_CONNECTION_CONTROL 2 - -#define PARM_CREATE_IBSS CreateIBSS -#define PARM_NAME_CREATE_IBSS TEXT("CreateIBSS") -#define PARM_DEFAULT_CREATE_IBSS FALSE -#define PARM_DEFAULT_CREATE_IBSS_STR "N" - -#define PARM_DEBUG_FLAG DebugFlag -#define PARM_NAME_DEBUG_FLAG TEXT("DebugFlag") -#define PARM_MIN_DEBUG_FLAG 0 -#define PARM_MAX_DEBUG_FLAG 0xFFFF -#define PARM_DEFAULT_DEBUG_FLAG 0xFFFF - -#define PARM_DESIRED_SSID DesiredSSID -#define PARM_NAME_DESIRED_SSID TEXT("DesiredSSID") - -#define PARM_DOWNLOAD_FIRMWARE DownloadFirmware -#define PARM_NAME_DOWNLOAD_FIRMWARE TEXT("DownloadFirmware") - -#define PARM_DRIVER_ENABLE DriverEnable -#define PARM_NAME_DRIVER_ENABLE TEXT("DriverEnable") -#define PARM_DEFAULT_DRIVER_ENABLE TRUE - -#define PARM_ENABLE_ENCRYPTION EnableEncryption -#define PARM_NAME_ENABLE_ENCRYPTION TEXT("EnableEncryption") -#define PARM_MIN_ENABLE_ENCRYPTION 0 -#define PARM_MAX_ENABLE_ENCRYPTION 7 -#define PARM_DEFAULT_ENABLE_ENCRYPTION 0 - -#define PARM_ENCRYPTION Encryption -#define PARM_NAME_ENCRYPTION TEXT("Encryption") - -#define PARM_EXCLUDE_UNENCRYPTED ExcludeUnencrypted -#define PARM_NAME_EXCLUDE_UNENCRYPTED TEXT("ExcludeUnencrypted") -#define PARM_DEFAULT_EXCLUDE_UNENCRYPTED TRUE -#define PARM_DEFAULT_EXCLUDE_UNENCRYPTED_STR "N" - -#define PARM_INTRA_BSS_RELAY IntraBSSRelay -#define PARM_NAME_INTRA_BSS_RELAY TEXT("IntraBSSRelay") -#define PARM_DEFAULT_INTRA_BSS_RELAY TRUE -#define PARM_DEFAULT_INTRA_BSS_RELAY_STR "Y" - -#define PARM_KEY1 Key1 -#define PARM_NAME_KEY1 TEXT("Key1") -#define PARM_KEY2 Key2 -#define PARM_NAME_KEY2 TEXT("Key2") -#define PARM_KEY3 Key3 -#define PARM_NAME_KEY3 TEXT("Key3") -#define PARM_KEY4 Key4 -#define PARM_NAME_KEY4 TEXT("Key4") - -//;? #define PARM_KEY_FORMAT AsciiHex -//;? #define PARM_NAME_KEY_FORMAT TEXT("AsciiHex") - -#define PARM_LOAD_BALANCING LoadBalancing -#define PARM_NAME_LOAD_BALANCING TEXT("LoadBalancing") -#define PARM_DEFAULT_LOAD_BALANCING TRUE -#define PARM_DEFAULT_LOAD_BALANCING_STR "Y" - -#define PARM_MAX_DATA_LENGTH MaxDataLength -#define PARM_NAME_MAX_DATA_LENGTH TEXT("MaxDataLength") - -#define PARM_MAX_SLEEP MaxSleepDuration -#define PARM_NAME_MAX_SLEEP TEXT("MaxSleepDuration") -#define PARM_MIN_MAX_PM_SLEEP 1 //;?names nearly right? -#define PARM_MAX_MAX_PM_SLEEP 65535 -#define PARM_DEFAULT_MAX_PM_SLEEP 100 - -#define PARM_MEDIUM_DISTRIBUTION MediumDistribution -#define PARM_NAME_MEDIUM_DISTRIBUTION TEXT("MediumDistribution") -#define PARM_DEFAULT_MEDIUM_DISTRIBUTION TRUE -#define PARM_DEFAULT_MEDIUM_DISTRIBUTION_STR "Y" - -#define PARM_MICROWAVE_ROBUSTNESS MicroWaveRobustness -#define PARM_NAME_MICROWAVE_ROBUSTNESS TEXT("MicroWaveRobustness") -#define PARM_DEFAULT_MICROWAVE_ROBUSTNESS FALSE -#define PARM_DEFAULT_MICROWAVE_ROBUSTNESS_STR "N" - -#define PARM_MULTICAST_PM_BUFFERING MulticastPMBuffering -#define PARM_NAME_MULTICAST_PM_BUFFERING TEXT("MulticastPMBuffering") -#define PARM_DEFAULT_MULTICAST_PM_BUFFERING TRUE -#define PARM_DEFAULT_MULTICAST_PM_BUFFERING_STR "Y" - -#define PARM_MULTICAST_RATE MulticastRate -#define PARM_NAME_MULTICAST_RATE TEXT("MulticastRate") -#ifdef WARP -#define PARM_MIN_MULTICAST_RATE 0x0001 -#define PARM_MAX_MULTICAST_RATE 0x0fff -#define PARM_DEFAULT_MULTICAST_RATE_2GHZ 0x0004 -#define PARM_DEFAULT_MULTICAST_RATE_5GHZ 0x0010 -#else -#define PARM_MIN_MULTICAST_RATE 0x0001 -#define PARM_MAX_MULTICAST_RATE 0x0004 -#define PARM_DEFAULT_MULTICAST_RATE_2GHZ 0x0002 -#define PARM_DEFAULT_MULTICAST_RATE_5GHZ 0x0000 -#endif // WARP - -#define PARM_MULTICAST_RX MulticastReceive -#define PARM_NAME_MULTICAST_RX TEXT("MulticastReceive") -#define PARM_DEFAULT_MULTICAST_RX TRUE -#define PARM_DEFAULT_MULTICAST_RX_STR "Y" - -#define PARM_NETWORK_ADDR NetworkAddress -#define PARM_NAME_NETWORK_ADDR TEXT("NetworkAddress") -#define PARM_DEFAULT_NETWORK_ADDR { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } - -#define PARM_NETWORK_TYPE NetworkType -#define PARM_NAME_NETWORK_TYPE TEXT("NetworkType") -#define PARM_DEFAULT_NETWORK_TYPE 0 - -#define PARM_OWN_ATIM_WINDOW OwnATIMWindow -#define PARM_NAME_OWN_ATIM_WINDOW TEXT("OwnATIMWindow") -#define PARM_MIN_OWN_ATIM_WINDOW 0 -#define PARM_MAX_OWN_ATIM_WINDOW 100 -#define PARM_DEFAULT_OWN_ATIM_WINDOW 0 - -#define PARM_OWN_BEACON_INTERVAL OwnBeaconInterval -#define PARM_NAME_OWN_BEACON_INTERVAL TEXT("OwnBeaconInterval") -#define PARM_MIN_OWN_BEACON_INTERVAL 20 -#define PARM_MAX_OWN_BEACON_INTERVAL 200 -#define PARM_DEFAULT_OWN_BEACON_INTERVAL 100 - -#define PARM_OWN_CHANNEL OwnChannel -#define PARM_NAME_OWN_CHANNEL TEXT("OwnChannel") -#define PARM_MIN_OWN_CHANNEL 1 -#define PARM_MAX_OWN_CHANNEL 161 -#define PARM_DEFAULT_OWN_CHANNEL 10 - -#define PARM_OWN_DTIM_PERIOD OwnDTIMPeriod -#define PARM_NAME_OWN_DTIM_PERIOD TEXT("OwnDTIMPeriod") -#define PARM_MIN_OWN_DTIM_PERIOD 1 -#define PARM_MAX_OWN_DTIM_PERIOD 65535 -#define PARM_DEFAULT_OWN_DTIM_PERIOD 1 - -#define PARM_OWN_NAME OwnName -#define PARM_NAME_OWN_NAME TEXT("OwnName") -#define PARM_DEFAULT_OWN_NAME "Linux" - -#define PARM_OWN_SSID OwnSSID -#define PARM_NAME_OWN_SSID TEXT("OwnSSID") - -#define PARM_PM_ENABLED PMEnabled -#define PARM_NAME_PM_ENABLED TEXT("PMEnabled") -#define PARM_MAX_PM_ENABLED 3 - -#define PARM_PMEPS PMEPS -#define PARM_NAME_PMEPS TEXT("PMEPS") - -#define PARM_PM_HOLDOVER_DURATION PMHoldoverDuration -#define PARM_NAME_PM_HOLDOVER_DURATION TEXT("PMHoldoverDuration") -#define PARM_MIN_PM_HOLDOVER_DURATION 1 -#define PARM_MAX_PM_HOLDOVER_DURATION 1000 -#define PARM_DEFAULT_PM_HOLDOVER_DURATION 100 - -#define PARM_PM_MODE PowerMode -#define PARM_NAME_PM_MODE TEXT("PowerMode") - -#define PARM_PORT_TYPE PortType -#define PARM_NAME_PORT_TYPE TEXT("PortType") -#define PARM_MIN_PORT_TYPE 1 -#define PARM_MAX_PORT_TYPE 3 -#define PARM_DEFAULT_PORT_TYPE 1 - -#define PARM_PROMISCUOUS_MODE PromiscuousMode -#define PARM_NAME_PROMISCUOUS_MODE TEXT("PromiscuousMode") -#define PARM_DEFAULT_PROMISCUOUS_MODE FALSE -#define PARM_DEFAULT_PROMISCUOUS_MODE_STR "N" - -#define PARM_REJECT_ANY RejectANY -#define PARM_NAME_REJECT_ANY TEXT("RejectANY") -#define PARM_DEFAULT_REJECT_ANY FALSE -#define PARM_DEFAULT_REJECT_ANY_STR "N" - -#define PARM_RTS_THRESHOLD RTSThreshold -#define PARM_NAME_RTS_THRESHOLD TEXT("RTSThreshold") -#define PARM_MIN_RTS_THRESHOLD 0 -#define PARM_MAX_RTS_THRESHOLD 2347 -#define PARM_DEFAULT_RTS_THRESHOLD 2347 - -#define PARM_RTS_THRESHOLD1 RTSThreshold1 -#define PARM_NAME_RTS_THRESHOLD1 TEXT("RTSThreshold1") -#define PARM_RTS_THRESHOLD2 RTSThreshold2 -#define PARM_NAME_RTS_THRESHOLD2 TEXT("RTSThreshold2") -#define PARM_RTS_THRESHOLD3 RTSThreshold3 -#define PARM_NAME_RTS_THRESHOLD3 TEXT("RTSThreshold3") -#define PARM_RTS_THRESHOLD4 RTSThreshold4 -#define PARM_NAME_RTS_THRESHOLD4 TEXT("RTSThreshold4") -#define PARM_RTS_THRESHOLD5 RTSThreshold5 -#define PARM_NAME_RTS_THRESHOLD5 TEXT("RTSThreshold5") -#define PARM_RTS_THRESHOLD6 RTSThreshold6 -#define PARM_NAME_RTS_THRESHOLD6 TEXT("RTSThreshold6") - -#define PARM_SRSC_2GHZ SRSC2GHz -#define PARM_NAME_SRSC_2GHZ TEXT("SRSC2GHz") -#define PARM_MIN_SRSC 0x0000 -#define PARM_MAX_SRSC 0x0FFF -#define PARM_DEFAULT_SRSC_2GHZ 0x0FFF - -#define PARM_SRSC_5GHZ SRSC5GHz -#define PARM_NAME_SRSC_5GHZ TEXT("SRSC5GHz") -#define PARM_DEFAULT_SRSC_5GHZ 0x0FF0 - -#define PARM_SYSTEM_SCALE SystemScale -#define PARM_NAME_SYSTEM_SCALE TEXT("SystemScale") -#define PARM_MIN_SYSTEM_SCALE 1 -#define PARM_MAX_SYSTEM_SCALE 5 -#define PARM_DEFAULT_SYSTEM_SCALE 1 - -#define PARM_TX_KEY TxKey -#define PARM_NAME_TX_KEY TEXT("TxKey") -#define PARM_MIN_TX_KEY 1 -#define PARM_MAX_TX_KEY 4 -#define PARM_DEFAULT_TX_KEY 1 - -#define PARM_TX_POW_LEVEL TxPowLevel -#define PARM_NAME_TX_POW_LEVEL TEXT("TxPowLevel") -#define PARM_MIN_TX_POW_LEVEL 1 // 20 dBm -#define PARM_MAX_TX_POW_LEVEL 6 // 8 dBm -#define PARM_DEFAULT_TX_POW_LEVEL 3 // 15 dBm - -#define PARM_TX_RATE TxRateControl -#define PARM_NAME_TX_RATE TEXT("TxRateControl") -#define PARM_MIN_TX_RATE 0x0001 -#ifdef WARP -#define PARM_MAX_TX_RATE 0x0FFF -#define PARM_DEFAULT_TX_RATE_2GHZ 0x0FFF -#define PARM_DEFAULT_TX_RATE_5GHZ 0x0FF0 -#else -#define PARM_MAX_TX_RATE 0x0007 -#define PARM_DEFAULT_TX_RATE_2GHZ 0x0003 -#define PARM_DEFAULT_TX_RATE_5GHZ 0x0000 -#endif // WARP - -#define PARM_TX_RATE1 TxRateControl1 -#define PARM_NAME_TX_RATE1 TEXT("TxRateControl1") -#define PARM_TX_RATE2 TxRateControl2 -#define PARM_NAME_TX_RATE2 TEXT("TxRateControl2") -#define PARM_TX_RATE3 TxRateControl3 -#define PARM_NAME_TX_RATE3 TEXT("TxRateControl3") -#define PARM_TX_RATE4 TxRateControl4 -#define PARM_NAME_TX_RATE4 TEXT("TxRateControl4") -#define PARM_TX_RATE5 TxRateControl5 -#define PARM_NAME_TX_RATE5 TEXT("TxRateControl5") -#define PARM_TX_RATE6 TxRateControl6 -#define PARM_NAME_TX_RATE6 TEXT("TxRateControl6") - -#define PARM_VENDORDESCRIPTION VendorDescription -#define PARM_NAME_VENDORDESCRIPTION TEXT("VendorDescription") - -#define PARM_WDS_ADDRESS WDSAddress -#define PARM_NAME_WDS_ADDRESS TEXT("WDSAddress") - -#define PARM_WDS_ADDRESS1 WDSAddress1 -#define PARM_NAME_WDS_ADDRESS1 TEXT("WDSAddress1") -#define PARM_WDS_ADDRESS2 WDSAddress2 -#define PARM_NAME_WDS_ADDRESS2 TEXT("WDSAddress2") -#define PARM_WDS_ADDRESS3 WDSAddress3 -#define PARM_NAME_WDS_ADDRESS3 TEXT("WDSAddress3") -#define PARM_WDS_ADDRESS4 WDSAddress4 -#define PARM_NAME_WDS_ADDRESS4 TEXT("WDSAddress4") -#define PARM_WDS_ADDRESS5 WDSAddress5 -#define PARM_NAME_WDS_ADDRESS5 TEXT("WDSAddress5") -#define PARM_WDS_ADDRESS6 WDSAddress6 -#define PARM_NAME_WDS_ADDRESS6 TEXT("WDSAddress6") - -/* -#define PARM_LONG_RETRY_LIMIT LongRetryLimit -#define PARM_NAME_LONG_RETRY_LIMIT TEXT("LongRetryLimit") -#define PARM_MIN_LONG_RETRY_LIMIT 1 -#define PARM_MAX_LONG_RETRY_LIMIT 15 -#define PARM_DEFAULT_LONG_RETRY_LIMIT 3 - - -#define PARM_PROBE_DATA_RATES ProbeDataRates -#define PARM_NAME_PROBE_DATA_RATES TEXT("ProbeDataRates") -#define PARM_MIN_PROBE_DATA_RATES 0x0000 -#define PARM_MAX_PROBE_DATA_RATES 0x0FFF -#define PARM_DEFAULT_PROBE_DATA_RATES_2GHZ 0x0002 -#define PARM_DEFAULT_PROBE_DATA_RATES_5GHZ 0x0010 - -#define PARM_SHORT_RETRY_LIMIT ShortRetryLimit -#define PARM_NAME_SHORT_RETRY_LIMIT TEXT("ShortRetryLimit") -#define PARM_MIN_SHORT_RETRY_LIMIT 1 -#define PARM_MAX_SHORT_RETRY_LIMIT 15 -#define PARM_DEFAULT_SHORT_RETRY_LIMIT 7 - - -*/ - -/******************************************************************************* - * state definitions - ******************************************************************************/ -/* The following constants are used to track state the device */ -#define WL_FRIMWARE_PRESENT 1 // Download if needed -#define WL_FRIMWARE_NOT_PRESENT 0 // Skip over download, assume its already there -#define WL_HANDLING_INT 1 // Actually call the HCF to switch interrupts on/off -#define WL_NOT_HANDLING_INT 0 // Not yet handling interrupts, do not switch on/off - -/******************************************************************************* - * macro definitions - ******************************************************************************/ -/* The following macro ensures that no symbols are exported, minimizing the - chance of a symbol collision in the kernel */ -// EXPORT_NO_SYMBOLS; - -#define NELEM(arr) (sizeof(arr) / sizeof(arr[0])) - -#define WVLAN_VALID_MAC_ADDRESS( x ) \ -((x[0]!=0xFF) && (x[1]!=0xFF) && (x[2]!=0xFF) && (x[3]!=0xFF) && (x[4]!=0xFF) && (x[5]!=0xFF)) - - - - -/******************************************************************************* - * type definitions - ******************************************************************************/ -#undef FALSE -#undef TRUE - -typedef enum -{ - FALSE = 0, - TRUE = 1 -} -bool_t; - - -typedef struct _ScanResult -{ - //hcf_16 len; - //hcf_16 typ; - int scan_complete; - int num_aps; - SCAN_RS_STRCT APTable [MAX_NAPS]; -} -ScanResult; - - -typedef struct _LINK_STATUS_STRCT -{ - hcf_16 len; - hcf_16 typ; - hcf_16 linkStatus; /* 1..5 */ -} -LINK_STATUS_STRCT; - - -typedef struct _ASSOC_STATUS_STRCT -{ - hcf_16 len; - hcf_16 typ; - hcf_16 assocStatus; /* 1..3 */ - hcf_8 staAddr[ETH_ALEN]; - hcf_8 oldApAddr[ETH_ALEN]; -} -ASSOC_STATUS_STRCT; - - -typedef struct _SECURITY_STATUS_STRCT -{ - hcf_16 len; - hcf_16 typ; - hcf_16 securityStatus; /* 1..3 */ - hcf_8 staAddr[ETH_ALEN]; - hcf_16 reason; -} -SECURITY_STATUS_STRCT; - -#define WVLAN_WMP_PDU_TYPE_LT_REQ 0x00 -#define WVLAN_WMP_PDU_TYPE_LT_RSP 0x01 -#define WVLAN_WMP_PDU_TYPE_APL_REQ 0x02 -#define WVLAN_WMP_PDU_TYPE_APL_RSP 0x03 - -typedef struct wvlan_eth_hdr -{ - unsigned char dst[ETH_ALEN]; /* Destination address. */ - unsigned char src[ETH_ALEN]; /* Source address. */ - unsigned short len; /* Length of the PDU. */ -} -WVLAN_ETH_HDR, *PWVLAN_ETH_HDR; - -typedef struct wvlan_llc_snap -{ - unsigned char dsap; /* DSAP (0xAA) */ - unsigned char ssap; /* SSAP (0xAA) */ - unsigned char ctrl; /* Control (0x03) */ - unsigned char oui[3]; /* Organization Unique ID (00-60-1d). */ - unsigned char specid[2]; /* Specific ID code (00-01). */ -} -WVLAN_LLC_SNAP, *PWVLAN_LLC_SNAP; - - -typedef struct wvlan_lt_hdr -{ - unsigned char version; /* Version (0x00) */ - unsigned char type; /* PDU type: 0-req/1-resp. */ - unsigned short id; /* Identifier to associate resp to req. */ -} -WVLAN_LT_HDR, *PWVLAN_LT_HDR; - - -typedef struct wvlan_wmp_hdr -{ - unsigned char version; /* Version */ - unsigned char type; /* PDU type */ -} -WVLAN_WMP_HDR, *PWVLAN_WMP_HDR; - - -#define FILLER_SIZE 1554 -#define TEST_PATTERN_SIZE 54 - - -typedef struct wvlan_lt_req -{ - unsigned char Filler[TEST_PATTERN_SIZE]; /* minimal length of 54 bytes */ -} -WVLAN_LT_REQ, *PWVLAN_LT_REQ; - - -typedef struct wvlan_lt_rsp -{ - char name[32]; - /* Measured Data */ - unsigned char signal; - unsigned char noise; - unsigned char rxFlow; - unsigned char dataRate; - unsigned short protocol; - /* Capabilities */ - unsigned char station; - unsigned char dataRateCap; - unsigned char powerMgmt[4]; - unsigned char robustness[4]; - unsigned char scaling; - unsigned char reserved[5]; -} -WVLAN_LT_RSP, *PWVLAN_LT_RSP; - - -typedef struct wvlan_rx_wmp_hdr -{ - unsigned short status; - unsigned short reserved1[2]; - unsigned char silence; - unsigned char signal; - unsigned char rate; - unsigned char rxFlow; - unsigned short reserved2[2]; - unsigned short frameControl; - unsigned short duration; - unsigned short address1[3]; - unsigned short address2[3]; - unsigned short address3[3]; - unsigned short sequenceControl; - unsigned short address4[3]; -#ifndef HERMES25 //;?just to be on the safe side of inherited but not comprehended code #ifdef HERMES2 - unsigned short seems_to_be_unused_reserved3[5]; //;? - unsigned short seems_to_be_unused_reserved4; //;? -#endif // HERMES25 - unsigned short HeaderDataLen; -} -WVLAN_RX_WMP_HDR, *PWVLAN_RX_WMP_HDR; - - -typedef struct wvlan_linktest_req_pdu -{ - WVLAN_ETH_HDR ethHdr; - WVLAN_LLC_SNAP llcSnap; - WVLAN_LT_HDR ltHdr; - WVLAN_LT_REQ ltReq; -} -WVLAN_LINKTEST_REQ_PDU, *PWVLAN_LINKTEST_REQ_PDU; - - -typedef struct wvlan_linktest_rsp_pdu -{ - WVLAN_RX_WMP_HDR wmpRxHdr; - WVLAN_ETH_HDR ethHdr; - WVLAN_LLC_SNAP llcSnap; - WVLAN_LT_HDR ltHdr; - WVLAN_LT_RSP ltRsp; -} -WVLAN_LINKTEST_RSP_PDU, *PWVLAN_LINKTEST_RSP_PDU; - - -typedef struct _LINKTEST_RSP_STRCT -{ - hcf_16 len; - hcf_16 typ; - WVLAN_LINKTEST_RSP_PDU ltRsp; -} -LINKTEST_RSP_STRCT; - - -typedef struct wvlan_wmp_rsp_pdu -{ - WVLAN_RX_WMP_HDR wmpRxHdr; - WVLAN_ETH_HDR ethHdr; - WVLAN_LLC_SNAP llcSnap; - WVLAN_WMP_HDR wmpHdr; -} -WVLAN_WMP_RSP_PDU, *PWVLAN_WMP_RSP_PDU; - - -typedef struct _WMP_RSP_STRCT -{ - hcf_16 len; - hcf_16 typ; - WVLAN_WMP_RSP_PDU wmpRsp; -} -WMP_RSP_STRCT; - - -typedef struct _PROBE_RESP -{ - // first part: 802.11 - hcf_16 length; - hcf_16 infoType; - hcf_16 reserved0; - //hcf_8 signal; - hcf_8 silence; - hcf_8 signal; // Moved signal here as signal/noise values were flipped - hcf_8 rxFlow; - hcf_8 rate; - hcf_16 reserved1[2]; - - // second part: - hcf_16 frameControl; - hcf_16 durID; - hcf_8 address1[6]; - hcf_8 address2[6]; - hcf_8 BSSID[6]; //! this is correct, right ? - hcf_16 sequence; - hcf_8 address4[6]; - -#ifndef WARP - hcf_8 reserved2[12]; -#endif // WARP - - hcf_16 dataLength; - // the information in the next 3 fields (DA/SA/LenType) is actually not filled in. - hcf_8 DA[6]; - hcf_8 SA[6]; - -#ifdef WARP - hcf_8 channel; - hcf_8 band; -#else - hcf_16 lenType; -#endif // WARP - - hcf_8 timeStamp[8]; - hcf_16 beaconInterval; - hcf_16 capability; - hcf_8 rawData[200]; //! <<< think about this number ! - hcf_16 flags; -} -PROBE_RESP, *PPROBE_RESP; - - -typedef struct _ProbeResult -{ - int scan_complete; - int num_aps; - PROBE_RESP ProbeTable[MAX_NAPS]; -} -ProbeResult; - -/* Definitions used to parse capabilities out of the probe responses */ -#define CAPABILITY_ESS 0x0001 -#define CAPABILITY_IBSS 0x0002 -#define CAPABILITY_PRIVACY 0x0010 - -/* Definitions used to parse the Information Elements out of probe responses */ -#define DS_INFO_ELEM 0x03 -#define GENERIC_INFO_ELEM 0xdd -#define WPA_MAX_IE_LEN 40 -#define WPA_SELECTOR_LEN 4 -#define WPA_OUI_TYPE { 0x00, 0x50, 0xf2, 1 } -#define WPA_VERSION 1 -#define WPA_AUTH_KEY_MGMT_UNSPEC_802_1X { 0x00, 0x50, 0xf2, 1 } -#define WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X { 0x00, 0x50, 0xf2, 2 } -#define WPA_CIPHER_SUITE_NONE { 0x00, 0x50, 0xf2, 0 } -#define WPA_CIPHER_SUITE_WEP40 { 0x00, 0x50, 0xf2, 1 } -#define WPA_CIPHER_SUITE_TKIP { 0x00, 0x50, 0xf2, 2 } -#define WPA_CIPHER_SUITE_WRAP { 0x00, 0x50, 0xf2, 3 } -#define WPA_CIPHER_SUITE_CCMP { 0x00, 0x50, 0xf2, 4 } -#define WPA_CIPHER_SUITE_WEP104 { 0x00, 0x50, 0xf2, 5 } - -typedef enum wvlan_drv_mode -{ - WVLAN_DRV_MODE_NO_DOWNLOAD, /* this is the same as STA for Hermes 1 */ - /* it is also only applicable for Hermes 1 */ - WVLAN_DRV_MODE_STA, - WVLAN_DRV_MODE_AP, - WVLAN_DRV_MODE_MAX -} -WVLAN_DRV_MODE, *PWVLAN_DRV_MODE; - - -typedef enum wvlan_port_state -{ - WVLAN_PORT_STATE_ENABLED, - WVLAN_PORT_STATE_DISABLED, - WVLAN_PORT_STATE_CONNECTED -} -WVLAN_PORT_STATE, *PWVLAN_PORT_STATE; - -/* -typedef enum wvlan_connect_state -{ - WVLAN_CONNECT_STATE_CONNECTED, - WVLAN_CONNECT_STATE_DISCONNECTED -} -WVLAN_CONNECT_STATE, *PWVLAN_CONNECT_STATE; -*/ - -typedef enum wvlan_pm_state -{ - WVLAN_PM_STATE_DISABLED, - WVLAN_PM_STATE_ENHANCED, - WVLAN_PM_STATE_STANDARD -} -WVLAN_PM_STATE, *PWVLAN_PM_STATE; - - -typedef struct wvlan_frame -{ - struct sk_buff *skb; /* sk_buff for frame. */ - hcf_16 port; /* MAC port for the frame. */ - hcf_16 len; /* Length of the frame. */ -} -WVLAN_FRAME, *PWVLAN_FRAME; - - -typedef struct wvlan_lframe -{ - struct list_head node; /* Node in the list */ - WVLAN_FRAME frame; /* Frame. */ -} -WVLAN_LFRAME, *PWVLAN_LFRAME; - - - -#define DEFAULT_NUM_TX_FRAMES 48 -#define TX_Q_LOW_WATER_MARK (DEFAULT_NUM_TX_FRAMES/3) - -#define WVLAN_MAX_TX_QUEUES 1 - - -#ifdef USE_WDS - -typedef struct wvlan_wds_if -{ - struct net_device *dev; - int is_registered; - int netif_queue_on; - struct net_device_stats stats; - hcf_16 rtsThreshold; - hcf_16 txRateCntl; - hcf_8 wdsAddress[ETH_ALEN]; -} WVLAN_WDS_IF, *PWVLAN_WDS_IF; - -#endif // USE_WDS - - - -#define NUM_RX_DESC 5 -#define NUM_TX_DESC 5 - -typedef struct dma_strct -{ - DESC_STRCT *tx_packet[NUM_TX_DESC]; - DESC_STRCT *rx_packet[NUM_RX_DESC]; - DESC_STRCT *rx_reclaim_desc, *tx_reclaim_desc; // Descriptors for host-reclaim purposes (see HCF) - int tx_rsc_ind; // DMA Tx resource indicator is maintained in the MSF, not in the HCF - int rx_rsc_ind; // Also added rx resource indicator so that cleanup can be performed if alloc fails - int status; -} DMA_STRCT; - - -/* Macros used in DMA support */ -/* get bus address of {rx,tx}dma structure member, in little-endian byte order */ -#define WL_DMA_BUS_ADDR_LE(str, i, mem) \ - cpu_to_le32(str##_dma_addr[(i)] + ((hcf_8 *)&str[(i)]->mem - (hcf_8 *)str[(i)])) - - -struct wl_private -{ - -#ifdef BUS_PCMCIA - struct pcmcia_device *link; -#endif // BUS_PCMCIA - - - struct net_device *dev; -// struct net_device *dev_next; - spinlock_t slock; - struct tasklet_struct task; - struct net_device_stats stats; - - -#ifdef WIRELESS_EXT - struct iw_statistics wstats; -// int spy_number; -// u_char spy_address[IW_MAX_SPY][ETH_ALEN]; -// struct iw_quality spy_stat[IW_MAX_SPY]; - struct iw_spy_data spy_data; - struct iw_public_data wireless_data; -#endif // WIRELESS_EXT - - - IFB_STRCT hcfCtx; -//;? struct timer_list timer_oor; -//;? hcf_16 timer_oor_cnt; - u_long wlags49_type; //controls output in /proc/wlags49 - u_long flags; - hcf_16 DebugFlag; - int is_registered; - int is_handling_int; - int firmware_present; - CFG_DRV_INFO_STRCT driverInfo; - CFG_IDENTITY_STRCT driverIdentity; - CFG_FW_IDENTITY_STRCT StationIdentity; - CFG_PRI_IDENTITY_STRCT PrimaryIdentity; - CFG_PRI_IDENTITY_STRCT NICIdentity; - - ltv_t ltvRecord; - u_long txBytes; - hcf_16 maxPort; /* 0 for STA, 6 for AP */ - - /* Elements used for async notification from hardware */ - RID_LOG_STRCT RidList[10]; - ltv_t updatedRecord; - PROBE_RESP ProbeResp; - ASSOC_STATUS_STRCT assoc_stat; - SECURITY_STATUS_STRCT sec_stat; - - u_char lookAheadBuf[WVLAN_MAX_LOOKAHEAD]; - - hcf_8 PortType; // 1 - 3 (1 [Normal] | 3 [AdHoc]) - hcf_16 Channel; // 0 - 14 (0) - hcf_16 TxRateControl[2]; - hcf_8 DistanceBetweenAPs; // 1 - 3 (1) - hcf_16 RTSThreshold; // 0 - 2347 (2347) - hcf_16 PMEnabled; // 0 - 2, 8001 - 8002 (0) - hcf_8 MicrowaveRobustness;// 0 - 1 (0) - hcf_8 CreateIBSS; // 0 - 1 (0) - hcf_8 MulticastReceive; // 0 - 1 (1) - hcf_16 MaxSleepDuration; // 0 - 65535 (100) - hcf_8 MACAddress[ETH_ALEN]; - char NetworkName[HCF_MAX_NAME_LEN+1]; - char StationName[HCF_MAX_NAME_LEN+1]; - hcf_8 EnableEncryption; // 0 - 1 (0) - char Key1[MAX_KEY_LEN+1]; - char Key2[MAX_KEY_LEN+1]; - char Key3[MAX_KEY_LEN+1]; - char Key4[MAX_KEY_LEN+1]; - hcf_8 TransmitKeyID; // 1 - 4 (1) - CFG_DEFAULT_KEYS_STRCT DefaultKeys; - u_char mailbox[MB_SIZE]; - char szEncryption[MAX_ENC_LEN]; - - hcf_16 driverEnable; - hcf_16 wolasEnable; - hcf_16 atimWindow; - hcf_16 holdoverDuration; - hcf_16 MulticastRate[2]; - - hcf_16 authentication; // is this AP specific? - hcf_16 promiscuousMode; - WVLAN_DRV_MODE DownloadFirmware; // 0 - 2 (0 [None] | 1 [STA] | 2 [AP]) - - char fw_image_filename[MAX_LINE_SIZE+1]; - - hcf_16 AuthKeyMgmtSuite; - - hcf_16 loadBalancing; - hcf_16 mediumDistribution; - hcf_16 txPowLevel; - //hcf_16 shortRetryLimit; - //hcf_16 longRetryLimit; - hcf_16 srsc[2]; - hcf_16 brsc[2]; - hcf_16 connectionControl; - //hcf_16 probeDataRates[2]; - hcf_16 ownBeaconInterval; - hcf_16 coexistence; - - WVLAN_FRAME txF; - WVLAN_LFRAME txList[DEFAULT_NUM_TX_FRAMES]; - struct list_head txFree; - struct list_head txQ[WVLAN_MAX_TX_QUEUES]; - int netif_queue_on; - int txQ_count; - DESC_STRCT desc_rx; - DESC_STRCT desc_tx; - - WVLAN_PORT_STATE portState; - - ScanResult scan_results; - ProbeResult probe_results; - int probe_num_aps; - - int use_dma; - DMA_STRCT dma; -#ifdef USE_RTS - int useRTS; -#endif // USE_RTS - hcf_8 DTIMPeriod; // 1 - 255 (1) - hcf_16 multicastPMBuffering; - hcf_8 RejectAny; // 0 - 1 (0) - hcf_8 ExcludeUnencrypted; // 0 - 1 (1) - hcf_16 intraBSSRelay; -#ifdef USE_WDS - WVLAN_WDS_IF wds_port[NUM_WDS_PORTS]; -#endif // USE_WDS - - /* Track whether the card is using WEP encryption or WPA - * so we know what to disable next time through. - * IW_ENCODE_ALG_NONE, IW_ENCODE_ALG_WEP, IW_ENCODE_ALG_TKIP - */ - int wext_enc; -}; // wl_private - -#define wl_priv(dev) ((struct wl_private *) netdev_priv(dev)) - -/********************************************************************/ -/* Locking and synchronization functions */ -/********************************************************************/ - -/* These functions *must* be inline or they will break horribly on - * SPARC, due to its weird semantics for save/restore flags. extern - * inline should prevent the kernel from linking or module from - * loading if they are not inlined. */ -static inline void wl_lock(struct wl_private *lp, - unsigned long *flags) -{ - spin_lock_irqsave(&lp->slock, *flags); -} - -static inline void wl_unlock(struct wl_private *lp, - unsigned long *flags) -{ - spin_unlock_irqrestore(&lp->slock, *flags); -} - -/********************************************************************/ -/* Interrupt enable disable functions */ -/********************************************************************/ - -static inline void wl_act_int_on(struct wl_private *lp) -{ - /* - * Only do something when the driver is handling - * interrupts. Handling starts at wl_open and - * ends at wl_close when not in RTS mode - */ - if(lp->is_handling_int == WL_HANDLING_INT) { - hcf_action( &lp->hcfCtx, HCF_ACT_INT_ON ); - } -} - -static inline void wl_act_int_off(struct wl_private *lp) -{ - /* - * Only do something when the driver is handling - * interrupts. Handling starts at wl_open and - * ends at wl_close when not in RTS mode - */ - if(lp->is_handling_int == WL_HANDLING_INT) { - hcf_action( &lp->hcfCtx, HCF_ACT_INT_OFF ); - } -} - -#endif // __WAVELAN2_H__ diff --git a/drivers/staging/wlags49_h2/wl_main.c b/drivers/staging/wlags49_h2/wl_main.c deleted file mode 100644 index fc98b6dbdb89..000000000000 --- a/drivers/staging/wlags49_h2/wl_main.c +++ /dev/null @@ -1,3702 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * This file contains the main driver entry points and other adapter - * specific routines. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -/******************************************************************************* - * constant definitions - ******************************************************************************/ - -/* Allow support for calling system fcns to access F/W image file */ -#define __KERNEL_SYSCALLS__ - -/******************************************************************************* - * include files - ******************************************************************************/ -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#define BIN_DL 0 -#if BIN_DL -#include -#endif /* BIN_DL */ - - -#include - -#include -#include -/* in order to get around:: wl_main.c:2229: `HREG_EV_RDMAD' undeclared (first use in this function) */ -#include - -#include -#include -#include -#include -#include -#include - -#ifdef USE_PROFILE -#include -#endif /* USE_PROFILE */ - -#ifdef BUS_PCMCIA -#include -#endif /* BUS_PCMCIA */ - -#ifdef BUS_PCI -#include -#endif /* BUS_PCI */ -/******************************************************************************* - * macro definitions - ******************************************************************************/ -#define VALID_PARAM(C) \ - { \ - if (!(C)) { \ - printk(KERN_INFO "Wireless, parameter error: \"%s\"\n", #C); \ - goto failed; \ - } \ - } -/******************************************************************************* - * local functions - ******************************************************************************/ -void wl_isr_handler(unsigned long p); - -#if 0 //SCULL_USE_PROC /* don't waste space if unused */ -static int scull_read_procmem(struct seq_file *m, void *v); -static int write_int(struct file *file, const char *buffer, unsigned long count, void *data); - -/* - * seq_file wrappers for procfile show routines. - */ -static int scull_read_procmem_open(struct inode *inode, struct file *file) -{ - return single_open(file, scull_read_procmem, PDE_DATA(inode)); -} - -static const struct file_operations scull_read_procmem_fops = { - .open = scull_read_procmem_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -#endif /* SCULL_USE_PROC */ - -/******************************************************************************* - * module parameter definitions - set with 'insmod' - ******************************************************************************/ -static p_u16 irq_mask = 0xdeb8; /* IRQ3,4,5,7,9,10,11,12,14,15 */ -static p_s8 irq_list[4] = { -1 }; - -#if 0 -MODULE_PARM(irq_mask, "h"); -MODULE_PARM_DESC(irq_mask, "IRQ mask [0xdeb8]"); -MODULE_PARM(irq_list, "1-4b"); -MODULE_PARM_DESC(irq_list, "IRQ list []"); -#endif - -static p_u8 PARM_AUTHENTICATION = PARM_DEFAULT_AUTHENTICATION; -static p_u16 PARM_AUTH_KEY_MGMT_SUITE = PARM_DEFAULT_AUTH_KEY_MGMT_SUITE; -static p_u16 PARM_BRSC_2GHZ = PARM_DEFAULT_BRSC_2GHZ; -static p_u16 PARM_BRSC_5GHZ = PARM_DEFAULT_BRSC_5GHZ; -static p_u16 PARM_COEXISTENCE = PARM_DEFAULT_COEXISTENCE; -static p_u16 PARM_CONNECTION_CONTROL = PARM_DEFAULT_CONNECTION_CONTROL; /* ;?rename and move */ -static p_char *PARM_CREATE_IBSS = PARM_DEFAULT_CREATE_IBSS_STR; -static p_char *PARM_DESIRED_SSID = PARM_DEFAULT_SSID; -static p_char *PARM_DOWNLOAD_FIRMWARE = ""; -static p_u16 PARM_ENABLE_ENCRYPTION = PARM_DEFAULT_ENABLE_ENCRYPTION; -static p_char *PARM_EXCLUDE_UNENCRYPTED = PARM_DEFAULT_EXCLUDE_UNENCRYPTED_STR; -static p_char *PARM_INTRA_BSS_RELAY = PARM_DEFAULT_INTRA_BSS_RELAY_STR; -static p_char *PARM_KEY1 = ""; -static p_char *PARM_KEY2 = ""; -static p_char *PARM_KEY3 = ""; -static p_char *PARM_KEY4 = ""; -static p_char *PARM_LOAD_BALANCING = PARM_DEFAULT_LOAD_BALANCING_STR; -static p_u16 PARM_MAX_SLEEP = PARM_DEFAULT_MAX_PM_SLEEP; -static p_char *PARM_MEDIUM_DISTRIBUTION = PARM_DEFAULT_MEDIUM_DISTRIBUTION_STR; -static p_char *PARM_MICROWAVE_ROBUSTNESS = PARM_DEFAULT_MICROWAVE_ROBUSTNESS_STR; -static p_char *PARM_MULTICAST_PM_BUFFERING = PARM_DEFAULT_MULTICAST_PM_BUFFERING_STR; -static p_u16 PARM_MULTICAST_RATE = PARM_DEFAULT_MULTICAST_RATE_2GHZ; -static p_char *PARM_MULTICAST_RX = PARM_DEFAULT_MULTICAST_RX_STR; -static p_u8 PARM_NETWORK_ADDR[ETH_ALEN] = PARM_DEFAULT_NETWORK_ADDR; -static p_u16 PARM_OWN_ATIM_WINDOW = PARM_DEFAULT_OWN_ATIM_WINDOW; -static p_u16 PARM_OWN_BEACON_INTERVAL = PARM_DEFAULT_OWN_BEACON_INTERVAL; -static p_u8 PARM_OWN_CHANNEL = PARM_DEFAULT_OWN_CHANNEL; -static p_u8 PARM_OWN_DTIM_PERIOD = PARM_DEFAULT_OWN_DTIM_PERIOD; -static p_char *PARM_OWN_NAME = PARM_DEFAULT_OWN_NAME; -static p_char *PARM_OWN_SSID = PARM_DEFAULT_SSID; -static p_u16 PARM_PM_ENABLED = WVLAN_PM_STATE_DISABLED; -static p_u16 PARM_PM_HOLDOVER_DURATION = PARM_DEFAULT_PM_HOLDOVER_DURATION; -static p_u8 PARM_PORT_TYPE = PARM_DEFAULT_PORT_TYPE; -static p_char *PARM_PROMISCUOUS_MODE = PARM_DEFAULT_PROMISCUOUS_MODE_STR; -static p_char *PARM_REJECT_ANY = PARM_DEFAULT_REJECT_ANY_STR; -#ifdef USE_WDS -static p_u16 PARM_RTS_THRESHOLD1 = PARM_DEFAULT_RTS_THRESHOLD; -static p_u16 PARM_RTS_THRESHOLD2 = PARM_DEFAULT_RTS_THRESHOLD; -static p_u16 PARM_RTS_THRESHOLD3 = PARM_DEFAULT_RTS_THRESHOLD; -static p_u16 PARM_RTS_THRESHOLD4 = PARM_DEFAULT_RTS_THRESHOLD; -static p_u16 PARM_RTS_THRESHOLD5 = PARM_DEFAULT_RTS_THRESHOLD; -static p_u16 PARM_RTS_THRESHOLD6 = PARM_DEFAULT_RTS_THRESHOLD; -#endif /* USE_WDS */ -static p_u16 PARM_RTS_THRESHOLD = PARM_DEFAULT_RTS_THRESHOLD; -static p_u16 PARM_SRSC_2GHZ = PARM_DEFAULT_SRSC_2GHZ; -static p_u16 PARM_SRSC_5GHZ = PARM_DEFAULT_SRSC_5GHZ; -static p_u8 PARM_SYSTEM_SCALE = PARM_DEFAULT_SYSTEM_SCALE; -static p_u8 PARM_TX_KEY = PARM_DEFAULT_TX_KEY; -static p_u16 PARM_TX_POW_LEVEL = PARM_DEFAULT_TX_POW_LEVEL; -#ifdef USE_WDS -static p_u16 PARM_TX_RATE1 = PARM_DEFAULT_TX_RATE_2GHZ; -static p_u16 PARM_TX_RATE2 = PARM_DEFAULT_TX_RATE_2GHZ; -static p_u16 PARM_TX_RATE3 = PARM_DEFAULT_TX_RATE_2GHZ; -static p_u16 PARM_TX_RATE4 = PARM_DEFAULT_TX_RATE_2GHZ; -static p_u16 PARM_TX_RATE5 = PARM_DEFAULT_TX_RATE_2GHZ; -static p_u16 PARM_TX_RATE6 = PARM_DEFAULT_TX_RATE_2GHZ; -#endif /* USE_WDS */ -static p_u16 PARM_TX_RATE = PARM_DEFAULT_TX_RATE_2GHZ; -#ifdef USE_WDS -static p_u8 PARM_WDS_ADDRESS1[ETH_ALEN] = PARM_DEFAULT_NETWORK_ADDR; -static p_u8 PARM_WDS_ADDRESS2[ETH_ALEN] = PARM_DEFAULT_NETWORK_ADDR; -static p_u8 PARM_WDS_ADDRESS3[ETH_ALEN] = PARM_DEFAULT_NETWORK_ADDR; -static p_u8 PARM_WDS_ADDRESS4[ETH_ALEN] = PARM_DEFAULT_NETWORK_ADDR; -static p_u8 PARM_WDS_ADDRESS5[ETH_ALEN] = PARM_DEFAULT_NETWORK_ADDR; -static p_u8 PARM_WDS_ADDRESS6[ETH_ALEN] = PARM_DEFAULT_NETWORK_ADDR; -#endif /* USE_WDS */ - - -#if 0 -MODULE_PARM(PARM_DESIRED_SSID, "s"); -MODULE_PARM_DESC(PARM_DESIRED_SSID, "Network Name () [ANY]"); -MODULE_PARM(PARM_OWN_SSID, "s"); -MODULE_PARM_DESC(PARM_OWN_SSID, "Network Name () [ANY]"); -MODULE_PARM(PARM_OWN_CHANNEL, "b"); -MODULE_PARM_DESC(PARM_OWN_CHANNEL, "Channel (0 - 14) [0]"); -MODULE_PARM(PARM_SYSTEM_SCALE, "b"); -MODULE_PARM_DESC(PARM_SYSTEM_SCALE, "Distance Between APs (1 - 3) [1]"); -MODULE_PARM(PARM_TX_RATE, "b"); -MODULE_PARM_DESC(PARM_TX_RATE, "Transmit Rate Control"); -MODULE_PARM(PARM_RTS_THRESHOLD, "h"); -MODULE_PARM_DESC(PARM_RTS_THRESHOLD, "Medium Reservation (RTS/CTS Fragment Length) (256 - 2347) [2347]"); -MODULE_PARM(PARM_MICROWAVE_ROBUSTNESS, "s"); -MODULE_PARM_DESC(PARM_MICROWAVE_ROBUSTNESS, "Microwave Oven Robustness Enabled ( N or Y) [N]"); -MODULE_PARM(PARM_OWN_NAME, "s"); -MODULE_PARM_DESC(PARM_OWN_NAME, "Station Name () [Linux]"); - -MODULE_PARM(PARM_ENABLE_ENCRYPTION, "b"); -MODULE_PARM_DESC(PARM_ENABLE_ENCRYPTION, "Encryption Mode (0 - 7) [0]"); - -MODULE_PARM(PARM_KEY1, "s"); -MODULE_PARM_DESC(PARM_KEY1, "Data Encryption Key 1 () []"); -MODULE_PARM(PARM_KEY2, "s"); -MODULE_PARM_DESC(PARM_KEY2, "Data Encryption Key 2 () []"); -MODULE_PARM(PARM_KEY3, "s"); -MODULE_PARM_DESC(PARM_KEY3, "Data Encryption Key 3 () []"); -MODULE_PARM(PARM_KEY4, "s"); -MODULE_PARM_DESC(PARM_KEY4, "Data Encryption Key 4 () []"); -MODULE_PARM(PARM_TX_KEY, "b"); -MODULE_PARM_DESC(PARM_TX_KEY, "Transmit Key ID (1 - 4) [1]"); -MODULE_PARM(PARM_MULTICAST_RATE, "b"); -MODULE_PARM_DESC(PARM_MULTICAST_RATE, "Multicast Rate"); -MODULE_PARM(PARM_DOWNLOAD_FIRMWARE, "s"); -MODULE_PARM_DESC(PARM_DOWNLOAD_FIRMWARE, "filename of firmware image"); - -MODULE_PARM(PARM_AUTH_KEY_MGMT_SUITE, "b"); -MODULE_PARM_DESC(PARM_AUTH_KEY_MGMT_SUITE, "Authentication Key Management suite (0-4) [0]"); - -MODULE_PARM(PARM_LOAD_BALANCING, "s"); -MODULE_PARM_DESC(PARM_LOAD_BALANCING, "Load Balancing Enabled ( N or Y) [Y]"); -MODULE_PARM(PARM_MEDIUM_DISTRIBUTION, "s"); -MODULE_PARM_DESC(PARM_MEDIUM_DISTRIBUTION, "Medium Distribution Enabled ( N or Y) [Y]"); -MODULE_PARM(PARM_TX_POW_LEVEL, "b"); -MODULE_PARM_DESC(PARM_TX_POW_LEVEL, "Transmit Power (0 - 6) [3]"); -MODULE_PARM(PARM_SRSC_2GHZ, "b"); -MODULE_PARM_DESC(PARM_SRSC_2GHZ, "Supported Rate Set Control 2.4 GHz"); -MODULE_PARM(PARM_SRSC_5GHZ, "b"); -MODULE_PARM_DESC(PARM_SRSC_5GHZ, "Supported Rate Set Control 5.0 GHz"); -MODULE_PARM(PARM_BRSC_2GHZ, "b"); -MODULE_PARM_DESC(PARM_BRSC_2GHZ, "Basic Rate Set Control 2.4 GHz"); -MODULE_PARM(PARM_BRSC_5GHZ, "b"); -MODULE_PARM_DESC(PARM_BRSC_5GHZ, "Basic Rate Set Control 5.0 GHz"); -#if 1 /* (HCF_TYPE) & HCF_TYPE_STA */ -/* ;?seems reasonable that even an AP-only driver could afford this small additional footprint */ -MODULE_PARM(PARM_PM_ENABLED, "h"); -MODULE_PARM_DESC(PARM_PM_ENABLED, "Power Management State (0 - 2, 8001 - 8002) [0]"); -MODULE_PARM(PARM_PORT_TYPE, "b"); -MODULE_PARM_DESC(PARM_PORT_TYPE, "Port Type (1 - 3) [1]"); -/* - * ;?MODULE_PARM(PARM_CREATE_IBSS, "s"); - *;?MODULE_PARM_DESC(PARM_CREATE_IBSS, "Create IBSS ( N or Y) [N]"); - *;?MODULE_PARM(PARM_MULTICAST_RX, "s"); - *;?MODULE_PARM_DESC(PARM_MULTICAST_RX, "Multicast Receive Enable ( N or Y) [Y]"); - *;?MODULE_PARM(PARM_MAX_SLEEP, "h"); - *;?MODULE_PARM_DESC(PARM_MAX_SLEEP, "Maximum Power Management Sleep Duration (0 - 65535) [100]"); - *;?MODULE_PARM(PARM_NETWORK_ADDR, "6b"); - *;?MODULE_PARM_DESC(PARM_NETWORK_ADDR, "Hardware Ethernet Address ([0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff]) []"); - *;?MODULE_PARM(PARM_AUTHENTICATION, "b"); - * - *tracker 12448 - *;?MODULE_PARM_DESC(PARM_AUTHENTICATION, "Authentication Type (0-2) [0] 0=Open 1=SharedKey 2=LEAP"); - *;?MODULE_PARM_DESC(authentication, "Authentication Type (1-2) [1] 1=Open 2=SharedKey"); - *tracker 12448 - * - *;?MODULE_PARM(PARM_OWN_ATIM_WINDOW, "b"); - *;?MODULE_PARM_DESC(PARM_OWN_ATIM_WINDOW, "ATIM Window time in TU for IBSS creation (0-100) [0]"); - *;?MODULE_PARM(PARM_PM_HOLDOVER_DURATION, "b"); - *;?MODULE_PARM_DESC(PARM_PM_HOLDOVER_DURATION, "Time station remains awake after MAC frame transfer when PM is on (0-65535) [100]"); - *;?MODULE_PARM(PARM_PROMISCUOUS_MODE, "s"); - *;?MODULE_PARM_DESC(PARM_PROMISCUOUS_MODE, "Promiscuous Mode Enable ( Y or N ) [N]" ); - *;? - */ -MODULE_PARM(PARM_CONNECTION_CONTROL, "b"); -MODULE_PARM_DESC(PARM_CONNECTION_CONTROL, "Connection Control (0 - 3) [2]"); -#endif /* HCF_STA */ -#if 1 /* ;? (HCF_TYPE) & HCF_TYPE_AP */ - /* ;?should we restore this to allow smaller memory footprint */ -MODULE_PARM(PARM_OWN_DTIM_PERIOD, "b"); -MODULE_PARM_DESC(PARM_OWN_DTIM_PERIOD, "DTIM Period (0 - 255) [1]"); -MODULE_PARM(PARM_REJECT_ANY, "s"); -MODULE_PARM_DESC(PARM_REJECT_ANY, "Closed System ( N or Y) [N]"); -MODULE_PARM(PARM_EXCLUDE_UNENCRYPTED, "s"); -MODULE_PARM_DESC(PARM_EXCLUDE_UNENCRYPTED, "Deny non-encrypted ( N or Y) [Y]"); -MODULE_PARM(PARM_MULTICAST_PM_BUFFERING,"s"); -MODULE_PARM_DESC(PARM_MULTICAST_PM_BUFFERING, "Buffer MAC frames for Tx after DTIM ( Y or N) [Y]"); -MODULE_PARM(PARM_INTRA_BSS_RELAY, "s"); -MODULE_PARM_DESC(PARM_INTRA_BSS_RELAY, "IntraBSS Relay ( N or Y) [Y]"); -MODULE_PARM(PARM_RTS_THRESHOLD1, "h"); -MODULE_PARM_DESC(PARM_RTS_THRESHOLD1, "RTS Threshold, WDS Port 1 (256 - 2347) [2347]"); -MODULE_PARM(PARM_RTS_THRESHOLD2, "h"); -MODULE_PARM_DESC(PARM_RTS_THRESHOLD2, "RTS Threshold, WDS Port 2 (256 - 2347) [2347]"); -MODULE_PARM(PARM_RTS_THRESHOLD3, "h"); -MODULE_PARM_DESC(PARM_RTS_THRESHOLD3, "RTS Threshold, WDS Port 3 (256 - 2347) [2347]"); -MODULE_PARM(PARM_RTS_THRESHOLD4, "h"); -MODULE_PARM_DESC(PARM_RTS_THRESHOLD4, "RTS Threshold, WDS Port 4 (256 - 2347) [2347]"); -MODULE_PARM(PARM_RTS_THRESHOLD5, "h"); -MODULE_PARM_DESC(PARM_RTS_THRESHOLD5, "RTS Threshold, WDS Port 5 (256 - 2347) [2347]"); -MODULE_PARM(PARM_RTS_THRESHOLD6, "h"); -MODULE_PARM_DESC(PARM_RTS_THRESHOLD6, "RTS Threshold, WDS Port 6 (256 - 2347) [2347]"); -MODULE_PARM(PARM_TX_RATE1, "b"); -MODULE_PARM_DESC(PARM_TX_RATE1, "Transmit Rate Control, WDS Port 1 (1 - 7) [3]"); -MODULE_PARM(PARM_TX_RATE2, "b"); -MODULE_PARM_DESC(PARM_TX_RATE2, "Transmit Rate Control, WDS Port 2 (1 - 7) [3]"); -MODULE_PARM(PARM_TX_RATE3, "b"); -MODULE_PARM_DESC(PARM_TX_RATE3, "Transmit Rate Control, WDS Port 3 (1 - 7) [3]"); -MODULE_PARM(PARM_TX_RATE4, "b"); -MODULE_PARM_DESC(PARM_TX_RATE4, "Transmit Rate Control, WDS Port 4 (1 - 7) [3]"); -MODULE_PARM(PARM_TX_RATE5, "b"); -MODULE_PARM_DESC(PARM_TX_RATE5, "Transmit Rate Control, WDS Port 5 (1 - 7) [3]"); -MODULE_PARM(PARM_TX_RATE6, "b"); -MODULE_PARM_DESC(PARM_TX_RATE6, "Transmit Rate Control, WDS Port 6 (1 - 7) [3]"); -MODULE_PARM(PARM_WDS_ADDRESS1, "6b"); -MODULE_PARM_DESC(PARM_WDS_ADDRESS1, "MAC Address, WDS Port 1 ([0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff]) [{0}]"); -MODULE_PARM(PARM_WDS_ADDRESS2, "6b"); -MODULE_PARM_DESC(PARM_WDS_ADDRESS2, "MAC Address, WDS Port 2 ([0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff]) [{0}]"); -MODULE_PARM(PARM_WDS_ADDRESS3, "6b"); -MODULE_PARM_DESC(PARM_WDS_ADDRESS3, "MAC Address, WDS Port 3 ([0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff]) [{0}]"); -MODULE_PARM(PARM_WDS_ADDRESS4, "6b"); -MODULE_PARM_DESC(PARM_WDS_ADDRESS4, "MAC Address, WDS Port 4 ([0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff]) [{0}]"); -MODULE_PARM(PARM_WDS_ADDRESS5, "6b"); -MODULE_PARM_DESC(PARM_WDS_ADDRESS5, "MAC Address, WDS Port 5 ([0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff]) [{0}]"); -MODULE_PARM(PARM_WDS_ADDRESS6, "6b"); -MODULE_PARM_DESC(PARM_WDS_ADDRESS6, "MAC Address, WDS Port 6 ([0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff],[0x00-0xff]) [{0}]"); - -MODULE_PARM(PARM_OWN_BEACON_INTERVAL, "b"); -MODULE_PARM_DESC(PARM_OWN_BEACON_INTERVAL, "Own Beacon Interval (20 - 200) [100]"); -MODULE_PARM(PARM_COEXISTENCE, "b"); -MODULE_PARM_DESC(PARM_COEXISTENCE, "Coexistence (0-7) [0]"); - -#endif /* HCF_AP */ -#endif - -/* END NEW PARAMETERS */ -/******************************************************************************* - * debugging specifics - ******************************************************************************/ -#if DBG - -static p_u32 pc_debug = DBG_LVL; -/* - * MODULE_PARM(pc_debug, "i"); - *static ;?conflicts with my understanding of CL parameters and breaks now I moved - * the correspondig logic to wl_profile - */ p_u32 DebugFlag = ~0; /* recognizable "undefined value" rather then DBG_DEFAULTS; */ -/* MODULE_PARM(DebugFlag, "l"); */ - -static struct dbg_info wl_info = { KBUILD_MODNAME, 0, 0 }; -struct dbg_info *DbgInfo = &wl_info; - -#endif /* DBG */ -#ifdef USE_RTS - -static p_char *useRTS = "N"; -MODULE_PARM(useRTS, "s"); -MODULE_PARM_DESC(useRTS, "Use RTS test interface ( N or Y) [N]"); - -#endif /* USE_RTS */ -/******************************************************************************* - * firmware download specifics - ******************************************************************************/ -extern struct CFG_RANGE2_STRCT BASED - cfg_drv_act_ranges_pri; // describes primary-actor range of HCF - -#if 0 //;? (HCF_TYPE) & HCF_TYPE_AP -extern memimage ap; // AP firmware image to be downloaded -#endif /* HCF_AP */ - -#if 1 //;? (HCF_TYPE) & HCF_TYPE_STA -//extern memimage station; // STA firmware image to be downloaded -extern memimage fw_image; // firmware image to be downloaded -#endif /* HCF_STA */ - - -int wl_insert(struct net_device *dev) -{ - int result = 0; - int hcf_status = HCF_SUCCESS; - int i; - unsigned long flags = 0; - struct wl_private *lp = wl_priv(dev); - - /* Initialize the adapter hardware. */ - memset(&(lp->hcfCtx), 0, sizeof(IFB_STRCT)); - - /* Initialize the adapter parameters. */ - spin_lock_init(&(lp->slock)); - - /* Initialize states */ - //lp->lockcount = 0; //PE1DNN - lp->is_handling_int = WL_NOT_HANDLING_INT; - lp->firmware_present = WL_FRIMWARE_NOT_PRESENT; - - lp->dev = dev; - - DBG_PARAM(DbgInfo, "irq_mask", "0x%04x", irq_mask & 0x0FFFF); - DBG_PARAM(DbgInfo, "irq_list", "0x%02x 0x%02x 0x%02x 0x%02x", - irq_list[0] & 0x0FF, irq_list[1] & 0x0FF, - irq_list[2] & 0x0FF, irq_list[3] & 0x0FF); - DBG_PARAM(DbgInfo, PARM_NAME_DESIRED_SSID, "\"%s\"", PARM_DESIRED_SSID); - DBG_PARAM(DbgInfo, PARM_NAME_OWN_SSID, "\"%s\"", PARM_OWN_SSID); - DBG_PARAM(DbgInfo, PARM_NAME_OWN_CHANNEL, "%d", PARM_OWN_CHANNEL); - DBG_PARAM(DbgInfo, PARM_NAME_SYSTEM_SCALE, "%d", PARM_SYSTEM_SCALE); - DBG_PARAM(DbgInfo, PARM_NAME_TX_RATE, "%d", PARM_TX_RATE); - DBG_PARAM(DbgInfo, PARM_NAME_RTS_THRESHOLD, "%d", PARM_RTS_THRESHOLD); - DBG_PARAM(DbgInfo, PARM_NAME_MICROWAVE_ROBUSTNESS, "\"%s\"", PARM_MICROWAVE_ROBUSTNESS); - DBG_PARAM(DbgInfo, PARM_NAME_OWN_NAME, "\"%s\"", PARM_OWN_NAME); -//;? DBG_PARAM( DbgInfo, PARM_NAME_ENABLE_ENCRYPTION, "\"%s\"", PARM_ENABLE_ENCRYPTION ); - DBG_PARAM(DbgInfo, PARM_NAME_KEY1, "\"%s\"", PARM_KEY1); - DBG_PARAM(DbgInfo, PARM_NAME_KEY2, "\"%s\"", PARM_KEY2); - DBG_PARAM(DbgInfo, PARM_NAME_KEY3, "\"%s\"", PARM_KEY3); - DBG_PARAM(DbgInfo, PARM_NAME_KEY4, "\"%s\"", PARM_KEY4); - DBG_PARAM(DbgInfo, PARM_NAME_TX_KEY, "%d", PARM_TX_KEY); - DBG_PARAM(DbgInfo, PARM_NAME_MULTICAST_RATE, "%d", PARM_MULTICAST_RATE); - DBG_PARAM(DbgInfo, PARM_NAME_DOWNLOAD_FIRMWARE, "\"%s\"", PARM_DOWNLOAD_FIRMWARE); - DBG_PARAM(DbgInfo, PARM_NAME_AUTH_KEY_MGMT_SUITE, "%d", PARM_AUTH_KEY_MGMT_SUITE); -//;?#if (HCF_TYPE) & HCF_TYPE_STA - //;?should we make this code conditional depending on in STA mode -//;? DBG_PARAM( DbgInfo, PARM_NAME_PORT_TYPE, "%d", PARM_PORT_TYPE ); - DBG_PARAM(DbgInfo, PARM_NAME_PM_ENABLED, "%04x", PARM_PM_ENABLED); -//;? DBG_PARAM( DbgInfo, PARM_NAME_CREATE_IBSS, "\"%s\"", PARM_CREATE_IBSS ); -//;? DBG_PARAM( DbgInfo, PARM_NAME_MULTICAST_RX, "\"%s\"", PARM_MULTICAST_RX ); -//;? DBG_PARAM( DbgInfo, PARM_NAME_MAX_SLEEP, "%d", PARM_MAX_SLEEP ); -/* - DBG_PARAM(DbgInfo, PARM_NAME_NETWORK_ADDR, "\"%pM\"", - PARM_NETWORK_ADDR); - */ -//;? DBG_PARAM( DbgInfo, PARM_NAME_AUTHENTICATION, "%d", PARM_AUTHENTICATION ); -//;? DBG_PARAM( DbgInfo, PARM_NAME_OWN_ATIM_WINDOW, "%d", PARM_OWN_ATIM_WINDOW ); -//;? DBG_PARAM( DbgInfo, PARM_NAME_PM_HOLDOVER_DURATION, "%d", PARM_PM_HOLDOVER_DURATION ); -//;? DBG_PARAM( DbgInfo, PARM_NAME_PROMISCUOUS_MODE, "\"%s\"", PARM_PROMISCUOUS_MODE ); -//;?#endif /* HCF_STA */ -#if 1 //;? (HCF_TYPE) & HCF_TYPE_AP - //;?should we restore this to allow smaller memory footprint - //;?I guess: no, since this is Debug mode only - DBG_PARAM(DbgInfo, PARM_NAME_OWN_DTIM_PERIOD, "%d", PARM_OWN_DTIM_PERIOD); - DBG_PARAM(DbgInfo, PARM_NAME_REJECT_ANY, "\"%s\"", PARM_REJECT_ANY); - DBG_PARAM(DbgInfo, PARM_NAME_EXCLUDE_UNENCRYPTED, "\"%s\"", PARM_EXCLUDE_UNENCRYPTED); - DBG_PARAM(DbgInfo, PARM_NAME_MULTICAST_PM_BUFFERING, "\"%s\"", PARM_MULTICAST_PM_BUFFERING); - DBG_PARAM(DbgInfo, PARM_NAME_INTRA_BSS_RELAY, "\"%s\"", PARM_INTRA_BSS_RELAY); -#ifdef USE_WDS - DBG_PARAM(DbgInfo, PARM_NAME_RTS_THRESHOLD1, "%d", PARM_RTS_THRESHOLD1); - DBG_PARAM(DbgInfo, PARM_NAME_RTS_THRESHOLD2, "%d", PARM_RTS_THRESHOLD2); - DBG_PARAM(DbgInfo, PARM_NAME_RTS_THRESHOLD3, "%d", PARM_RTS_THRESHOLD3); - DBG_PARAM(DbgInfo, PARM_NAME_RTS_THRESHOLD4, "%d", PARM_RTS_THRESHOLD4); - DBG_PARAM(DbgInfo, PARM_NAME_RTS_THRESHOLD5, "%d", PARM_RTS_THRESHOLD5); - DBG_PARAM(DbgInfo, PARM_NAME_RTS_THRESHOLD6, "%d", PARM_RTS_THRESHOLD6); - DBG_PARAM(DbgInfo, PARM_NAME_TX_RATE1, "%d", PARM_TX_RATE1); - DBG_PARAM(DbgInfo, PARM_NAME_TX_RATE2, "%d", PARM_TX_RATE2); - DBG_PARAM(DbgInfo, PARM_NAME_TX_RATE3, "%d", PARM_TX_RATE3); - DBG_PARAM(DbgInfo, PARM_NAME_TX_RATE4, "%d", PARM_TX_RATE4); - DBG_PARAM(DbgInfo, PARM_NAME_TX_RATE5, "%d", PARM_TX_RATE5); - DBG_PARAM(DbgInfo, PARM_NAME_TX_RATE6, "%d", PARM_TX_RATE6); - DBG_PARAM(DbgInfo, PARM_NAME_WDS_ADDRESS1, "\"%pM\"", - PARM_WDS_ADDRESS1); - DBG_PARAM(DbgInfo, PARM_NAME_WDS_ADDRESS2, "\"%pM\"", - PARM_WDS_ADDRESS2); - DBG_PARAM(DbgInfo, PARM_NAME_WDS_ADDRESS3, "\"%pM\"", - PARM_WDS_ADDRESS3); - DBG_PARAM(DbgInfo, PARM_NAME_WDS_ADDRESS4, "\"%pM\"", - PARM_WDS_ADDRESS4); - DBG_PARAM(DbgInfo, PARM_NAME_WDS_ADDRESS5, "\"%pM\"", - PARM_WDS_ADDRESS5); - DBG_PARAM(DbgInfo, PARM_NAME_WDS_ADDRESS6, "\"%pM\"", - PARM_WDS_ADDRESS6); -#endif /* USE_WDS */ -#endif /* HCF_AP */ - - VALID_PARAM(!PARM_DESIRED_SSID || (strlen(PARM_DESIRED_SSID) <= PARM_MAX_NAME_LEN)); - VALID_PARAM(!PARM_OWN_SSID || (strlen(PARM_OWN_SSID) <= PARM_MAX_NAME_LEN)); - VALID_PARAM((PARM_OWN_CHANNEL <= PARM_MAX_OWN_CHANNEL)); - VALID_PARAM((PARM_SYSTEM_SCALE >= PARM_MIN_SYSTEM_SCALE) && (PARM_SYSTEM_SCALE <= PARM_MAX_SYSTEM_SCALE)); - VALID_PARAM((PARM_TX_RATE >= PARM_MIN_TX_RATE) && (PARM_TX_RATE <= PARM_MAX_TX_RATE)); - VALID_PARAM((PARM_RTS_THRESHOLD <= PARM_MAX_RTS_THRESHOLD)); - VALID_PARAM(!PARM_MICROWAVE_ROBUSTNESS || strchr("NnYy", PARM_MICROWAVE_ROBUSTNESS[0]) != NULL); - VALID_PARAM(!PARM_OWN_NAME || (strlen(PARM_NAME_OWN_NAME) <= PARM_MAX_NAME_LEN)); - VALID_PARAM((PARM_ENABLE_ENCRYPTION <= PARM_MAX_ENABLE_ENCRYPTION)); - VALID_PARAM(is_valid_key_string(PARM_KEY1)); - VALID_PARAM(is_valid_key_string(PARM_KEY2)); - VALID_PARAM(is_valid_key_string(PARM_KEY3)); - VALID_PARAM(is_valid_key_string(PARM_KEY4)); - VALID_PARAM((PARM_TX_KEY >= PARM_MIN_TX_KEY) && (PARM_TX_KEY <= PARM_MAX_TX_KEY)); - - VALID_PARAM((PARM_MULTICAST_RATE >= PARM_MIN_MULTICAST_RATE) && - (PARM_MULTICAST_RATE <= PARM_MAX_MULTICAST_RATE)); - - VALID_PARAM(!PARM_DOWNLOAD_FIRMWARE || (strlen(PARM_DOWNLOAD_FIRMWARE) <= 255 /*;?*/)); - VALID_PARAM((PARM_AUTH_KEY_MGMT_SUITE < PARM_MAX_AUTH_KEY_MGMT_SUITE)); - - VALID_PARAM(!PARM_LOAD_BALANCING || strchr("NnYy", PARM_LOAD_BALANCING[0]) != NULL); - VALID_PARAM( !PARM_MEDIUM_DISTRIBUTION || strchr( "NnYy", PARM_MEDIUM_DISTRIBUTION[0] ) != NULL ); - VALID_PARAM(( PARM_TX_POW_LEVEL <= PARM_MAX_TX_POW_LEVEL )); - - VALID_PARAM(( PARM_PORT_TYPE >= PARM_MIN_PORT_TYPE ) && ( PARM_PORT_TYPE <= PARM_MAX_PORT_TYPE )); - VALID_PARAM( PARM_PM_ENABLED <= WVLAN_PM_STATE_STANDARD || - ( PARM_PM_ENABLED & 0x7FFF ) <= WVLAN_PM_STATE_STANDARD ); - VALID_PARAM( !PARM_CREATE_IBSS || strchr( "NnYy", PARM_CREATE_IBSS[0] ) != NULL ); - VALID_PARAM( !PARM_MULTICAST_RX || strchr( "NnYy", PARM_MULTICAST_RX[0] ) != NULL ); - VALID_PARAM(( PARM_MAX_SLEEP <= PARM_MAX_MAX_PM_SLEEP )); - VALID_PARAM(( PARM_AUTHENTICATION <= PARM_MAX_AUTHENTICATION )); - VALID_PARAM(( PARM_OWN_ATIM_WINDOW <= PARM_MAX_OWN_ATIM_WINDOW )); - VALID_PARAM(( PARM_PM_HOLDOVER_DURATION <= PARM_MAX_PM_HOLDOVER_DURATION )); - VALID_PARAM( !PARM_PROMISCUOUS_MODE || strchr( "NnYy", PARM_PROMISCUOUS_MODE[0] ) != NULL ); - VALID_PARAM(( PARM_CONNECTION_CONTROL <= PARM_MAX_CONNECTION_CONTROL )); - - VALID_PARAM(( PARM_OWN_DTIM_PERIOD >= PARM_MIN_OWN_DTIM_PERIOD )); - VALID_PARAM( !PARM_REJECT_ANY || strchr( "NnYy", PARM_REJECT_ANY[0] ) != NULL ); - VALID_PARAM( !PARM_EXCLUDE_UNENCRYPTED || strchr( "NnYy", PARM_EXCLUDE_UNENCRYPTED[0] ) != NULL ); - VALID_PARAM( !PARM_MULTICAST_PM_BUFFERING || strchr( "NnYy", PARM_MULTICAST_PM_BUFFERING[0] ) != NULL ); - VALID_PARAM( !PARM_INTRA_BSS_RELAY || strchr( "NnYy", PARM_INTRA_BSS_RELAY[0] ) != NULL ); -#ifdef USE_WDS - VALID_PARAM(( PARM_RTS_THRESHOLD1 <= PARM_MAX_RTS_THRESHOLD )); - VALID_PARAM(( PARM_RTS_THRESHOLD2 <= PARM_MAX_RTS_THRESHOLD )); - VALID_PARAM(( PARM_RTS_THRESHOLD3 <= PARM_MAX_RTS_THRESHOLD )); - VALID_PARAM(( PARM_RTS_THRESHOLD4 <= PARM_MAX_RTS_THRESHOLD )); - VALID_PARAM(( PARM_RTS_THRESHOLD5 <= PARM_MAX_RTS_THRESHOLD )); - VALID_PARAM(( PARM_RTS_THRESHOLD6 <= PARM_MAX_RTS_THRESHOLD )); - VALID_PARAM(( PARM_TX_RATE1 >= PARM_MIN_TX_RATE ) && (PARM_TX_RATE1 <= PARM_MAX_TX_RATE )); - VALID_PARAM(( PARM_TX_RATE2 >= PARM_MIN_TX_RATE ) && (PARM_TX_RATE2 <= PARM_MAX_TX_RATE )); - VALID_PARAM(( PARM_TX_RATE3 >= PARM_MIN_TX_RATE ) && (PARM_TX_RATE3 <= PARM_MAX_TX_RATE )); - VALID_PARAM(( PARM_TX_RATE4 >= PARM_MIN_TX_RATE ) && (PARM_TX_RATE4 <= PARM_MAX_TX_RATE )); - VALID_PARAM(( PARM_TX_RATE5 >= PARM_MIN_TX_RATE ) && (PARM_TX_RATE5 <= PARM_MAX_TX_RATE )); - VALID_PARAM(( PARM_TX_RATE6 >= PARM_MIN_TX_RATE ) && (PARM_TX_RATE6 <= PARM_MAX_TX_RATE )); -#endif /* USE_WDS */ - - VALID_PARAM(( PARM_OWN_BEACON_INTERVAL >= PARM_MIN_OWN_BEACON_INTERVAL ) && ( PARM_OWN_BEACON_INTERVAL <= PARM_MAX_OWN_BEACON_INTERVAL )); - VALID_PARAM(( PARM_COEXISTENCE <= PARM_COEXISTENCE )); - - /* Set the driver parameters from the passed in parameters. */ - - /* THESE MODULE PARAMETERS ARE TO BE DEPRECATED IN FAVOR OF A NAMING CONVENTION - WHICH IS INLINE WITH THE FORTHCOMING WAVELAN API */ - - /* START NEW PARAMETERS */ - - lp->Channel = PARM_OWN_CHANNEL; - lp->DistanceBetweenAPs = PARM_SYSTEM_SCALE; - - /* Need to determine how to handle the new bands for 5GHz */ - lp->TxRateControl[0] = PARM_DEFAULT_TX_RATE_2GHZ; - lp->TxRateControl[1] = PARM_DEFAULT_TX_RATE_5GHZ; - - lp->RTSThreshold = PARM_RTS_THRESHOLD; - - /* Need to determine how to handle the new bands for 5GHz */ - lp->MulticastRate[0] = PARM_DEFAULT_MULTICAST_RATE_2GHZ; - lp->MulticastRate[1] = PARM_DEFAULT_MULTICAST_RATE_5GHZ; - - if ( strchr( "Yy", PARM_MICROWAVE_ROBUSTNESS[0] ) != NULL ) - lp->MicrowaveRobustness = 1; - else - lp->MicrowaveRobustness = 0; - if ( PARM_DESIRED_SSID && ( strlen( PARM_DESIRED_SSID ) <= HCF_MAX_NAME_LEN )) - strcpy( lp->NetworkName, PARM_DESIRED_SSID ); - if ( PARM_OWN_SSID && ( strlen( PARM_OWN_SSID ) <= HCF_MAX_NAME_LEN )) - strcpy( lp->NetworkName, PARM_OWN_SSID ); - if ( PARM_OWN_NAME && ( strlen( PARM_OWN_NAME ) <= HCF_MAX_NAME_LEN )) - strcpy( lp->StationName, PARM_OWN_NAME ); - lp->EnableEncryption = PARM_ENABLE_ENCRYPTION; - if ( PARM_KEY1 && ( strlen( PARM_KEY1 ) <= MAX_KEY_LEN )) - strcpy( lp->Key1, PARM_KEY1 ); - if ( PARM_KEY2 && ( strlen( PARM_KEY2 ) <= MAX_KEY_LEN )) - strcpy( lp->Key2, PARM_KEY2 ); - if ( PARM_KEY3 && ( strlen( PARM_KEY3 ) <= MAX_KEY_LEN )) - strcpy( lp->Key3, PARM_KEY3 ); - if ( PARM_KEY4 && ( strlen( PARM_KEY4 ) <= MAX_KEY_LEN )) - strcpy( lp->Key4, PARM_KEY4 ); - - lp->TransmitKeyID = PARM_TX_KEY; - - key_string2key( lp->Key1, &(lp->DefaultKeys.key[0] )); - key_string2key( lp->Key2, &(lp->DefaultKeys.key[1] )); - key_string2key( lp->Key3, &(lp->DefaultKeys.key[2] )); - key_string2key( lp->Key4, &(lp->DefaultKeys.key[3] )); - - lp->DownloadFirmware = 1 ; //;?to be upgraded PARM_DOWNLOAD_FIRMWARE; - lp->AuthKeyMgmtSuite = PARM_AUTH_KEY_MGMT_SUITE; - - if ( strchr( "Yy", PARM_LOAD_BALANCING[0] ) != NULL ) - lp->loadBalancing = 1; - else - lp->loadBalancing = 0; - - if ( strchr( "Yy", PARM_MEDIUM_DISTRIBUTION[0] ) != NULL ) - lp->mediumDistribution = 1; - else - lp->mediumDistribution = 0; - - lp->txPowLevel = PARM_TX_POW_LEVEL; - - lp->srsc[0] = PARM_SRSC_2GHZ; - lp->srsc[1] = PARM_SRSC_5GHZ; - lp->brsc[0] = PARM_BRSC_2GHZ; - lp->brsc[1] = PARM_BRSC_5GHZ; -#if 1 //;? (HCF_TYPE) & HCF_TYPE_STA -//;?seems reasonable that even an AP-only driver could afford this small additional footprint - lp->PortType = PARM_PORT_TYPE; - lp->MaxSleepDuration = PARM_MAX_SLEEP; - lp->authentication = PARM_AUTHENTICATION; - lp->atimWindow = PARM_OWN_ATIM_WINDOW; - lp->holdoverDuration = PARM_PM_HOLDOVER_DURATION; - lp->PMEnabled = PARM_PM_ENABLED; //;? - if ( strchr( "Yy", PARM_CREATE_IBSS[0] ) != NULL ) - lp->CreateIBSS = 1; - else - lp->CreateIBSS = 0; - if ( strchr( "Nn", PARM_MULTICAST_RX[0] ) != NULL ) - lp->MulticastReceive = 0; - else - lp->MulticastReceive = 1; - if ( strchr( "Yy", PARM_PROMISCUOUS_MODE[0] ) != NULL ) - lp->promiscuousMode = 1; - else - lp->promiscuousMode = 0; - for( i = 0; i < ETH_ALEN; i++ ) - lp->MACAddress[i] = PARM_NETWORK_ADDR[i]; - - lp->connectionControl = PARM_CONNECTION_CONTROL; - -#endif /* HCF_STA */ -#if 1 //;? (HCF_TYPE) & HCF_TYPE_AP - //;?should we restore this to allow smaller memory footprint - lp->DTIMPeriod = PARM_OWN_DTIM_PERIOD; - - if ( strchr( "Yy", PARM_REJECT_ANY[0] ) != NULL ) - lp->RejectAny = 1; - else - lp->RejectAny = 0; - if ( strchr( "Nn", PARM_EXCLUDE_UNENCRYPTED[0] ) != NULL ) - lp->ExcludeUnencrypted = 0; - else - lp->ExcludeUnencrypted = 1; - if ( strchr( "Yy", PARM_MULTICAST_PM_BUFFERING[0] ) != NULL ) - lp->multicastPMBuffering = 1; - else - lp->multicastPMBuffering = 0; - if ( strchr( "Yy", PARM_INTRA_BSS_RELAY[0] ) != NULL ) - lp->intraBSSRelay = 1; - else - lp->intraBSSRelay = 0; - - lp->ownBeaconInterval = PARM_OWN_BEACON_INTERVAL; - lp->coexistence = PARM_COEXISTENCE; - -#ifdef USE_WDS - lp->wds_port[0].rtsThreshold = PARM_RTS_THRESHOLD1; - lp->wds_port[1].rtsThreshold = PARM_RTS_THRESHOLD2; - lp->wds_port[2].rtsThreshold = PARM_RTS_THRESHOLD3; - lp->wds_port[3].rtsThreshold = PARM_RTS_THRESHOLD4; - lp->wds_port[4].rtsThreshold = PARM_RTS_THRESHOLD5; - lp->wds_port[5].rtsThreshold = PARM_RTS_THRESHOLD6; - lp->wds_port[0].txRateCntl = PARM_TX_RATE1; - lp->wds_port[1].txRateCntl = PARM_TX_RATE2; - lp->wds_port[2].txRateCntl = PARM_TX_RATE3; - lp->wds_port[3].txRateCntl = PARM_TX_RATE4; - lp->wds_port[4].txRateCntl = PARM_TX_RATE5; - lp->wds_port[5].txRateCntl = PARM_TX_RATE6; - - for( i = 0; i < ETH_ALEN; i++ ) { - lp->wds_port[0].wdsAddress[i] = PARM_WDS_ADDRESS1[i]; - } - for( i = 0; i < ETH_ALEN; i++ ) { - lp->wds_port[1].wdsAddress[i] = PARM_WDS_ADDRESS2[i]; - } - for( i = 0; i < ETH_ALEN; i++ ) { - lp->wds_port[2].wdsAddress[i] = PARM_WDS_ADDRESS3[i]; - } - for( i = 0; i < ETH_ALEN; i++ ) { - lp->wds_port[3].wdsAddress[i] = PARM_WDS_ADDRESS4[i]; - } - for( i = 0; i < ETH_ALEN; i++ ) { - lp->wds_port[4].wdsAddress[i] = PARM_WDS_ADDRESS5[i]; - } - for( i = 0; i < ETH_ALEN; i++ ) { - lp->wds_port[5].wdsAddress[i] = PARM_WDS_ADDRESS6[i]; - } -#endif /* USE_WDS */ -#endif /* HCF_AP */ -#ifdef USE_RTS - if ( strchr( "Yy", useRTS[0] ) != NULL ) - lp->useRTS = 1; - else - lp->useRTS = 0; -#endif /* USE_RTS */ - - - /* END NEW PARAMETERS */ - - - wl_lock( lp, &flags ); - - /* Initialize the portState variable */ - lp->portState = WVLAN_PORT_STATE_DISABLED; - - /* Initialize the ScanResult struct */ - memset( &( lp->scan_results ), 0, sizeof( lp->scan_results )); - lp->scan_results.scan_complete = FALSE; - - /* Initialize the ProbeResult struct */ - memset( &( lp->probe_results ), 0, sizeof( lp->probe_results )); - lp->probe_results.scan_complete = FALSE; - lp->probe_num_aps = 0; - - - /* Initialize Tx queue stuff */ - memset( lp->txList, 0, sizeof( lp->txList )); - - INIT_LIST_HEAD( &( lp->txFree )); - - lp->txF.skb = NULL; - lp->txF.port = 0; - - - for( i = 0; i < DEFAULT_NUM_TX_FRAMES; i++ ) { - list_add_tail( &( lp->txList[i].node ), &( lp->txFree )); - } - - - for( i = 0; i < WVLAN_MAX_TX_QUEUES; i++ ) { - INIT_LIST_HEAD( &( lp->txQ[i] )); - } - - lp->netif_queue_on = TRUE; - lp->txQ_count = 0; - /* Initialize the use_dma element in the adapter structure. Not sure if - this should be a compile-time or run-time configurable. So for now, - implement as run-time and just define here */ -#ifdef WARP -#ifdef ENABLE_DMA - DBG_TRACE( DbgInfo, "HERMES 2.5 BUSMASTER DMA MODE\n" ); - lp->use_dma = 1; -#else - DBG_TRACE( DbgInfo, "HERMES 2.5 PORT I/O MODE\n" ); - lp->use_dma = 0; -#endif // ENABLE_DMA -#endif // WARP - - /* Register the ISR handler information here, so that it's not done - repeatedly in the ISR */ - tasklet_init(&lp->task, wl_isr_handler, (unsigned long)lp); - - /* Connect to the adapter */ - DBG_TRACE( DbgInfo, "Calling hcf_connect()...\n" ); - hcf_status = hcf_connect( &lp->hcfCtx, dev->base_addr ); - //HCF_ERR_INCOMP_FW is acceptable, because download must still take place - //HCF_ERR_INCOMP_PRI is not acceptable - if ( hcf_status != HCF_SUCCESS && hcf_status != HCF_ERR_INCOMP_FW ) { - DBG_ERROR( DbgInfo, "hcf_connect() failed, status: 0x%x\n", hcf_status ); - wl_unlock( lp, &flags ); - goto hcf_failed; - } - - //;?should set HCF_version and how about driver_stat - lp->driverInfo.IO_address = dev->base_addr; - lp->driverInfo.IO_range = HCF_NUM_IO_PORTS; //;?conditionally 0x40 or 0x80 seems better - lp->driverInfo.IRQ_number = dev->irq; - lp->driverInfo.card_stat = lp->hcfCtx.IFB_CardStat; - //;? what happened to frame_type - - /* Fill in the driver identity structure */ - lp->driverIdentity.len = ( sizeof( lp->driverIdentity ) / sizeof( hcf_16 )) - 1; - lp->driverIdentity.typ = CFG_DRV_IDENTITY; - lp->driverIdentity.comp_id = DRV_IDENTITY; - lp->driverIdentity.variant = DRV_VARIANT; - lp->driverIdentity.version_major = DRV_MAJOR_VERSION; - lp->driverIdentity.version_minor = DRV_MINOR_VERSION; - - - /* Start the card here - This needs to be done in order to get the - MAC address for the network layer */ - DBG_TRACE( DbgInfo, "Calling wvlan_go() to perform a card reset...\n" ); - hcf_status = wl_go( lp ); - - if ( hcf_status != HCF_SUCCESS ) { - DBG_ERROR( DbgInfo, "wl_go() failed\n" ); - wl_unlock( lp, &flags ); - goto hcf_failed; - } - - /* Certain RIDs must be set before enabling the ports */ - wl_put_ltv_init( lp ); - -#if 0 //;?why was this already commented out in wl_lkm_720 - /* Enable the ports */ - if ( wl_adapter_is_open( lp->dev )) { - /* Enable the ports */ - DBG_TRACE( DbgInfo, "Enabling Port 0\n" ); - hcf_status = wl_enable( lp ); - - if ( hcf_status != HCF_SUCCESS ) { - DBG_TRACE( DbgInfo, "Enable port 0 failed: 0x%x\n", hcf_status ); - } - -#if (HCF_TYPE) & HCF_TYPE_AP - DBG_TRACE( DbgInfo, "Enabling WDS Ports\n" ); - //wl_enable_wds_ports( lp ); -#endif /* (HCF_TYPE) & HCF_TYPE_AP */ - - } -#endif - - /* Fill out the MAC address information in the net_device struct */ - memcpy( lp->dev->dev_addr, lp->MACAddress, ETH_ALEN ); - dev->addr_len = ETH_ALEN; - - lp->is_registered = TRUE; - -#ifdef USE_PROFILE - /* Parse the config file for the sake of creating WDS ports if WDS is - configured there but not in the module options */ - parse_config( dev ); -#endif /* USE_PROFILE */ - - /* If we're going into AP Mode, register the "virtual" ethernet devices - needed for WDS */ - WL_WDS_NETDEV_REGISTER( lp ); - - /* Reset the DownloadFirmware variable in the private struct. If the - config file is not used, this will not matter; if it is used, it - will be reparsed in wl_open(). This is done because logic in wl_open - used to check if a firmware download is needed is broken by parsing - the file here; however, this parsing is needed to register WDS ports - in AP mode, if they are configured */ - lp->DownloadFirmware = WVLAN_DRV_MODE_STA; //;?download_firmware; - -#ifdef USE_RTS - if ( lp->useRTS == 1 ) { - DBG_TRACE( DbgInfo, "ENTERING RTS MODE...\n" ); - wl_act_int_off( lp ); - lp->is_handling_int = WL_NOT_HANDLING_INT; // Not handling interrupts anymore - - wl_disable( lp ); - - hcf_connect( &lp->hcfCtx, HCF_DISCONNECT); - } -#endif /* USE_RTS */ - - wl_unlock( lp, &flags ); - - DBG_TRACE( DbgInfo, "%s: Wireless, io_addr %#03lx, irq %d, ""mac_address ", - dev->name, dev->base_addr, dev->irq ); - - for( i = 0; i < ETH_ALEN; i++ ) { - printk( "%02X%c", dev->dev_addr[i], (( i < ( ETH_ALEN-1 )) ? ':' : '\n' )); - } - -#if 0 //SCULL_USE_PROC /* don't waste space if unused */ - proc_create_data( "wlags", 0, NULL, &scull_read_procmem_fops, dev ); - proc_mkdir("driver/wlags49", 0); -#endif /* SCULL_USE_PROC */ - - return result; - -hcf_failed: - wl_hcf_error( dev, hcf_status ); - -failed: - - DBG_ERROR( DbgInfo, "wl_insert() FAILED\n" ); - - if ( lp->is_registered == TRUE ) { - lp->is_registered = FALSE; - } - - WL_WDS_NETDEV_DEREGISTER( lp ); - - result = -EFAULT; - - return result; -} // wl_insert -/*============================================================================*/ - - -/******************************************************************************* - * wl_reset() - ******************************************************************************* - * - * DESCRIPTION: - * - * Reset the adapter. - * - * PARAMETERS: - * - * dev - a pointer to the net_device struct of the wireless device - * - * RETURNS: - * - * an HCF status code - * - ******************************************************************************/ -int wl_reset(struct net_device *dev) -{ - struct wl_private *lp = wl_priv(dev); - int hcf_status = HCF_SUCCESS; - - DBG_PARAM( DbgInfo, "dev", "%s (0x%p)", dev->name, dev ); - DBG_PARAM( DbgInfo, "dev->base_addr", "(%#03lx)", dev->base_addr ); - - /* - * The caller should already have a lock and - * disable the interrupts, we do not lock here, - * nor do we enable/disable interrupts! - */ - - DBG_TRACE( DbgInfo, "Device Base Address: %#03lx\n", dev->base_addr ); - if ( dev->base_addr ) { - /* Shutdown the adapter. */ - hcf_connect( &lp->hcfCtx, HCF_DISCONNECT ); - - /* Reset the driver information. */ - lp->txBytes = 0; - - /* Connect to the adapter. */ - hcf_status = hcf_connect( &lp->hcfCtx, dev->base_addr ); - if ( hcf_status != HCF_SUCCESS && hcf_status != HCF_ERR_INCOMP_FW ) { - DBG_ERROR( DbgInfo, "hcf_connect() failed, status: 0x%x\n", hcf_status ); - goto out; - } - - /* Check if firmware is present, if not change state */ - if ( hcf_status == HCF_ERR_INCOMP_FW ) { - lp->firmware_present = WL_FRIMWARE_NOT_PRESENT; - } - - /* Initialize the portState variable */ - lp->portState = WVLAN_PORT_STATE_DISABLED; - - /* Restart the adapter. */ - hcf_status = wl_go( lp ); - if ( hcf_status != HCF_SUCCESS ) { - DBG_ERROR( DbgInfo, "wl_go() failed, status: 0x%x\n", hcf_status ); - goto out; - } - - /* Certain RIDs must be set before enabling the ports */ - wl_put_ltv_init( lp ); - } else { - DBG_ERROR( DbgInfo, "Device Base Address INVALID!!!\n" ); - } - -out: - return hcf_status; -} // wl_reset -/*============================================================================*/ - - -/******************************************************************************* - * wl_go() - ******************************************************************************* - * - * DESCRIPTION: - * - * Reset the adapter. - * - * PARAMETERS: - * - * dev - a pointer to the net_device struct of the wireless device - * - * RETURNS: - * - * an HCF status code - * - ******************************************************************************/ -int wl_go( struct wl_private *lp ) -{ - int hcf_status = HCF_SUCCESS; - char *cp = NULL; //fw_image - int retries = 0; - - hcf_status = wl_disable( lp ); - if ( hcf_status != HCF_SUCCESS ) { - DBG_TRACE( DbgInfo, "Disable port 0 failed: 0x%x\n", hcf_status ); - - while (( hcf_status != HCF_SUCCESS ) && (retries < 10)) { - retries++; - hcf_status = wl_disable( lp ); - } - if ( hcf_status == HCF_SUCCESS ) { - DBG_TRACE( DbgInfo, "Disable port 0 succes : %d retries\n", retries ); - } else { - DBG_TRACE( DbgInfo, "Disable port 0 failed after: %d retries\n", retries ); - } - } - -#if 1 //;? (HCF_TYPE) & HCF_TYPE_AP - //DBG_TRACE( DbgInfo, "Disabling WDS Ports\n" ); - //wl_disable_wds_ports( lp ); -#endif /* (HCF_TYPE) & HCF_TYPE_AP */ - -//;?what was the purpose of this -// /* load the appropriate firmware image, depending on driver mode */ -// lp->ltvRecord.len = ( sizeof( CFG_RANGE20_STRCT ) / sizeof( hcf_16 )) - 1; -// lp->ltvRecord.typ = CFG_DRV_ACT_RANGES_PRI; -// hcf_get_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - -#if BIN_DL - if ( strlen( lp->fw_image_filename ) ) { -mm_segment_t fs; -int file_desc; -int rc; - - DBG_TRACE( DbgInfo, "F/W image:%s:\n", lp->fw_image_filename ); - /* Obtain a user-space process context, storing the original context */ - fs = get_fs( ); - set_fs( get_ds( )); - file_desc = open( lp->fw_image_filename, O_RDONLY, 0 ); - if ( file_desc == -1 ) { - DBG_ERROR( DbgInfo, "No image file found\n" ); - } else { - DBG_TRACE( DbgInfo, "F/W image file found\n" ); -#define DHF_ALLOC_SIZE 96000 //just below 96K, let's hope it suffices for now and for the future - cp = (char*)vmalloc( DHF_ALLOC_SIZE ); - if ( cp == NULL ) { - DBG_ERROR( DbgInfo, "error in vmalloc\n" ); - } else { - rc = read( file_desc, cp, DHF_ALLOC_SIZE ); - if ( rc == DHF_ALLOC_SIZE ) { - DBG_ERROR( DbgInfo, "buffer too small, %d\n", DHF_ALLOC_SIZE ); - } else if ( rc > 0 ) { - DBG_TRACE( DbgInfo, "read O.K.: %d bytes %.12s\n", rc, cp ); - rc = read( file_desc, &cp[rc], 1 ); - if ( rc == 0 ) { //;/change to an until-loop at rc<=0 - DBG_TRACE( DbgInfo, "no more to read\n" ); - } - } - if ( rc != 0 ) { - DBG_ERROR( DbgInfo, "file not read in one swoop or other error"\ - ", give up, too complicated, rc = %0X\n", rc ); - DBG_ERROR( DbgInfo, "still have to change code to get a real download now !!!!!!!!\n" ); - } else { - DBG_TRACE( DbgInfo, "before dhf_download_binary\n" ); - hcf_status = dhf_download_binary( (memimage *)cp ); - DBG_TRACE( DbgInfo, "after dhf_download_binary, before dhf_download_fw\n" ); - //;?improve error flow/handling - hcf_status = dhf_download_fw( &lp->hcfCtx, (memimage *)cp ); - DBG_TRACE( DbgInfo, "after dhf_download_fw\n" ); - } - vfree( cp ); - } - close( file_desc ); - } - set_fs( fs ); /* Return to the original context */ - } -#endif // BIN_DL - - /* If firmware is present but the type is unknown then download anyway */ - if ( (lp->firmware_present == WL_FRIMWARE_PRESENT) - && - ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) != COMP_ID_FW_STA ) - && - ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) != COMP_ID_FW_AP ) ) { - /* Unknown type, download needed. */ - lp->firmware_present = WL_FRIMWARE_NOT_PRESENT; - } - - if(lp->firmware_present == WL_FRIMWARE_NOT_PRESENT) - { - if ( cp == NULL ) { - DBG_TRACE( DbgInfo, "Downloading STA firmware...\n" ); -// hcf_status = dhf_download_fw( &lp->hcfCtx, &station ); - hcf_status = dhf_download_fw( &lp->hcfCtx, &fw_image ); - } - if ( hcf_status != HCF_SUCCESS ) { - DBG_ERROR( DbgInfo, "Firmware Download failed\n" ); - return hcf_status; - } - } - /* Report the FW versions */ - //;?obsolete, use the available IFB info:: wl_get_pri_records( lp ); - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_STA ) { - DBG_TRACE( DbgInfo, "downloaded station F/W\n" ); - } else if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_AP ) { - DBG_TRACE( DbgInfo, "downloaded AP F/W\n" ); - } else { - DBG_ERROR( DbgInfo, "unknown F/W type\n" ); - } - - /* - * Downloaded, no need to repeat this next time, assume the - * contents stays in the card until it is powered off. Note we - * do not switch firmware on the fly, the firmware is fixed in - * the driver for now. - */ - lp->firmware_present = WL_FRIMWARE_PRESENT; - - DBG_TRACE( DbgInfo, "ComponentID:%04x variant:%04x major:%04x minor:%04x\n", - CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ), - CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.variant ), - CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.version_major ), - CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.version_minor )); - - /* now we will get the MAC address of the card */ - lp->ltvRecord.len = 4; - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_AP ) { - lp->ltvRecord.typ = CFG_NIC_MAC_ADDR; - } else - { - lp->ltvRecord.typ = CFG_CNF_OWN_MAC_ADDR; - } - hcf_status = hcf_get_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - if ( hcf_status != HCF_SUCCESS ) { - DBG_ERROR( DbgInfo, "Could not retrieve MAC address\n" ); - return hcf_status; - } - memcpy( lp->MACAddress, &lp->ltvRecord.u.u8[0], ETH_ALEN ); - DBG_TRACE(DbgInfo, "Card MAC Address: %pM\n", lp->MACAddress); - - /* Write out configuration to the device, enable, and reconnect. However, - only reconnect if in AP mode. For STA mode, need to wait for passive scan - completion before a connect can be issued */ - wl_put_ltv( lp ); - /* Enable the ports */ - hcf_status = wl_enable( lp ); - - if ( lp->DownloadFirmware == WVLAN_DRV_MODE_AP ) { -#ifdef USE_WDS - wl_enable_wds_ports( lp ); -#endif // USE_WDS - hcf_status = wl_connect( lp ); - } - return hcf_status; -} // wl_go -/*============================================================================*/ - - -/******************************************************************************* - * wl_set_wep_keys() - ******************************************************************************* - * - * DESCRIPTION: - * - * Write TxKeyID and WEP keys to the adapter. This is separated from - * wl_apply() to allow dynamic WEP key updates through the wireless - * extensions. - * - * PARAMETERS: - * - * lp - a pointer to the wireless adapter's private structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_set_wep_keys( struct wl_private *lp ) -{ - int count = 0; - - DBG_PARAM( DbgInfo, "lp", "%s (0x%p)", lp->dev->name, lp ); - if ( lp->EnableEncryption ) { - /* NOTE: CFG_CNF_ENCRYPTION is set in wl_put_ltv() as it's a static - RID */ - - /* set TxKeyID */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_TX_KEY_ID; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->TransmitKeyID - 1); - - hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - DBG_TRACE( DbgInfo, "Key 1 len: %d\n", lp->DefaultKeys.key[0].len ); - DBG_TRACE( DbgInfo, "Key 2 len: %d\n", lp->DefaultKeys.key[1].len ); - DBG_TRACE( DbgInfo, "Key 3 len: %d\n", lp->DefaultKeys.key[2].len ); - DBG_TRACE( DbgInfo, "Key 4 len: %d\n", lp->DefaultKeys.key[3].len ); - - /* write keys */ - lp->DefaultKeys.len = sizeof( lp->DefaultKeys ) / sizeof( hcf_16 ) - 1; - lp->DefaultKeys.typ = CFG_DEFAULT_KEYS; - - /* endian translate the appropriate key information */ - for( count = 0; count < MAX_KEYS; count++ ) { - lp->DefaultKeys.key[count].len = CNV_INT_TO_LITTLE( lp->DefaultKeys.key[count].len ); - } - - hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->DefaultKeys )); - - /* Reverse the above endian translation, since these keys are accessed - elsewhere */ - for( count = 0; count < MAX_KEYS; count++ ) { - lp->DefaultKeys.key[count].len = CNV_INT_TO_LITTLE( lp->DefaultKeys.key[count].len ); - } - - DBG_NOTICE( DbgInfo, "encrypt: %d, ID: %d\n", lp->EnableEncryption, lp->TransmitKeyID ); - DBG_NOTICE( DbgInfo, "set key: %s(%d) [%d]\n", lp->DefaultKeys.key[lp->TransmitKeyID-1].key, lp->DefaultKeys.key[lp->TransmitKeyID-1].len, lp->TransmitKeyID-1 ); - } -} // wl_set_wep_keys -/*============================================================================*/ - - -/******************************************************************************* - * wl_apply() - ******************************************************************************* - * - * DESCRIPTION: - * - * Write the parameters to the adapter. (re-)enables the card if device is - * open. Returns hcf_status of hcf_enable(). - * - * PARAMETERS: - * - * lp - a pointer to the wireless adapter's private structure - * - * RETURNS: - * - * an HCF status code - * - ******************************************************************************/ -int wl_apply(struct wl_private *lp) -{ - int hcf_status = HCF_SUCCESS; - - DBG_ASSERT( lp != NULL); - DBG_PARAM( DbgInfo, "lp", "%s (0x%p)", lp->dev->name, lp ); - - if ( !( lp->flags & WVLAN2_UIL_BUSY )) { - /* The adapter parameters have changed: - disable card - reload parameters - enable card - */ - - if ( wl_adapter_is_open( lp->dev )) { - /* Disconnect and disable if necessary */ - hcf_status = wl_disconnect( lp ); - if ( hcf_status != HCF_SUCCESS ) { - DBG_ERROR( DbgInfo, "Disconnect failed\n" ); - return -1; - } - hcf_status = wl_disable( lp ); - if ( hcf_status != HCF_SUCCESS ) { - DBG_ERROR( DbgInfo, "Disable failed\n" ); - return -1; - } else { - /* Write out configuration to the device, enable, and reconnect. - However, only reconnect if in AP mode. For STA mode, need to - wait for passive scan completion before a connect can be - issued */ - hcf_status = wl_put_ltv( lp ); - - if ( hcf_status == HCF_SUCCESS ) { - hcf_status = wl_enable( lp ); - - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_AP ) { - hcf_status = wl_connect( lp ); - } - } else { - DBG_WARNING( DbgInfo, "wl_put_ltv() failed\n" ); - } - } - } - } - - return hcf_status; -} // wl_apply -/*============================================================================*/ - - -/******************************************************************************* - * wl_put_ltv_init() - ******************************************************************************* - * - * DESCRIPTION: - * - * Used to set basic parameters for card initialization. - * - * PARAMETERS: - * - * lp - a pointer to the wireless adapter's private structure - * - * RETURNS: - * - * an HCF status code - * - ******************************************************************************/ -int wl_put_ltv_init( struct wl_private *lp ) -{ - int i; - int hcf_status; - CFG_RID_LOG_STRCT *RidLog; - - if ( lp == NULL ) { - DBG_ERROR( DbgInfo, "lp pointer is NULL\n" ); - return -1; - } - /* DMA/IO */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNTL_OPT; - - /* The Card Services build must ALWAYS be configured for 16-bit I/O. PCI or - CardBus can be set to either 16/32 bit I/O, or Bus Master DMA, but only - for Hermes-2.5 */ -#ifdef BUS_PCMCIA - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( USE_16BIT ); -#else - if ( lp->use_dma ) { - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( USE_DMA ); - } else { - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( 0 ); - } - -#endif - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - DBG_TRACE( DbgInfo, "CFG_CNTL_OPT : 0x%04x\n", - lp->ltvRecord.u.u16[0] ); - DBG_TRACE( DbgInfo, "CFG_CNTL_OPT result : 0x%04x\n", - hcf_status ); - - /* Register the list of RIDs on which asynchronous notification is - required. Note that this mechanism replaces the mailbox, so the mailbox - can be queried by the host (if desired) without contention from us */ - i=0; - - lp->RidList[i].len = sizeof( lp->ProbeResp ); - lp->RidList[i].typ = CFG_ACS_SCAN; - lp->RidList[i].bufp = (wci_recordp)&lp->ProbeResp; - //lp->ProbeResp.infoType = 0xFFFF; - i++; - - lp->RidList[i].len = sizeof( lp->assoc_stat ); - lp->RidList[i].typ = CFG_ASSOC_STAT; - lp->RidList[i].bufp = (wci_recordp)&lp->assoc_stat; - lp->assoc_stat.len = 0xFFFF; - i++; - - lp->RidList[i].len = 4; - lp->RidList[i].typ = CFG_UPDATED_INFO_RECORD; - lp->RidList[i].bufp = (wci_recordp)&lp->updatedRecord; - lp->updatedRecord.len = 0xFFFF; - i++; - - lp->RidList[i].len = sizeof( lp->sec_stat ); - lp->RidList[i].typ = CFG_SECURITY_STAT; - lp->RidList[i].bufp = (wci_recordp)&lp->sec_stat; - lp->sec_stat.len = 0xFFFF; - i++; - - lp->RidList[i].typ = 0; // Terminate List - - RidLog = (CFG_RID_LOG_STRCT *)&lp->ltvRecord; - RidLog->len = 3; - RidLog->typ = CFG_REG_INFO_LOG; - RidLog->recordp = (RID_LOGP)&lp->RidList[0]; - - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - DBG_TRACE( DbgInfo, "CFG_REG_INFO_LOG\n" ); - DBG_TRACE( DbgInfo, "CFG_REG_INFO_LOG result : 0x%04x\n", - hcf_status ); - return hcf_status; -} // wl_put_ltv_init -/*============================================================================*/ - - -/******************************************************************************* - * wl_put_ltv() - ******************************************************************************* - * - * DESCRIPTION: - * - * Used by wvlan_apply() and wvlan_go to set the card's configuration. - * - * PARAMETERS: - * - * lp - a pointer to the wireless adapter's private structure - * - * RETURNS: - * - * an HCF status code - * - ******************************************************************************/ -int wl_put_ltv( struct wl_private *lp ) -{ - int len; - int hcf_status; - - if ( lp == NULL ) { - DBG_ERROR( DbgInfo, "lp pointer is NULL\n" ); - return -1; - } - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_AP ) { - lp->maxPort = 6; //;?why set this here and not as part of download process - } else { - lp->maxPort = 0; - } - - /* Send our configuration to the card. Perform any endian translation - necessary */ - /* Register the Mailbox; VxWorks does this elsewhere; why;? */ - lp->ltvRecord.len = 4; - lp->ltvRecord.typ = CFG_REG_MB; - lp->ltvRecord.u.u32[0] = (u_long)&( lp->mailbox ); - lp->ltvRecord.u.u16[2] = ( MB_SIZE / sizeof( hcf_16 )); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Max Data Length */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_MAX_DATA_LEN; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( HCF_MAX_PACKET_SIZE ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* System Scale / Distance between APs */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_SYSTEM_SCALE; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->DistanceBetweenAPs ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Channel */ - if ( lp->CreateIBSS && ( lp->Channel == 0 )) { - DBG_TRACE( DbgInfo, "Create IBSS" ); - lp->Channel = 10; - } - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_OWN_CHANNEL; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->Channel ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Microwave Robustness */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_MICRO_WAVE; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->MicrowaveRobustness ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Load Balancing */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_LOAD_BALANCING; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->loadBalancing ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Medium Distribution */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_MEDIUM_DISTRIBUTION; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->mediumDistribution ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - /* Country Code */ - -#ifdef WARP - /* Tx Power Level (for supported cards) */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_TX_POW_LVL; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->txPowLevel ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Short Retry Limit */ - /*lp->ltvRecord.len = 2; - lp->ltvRecord.typ = 0xFC32; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->shortRetryLimit ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - */ - - /* Long Retry Limit */ - /*lp->ltvRecord.len = 2; - lp->ltvRecord.typ = 0xFC33; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->longRetryLimit ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - */ - - /* Supported Rate Set Control */ - lp->ltvRecord.len = 3; - lp->ltvRecord.typ = CFG_SUPPORTED_RATE_SET_CNTL; //0xFC88; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->srsc[0] ); - lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE( lp->srsc[1] ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Basic Rate Set Control */ - lp->ltvRecord.len = 3; - lp->ltvRecord.typ = CFG_BASIC_RATE_SET_CNTL; //0xFC89; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->brsc[0] ); - lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE( lp->brsc[1] ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Frame Burst Limit */ - /* Defined, but not currently available in Firmware */ - -#endif // WARP - -#ifdef WARP - /* Multicast Rate */ - lp->ltvRecord.len = 3; - lp->ltvRecord.typ = CFG_CNF_MCAST_RATE; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->MulticastRate[0] ); - lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE( lp->MulticastRate[1] ); -#else - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_MCAST_RATE; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->MulticastRate[0] ); -#endif // WARP - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Own Name (Station Nickname) */ - len = (strlen(lp->StationName) + 1) & ~0x01; - if (len != 0) { - //DBG_TRACE( DbgInfo, "CFG_CNF_OWN_NAME : %s\n", - // lp->StationName ); - - lp->ltvRecord.len = 2 + ( len / sizeof( hcf_16 )); - lp->ltvRecord.typ = CFG_CNF_OWN_NAME; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( strlen( lp->StationName )); - - memcpy( &( lp->ltvRecord.u.u8[2] ), lp->StationName, len ); - } else { - //DBG_TRACE( DbgInfo, "CFG_CNF_OWN_NAME : EMPTY\n" ); - - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_OWN_NAME; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( 0 ); - } - - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - //DBG_TRACE( DbgInfo, "CFG_CNF_OWN_NAME result : 0x%04x\n", - // hcf_status ); - - /* The following are set in STA mode only */ - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_STA ) { - - /* RTS Threshold */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_RTS_THRH; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->RTSThreshold ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Port Type */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_PORT_TYPE; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->PortType ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Tx Rate Control */ -#ifdef WARP - lp->ltvRecord.len = 3; - lp->ltvRecord.typ = CFG_TX_RATE_CNTL; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->TxRateControl[0] ); - lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE( lp->TxRateControl[1] ); -#else - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_TX_RATE_CNTL; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->TxRateControl[0] ); -#endif // WARP - -//;?skip temporarily to see whether the RID or something else is the problem hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - DBG_TRACE( DbgInfo, "CFG_TX_RATE_CNTL 2.4GHz : 0x%04x\n", - lp->TxRateControl[0] ); - DBG_TRACE( DbgInfo, "CFG_TX_RATE_CNTL 5.0GHz : 0x%04x\n", - lp->TxRateControl[1] ); - DBG_TRACE( DbgInfo, "CFG_TX_RATE_CNTL result : 0x%04x\n", - hcf_status ); - /* Power Management */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_PM_ENABLED; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->PMEnabled ); -// lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( 0x8001 ); - DBG_TRACE( DbgInfo, "CFG_CNF_PM_ENABLED : 0x%04x\n", lp->PMEnabled ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - /* Multicast Receive */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_MCAST_RX; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->MulticastReceive ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Max Sleep Duration */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_MAX_SLEEP_DURATION; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->MaxSleepDuration ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Create IBSS */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CREATE_IBSS; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->CreateIBSS ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Desired SSID */ - if ((( len = ( strlen( lp->NetworkName ) + 1 ) & ~0x01 ) != 0 ) && - ( strcmp( lp->NetworkName, "ANY" ) != 0 ) && - ( strcmp( lp->NetworkName, "any" ) != 0 )) { - //DBG_TRACE( DbgInfo, "CFG_DESIRED_SSID : %s\n", - // lp->NetworkName ); - - lp->ltvRecord.len = 2 + (len / sizeof(hcf_16)); - lp->ltvRecord.typ = CFG_DESIRED_SSID; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( strlen( lp->NetworkName )); - - memcpy( &( lp->ltvRecord.u.u8[2] ), lp->NetworkName, len ); - } else { - //DBG_TRACE( DbgInfo, "CFG_DESIRED_SSID : ANY\n" ); - - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_DESIRED_SSID; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( 0 ); - } - - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - //DBG_TRACE( DbgInfo, "CFG_DESIRED_SSID result : 0x%04x\n", - // hcf_status ); - /* Own ATIM window */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_OWN_ATIM_WINDOW; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->atimWindow ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - - /* Holdover Duration */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_HOLDOVER_DURATION; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->holdoverDuration ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Promiscuous Mode */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_PROMISCUOUS_MODE; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->promiscuousMode ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Authentication */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_AUTHENTICATION; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->authentication ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); -#ifdef WARP - /* Connection Control */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_CONNECTION_CNTL; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->connectionControl ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - - - /* Probe data rate */ - /*lp->ltvRecord.len = 3; - lp->ltvRecord.typ = CFG_PROBE_DATA_RATE; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->probeDataRates[0] ); - lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE( lp->probeDataRates[1] ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - DBG_TRACE( DbgInfo, "CFG_PROBE_DATA_RATE 2.4GHz : 0x%04x\n", - lp->probeDataRates[0] ); - DBG_TRACE( DbgInfo, "CFG_PROBE_DATA_RATE 5.0GHz : 0x%04x\n", - lp->probeDataRates[1] ); - DBG_TRACE( DbgInfo, "CFG_PROBE_DATA_RATE result : 0x%04x\n", - hcf_status );*/ -#endif // WARP - } else { - /* The following are set in AP mode only */ -#if 0 //;? (HCF_TYPE) & HCF_TYPE_AP - //;?should we restore this to allow smaller memory footprint - - /* DTIM Period */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_OWN_DTIM_PERIOD; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->DTIMPeriod ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Multicast PM Buffering */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_MCAST_PM_BUF; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->multicastPMBuffering ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Reject ANY - Closed System */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_REJECT_ANY; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->RejectAny ); - - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Exclude Unencrypted */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_EXCL_UNENCRYPTED; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->ExcludeUnencrypted ); - - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* IntraBSS Relay */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_INTRA_BSS_RELAY; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->intraBSSRelay ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* RTS Threshold 0 */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_RTS_THRH0; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->RTSThreshold ); - - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Tx Rate Control 0 */ -#ifdef WARP - lp->ltvRecord.len = 3; - lp->ltvRecord.typ = CFG_TX_RATE_CNTL0; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->TxRateControl[0] ); - lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE( lp->TxRateControl[1] ); -#else - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_TX_RATE_CNTL0; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->TxRateControl[0] ); -#endif // WARP - - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Own Beacon Interval */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = 0xFC31; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->ownBeaconInterval ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Co-Existence Behavior */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = 0xFCC7; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->coexistence ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - -#ifdef USE_WDS - - /* RTS Threshold 1 */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_RTS_THRH1; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->wds_port[0].rtsThreshold ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* RTS Threshold 2 */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_RTS_THRH2; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->wds_port[1].rtsThreshold ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - - /* RTS Threshold 3 */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_RTS_THRH3; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->wds_port[2].rtsThreshold ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - - /* RTS Threshold 4 */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_RTS_THRH4; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->wds_port[3].rtsThreshold ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - - /* RTS Threshold 5 */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_RTS_THRH5; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->wds_port[4].rtsThreshold ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* RTS Threshold 6 */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_RTS_THRH6; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->wds_port[5].rtsThreshold ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); -#if 0 - /* TX Rate Control 1 */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_TX_RATE_CNTL1; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->wds_port[0].txRateCntl ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* TX Rate Control 2 */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_TX_RATE_CNTL2; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->wds_port[1].txRateCntl ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* TX Rate Control 3 */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_TX_RATE_CNTL3; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->wds_port[2].txRateCntl ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* TX Rate Control 4 */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_TX_RATE_CNTL4; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->wds_port[3].txRateCntl ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* TX Rate Control 5 */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_TX_RATE_CNTL5; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->wds_port[4].txRateCntl ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* TX Rate Control 6 */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_TX_RATE_CNTL6; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->wds_port[5].txRateCntl ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - -#endif - - /* WDS addresses. It's okay to blindly send these parameters, because - the port needs to be enabled, before anything is done with it. */ - - /* WDS Address 1 */ - lp->ltvRecord.len = 4; - lp->ltvRecord.typ = CFG_CNF_WDS_ADDR1; - - memcpy( &lp->ltvRecord.u.u8[0], lp->wds_port[0].wdsAddress, ETH_ALEN ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* WDS Address 2 */ - lp->ltvRecord.len = 4; - lp->ltvRecord.typ = CFG_CNF_WDS_ADDR2; - - memcpy( &lp->ltvRecord.u.u8[0], lp->wds_port[1].wdsAddress, ETH_ALEN ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* WDS Address 3 */ - lp->ltvRecord.len = 4; - lp->ltvRecord.typ = CFG_CNF_WDS_ADDR3; - - memcpy( &lp->ltvRecord.u.u8[0], lp->wds_port[2].wdsAddress, ETH_ALEN ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* WDS Address 4 */ - lp->ltvRecord.len = 4; - lp->ltvRecord.typ = CFG_CNF_WDS_ADDR4; - - memcpy( &lp->ltvRecord.u.u8[0], lp->wds_port[3].wdsAddress, ETH_ALEN ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* WDS Address 5 */ - lp->ltvRecord.len = 4; - lp->ltvRecord.typ = CFG_CNF_WDS_ADDR5; - - memcpy( &lp->ltvRecord.u.u8[0], lp->wds_port[4].wdsAddress, ETH_ALEN ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* WDS Address 6 */ - lp->ltvRecord.len = 4; - lp->ltvRecord.typ = CFG_CNF_WDS_ADDR6; - - memcpy( &lp->ltvRecord.u.u8[0], lp->wds_port[5].wdsAddress, ETH_ALEN ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); -#endif /* USE_WDS */ -#endif /* (HCF_TYPE) & HCF_TYPE_AP */ - } - - /* Own MAC Address */ -/* - DBG_TRACE(DbgInfo, "MAC Address : %pM\n", - lp->MACAddress); - */ - - if ( WVLAN_VALID_MAC_ADDRESS( lp->MACAddress )) { - /* Make the MAC address valid by: - Clearing the multicast bit - Setting the local MAC address bit - */ - //lp->MACAddress[0] &= ~0x03; //;?why is this commented out already in 720 - //lp->MACAddress[0] |= 0x02; - - lp->ltvRecord.len = 1 + ( ETH_ALEN / sizeof( hcf_16 )); - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_AP ) { - //DBG_TRACE( DbgInfo, "CFG_NIC_MAC_ADDR\n" ); - lp->ltvRecord.typ = CFG_NIC_MAC_ADDR; - } else { - //DBG_TRACE( DbgInfo, "CFG_CNF_OWN_MAC_ADDR\n" ); - lp->ltvRecord.typ = CFG_CNF_OWN_MAC_ADDR; - } - /* MAC address is byte aligned, no endian conversion needed */ - memcpy( &( lp->ltvRecord.u.u8[0] ), lp->MACAddress, ETH_ALEN ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - //DBG_TRACE( DbgInfo, "CFG_XXX_MAC_ADDR result : 0x%04x\n", - // hcf_status ); - - /* Update the MAC address in the netdevice struct */ - memcpy( lp->dev->dev_addr, lp->MACAddress, ETH_ALEN ); //;?what is the purpose of this seemingly complex logic - } - /* Own SSID */ - if ((( len = ( strlen( lp->NetworkName ) + 1 ) & ~0x01 ) != 0 ) && - ( strcmp( lp->NetworkName, "ANY" ) != 0 ) && - ( strcmp( lp->NetworkName, "any" ) != 0 )) { - //DBG_TRACE( DbgInfo, "CFG_CNF_OWN_SSID : %s\n", - // lp->NetworkName ); - lp->ltvRecord.len = 2 + (len / sizeof(hcf_16)); - lp->ltvRecord.typ = CFG_CNF_OWN_SSID; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( strlen( lp->NetworkName )); - - memcpy( &( lp->ltvRecord.u.u8[2] ), lp->NetworkName, len ); - } else { - //DBG_TRACE( DbgInfo, "CFG_CNF_OWN_SSID : ANY\n" ); - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_OWN_SSID; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( 0 ); - } - - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - //DBG_TRACE( DbgInfo, "CFG_CNF_OWN_SSID result : 0x%04x\n", - // hcf_status ); - /* enable/disable encryption */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_ENCRYPTION; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->EnableEncryption ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* Set the Authentication Key Management Suite */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_SET_WPA_AUTH_KEY_MGMT_SUITE; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( lp->AuthKeyMgmtSuite ); - hcf_status = hcf_put_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - /* If WEP (or no) keys are being used, write (or clear) them */ - if (lp->wext_enc != IW_ENCODE_ALG_TKIP) - wl_set_wep_keys(lp); - - /* Country Code */ - /* countryInfo, ltvCountryInfo, CFG_CNF_COUNTRY_INFO */ - - return hcf_status; -} // wl_put_ltv -/*============================================================================*/ - - -/******************************************************************************* - * init_module() - ******************************************************************************* - * - * DESCRIPTION: - * - * Load the kernel module. - * - * PARAMETERS: - * - * N/A - * - * RETURNS: - * - * 0 on success - * an errno value otherwise - * - ******************************************************************************/ -static int __init wl_module_init( void ) -{ - int result; - /*------------------------------------------------------------------------*/ - - -#if DBG - /* Convert "standard" PCMCIA parameter pc_debug to a reasonable DebugFlag value. - * NOTE: The values all fall through to the lower values. */ - DbgInfo->DebugFlag = 0; - DbgInfo->DebugFlag = DBG_TRACE_ON; //;?get this mess resolved one day - if ( pc_debug ) switch( pc_debug ) { - case 8: - DbgInfo->DebugFlag |= DBG_DS_ON; - case 7: - DbgInfo->DebugFlag |= DBG_RX_ON | DBG_TX_ON; - case 6: - DbgInfo->DebugFlag |= DBG_PARAM_ON; - case 5: - DbgInfo->DebugFlag |= DBG_TRACE_ON; - case 4: - DbgInfo->DebugFlag |= DBG_VERBOSE_ON; - case 1: - DbgInfo->DebugFlag |= DBG_DEFAULTS; - default: - break; - } -#endif /* DBG */ - - printk(KERN_INFO "%s\n", VERSION_INFO); - printk(KERN_INFO "*** Modified for kernel 2.6 by Henk de Groot \n"); - printk(KERN_INFO "*** Based on 7.18 version by Andrey Borzenkov $Revision: 39 $\n"); - - -// ;?#if (HCF_TYPE) & HCF_TYPE_AP -// DBG_PRINT( "Access Point Mode (AP) Support: YES\n" ); -// #else -// DBG_PRINT( "Access Point Mode (AP) Support: NO\n" ); -// #endif /* (HCF_TYPE) & HCF_TYPE_AP */ - - result = wl_adapter_init_module( ); - return result; -} // init_module -/*============================================================================*/ - - -/******************************************************************************* - * cleanup_module() - ******************************************************************************* - * - * DESCRIPTION: - * - * Unload the kernel module. - * - * PARAMETERS: - * - * N/A - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -static void __exit wl_module_exit( void ) -{ - wl_adapter_cleanup_module( ); -#if 0 //SCULL_USE_PROC /* don't waste space if unused */ - remove_proc_entry( "wlags", NULL ); //;?why so a-symmetric compared to location of proc_create_data -#endif -} // cleanup_module -/*============================================================================*/ - -module_init(wl_module_init); -module_exit(wl_module_exit); - -/******************************************************************************* - * wl_isr() - ******************************************************************************* - * - * DESCRIPTION: - * - * The Interrupt Service Routine for the driver. - * - * PARAMETERS: - * - * irq - the irq the interrupt came in on - * dev_id - a buffer containing information about the request - * regs - - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -irqreturn_t wl_isr( int irq, void *dev_id, struct pt_regs *regs ) -{ - int events; - struct net_device *dev = (struct net_device *) dev_id; - struct wl_private *lp = NULL; - /*------------------------------------------------------------------------*/ - if (( dev == NULL ) || ( !netif_device_present( dev ))) { - return IRQ_NONE; - } - - /* Set the wl_private pointer (lp), now that we know that dev is non-null */ - lp = wl_priv(dev); - -#ifdef USE_RTS - if ( lp->useRTS == 1 ) { - DBG_PRINT( "EXITING ISR, IN RTS MODE...\n" ); - return; - } -#endif /* USE_RTS */ - - /* If we have interrupts pending, then put them on a system task - queue. Otherwise turn interrupts back on */ - events = hcf_action( &lp->hcfCtx, HCF_ACT_INT_OFF ); - - if ( events == HCF_INT_PENDING ) { - /* Schedule the ISR handler as a bottom-half task in the - tq_immediate queue */ - tasklet_schedule(&lp->task); - } else { - //DBG_PRINT( "NOT OUR INTERRUPT\n" ); - hcf_action( &lp->hcfCtx, HCF_ACT_INT_ON ); - } - - return IRQ_RETVAL(events == HCF_INT_PENDING); -} // wl_isr -/*============================================================================*/ - - -/******************************************************************************* - * wl_isr_handler() - ******************************************************************************* - * - * DESCRIPTION: - * - * The ISR handler, scheduled to run in a deferred context by the ISR. This - * is where the ISR's work actually gets done. - * - * PARAMETERS: - * - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -#define WVLAN_MAX_INT_SERVICES 50 - -void wl_isr_handler( unsigned long p ) -{ - struct net_device *dev; - unsigned long flags; - bool_t stop = TRUE; - int count; - int result; - struct wl_private *lp = (struct wl_private *)p; - /*------------------------------------------------------------------------*/ - - if ( lp == NULL ) { - DBG_PRINT( "wl_isr_handler lp adapter pointer is NULL!!!\n" ); - } else { - wl_lock( lp, &flags ); - - dev = (struct net_device *)lp->dev; - if ( dev != NULL && netif_device_present( dev ) ) stop = FALSE; - for( count = 0; stop == FALSE && count < WVLAN_MAX_INT_SERVICES; count++ ) { - stop = TRUE; - result = hcf_service_nic( &lp->hcfCtx, - (wci_bufp)lp->lookAheadBuf, - sizeof( lp->lookAheadBuf )); - if ( result == HCF_ERR_MIC ) { - wl_wext_event_mic_failed( dev ); /* Send an event that MIC failed */ - //;?this seems wrong if HCF_ERR_MIC coincides with another event, stop gets FALSE - //so why not do it always ;? - } - -#ifndef USE_MBOX_SYNC - if ( lp->hcfCtx.IFB_MBInfoLen != 0 ) { /* anything in the mailbox */ - wl_mbx( lp ); - stop = FALSE; - } -#endif - /* Check for a Link status event */ - if ( ( lp->hcfCtx.IFB_LinkStat & CFG_LINK_STAT_FW ) != 0 ) { - wl_process_link_status( lp ); - stop = FALSE; - } - /* Check for probe response events */ - if ( lp->ProbeResp.infoType != 0 && - lp->ProbeResp.infoType != 0xFFFF ) { - wl_process_probe_response( lp ); - memset( &lp->ProbeResp, 0, sizeof( lp->ProbeResp )); - lp->ProbeResp.infoType = 0xFFFF; - stop = FALSE; - } - /* Check for updated record events */ - if ( lp->updatedRecord.len != 0xFFFF ) { - wl_process_updated_record( lp ); - lp->updatedRecord.len = 0xFFFF; - stop = FALSE; - } - /* Check for association status events */ - if ( lp->assoc_stat.len != 0xFFFF ) { - wl_process_assoc_status( lp ); - lp->assoc_stat.len = 0xFFFF; - stop = FALSE; - } - /* Check for security status events */ - if ( lp->sec_stat.len != 0xFFFF ) { - wl_process_security_status( lp ); - lp->sec_stat.len = 0xFFFF; - stop = FALSE; - } - -#ifdef ENABLE_DMA - if ( lp->use_dma ) { - /* Check for DMA Rx packets */ - if ( lp->hcfCtx.IFB_DmaPackets & HREG_EV_RDMAD ) { - wl_rx_dma( dev ); - stop = FALSE; - } - /* Return Tx DMA descriptors to host */ - if ( lp->hcfCtx.IFB_DmaPackets & HREG_EV_TDMAD ) { - wl_pci_dma_hcf_reclaim_tx( lp ); - stop = FALSE; - } - } - else -#endif // ENABLE_DMA - { - /* Check for Rx packets */ - if ( lp->hcfCtx.IFB_RxLen != 0 ) { - wl_rx( dev ); - stop = FALSE; - } - /* Make sure that queued frames get sent */ - if ( wl_send( lp )) { - stop = FALSE; - } - } - } - /* We're done, so turn interrupts which were turned off in wl_isr, back on */ - hcf_action( &lp->hcfCtx, HCF_ACT_INT_ON ); - wl_unlock( lp, &flags ); - } - return; -} // wl_isr_handler -/*============================================================================*/ - - -/******************************************************************************* - * wl_remove() - ******************************************************************************* - * - * DESCRIPTION: - * - * Notify the adapter that it has been removed. Since the adapter is gone, - * we should no longer try to talk to it. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_remove( struct net_device *dev ) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - - DBG_PARAM( DbgInfo, "dev", "%s (0x%p)", dev->name, dev ); - - wl_lock( lp, &flags ); - - /* stop handling interrupts */ - wl_act_int_off( lp ); - lp->is_handling_int = WL_NOT_HANDLING_INT; - - /* - * Disable the ports: just change state: since the - * card is gone it is useless to talk to it and at - * disconnect all state information is lost anyway. - */ - /* Reset portState */ - lp->portState = WVLAN_PORT_STATE_DISABLED; - -#if 0 //;? (HCF_TYPE) & HCF_TYPE_AP -#ifdef USE_WDS - //wl_disable_wds_ports( lp ); -#endif // USE_WDS -#endif /* (HCF_TYPE) & HCF_TYPE_AP */ - - /* Mark the device as unregistered */ - lp->is_registered = FALSE; - - /* Deregister the WDS ports as well */ - WL_WDS_NETDEV_DEREGISTER( lp ); -#ifdef USE_RTS - if ( lp->useRTS == 1 ) { - wl_unlock( lp, &flags ); - return; - } -#endif /* USE_RTS */ - - /* Inform the HCF that the card has been removed */ - hcf_connect( &lp->hcfCtx, HCF_DISCONNECT ); - - wl_unlock( lp, &flags ); -} // wl_remove -/*============================================================================*/ - - -/******************************************************************************* - * wl_suspend() - ******************************************************************************* - * - * DESCRIPTION: - * - * Power-down and halt the adapter. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_suspend( struct net_device *dev ) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - - DBG_PARAM( DbgInfo, "dev", "%s (0x%p)", dev->name, dev ); - - /* The adapter is suspended: - Stop the adapter - Power down - */ - wl_lock( lp, &flags ); - - /* Disable interrupt handling */ - wl_act_int_off( lp ); - - /* Disconnect */ - wl_disconnect( lp ); - - /* Disable */ - wl_disable( lp ); - - /* Disconnect from the adapter */ - hcf_connect( &lp->hcfCtx, HCF_DISCONNECT ); - - /* Reset portState to be sure (should have been done by wl_disable */ - lp->portState = WVLAN_PORT_STATE_DISABLED; - - wl_unlock( lp, &flags ); -} // wl_suspend -/*============================================================================*/ - - -/******************************************************************************* - * wl_resume() - ******************************************************************************* - * - * DESCRIPTION: - * - * Resume a previously suspended adapter. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_resume(struct net_device *dev) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - - DBG_PARAM( DbgInfo, "dev", "%s (0x%p)", dev->name, dev ); - - wl_lock( lp, &flags ); - - /* Connect to the adapter */ - hcf_connect( &lp->hcfCtx, dev->base_addr ); - - /* Reset portState */ - lp->portState = WVLAN_PORT_STATE_DISABLED; - - /* Power might have been off, assume the card lost the firmware*/ - lp->firmware_present = WL_FRIMWARE_NOT_PRESENT; - - /* Reload the firmware and restart */ - wl_reset( dev ); - - /* Resume interrupt handling */ - wl_act_int_on( lp ); - - wl_unlock( lp, &flags ); -} // wl_resume -/*============================================================================*/ - - -/******************************************************************************* - * wl_release() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function performs a check on the device and calls wl_remove() if - * necessary. This function can be used for all bus types, but exists mostly - * for the benefit of the Card Services driver, as there are times when - * wl_remove() does not get called. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_release( struct net_device *dev ) -{ - struct wl_private *lp = wl_priv(dev); - - DBG_PARAM( DbgInfo, "dev", "%s (0x%p)", dev->name, dev ); - /* If wl_remove() hasn't been called (i.e. when Card Services is shut - down with the card in the slot), then call it */ - if ( lp->is_registered == TRUE ) { - DBG_TRACE( DbgInfo, "Calling unregister_netdev(), as it wasn't called yet\n" ); - wl_remove( dev ); - - lp->is_registered = FALSE; - } -} // wl_release -/*============================================================================*/ - - -/******************************************************************************* - * wl_get_irq_mask() - ******************************************************************************* - * - * DESCRIPTION: - * - * Accessor function to retrieve the irq_mask module parameter - * - * PARAMETERS: - * - * N/A - * - * RETURNS: - * - * The irq_mask module parameter - * - ******************************************************************************/ -p_u16 wl_get_irq_mask( void ) -{ - return irq_mask; -} // wl_get_irq_mask -/*============================================================================*/ - - -/******************************************************************************* - * wl_get_irq_list() - ******************************************************************************* - * - * DESCRIPTION: - * - * Accessor function to retrieve the irq_list module parameter - * - * PARAMETERS: - * - * N/A - * - * RETURNS: - * - * The irq_list module parameter - * - ******************************************************************************/ -p_s8 * wl_get_irq_list( void ) -{ - return irq_list; -} // wl_get_irq_list -/*============================================================================*/ - - - -/******************************************************************************* - * wl_enable() - ******************************************************************************* - * - * DESCRIPTION: - * - * Used to enable MAC ports - * - * PARAMETERS: - * - * lp - pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -int wl_enable( struct wl_private *lp ) -{ - int hcf_status = HCF_SUCCESS; - - if ( lp->portState == WVLAN_PORT_STATE_ENABLED ) { - DBG_TRACE( DbgInfo, "No action: Card already enabled\n" ); - } else if ( lp->portState == WVLAN_PORT_STATE_CONNECTED ) { - //;?suspicuous logic, how can you be connected without being enabled so this is probably dead code - DBG_TRACE( DbgInfo, "No action: Card already connected\n" ); - } else { - hcf_status = hcf_cntl( &lp->hcfCtx, HCF_CNTL_ENABLE ); - if ( hcf_status == HCF_SUCCESS ) { - /* Set the status of the NIC to enabled */ - lp->portState = WVLAN_PORT_STATE_ENABLED; //;?bad mnemonic, NIC iso PORT -#ifdef ENABLE_DMA - if ( lp->use_dma ) { - wl_pci_dma_hcf_supply( lp ); //;?always successful? - } -#endif - } - } - if ( hcf_status != HCF_SUCCESS ) { //;?make this an assert - DBG_TRACE( DbgInfo, "failed: 0x%x\n", hcf_status ); - } - return hcf_status; -} // wl_enable -/*============================================================================*/ - - -#ifdef USE_WDS -/******************************************************************************* - * wl_enable_wds_ports() - ******************************************************************************* - * - * DESCRIPTION: - * - * Used to enable the WDS MAC ports 1-6 - * - * PARAMETERS: - * - * lp - pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_enable_wds_ports( struct wl_private * lp ) -{ - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_AP ){ - DBG_ERROR( DbgInfo, "!!!!;? someone misunderstood something !!!!!\n" ); - } -} // wl_enable_wds_ports -#endif /* USE_WDS */ -/*============================================================================*/ - - -/******************************************************************************* - * wl_connect() - ******************************************************************************* - * - * DESCRIPTION: - * - * Used to connect a MAC port - * - * PARAMETERS: - * - * lp - pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -int wl_connect( struct wl_private *lp ) -{ - int hcf_status; - - if ( lp->portState != WVLAN_PORT_STATE_ENABLED ) { - DBG_TRACE( DbgInfo, "No action: Not in enabled state\n" ); - return HCF_SUCCESS; - } - hcf_status = hcf_cntl( &lp->hcfCtx, HCF_CNTL_CONNECT ); - if ( hcf_status == HCF_SUCCESS ) { - lp->portState = WVLAN_PORT_STATE_CONNECTED; - } - return hcf_status; -} // wl_connect -/*============================================================================*/ - - -/******************************************************************************* - * wl_disconnect() - ******************************************************************************* - * - * DESCRIPTION: - * - * Used to disconnect a MAC port - * - * PARAMETERS: - * - * lp - pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -int wl_disconnect( struct wl_private *lp ) -{ - int hcf_status; - - if ( lp->portState != WVLAN_PORT_STATE_CONNECTED ) { - DBG_TRACE( DbgInfo, "No action: Not in connected state\n" ); - return HCF_SUCCESS; - } - hcf_status = hcf_cntl( &lp->hcfCtx, HCF_CNTL_DISCONNECT ); - if ( hcf_status == HCF_SUCCESS ) { - lp->portState = WVLAN_PORT_STATE_ENABLED; - } - return hcf_status; -} // wl_disconnect -/*============================================================================*/ - - -/******************************************************************************* - * wl_disable() - ******************************************************************************* - * - * DESCRIPTION: - * - * Used to disable MAC ports - * - * PARAMETERS: - * - * lp - pointer to the device's private adapter structure - * port - the MAC port to disable - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -int wl_disable( struct wl_private *lp ) -{ - int hcf_status = HCF_SUCCESS; - - if ( lp->portState == WVLAN_PORT_STATE_DISABLED ) { - DBG_TRACE( DbgInfo, "No action: Port state is disabled\n" ); - } else { - hcf_status = hcf_cntl( &lp->hcfCtx, HCF_CNTL_DISABLE ); - if ( hcf_status == HCF_SUCCESS ) { - /* Set the status of the port to disabled */ //;?bad mnemonic use NIC iso PORT - lp->portState = WVLAN_PORT_STATE_DISABLED; - -#ifdef ENABLE_DMA - if ( lp->use_dma ) { - wl_pci_dma_hcf_reclaim( lp ); - } -#endif - } - } - if ( hcf_status != HCF_SUCCESS ) { - DBG_TRACE( DbgInfo, "failed: 0x%x\n", hcf_status ); - } - return hcf_status; -} // wl_disable -/*============================================================================*/ - - -#ifdef USE_WDS -/******************************************************************************* - * wl_disable_wds_ports() - ******************************************************************************* - * - * DESCRIPTION: - * - * Used to disable the WDS MAC ports 1-6 - * - * PARAMETERS: - * - * lp - pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_disable_wds_ports( struct wl_private * lp ) -{ - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_AP ){ - DBG_ERROR( DbgInfo, "!!!!;? someone misunderstood something !!!!!\n" ); - } -// if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_AP ) { -// wl_disable( lp, HCF_PORT_1 ); -// wl_disable( lp, HCF_PORT_2 ); -// wl_disable( lp, HCF_PORT_3 ); -// wl_disable( lp, HCF_PORT_4 ); -// wl_disable( lp, HCF_PORT_5 ); -// wl_disable( lp, HCF_PORT_6 ); -// } - return; -} // wl_disable_wds_ports -#endif // USE_WDS -/*============================================================================*/ - - -#ifndef USE_MBOX_SYNC -/******************************************************************************* - * wl_mbx() - ******************************************************************************* - * - * DESCRIPTION: - * This function is used to read and process a mailbox message. - * - * - * PARAMETERS: - * - * lp - pointer to the device's private adapter structure - * - * RETURNS: - * - * an HCF status code - * - ******************************************************************************/ -int wl_mbx( struct wl_private *lp ) -{ - int hcf_status = HCF_SUCCESS; - - DBG_TRACE( DbgInfo, "Mailbox Info: IFB_MBInfoLen: %d\n", - lp->hcfCtx.IFB_MBInfoLen ); - - memset( &( lp->ltvRecord ), 0, sizeof( ltv_t )); - - lp->ltvRecord.len = MB_SIZE; - lp->ltvRecord.typ = CFG_MB_INFO; - hcf_status = hcf_get_info( &lp->hcfCtx, (LTVP)&( lp->ltvRecord )); - - if ( hcf_status != HCF_SUCCESS ) { - DBG_ERROR( DbgInfo, "hcf_get_info returned 0x%x\n", hcf_status ); - return hcf_status; - } - - if ( lp->ltvRecord.typ == CFG_MB_INFO ) - return hcf_status; - - /* Endian translate the mailbox data, then process the message */ - wl_endian_translate_mailbox( &( lp->ltvRecord )); - wl_process_mailbox( lp ); - return hcf_status; -} // wl_mbx -/*============================================================================*/ - - -/******************************************************************************* - * wl_endian_translate_mailbox() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function will perform the tedious task of endian translating all - * fields within a mailbox message which need translating. - * - * PARAMETERS: - * - * ltv - pointer to the LTV to endian translate - * - * RETURNS: - * - * none - * - ******************************************************************************/ -void wl_endian_translate_mailbox( ltv_t *ltv ) -{ - switch( ltv->typ ) { - case CFG_TALLIES: - break; - - case CFG_SCAN: - { - int num_aps; - SCAN_RS_STRCT *aps = (SCAN_RS_STRCT *)<v->u.u8[0]; - - num_aps = (hcf_16)(( (size_t)(ltv->len - 1 ) * 2 ) / - ( sizeof( SCAN_RS_STRCT ))); - - while( num_aps >= 1 ) { - num_aps--; - - aps[num_aps].channel_id = - CNV_LITTLE_TO_INT( aps[num_aps].channel_id ); - - aps[num_aps].noise_level = - CNV_LITTLE_TO_INT( aps[num_aps].noise_level ); - - aps[num_aps].signal_level = - CNV_LITTLE_TO_INT( aps[num_aps].signal_level ); - - aps[num_aps].beacon_interval_time = - CNV_LITTLE_TO_INT( aps[num_aps].beacon_interval_time ); - - aps[num_aps].capability = - CNV_LITTLE_TO_INT( aps[num_aps].capability ); - - aps[num_aps].ssid_len = - CNV_LITTLE_TO_INT( aps[num_aps].ssid_len ); - - aps[num_aps].ssid_val[aps[num_aps].ssid_len] = 0; - } - } - break; - - case CFG_ACS_SCAN: - { - PROBE_RESP *probe_resp = (PROBE_RESP *)ltv; - - probe_resp->frameControl = CNV_LITTLE_TO_INT( probe_resp->frameControl ); - probe_resp->durID = CNV_LITTLE_TO_INT( probe_resp->durID ); - probe_resp->sequence = CNV_LITTLE_TO_INT( probe_resp->sequence ); - probe_resp->dataLength = CNV_LITTLE_TO_INT( probe_resp->dataLength ); -#ifndef WARP - probe_resp->lenType = CNV_LITTLE_TO_INT( probe_resp->lenType ); -#endif // WARP - probe_resp->beaconInterval = CNV_LITTLE_TO_INT( probe_resp->beaconInterval ); - probe_resp->capability = CNV_LITTLE_TO_INT( probe_resp->capability ); - probe_resp->flags = CNV_LITTLE_TO_INT( probe_resp->flags ); - } - break; - - case CFG_LINK_STAT: -#define ls ((LINK_STATUS_STRCT *)ltv) - ls->linkStatus = CNV_LITTLE_TO_INT( ls->linkStatus ); - break; -#undef ls - - case CFG_ASSOC_STAT: - { - ASSOC_STATUS_STRCT *as = (ASSOC_STATUS_STRCT *)ltv; - - as->assocStatus = CNV_LITTLE_TO_INT( as->assocStatus ); - } - break; - - case CFG_SECURITY_STAT: - { - SECURITY_STATUS_STRCT *ss = (SECURITY_STATUS_STRCT *)ltv; - - ss->securityStatus = CNV_LITTLE_TO_INT( ss->securityStatus ); - ss->reason = CNV_LITTLE_TO_INT( ss->reason ); - } - break; - - case CFG_WMP: - break; - - case CFG_NULL: - break; - - default: - break; - } -} // wl_endian_translate_mailbox -/*============================================================================*/ - -/******************************************************************************* - * wl_process_mailbox() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function processes the mailbox data. - * - * PARAMETERS: - * - * ltv - pointer to the LTV to be processed. - * - * RETURNS: - * - * none - * - ******************************************************************************/ -void wl_process_mailbox( struct wl_private *lp ) -{ - ltv_t *ltv; - hcf_16 ltv_val = 0xFFFF; - - ltv = &( lp->ltvRecord ); - - switch( ltv->typ ) { - - case CFG_TALLIES: - DBG_TRACE( DbgInfo, "CFG_TALLIES\n" ); - break; - case CFG_SCAN: - DBG_TRACE( DbgInfo, "CFG_SCAN\n" ); - - { - int num_aps; - SCAN_RS_STRCT *aps = (SCAN_RS_STRCT *)<v->u.u8[0]; - - num_aps = (hcf_16)(( (size_t)(ltv->len - 1 ) * 2 ) / - ( sizeof( SCAN_RS_STRCT ))); - - lp->scan_results.num_aps = num_aps; - - DBG_TRACE( DbgInfo, "Number of APs: %d\n", num_aps ); - - while( num_aps >= 1 ) { - num_aps--; - - DBG_TRACE( DbgInfo, "AP : %d\n", num_aps ); - DBG_TRACE( DbgInfo, "=========================\n" ); - DBG_TRACE( DbgInfo, "Channel ID : 0x%04x\n", - aps[num_aps].channel_id ); - DBG_TRACE( DbgInfo, "Noise Level : 0x%04x\n", - aps[num_aps].noise_level ); - DBG_TRACE( DbgInfo, "Signal Level : 0x%04x\n", - aps[num_aps].signal_level ); - DBG_TRACE( DbgInfo, "Beacon Interval : 0x%04x\n", - aps[num_aps].beacon_interval_time ); - DBG_TRACE( DbgInfo, "Capability : 0x%04x\n", - aps[num_aps].capability ); - DBG_TRACE( DbgInfo, "SSID Length : 0x%04x\n", - aps[num_aps].ssid_len ); - DBG_TRACE(DbgInfo, "BSSID : %pM\n", - aps[num_aps].bssid); - - if ( aps[num_aps].ssid_len != 0 ) { - DBG_TRACE( DbgInfo, "SSID : %s.\n", - aps[num_aps].ssid_val ); - } else { - DBG_TRACE( DbgInfo, "SSID : %s.\n", "ANY" ); - } - - DBG_TRACE( DbgInfo, "\n" ); - - /* Copy the info to the ScanResult structure in the private - adapter struct */ - memcpy( &( lp->scan_results.APTable[num_aps]), &( aps[num_aps] ), - sizeof( SCAN_RS_STRCT )); - } - - /* Set scan result to true so that any scan requests will - complete */ - lp->scan_results.scan_complete = TRUE; - } - - break; - case CFG_ACS_SCAN: - DBG_TRACE( DbgInfo, "CFG_ACS_SCAN\n" ); - - { - PROBE_RESP *probe_rsp = (PROBE_RESP *)ltv; - hcf_8 *wpa_ie = NULL; - hcf_16 wpa_ie_len = 0; - - DBG_TRACE( DbgInfo, "(%s) =========================\n", - lp->dev->name ); - - DBG_TRACE( DbgInfo, "(%s) length : 0x%04x.\n", - lp->dev->name, probe_rsp->length ); - - if ( probe_rsp->length > 1 ) { - DBG_TRACE( DbgInfo, "(%s) infoType : 0x%04x.\n", - lp->dev->name, probe_rsp->infoType ); - - DBG_TRACE( DbgInfo, "(%s) signal : 0x%02x.\n", - lp->dev->name, probe_rsp->signal ); - - DBG_TRACE( DbgInfo, "(%s) silence : 0x%02x.\n", - lp->dev->name, probe_rsp->silence ); - - DBG_TRACE( DbgInfo, "(%s) rxFlow : 0x%02x.\n", - lp->dev->name, probe_rsp->rxFlow ); - - DBG_TRACE( DbgInfo, "(%s) rate : 0x%02x.\n", - lp->dev->name, probe_rsp->rate ); - - DBG_TRACE( DbgInfo, "(%s) frame cntl : 0x%04x.\n", - lp->dev->name, probe_rsp->frameControl ); - - DBG_TRACE( DbgInfo, "(%s) durID : 0x%04x.\n", - lp->dev->name, probe_rsp->durID ); - - DBG_TRACE(DbgInfo, "(%s) address1 : %pM\n", - lp->dev->name, probe_rsp->address1); - - DBG_TRACE(DbgInfo, "(%s) address2 : %pM\n", - lp->dev->name, probe_rsp->address2); - - DBG_TRACE(DbgInfo, "(%s) BSSID : %pM\n", - lp->dev->name, probe_rsp->BSSID); - - DBG_TRACE( DbgInfo, "(%s) sequence : 0x%04x.\n", - lp->dev->name, probe_rsp->sequence ); - - DBG_TRACE(DbgInfo, "(%s) address4 : %pM\n", - lp->dev->name, probe_rsp->address4); - - DBG_TRACE( DbgInfo, "(%s) datalength : 0x%04x.\n", - lp->dev->name, probe_rsp->dataLength ); - - DBG_TRACE(DbgInfo, "(%s) DA : %pM\n", - lp->dev->name, probe_rsp->DA); - - DBG_TRACE(DbgInfo, "(%s) SA : %pM\n", - lp->dev->name, probe_rsp->SA); - - //DBG_TRACE( DbgInfo, "(%s) lenType : 0x%04x.\n", - // lp->dev->name, probe_rsp->lenType ); - - DBG_TRACE(DbgInfo, "(%s) timeStamp : " - "%d.%d.%d.%d.%d.%d.%d.%d\n", - lp->dev->name, - probe_rsp->timeStamp[0], - probe_rsp->timeStamp[1], - probe_rsp->timeStamp[2], - probe_rsp->timeStamp[3], - probe_rsp->timeStamp[4], - probe_rsp->timeStamp[5], - probe_rsp->timeStamp[6], - probe_rsp->timeStamp[7]); - - DBG_TRACE( DbgInfo, "(%s) beaconInt : 0x%04x.\n", - lp->dev->name, probe_rsp->beaconInterval ); - - DBG_TRACE( DbgInfo, "(%s) capability : 0x%04x.\n", - lp->dev->name, probe_rsp->capability ); - - DBG_TRACE( DbgInfo, "(%s) SSID len : 0x%04x.\n", - lp->dev->name, probe_rsp->rawData[1] ); - - if ( probe_rsp->rawData[1] > 0 ) { - char ssid[HCF_MAX_NAME_LEN]; - - memset( ssid, 0, sizeof( ssid )); - strncpy( ssid, &probe_rsp->rawData[2], - min_t(u8, - probe_rsp->rawData[1], - HCF_MAX_NAME_LEN - 1)); - - DBG_TRACE( DbgInfo, "(%s) SSID : %s\n", - lp->dev->name, ssid ); - } - - /* Parse out the WPA-IE, if one exists */ - wpa_ie = wl_parse_wpa_ie( probe_rsp, &wpa_ie_len ); - if ( wpa_ie != NULL ) { - DBG_TRACE( DbgInfo, "(%s) WPA-IE : %s\n", - lp->dev->name, wl_print_wpa_ie( wpa_ie, wpa_ie_len )); - } - - DBG_TRACE( DbgInfo, "(%s) flags : 0x%04x.\n", - lp->dev->name, probe_rsp->flags ); - } - - DBG_TRACE( DbgInfo, "\n\n" ); - /* If probe response length is 1, then the scan is complete */ - if ( probe_rsp->length == 1 ) { - DBG_TRACE( DbgInfo, "SCAN COMPLETE\n" ); - lp->probe_results.num_aps = lp->probe_num_aps; - lp->probe_results.scan_complete = TRUE; - - /* Reset the counter for the next scan request */ - lp->probe_num_aps = 0; - - /* Send a wireless extensions event that the scan completed */ - wl_wext_event_scan_complete( lp->dev ); - } else { - /* Only copy to the table if the entry is unique; APs sometimes - respond more than once to a probe */ - if ( lp->probe_num_aps == 0 ) { - /* Copy the info to the ScanResult structure in the private - adapter struct */ - memcpy( &( lp->probe_results.ProbeTable[lp->probe_num_aps] ), - probe_rsp, sizeof( PROBE_RESP )); - - /* Increment the number of APs detected */ - lp->probe_num_aps++; - } else { - int count; - int unique = 1; - - for( count = 0; count < lp->probe_num_aps; count++ ) { - if ( memcmp( &( probe_rsp->BSSID ), - lp->probe_results.ProbeTable[count].BSSID, - ETH_ALEN ) == 0 ) { - unique = 0; - } - } - - if ( unique ) { - /* Copy the info to the ScanResult structure in the - private adapter struct. Only copy if there's room in the - table */ - if ( lp->probe_num_aps < MAX_NAPS ) - { - memcpy( &( lp->probe_results.ProbeTable[lp->probe_num_aps] ), - probe_rsp, sizeof( PROBE_RESP )); - } - else - { - DBG_WARNING( DbgInfo, "Num of scan results exceeds storage, truncating\n" ); - } - - /* Increment the number of APs detected. Note I do this - here even when I don't copy the probe response to the - buffer in order to detect the overflow condition */ - lp->probe_num_aps++; - } - } - } - } - - break; - - case CFG_LINK_STAT: -#define ls ((LINK_STATUS_STRCT *)ltv) - DBG_TRACE( DbgInfo, "CFG_LINK_STAT\n" ); - - switch( ls->linkStatus ) { - case 1: - DBG_TRACE( DbgInfo, "Link Status : Connected\n" ); - wl_wext_event_ap( lp->dev ); - break; - - case 2: - DBG_TRACE( DbgInfo, "Link Status : Disconnected\n" ); - break; - - case 3: - DBG_TRACE( DbgInfo, "Link Status : Access Point Change\n" ); - break; - - case 4: - DBG_TRACE( DbgInfo, "Link Status : Access Point Out of Range\n" ); - break; - - case 5: - DBG_TRACE( DbgInfo, "Link Status : Access Point In Range\n" ); - break; - - default: - DBG_TRACE( DbgInfo, "Link Status : UNKNOWN (0x%04x)\n", - ls->linkStatus ); - break; - } - - break; -#undef ls - - case CFG_ASSOC_STAT: - DBG_TRACE( DbgInfo, "CFG_ASSOC_STAT\n" ); - - { - ASSOC_STATUS_STRCT *as = (ASSOC_STATUS_STRCT *)ltv; - - switch( as->assocStatus ) { - case 1: - DBG_TRACE( DbgInfo, "Association Status : STA Associated\n" ); - break; - - case 2: - DBG_TRACE( DbgInfo, "Association Status : STA Reassociated\n" ); - break; - - case 3: - DBG_TRACE( DbgInfo, "Association Status : STA Disassociated\n" ); - break; - - default: - DBG_TRACE( DbgInfo, "Association Status : UNKNOWN (0x%04x)\n", - as->assocStatus ); - break; - } - - DBG_TRACE(DbgInfo, "STA Address : %pM\n", - as->staAddr); - - if (( as->assocStatus == 2 ) && ( as->len == 8 )) { - DBG_TRACE(DbgInfo, "Old AP Address : %pM\n", - as->oldApAddr); - } - } - - break; - - case CFG_SECURITY_STAT: - DBG_TRACE( DbgInfo, "CFG_SECURITY_STAT\n" ); - - { - SECURITY_STATUS_STRCT *ss = (SECURITY_STATUS_STRCT *)ltv; - - switch( ss->securityStatus ) { - case 1: - DBG_TRACE( DbgInfo, "Security Status : Dissassociate [AP]\n" ); - break; - - case 2: - DBG_TRACE( DbgInfo, "Security Status : Deauthenticate [AP]\n" ); - break; - - case 3: - DBG_TRACE( DbgInfo, "Security Status : Authenticate Fail [STA] or [AP]\n" ); - break; - - case 4: - DBG_TRACE( DbgInfo, "Security Status : MIC Fail\n" ); - break; - - case 5: - DBG_TRACE( DbgInfo, "Security Status : Associate Fail\n" ); - break; - - default: - DBG_TRACE( DbgInfo, "Security Status : UNKNOWN %d\n", - ss->securityStatus ); - break; - } - - DBG_TRACE(DbgInfo, "STA Address : %pM\n", - ss->staAddr); - - DBG_TRACE(DbgInfo, "Reason : 0x%04x\n", - ss->reason); - } - - break; - - case CFG_WMP: - DBG_TRACE( DbgInfo, "CFG_WMP, size is %d bytes\n", ltv->len ); - { - WMP_RSP_STRCT *wmp_rsp = (WMP_RSP_STRCT *)ltv; - - DBG_TRACE( DbgInfo, "CFG_WMP, pdu type is 0x%x\n", - wmp_rsp->wmpRsp.wmpHdr.type ); - - switch( wmp_rsp->wmpRsp.wmpHdr.type ) { - case WVLAN_WMP_PDU_TYPE_LT_RSP: - { -#if DBG - LINKTEST_RSP_STRCT *lt_rsp = (LINKTEST_RSP_STRCT *)ltv; -#endif // DBG - DBG_TRACE( DbgInfo, "LINK TEST RESULT\n" ); - DBG_TRACE( DbgInfo, "================\n" ); - DBG_TRACE( DbgInfo, "Length : %d.\n", lt_rsp->len ); - - DBG_TRACE( DbgInfo, "Name : %s.\n", lt_rsp->ltRsp.ltRsp.name ); - DBG_TRACE( DbgInfo, "Signal Level : 0x%02x.\n", lt_rsp->ltRsp.ltRsp.signal ); - DBG_TRACE( DbgInfo, "Noise Level : 0x%02x.\n", lt_rsp->ltRsp.ltRsp.noise ); - DBG_TRACE( DbgInfo, "Receive Flow : 0x%02x.\n", lt_rsp->ltRsp.ltRsp.rxFlow ); - DBG_TRACE( DbgInfo, "Data Rate : 0x%02x.\n", lt_rsp->ltRsp.ltRsp.dataRate ); - DBG_TRACE( DbgInfo, "Protocol : 0x%04x.\n", lt_rsp->ltRsp.ltRsp.protocol ); - DBG_TRACE( DbgInfo, "Station : 0x%02x.\n", lt_rsp->ltRsp.ltRsp.station ); - DBG_TRACE( DbgInfo, "Data Rate Cap : 0x%02x.\n", lt_rsp->ltRsp.ltRsp.dataRateCap ); - - DBG_TRACE( DbgInfo, "Power Mgmt : 0x%02x 0x%02x 0x%02x 0x%02x.\n", - lt_rsp->ltRsp.ltRsp.powerMgmt[0], - lt_rsp->ltRsp.ltRsp.powerMgmt[1], - lt_rsp->ltRsp.ltRsp.powerMgmt[2], - lt_rsp->ltRsp.ltRsp.powerMgmt[3] ); - - DBG_TRACE( DbgInfo, "Robustness : 0x%02x 0x%02x 0x%02x 0x%02x.\n", - lt_rsp->ltRsp.ltRsp.robustness[0], - lt_rsp->ltRsp.ltRsp.robustness[1], - lt_rsp->ltRsp.ltRsp.robustness[2], - lt_rsp->ltRsp.ltRsp.robustness[3] ); - - DBG_TRACE( DbgInfo, "Scaling : 0x%02x.\n", lt_rsp->ltRsp.ltRsp.scaling ); - } - - break; - - default: - break; - } - } - - break; - - case CFG_NULL: - DBG_TRACE( DbgInfo, "CFG_NULL\n" ); - break; - - case CFG_UPDATED_INFO_RECORD: // Updated Information Record - DBG_TRACE( DbgInfo, "UPDATED INFORMATION RECORD\n" ); - - ltv_val = CNV_INT_TO_LITTLE( ltv->u.u16[0] ); - - /* Check and see which RID was updated */ - switch( ltv_val ) { - case CFG_CUR_COUNTRY_INFO: // Indicate Passive Scan Completion - DBG_TRACE( DbgInfo, "Updated country info\n" ); - - /* Do I need to hold off on updating RIDs until the process is - complete? */ - wl_connect( lp ); - break; - - case CFG_PORT_STAT: // Wait for Connect Event - //wl_connect( lp ); - - break; - - default: - DBG_WARNING( DbgInfo, "Unknown RID: 0x%04x\n", ltv_val ); - } - - break; - - default: - DBG_TRACE( DbgInfo, "UNKNOWN MESSAGE: 0x%04x\n", ltv->typ ); - break; - } -} // wl_process_mailbox -/*============================================================================*/ -#endif /* ifndef USE_MBOX_SYNC */ - -#ifdef USE_WDS -/******************************************************************************* - * wl_wds_netdev_register() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function registers net_device structures with the system's network - * layer for use with the WDS ports. - * - * - * PARAMETERS: - * - * lp - pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wds_netdev_register( struct wl_private *lp ) -{ - int count; - - //;?why is there no USE_WDS clause like in wl_enable_wds_ports - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_AP ) { - for( count = 0; count < NUM_WDS_PORTS; count++ ) { - if ( WVLAN_VALID_MAC_ADDRESS( lp->wds_port[count].wdsAddress )) { - if ( register_netdev( lp->wds_port[count].dev ) != 0 ) { - DBG_WARNING( DbgInfo, "net device for WDS port %d could not be registered\n", - ( count + 1 )); - } - lp->wds_port[count].is_registered = TRUE; - - /* Fill out the net_device structs with the MAC addr */ - memcpy( lp->wds_port[count].dev->dev_addr, lp->MACAddress, ETH_ALEN ); - lp->wds_port[count].dev->addr_len = ETH_ALEN; - } - } - } -} // wl_wds_netdev_register -/*============================================================================*/ - - -/******************************************************************************* - * wl_wds_netdev_deregister() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function deregisters the WDS net_device structures used by the - * system's network layer. - * - * - * PARAMETERS: - * - * lp - pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wds_netdev_deregister( struct wl_private *lp ) -{ - int count; - - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_AP ) { - for( count = 0; count < NUM_WDS_PORTS; count++ ) { - if ( WVLAN_VALID_MAC_ADDRESS( lp->wds_port[count].wdsAddress )) { - unregister_netdev( lp->wds_port[count].dev ); - } - lp->wds_port[count].is_registered = FALSE; - } - } -} // wl_wds_netdev_deregister -/*============================================================================*/ -#endif /* USE_WDS */ - - -#if 0 //SCULL_USE_PROC /* don't waste space if unused */ -/* - * The proc filesystem: function to read and entry - */ -static void printf_hcf_16(struct seq_file *m, const char *s, hcf_16 *p, int n) -{ - int i, len; - - seq_printf(m, "%-20.20s: ", s); - len = 22; - - for (i = 0; i < n; i++) { - if (len % 80 > 75) - seq_putc(m, '\n'); - seq_printf(m, "%04X ", p[i]); - } - seq_putc(m, '\n'); -} - -static void printf_hcf_8(struct seq_file *m, const char *s, hcf_8 *p, int n) -{ - int i, len; - - seq_printf(m, "%-20.20s: ", s); - len = 22; - - for (i = 0; i <= n; i++) { - if (len % 80 > 77) - seq_putc(m, '\n'); - seq_printf(m, "%02X ", p[i]); - } - seq_putc(m, '\n'); -} - -static void printf_strct(struct seq_file *m, const char *s, hcf_16 *p) -{ - int i, len; - - seq_printf(m, "%-20.20s: ", s); - len = 22; - - for ( i = 0; i <= *p; i++ ) { - if (len % 80 > 75) - seq_putc(m, '\n'); - seq_printf(m,"%04X ", p[i]); - } - seq_putc(m, '\n'); -} - -int scull_read_procmem(struct seq_file *m, void *v) -{ - struct wl_private *lp = m->private; - IFBP ifbp; - CFG_HERMES_TALLIES_STRCT *p; - - if (lp == NULL) { - seq_puts(m, "No wl_private in scull_read_procmem\n" ); - } else if ( lp->wlags49_type == 0 ){ - ifbp = &lp->hcfCtx; - seq_printf(m, "Magic: 0x%04X\n", ifbp->IFB_Magic ); - seq_printf(m, "IOBase: 0x%04X\n", ifbp->IFB_IOBase ); - seq_printf(m, "LinkStat: 0x%04X\n", ifbp->IFB_LinkStat ); - seq_printf(m, "DSLinkStat: 0x%04X\n", ifbp->IFB_DSLinkStat ); - seq_printf(m, "TickIni: 0x%08lX\n", ifbp->IFB_TickIni ); - seq_printf(m, "TickCnt: 0x%04X\n", ifbp->IFB_TickCnt ); - seq_printf(m, "IntOffCnt: 0x%04X\n", ifbp->IFB_IntOffCnt ); - printf_hcf_16(m, "IFB_FWIdentity", - &ifbp->IFB_FWIdentity.len, ifbp->IFB_FWIdentity.len + 1 ); - } else if ( lp->wlags49_type == 1 ) { - seq_printf(m, "Channel: 0x%04X\n", lp->Channel ); -/****** seq_printf(m, "slock: %d\n", lp->slock ); */ -//x struct tq_struct "task: 0x%04X\n", lp->task ); -//x struct net_device_stats "stats: 0x%04X\n", lp->stats ); -#ifdef WIRELESS_EXT -//x struct iw_statistics "wstats: 0x%04X\n", lp->wstats ); -//x seq_printf(m, "spy_number: 0x%04X\n", lp->spy_number ); -//x u_char spy_address[IW_MAX_SPY][ETH_ALEN]; -//x struct iw_quality spy_stat[IW_MAX_SPY]; -#endif // WIRELESS_EXT - seq_printf(m, "IFB: 0x%p\n", &lp->hcfCtx ); - seq_printf(m, "flags: %#.8lX\n", lp->flags ); //;?use this format from now on - seq_printf(m, "DebugFlag(wl_private) 0x%04X\n", lp->DebugFlag ); -#if DBG - seq_printf(m, "DebugFlag (DbgInfo): 0x%08lX\n", DbgInfo->DebugFlag ); -#endif // DBG - seq_printf(m, "is_registered: 0x%04X\n", lp->is_registered ); -//x CFG_DRV_INFO_STRCT "driverInfo: 0x%04X\n", lp->driverInfo ); - printf_strct( m, "driverInfo", (hcf_16*)&lp->driverInfo ); -//x CFG_IDENTITY_STRCT "driverIdentity: 0x%04X\n", lp->driverIdentity ); - printf_strct( m, "driverIdentity", (hcf_16*)&lp->driverIdentity ); -//x CFG_FW_IDENTITY_STRCT "StationIdentity: 0x%04X\n", lp->StationIdentity ); - printf_strct( m, "StationIdentity", (hcf_16*)&lp->StationIdentity ); -//x CFG_PRI_IDENTITY_STRCT "PrimaryIdentity: 0x%04X\n", lp->PrimaryIdentity ); - printf_strct( m, "PrimaryIdentity", (hcf_16*)&lp->hcfCtx.IFB_PRIIdentity ); - printf_strct( m, "PrimarySupplier", (hcf_16*)&lp->hcfCtx.IFB_PRISup ); -//x CFG_PRI_IDENTITY_STRCT "NICIdentity: 0x%04X\n", lp->NICIdentity ); - printf_strct( m, "NICIdentity", (hcf_16*)&lp->NICIdentity ); -//x ltv_t "ltvRecord: 0x%04X\n", lp->ltvRecord ); - seq_printf(m, "txBytes: 0x%08lX\n", lp->txBytes ); - seq_printf(m, "maxPort: 0x%04X\n", lp->maxPort ); /* 0 for STA, 6 for AP */ - /* Elements used for async notification from hardware */ -//x RID_LOG_STRCT RidList[10]; -//x ltv_t "updatedRecord: 0x%04X\n", lp->updatedRecord ); -//x PROBE_RESP "ProbeResp: 0x%04X\n", lp->ProbeResp ); -//x ASSOC_STATUS_STRCT "assoc_stat: 0x%04X\n", lp->assoc_stat ); -//x SECURITY_STATUS_STRCT "sec_stat: 0x%04X\n", lp->sec_stat ); -//x u_char lookAheadBuf[WVLAN_MAX_LOOKAHEAD]; - seq_printf(m, "PortType: 0x%04X\n", lp->PortType ); // 1 - 3 (1 [Normal] | 3 [AdHoc]) - seq_printf(m, "Channel: 0x%04X\n", lp->Channel ); // 0 - 14 (0) -//x hcf_16 TxRateControl[2]; - seq_printf(m, "TxRateControl[2]: 0x%04X 0x%04X\n", - lp->TxRateControl[0], lp->TxRateControl[1] ); - seq_printf(m, "DistanceBetweenAPs: 0x%04X\n", lp->DistanceBetweenAPs ); // 1 - 3 (1) - seq_printf(m, "RTSThreshold: 0x%04X\n", lp->RTSThreshold ); // 0 - 2347 (2347) - seq_printf(m, "PMEnabled: 0x%04X\n", lp->PMEnabled ); // 0 - 2, 8001 - 8002 (0) - seq_printf(m, "MicrowaveRobustness: 0x%04X\n", lp->MicrowaveRobustness );// 0 - 1 (0) - seq_printf(m, "CreateIBSS: 0x%04X\n", lp->CreateIBSS ); // 0 - 1 (0) - seq_printf(m, "MulticastReceive: 0x%04X\n", lp->MulticastReceive ); // 0 - 1 (1) - seq_printf(m, "MaxSleepDuration: 0x%04X\n", lp->MaxSleepDuration ); // 0 - 65535 (100) -//x hcf_8 MACAddress[ETH_ALEN]; - printf_hcf_8(m, "MACAddress", lp->MACAddress, ETH_ALEN ); -//x char NetworkName[HCF_MAX_NAME_LEN+1]; - seq_printf(m, "NetworkName: %.32s\n", lp->NetworkName ); -//x char StationName[HCF_MAX_NAME_LEN+1]; - seq_printf(m, "EnableEncryption: 0x%04X\n", lp->EnableEncryption ); // 0 - 1 (0) -//x char Key1[MAX_KEY_LEN+1]; - printf_hcf_8( m, "Key1", lp->Key1, MAX_KEY_LEN ); -//x char Key2[MAX_KEY_LEN+1]; -//x char Key3[MAX_KEY_LEN+1]; -//x char Key4[MAX_KEY_LEN+1]; - seq_printf(m, "TransmitKeyID: 0x%04X\n", lp->TransmitKeyID ); // 1 - 4 (1) -//x CFG_DEFAULT_KEYS_STRCT "DefaultKeys: 0x%04X\n", lp->DefaultKeys ); -//x u_char mailbox[MB_SIZE]; -//x char szEncryption[MAX_ENC_LEN]; - seq_printf(m, "driverEnable: 0x%04X\n", lp->driverEnable ); - seq_printf(m, "wolasEnable: 0x%04X\n", lp->wolasEnable ); - seq_printf(m, "atimWindow: 0x%04X\n", lp->atimWindow ); - seq_printf(m, "holdoverDuration: 0x%04X\n", lp->holdoverDuration ); -//x hcf_16 MulticastRate[2]; - seq_printf(m, "authentication: 0x%04X\n", lp->authentication ); // is this AP specific? - seq_printf(m, "promiscuousMode: 0x%04X\n", lp->promiscuousMode ); - seq_printf(m, "DownloadFirmware: 0x%04X\n", lp->DownloadFirmware ); // 0 - 2 (0 [None] | 1 [STA] | 2 [AP]) - seq_printf(m, "AuthKeyMgmtSuite: 0x%04X\n", lp->AuthKeyMgmtSuite ); - seq_printf(m, "loadBalancing: 0x%04X\n", lp->loadBalancing ); - seq_printf(m, "mediumDistribution: 0x%04X\n", lp->mediumDistribution ); - seq_printf(m, "txPowLevel: 0x%04X\n", lp->txPowLevel ); -// seq_printf(m, "shortRetryLimit: 0x%04X\n", lp->shortRetryLimit ); -// seq_printf(m, "longRetryLimit: 0x%04X\n", lp->longRetryLimit ); -//x hcf_16 srsc[2]; -//x hcf_16 brsc[2]; - seq_printf(m, "connectionControl: 0x%04X\n", lp->connectionControl ); -//x //hcf_16 probeDataRates[2]; - seq_printf(m, "ownBeaconInterval: 0x%04X\n", lp->ownBeaconInterval ); - seq_printf(m, "coexistence: 0x%04X\n", lp->coexistence ); -//x WVLAN_FRAME "txF: 0x%04X\n", lp->txF ); -//x WVLAN_LFRAME txList[DEFAULT_NUM_TX_FRAMES]; -//x struct list_head "txFree: 0x%04X\n", lp->txFree ); -//x struct list_head txQ[WVLAN_MAX_TX_QUEUES]; - seq_printf(m, "netif_queue_on: 0x%04X\n", lp->netif_queue_on ); - seq_printf(m, "txQ_count: 0x%04X\n", lp->txQ_count ); -//x DESC_STRCT "desc_rx: 0x%04X\n", lp->desc_rx ); -//x DESC_STRCT "desc_tx: 0x%04X\n", lp->desc_tx ); -//x WVLAN_PORT_STATE "portState: 0x%04X\n", lp->portState ); -//x ScanResult "scan_results: 0x%04X\n", lp->scan_results ); -//x ProbeResult "probe_results: 0x%04X\n", lp->probe_results ); - seq_printf(m, "probe_num_aps: 0x%04X\n", lp->probe_num_aps ); - seq_printf(m, "use_dma: 0x%04X\n", lp->use_dma ); -//x DMA_STRCT "dma: 0x%04X\n", lp->dma ); -#ifdef USE_RTS - seq_printf(m, "useRTS: 0x%04X\n", lp->useRTS ); -#endif // USE_RTS -#if 1 //;? (HCF_TYPE) & HCF_TYPE_AP - //;?should we restore this to allow smaller memory footprint - //;?I guess not. This should be brought under Debug mode only - seq_printf(m, "DTIMPeriod: 0x%04X\n", lp->DTIMPeriod ); // 1 - 255 (1) - seq_printf(m, "multicastPMBuffering: 0x%04X\n", lp->multicastPMBuffering ); - seq_printf(m, "RejectAny: 0x%04X\n", lp->RejectAny ); // 0 - 1 (0) - seq_printf(m, "ExcludeUnencrypted: 0x%04X\n", lp->ExcludeUnencrypted ); // 0 - 1 (1) - seq_printf(m, "intraBSSRelay: 0x%04X\n", lp->intraBSSRelay ); - seq_printf(m, "wlags49_type: 0x%08lX\n", lp->wlags49_type ); -#ifdef USE_WDS -//x WVLAN_WDS_IF wds_port[NUM_WDS_PORTS]; -#endif // USE_WDS -#endif // HCF_AP - } else if ( lp->wlags49_type == 2 ){ - seq_printf(m, "tallies to be added\n" ); -//Hermes Tallies (IFB substructure) { - p = &lp->hcfCtx.IFB_NIC_Tallies; - seq_printf(m, "TxUnicastFrames: %08lX\n", p->TxUnicastFrames ); - seq_printf(m, "TxMulticastFrames: %08lX\n", p->TxMulticastFrames ); - seq_printf(m, "TxFragments: %08lX\n", p->TxFragments ); - seq_printf(m, "TxUnicastOctets: %08lX\n", p->TxUnicastOctets ); - seq_printf(m, "TxMulticastOctets: %08lX\n", p->TxMulticastOctets ); - seq_printf(m, "TxDeferredTransmissions: %08lX\n", p->TxDeferredTransmissions ); - seq_printf(m, "TxSingleRetryFrames: %08lX\n", p->TxSingleRetryFrames ); - seq_printf(m, "TxMultipleRetryFrames: %08lX\n", p->TxMultipleRetryFrames ); - seq_printf(m, "TxRetryLimitExceeded: %08lX\n", p->TxRetryLimitExceeded ); - seq_printf(m, "TxDiscards: %08lX\n", p->TxDiscards ); - seq_printf(m, "RxUnicastFrames: %08lX\n", p->RxUnicastFrames ); - seq_printf(m, "RxMulticastFrames: %08lX\n", p->RxMulticastFrames ); - seq_printf(m, "RxFragments: %08lX\n", p->RxFragments ); - seq_printf(m, "RxUnicastOctets: %08lX\n", p->RxUnicastOctets ); - seq_printf(m, "RxMulticastOctets: %08lX\n", p->RxMulticastOctets ); - seq_printf(m, "RxFCSErrors: %08lX\n", p->RxFCSErrors ); - seq_printf(m, "RxDiscardsNoBuffer: %08lX\n", p->RxDiscardsNoBuffer ); - seq_printf(m, "TxDiscardsWrongSA: %08lX\n", p->TxDiscardsWrongSA ); - seq_printf(m, "RxWEPUndecryptable: %08lX\n", p->RxWEPUndecryptable ); - seq_printf(m, "RxMsgInMsgFragments: %08lX\n", p->RxMsgInMsgFragments ); - seq_printf(m, "RxMsgInBadMsgFragments: %08lX\n", p->RxMsgInBadMsgFragments ); - seq_printf(m, "RxDiscardsWEPICVError: %08lX\n", p->RxDiscardsWEPICVError ); - seq_printf(m, "RxDiscardsWEPExcluded: %08lX\n", p->RxDiscardsWEPExcluded ); -#if (HCF_EXT) & HCF_EXT_TALLIES_FW - //to be added ;? -#endif // HCF_EXT_TALLIES_FW - } else if ( lp->wlags49_type & 0x8000 ) { //;?kludgy but it is unclear to me were else to place this -#if DBG - DbgInfo->DebugFlag = lp->wlags49_type & 0x7FFF; -#endif // DBG - lp->wlags49_type = 0; //default to IFB again ;? - } else { - seq_printf(m, "unknown value for wlags49_type: 0x%08lX\n", lp->wlags49_type ); - seq_puts(m, - "0x0000 - IFB\n" - "0x0001 - wl_private\n" - "0x0002 - Tallies\n" - "0x8xxx - Change debufflag\n" - "ERROR 0001\nWARNING 0002\nNOTICE 0004\nTRACE 0008\n" - "VERBOSE 0010\nPARAM 0020\nBREAK 0040\nRX 0100\n" - "TX 0200\nDS 0400\n"); - } - return 0; -} // scull_read_procmem - -static int write_int(struct file *file, const char *buffer, unsigned long count, void *data) -{ - static char proc_number[11]; - unsigned int nr = 0; - - if (count > 9) { - count = -EINVAL; - } else if ( copy_from_user(proc_number, buffer, count) ) { - count = -EFAULT; - } - if (count > 0 ) { - proc_number[count] = 0; - nr = simple_strtoul(proc_number , NULL, 0); - *(unsigned int *)data = nr; - if ( nr & 0x8000 ) { //;?kludgy but it is unclear to me were else to place this -#if DBG - DbgInfo->DebugFlag = nr & 0x7FFF; -#endif // DBG - } - } - DBG_PRINT( "value: %08X\n", nr ); - return count; -} // write_int - -#endif /* SCULL_USE_PROC */ - -#ifdef DN554 -#define RUN_AT(x) (jiffies+(x)) //"borrowed" from include/pcmcia/k_compat.h -#define DS_OOR 0x8000 //Deepsleep OutOfRange Status - - lp->timer_oor_cnt = DS_OOR; - init_timer( &lp->timer_oor ); - lp->timer_oor.function = timer_oor; - lp->timer_oor.data = (unsigned long)lp; - lp->timer_oor.expires = RUN_AT( 3 * HZ ); - add_timer( &lp->timer_oor ); - printk(KERN_NOTICE "wl_enable: %ld\n", jiffies ); //;?remove me 1 day -#endif //DN554 -#ifdef DN554 -/******************************************************************************* - * timer_oor() - ******************************************************************************* - * - * DESCRIPTION: - * - * - * PARAMETERS: - * - * arg - a u_long representing a pointer to a dev_link_t structure for the - * device to be released. - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void timer_oor( u_long arg ) -{ - struct wl_private *lp = (struct wl_private *)arg; - - DBG_PARAM( DbgInfo, "arg", "0x%08lx", arg ); - - printk(KERN_NOTICE "timer_oor: %ld 0x%04X\n", jiffies, lp->timer_oor_cnt ); //;?remove me 1 day - lp->timer_oor_cnt += 10; - if ( (lp->timer_oor_cnt & ~DS_OOR) > 300 ) { - lp->timer_oor_cnt = 300; - } - lp->timer_oor_cnt |= DS_OOR; - init_timer( &lp->timer_oor ); - lp->timer_oor.function = timer_oor; - lp->timer_oor.data = (unsigned long)lp; - lp->timer_oor.expires = RUN_AT( (lp->timer_oor_cnt & ~DS_OOR) * HZ ); - add_timer( &lp->timer_oor ); -} // timer_oor -#endif //DN554 - -MODULE_LICENSE("Dual BSD/GPL"); diff --git a/drivers/staging/wlags49_h2/wl_main.h b/drivers/staging/wlags49_h2/wl_main.h deleted file mode 100644 index 3806e744d7f6..000000000000 --- a/drivers/staging/wlags49_h2/wl_main.h +++ /dev/null @@ -1,138 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * Header describing device specific routines and driver init/un-init. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -#ifndef __WL_MAIN_H__ -#define __WL_MAIN_H__ - - - - -/******************************************************************************* - * function prototypes - ******************************************************************************/ -int wl_insert( struct net_device *dev ); - -void wl_set_wep_keys( struct wl_private *lp ); - -int wl_put_ltv_init( struct wl_private *lp ); - -int wl_put_ltv( struct wl_private *lp ); - -p_u16 wl_get_irq_mask( void ); - -p_s8 * wl_get_irq_list( void ); - -int wl_reset( struct net_device *dev ); - -int wl_go( struct wl_private *lp ); - -int wl_apply( struct wl_private *lp ); - -irqreturn_t wl_isr( int irq, void *dev_id, struct pt_regs *regs ); - -void wl_remove( struct net_device *dev ); - -void wl_suspend( struct net_device *dev ); - -void wl_resume( struct net_device *dev ); - -void wl_release( struct net_device *dev ); - -int wl_enable( struct wl_private *lp ); - -int wl_connect( struct wl_private *lp ); - -int wl_disable( struct wl_private *lp ); - -int wl_disconnect( struct wl_private *lp ); - -void wl_enable_wds_ports( struct wl_private * lp ); - -void wl_disable_wds_ports( struct wl_private * lp ); - -#ifndef USE_MBOX_SYNC - -int wl_mbx( struct wl_private *lp ); -void wl_endian_translate_mailbox( ltv_t *ltv ); -void wl_process_mailbox( struct wl_private *lp ); - -#endif /* USE_MBOX_SYNC */ - - -#ifdef USE_WDS - -void wl_wds_netdev_register( struct wl_private *lp ); -void wl_wds_netdev_deregister( struct wl_private *lp ); - -#endif /* USE_WDS */ - - -#ifdef USE_WDS - -#define WL_WDS_NETDEV_REGISTER( ARG ) wl_wds_netdev_register( ARG ) -#define WL_WDS_NETDEV_DEREGISTER( ARG ) wl_wds_netdev_deregister( ARG ) - -#else - -#define WL_WDS_NETDEV_REGISTER( ARG ) -#define WL_WDS_NETDEV_DEREGISTER( ARG ) - -#endif /* USE_WDS */ -#endif /* __WL_MAIN_H__ */ diff --git a/drivers/staging/wlags49_h2/wl_netdev.c b/drivers/staging/wlags49_h2/wl_netdev.c deleted file mode 100644 index 60701d4325d0..000000000000 --- a/drivers/staging/wlags49_h2/wl_netdev.c +++ /dev/null @@ -1,1950 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * This file contains handler functions registered with the net_device - * structure. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -/******************************************************************************* - * include files - ******************************************************************************/ -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#ifdef USE_PROFILE -#include -#endif /* USE_PROFILE */ - -#ifdef BUS_PCMCIA -#include -#endif /* BUS_PCMCIA */ - -#ifdef BUS_PCI -#include -#endif /* BUS_PCI */ - -#if HCF_ENCAP -#define MTU_MAX (HCF_MAX_MSG - ETH_HLEN - 8) -#else -#define MTU_MAX (HCF_MAX_MSG - ETH_HLEN) -#endif - -/******************************************************************************* - * macros - ******************************************************************************/ -#define BLOCK_INPUT(buf, len) \ - do { \ - desc->buf_addr = buf; \ - desc->BUF_SIZE = len; \ - status = hcf_rcv_msg(&(lp->hcfCtx), desc, 0); \ - } while (0) - -#define BLOCK_INPUT_DMA(buf, len) memcpy( buf, desc_next->buf_addr, pktlen ) - -/******************************************************************************* - * function prototypes - ******************************************************************************/ - -/******************************************************************************* - * wl_init() - ******************************************************************************* - * - * DESCRIPTION: - * - * We never need to do anything when a "Wireless" device is "initialized" - * by the net software, because we only register already-found cards. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -int wl_init(struct net_device *dev) -{ - DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev); - return 0; -} /* wl_init */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_config() - ******************************************************************************* - * - * DESCRIPTION: - * - * Implement the SIOCSIFMAP interface. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device structure - * map - a pointer to the device's ifmap structure - * - * RETURNS: - * - * 0 on success - * errno otherwise - * - ******************************************************************************/ -int wl_config(struct net_device *dev, struct ifmap *map) -{ - DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev); - DBG_PARAM(DbgInfo, "map", "0x%p", map); - - /* - * The only thing we care about here is a port change. - * Since this not needed, ignore the request. - */ - DBG_TRACE(DbgInfo, "%s: %s called.\n", dev->name, __func__); - - return 0; -} /* wl_config */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_stats() - ******************************************************************************* - * - * DESCRIPTION: - * - * Return the current device statistics. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device structure - * - * RETURNS: - * - * a pointer to a net_device_stats structure containing the network - * statistics. - * - ******************************************************************************/ -struct net_device_stats *wl_stats(struct net_device *dev) -{ -#ifdef USE_WDS - int count; -#endif /* USE_WDS */ - unsigned long flags; - struct net_device_stats *pStats; - struct wl_private *lp = wl_priv(dev); - - /*DBG_PARAM( DbgInfo, "dev", "%s (0x%p)", dev->name, dev ); */ - - pStats = NULL; - - wl_lock(lp, &flags); - -#ifdef USE_RTS - if (lp->useRTS == 1) { - wl_unlock(lp, &flags); - return NULL; - } -#endif /* USE_RTS */ - - /* Return the statistics for the appropriate device */ -#ifdef USE_WDS - - for (count = 0; count < NUM_WDS_PORTS; count++) { - if (dev == lp->wds_port[count].dev) - pStats = &(lp->wds_port[count].stats); - } - -#endif /* USE_WDS */ - - /* If pStats is still NULL, then the device is not a WDS port */ - if (pStats == NULL) - pStats = &(lp->stats); - - wl_unlock(lp, &flags); - - return pStats; -} /* wl_stats */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_open() - ******************************************************************************* - * - * DESCRIPTION: - * - * Open the device. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device structure - * - * RETURNS: - * - * 0 on success - * errno otherwise - * - ******************************************************************************/ -int wl_open(struct net_device *dev) -{ - int status = HCF_SUCCESS; - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - - wl_lock(lp, &flags); - -#ifdef USE_RTS - if (lp->useRTS == 1) { - DBG_TRACE(DbgInfo, "Skipping device open, in RTS mode\n"); - wl_unlock(lp, &flags); - return -EIO; - } -#endif /* USE_RTS */ - -#ifdef USE_PROFILE - parse_config(dev); -#endif - - if (lp->portState == WVLAN_PORT_STATE_DISABLED) { - DBG_TRACE(DbgInfo, "Enabling Port 0\n"); - status = wl_enable(lp); - - if (status != HCF_SUCCESS) { - DBG_TRACE(DbgInfo, "Enable port 0 failed: 0x%x\n", - status); - } - } - - /* Holding the lock too long, make a gap to allow other processes */ - wl_unlock(lp, &flags); - wl_lock(lp, &flags); - - if (strlen(lp->fw_image_filename)) { - DBG_TRACE(DbgInfo, ";???? Kludgy way to force a download\n"); - status = wl_go(lp); - } else { - status = wl_apply(lp); - } - - /* Holding the lock too long, make a gap to allow other processes */ - wl_unlock(lp, &flags); - wl_lock(lp, &flags); - - /* Unsuccessful, try reset of the card to recover */ - if (status != HCF_SUCCESS) - status = wl_reset(dev); - - /* Holding the lock too long, make a gap to allow other processes */ - wl_unlock(lp, &flags); - wl_lock(lp, &flags); - - if (status == HCF_SUCCESS) { - netif_carrier_on(dev); - WL_WDS_NETIF_CARRIER_ON(lp); - - /* Start handling interrupts */ - lp->is_handling_int = WL_HANDLING_INT; - wl_act_int_on(lp); - - netif_start_queue(dev); - WL_WDS_NETIF_START_QUEUE(lp); - } else { - wl_hcf_error(dev, status); /* Report the error */ - netif_device_detach(dev); /* Stop the device and queue */ - } - - wl_unlock(lp, &flags); - - return status; -} /* wl_open */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_close() - ******************************************************************************* - * - * DESCRIPTION: - * - * Close the device. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device structure - * - * RETURNS: - * - * 0 on success - * errno otherwise - * - ******************************************************************************/ -int wl_close(struct net_device *dev) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - - DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev); - - /* Mark the adapter as busy */ - netif_stop_queue(dev); - WL_WDS_NETIF_STOP_QUEUE(lp); - - netif_carrier_off(dev); - WL_WDS_NETIF_CARRIER_OFF(lp); - - /* - * Shutdown the adapter: - * Disable adapter interrupts - * Stop Tx/Rx - * Update statistics - * Set low power mode - */ - - wl_lock(lp, &flags); - - wl_act_int_off(lp); - /* Stop handling interrupts */ - lp->is_handling_int = WL_NOT_HANDLING_INT; - -#ifdef USE_RTS - if (lp->useRTS == 1) { - DBG_TRACE(DbgInfo, "Skipping device close, in RTS mode\n"); - wl_unlock(lp, &flags); - return -EIO; - } -#endif /* USE_RTS */ - - /* Disable the ports */ - wl_disable(lp); - - wl_unlock(lp, &flags); - - return 0; -} /* wl_close */ - -/*============================================================================*/ - -static void wl_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) -{ - strlcpy(info->driver, DRIVER_NAME, sizeof(info->driver)); - strlcpy(info->version, DRV_VERSION_STR, sizeof(info->version)); - - if (dev->dev.parent) { - dev_set_name(dev->dev.parent, "%s", info->bus_info); - } else { - snprintf(info->bus_info, sizeof(info->bus_info), - "PCMCIA FIXME"); - } -} /* wl_get_drvinfo */ - -static struct ethtool_ops wl_ethtool_ops = { - .get_drvinfo = wl_get_drvinfo, - .get_link = ethtool_op_get_link, -}; - -/******************************************************************************* - * wl_ioctl() - ******************************************************************************* - * - * DESCRIPTION: - * - * The IOCTL handler for the device. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device struct. - * rq - a pointer to the IOCTL request buffer. - * cmd - the IOCTL command code. - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -int wl_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - - DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev); - DBG_PARAM(DbgInfo, "rq", "0x%p", rq); - DBG_PARAM(DbgInfo, "cmd", "0x%04x", cmd); - - wl_lock(lp, &flags); - - wl_act_int_off(lp); - -#ifdef USE_RTS - if (lp->useRTS == 1) { - /* Handle any RTS IOCTL here */ - if (cmd == WL_IOCTL_RTS) { - DBG_TRACE(DbgInfo, "IOCTL: WL_IOCTL_RTS\n"); - ret = wvlan_rts((struct rtsreq *)rq, dev->base_addr); - } else { - DBG_TRACE(DbgInfo, - "IOCTL not supported in RTS mode: 0x%X\n", - cmd); - ret = -EOPNOTSUPP; - } - - goto out_act_int_on_unlock; - } -#endif /* USE_RTS */ - - /* Only handle UIL IOCTL requests when the UIL has the system blocked. */ - if (!((lp->flags & WVLAN2_UIL_BUSY) && (cmd != WVLAN2_IOCTL_UIL))) { -#ifdef USE_UIL - struct uilreq *urq = (struct uilreq *)rq; -#endif /* USE_UIL */ - - switch (cmd) { - /* ================== Private IOCTLs (up to 16) ================== */ -#ifdef USE_UIL - case WVLAN2_IOCTL_UIL: - DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL\n"); - ret = wvlan_uil(urq, lp); - break; -#endif /* USE_UIL */ - - default: - DBG_TRACE(DbgInfo, "IOCTL CODE NOT SUPPORTED: 0x%X\n", - cmd); - ret = -EOPNOTSUPP; - break; - } - } else { - DBG_WARNING(DbgInfo, - "DEVICE IS BUSY, CANNOT PROCESS REQUEST\n"); - ret = -EBUSY; - } - -#ifdef USE_RTS -out_act_int_on_unlock: -#endif /* USE_RTS */ - wl_act_int_on(lp); - - wl_unlock(lp, &flags); - - return ret; -} /* wl_ioctl */ - -/*============================================================================*/ - -#ifdef CONFIG_NET_POLL_CONTROLLER -static void wl_poll(struct net_device *dev) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - struct pt_regs regs; - - wl_lock(lp, &flags); - wl_isr(dev->irq, dev, ®s); - wl_unlock(lp, &flags); -} -#endif - -/******************************************************************************* - * wl_tx_timeout() - ******************************************************************************* - * - * DESCRIPTION: - * - * The handler called when, for some reason, a Tx request is not completed. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device struct. - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_tx_timeout(struct net_device *dev) -{ -#ifdef USE_WDS - int count; -#endif /* USE_WDS */ - unsigned long flags; - struct wl_private *lp = wl_priv(dev); - struct net_device_stats *pStats = NULL; - - DBG_WARNING(DbgInfo, "%s: Transmit timeout.\n", dev->name); - - wl_lock(lp, &flags); - -#ifdef USE_RTS - if (lp->useRTS == 1) { - DBG_TRACE(DbgInfo, - "Skipping tx_timeout handler, in RTS mode\n"); - wl_unlock(lp, &flags); - return; - } -#endif /* USE_RTS */ - - /* Figure out which device (the "root" device or WDS port) this timeout - is for */ -#ifdef USE_WDS - - for (count = 0; count < NUM_WDS_PORTS; count++) { - if (dev == lp->wds_port[count].dev) { - pStats = &(lp->wds_port[count].stats); - - /* Break the loop so that we can use the counter to access WDS - information in the private structure */ - break; - } - } - -#endif /* USE_WDS */ - - /* If pStats is still NULL, then the device is not a WDS port */ - if (pStats == NULL) - pStats = &(lp->stats); - - /* Accumulate the timeout error */ - pStats->tx_errors++; - - wl_unlock(lp, &flags); -} /* wl_tx_timeout */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_send() - ******************************************************************************* - * - * DESCRIPTION: - * - * The routine which performs data transmits. - * - * PARAMETERS: - * - * lp - a pointer to the device's wl_private struct. - * - * RETURNS: - * - * 0 on success - * 1 on error - * - ******************************************************************************/ -int wl_send(struct wl_private *lp) -{ - - int status; - DESC_STRCT *desc; - WVLAN_LFRAME *txF = NULL; - struct list_head *element; - int len; - /*------------------------------------------------------------------------*/ - - if (lp == NULL) { - DBG_ERROR(DbgInfo, "Private adapter struct is NULL\n"); - return FALSE; - } - if (lp->dev == NULL) { - DBG_ERROR(DbgInfo, "net_device struct in wl_private is NULL\n"); - return FALSE; - } - - /* - * Check for the availability of FIDs; if none are available, - * don't take any frames off the txQ - */ - if (lp->hcfCtx.IFB_RscInd == 0) - return FALSE; - - /* Reclaim the TxQ Elements and place them back on the free queue */ - if (!list_empty(&(lp->txQ[0]))) { - element = lp->txQ[0].next; - - txF = (WVLAN_LFRAME *) list_entry(element, WVLAN_LFRAME, node); - if (txF != NULL) { - lp->txF.skb = txF->frame.skb; - lp->txF.port = txF->frame.port; - - txF->frame.skb = NULL; - txF->frame.port = 0; - - list_del(&(txF->node)); - list_add(element, &(lp->txFree)); - - lp->txQ_count--; - - if (lp->txQ_count < TX_Q_LOW_WATER_MARK) { - if (lp->netif_queue_on == FALSE) { - DBG_TX(DbgInfo, "Kickstarting Q: %d\n", - lp->txQ_count); - netif_wake_queue(lp->dev); - WL_WDS_NETIF_WAKE_QUEUE(lp); - lp->netif_queue_on = TRUE; - } - } - } - } - - if (lp->txF.skb == NULL) - return FALSE; - - /* If the device has resources (FIDs) available, then Tx the packet */ - /* Format the TxRequest and send it to the adapter */ - len = lp->txF.skb->len < ETH_ZLEN ? ETH_ZLEN : lp->txF.skb->len; - - desc = &(lp->desc_tx); - desc->buf_addr = lp->txF.skb->data; - desc->BUF_CNT = len; - desc->next_desc_addr = NULL; - - status = hcf_send_msg(&(lp->hcfCtx), desc, lp->txF.port); - - if (status == HCF_SUCCESS) { - lp->dev->trans_start = jiffies; - - DBG_TX(DbgInfo, "Transmit...\n"); - - if (lp->txF.port == HCF_PORT_0) { - lp->stats.tx_packets++; - lp->stats.tx_bytes += lp->txF.skb->len; - } -#ifdef USE_WDS - else { - lp->wds_port[((lp->txF.port >> 8) - - 1)].stats.tx_packets++; - lp->wds_port[((lp->txF.port >> 8) - - 1)].stats.tx_bytes += lp->txF.skb->len; - } - -#endif /* USE_WDS */ - - /* Free the skb and perform queue cleanup, as the buffer was - transmitted successfully */ - dev_consume_skb_any( lp->txF.skb ); - - lp->txF.skb = NULL; - lp->txF.port = 0; - } - - return TRUE; -} /* wl_send */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_tx() - ******************************************************************************* - * - * DESCRIPTION: - * - * The Tx handler function for the network layer. - * - * PARAMETERS: - * - * skb - a pointer to the sk_buff structure containing the data to transfer. - * dev - a pointer to the device's net_device structure. - * - * RETURNS: - * - * 0 on success - * 1 on error - * - ******************************************************************************/ -int wl_tx(struct sk_buff *skb, struct net_device *dev, int port) -{ - unsigned long flags; - struct wl_private *lp = wl_priv(dev); - WVLAN_LFRAME *txF = NULL; - struct list_head *element; - /*------------------------------------------------------------------------*/ - - /* Grab the spinlock */ - wl_lock(lp, &flags); - - if (lp->flags & WVLAN2_UIL_BUSY) { - DBG_WARNING(DbgInfo, "UIL has device blocked\n"); - /* Start dropping packets here??? */ - wl_unlock(lp, &flags); - return 1; - } -#ifdef USE_RTS - if (lp->useRTS == 1) { - DBG_PRINT("RTS: we're getting a Tx...\n"); - wl_unlock(lp, &flags); - return 1; - } -#endif /* USE_RTS */ - - if (!lp->use_dma) { - /* Get an element from the queue */ - element = lp->txFree.next; - txF = (WVLAN_LFRAME *) list_entry(element, WVLAN_LFRAME, node); - if (txF == NULL) { - DBG_ERROR(DbgInfo, "Problem with list_entry\n"); - wl_unlock(lp, &flags); - return 1; - } - /* Fill out the frame */ - txF->frame.skb = skb; - txF->frame.port = port; - /* Move the frame to the txQ */ - /* NOTE: Here's where we would do priority queueing */ - list_move(&(txF->node), &(lp->txQ[0])); - - lp->txQ_count++; - if (lp->txQ_count >= DEFAULT_NUM_TX_FRAMES) { - DBG_TX(DbgInfo, "Q Full: %d\n", lp->txQ_count); - if (lp->netif_queue_on == TRUE) { - netif_stop_queue(lp->dev); - WL_WDS_NETIF_STOP_QUEUE(lp); - lp->netif_queue_on = FALSE; - } - } - } - wl_act_int_off(lp); /* Disable Interrupts */ - - /* Send the data to the hardware using the appropriate method */ -#ifdef ENABLE_DMA - if (lp->use_dma) { - wl_send_dma(lp, skb, port); - } else -#endif - { - wl_send(lp); - } - /* Re-enable Interrupts, release the spinlock and return */ - wl_act_int_on(lp); - wl_unlock(lp, &flags); - return 0; -} /* wl_tx */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_rx() - ******************************************************************************* - * - * DESCRIPTION: - * - * The routine which performs data reception. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device structure. - * - * RETURNS: - * - * 0 on success - * 1 on error - * - ******************************************************************************/ -int wl_rx(struct net_device *dev) -{ - int port; - struct sk_buff *skb; - struct wl_private *lp = wl_priv(dev); - int status; - hcf_16 pktlen; - hcf_16 hfs_stat; - DESC_STRCT *desc; - /*------------------------------------------------------------------------*/ - - DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev); - - if (!(lp->flags & WVLAN2_UIL_BUSY)) { - -#ifdef USE_RTS - if (lp->useRTS == 1) { - DBG_PRINT("RTS: We're getting an Rx...\n"); - return -EIO; - } -#endif /* USE_RTS */ - - /* Read the HFS_STAT register from the lookahead buffer */ - hfs_stat = (hcf_16) ((lp->lookAheadBuf[HFS_STAT]) | - (lp->lookAheadBuf[HFS_STAT + 1] << 8)); - - /* Make sure the frame isn't bad */ - if ((hfs_stat & HFS_STAT_ERR) != HCF_SUCCESS) { - DBG_WARNING(DbgInfo, - "HFS_STAT_ERROR (0x%x) in Rx Packet\n", - lp->lookAheadBuf[HFS_STAT]); - return -EIO; - } - - /* Determine what port this packet is for */ - port = (hfs_stat >> 8) & 0x0007; - DBG_RX(DbgInfo, "Rx frame for port %d\n", port); - - pktlen = lp->hcfCtx.IFB_RxLen; - if (pktlen != 0) { - skb = ALLOC_SKB(pktlen); - if (skb != NULL) { - /* Set the netdev based on the port */ - switch (port) { -#ifdef USE_WDS - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - skb->dev = lp->wds_port[port - 1].dev; - break; -#endif /* USE_WDS */ - - case 0: - default: - skb->dev = dev; - break; - } - - desc = &(lp->desc_rx); - - desc->next_desc_addr = NULL; - -/* -#define BLOCK_INPUT(buf, len) \ - desc->buf_addr = buf; \ - desc->BUF_SIZE = len; \ - status = hcf_rcv_msg(&(lp->hcfCtx), desc, 0) -*/ - - GET_PACKET(skb->dev, skb, pktlen); - - if (status == HCF_SUCCESS) { - if (port == 0) { - lp->stats.rx_packets++; - lp->stats.rx_bytes += pktlen; - } -#ifdef USE_WDS - else { - lp->wds_port[port - - 1].stats. - rx_packets++; - lp->wds_port[port - - 1].stats. - rx_bytes += pktlen; - } -#endif /* USE_WDS */ - - dev->last_rx = jiffies; - -#ifdef WIRELESS_EXT -#ifdef WIRELESS_SPY - if (lp->spydata.spy_number > 0) { - char *srcaddr = - skb->mac.raw + - MAC_ADDR_SIZE; - - wl_spy_gather(dev, srcaddr); - } -#endif /* WIRELESS_SPY */ -#endif /* WIRELESS_EXT */ - netif_rx(skb); - } else { - DBG_ERROR(DbgInfo, - "Rx request to card FAILED\n"); - - if (port == 0) - lp->stats.rx_dropped++; -#ifdef USE_WDS - else { - lp->wds_port[port - - 1].stats. - rx_dropped++; - } -#endif /* USE_WDS */ - - dev_kfree_skb(skb); - } - } else { - DBG_ERROR(DbgInfo, "Could not alloc skb\n"); - - if (port == 0) - lp->stats.rx_dropped++; -#ifdef USE_WDS - else { - lp->wds_port[port - - 1].stats.rx_dropped++; - } -#endif /* USE_WDS */ - } - } - } - - return 0; -} /* wl_rx */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_multicast() - ******************************************************************************* - * - * DESCRIPTION: - * - * Function to handle multicast packets - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device structure. - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -#ifdef NEW_MULTICAST - -void wl_multicast(struct net_device *dev) -{ -#if 1 /* (HCF_TYPE) & HCF_TYPE_STA */ - /* - * should we return an error status in AP mode ? - * seems reasonable that even an AP-only driver - * could afford this small additional footprint - */ - - int x; - struct netdev_hw_addr *ha; - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - - DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev); - - if (!wl_adapter_is_open(dev)) - return; - -#if DBG - if (DBG_FLAGS(DbgInfo) & DBG_PARAM_ON) { - DBG_PRINT(" flags: %s%s%s\n", - (dev->flags & IFF_PROMISC) ? "Promiscuous " : "", - (dev->flags & IFF_MULTICAST) ? "Multicast " : "", - (dev->flags & IFF_ALLMULTI) ? "All-Multicast" : ""); - - DBG_PRINT(" mc_count: %d\n", netdev_mc_count(dev)); - - netdev_for_each_mc_addr(ha, dev) - DBG_PRINT(" %pM (%d)\n", ha->addr, dev->addr_len); - } -#endif /* DBG */ - - if (!(lp->flags & WVLAN2_UIL_BUSY)) { - -#ifdef USE_RTS - if (lp->useRTS == 1) { - DBG_TRACE(DbgInfo, "Skipping multicast, in RTS mode\n"); - return; - } -#endif /* USE_RTS */ - - wl_lock(lp, &flags); - wl_act_int_off(lp); - - if (CNV_INT_TO_LITTLE(lp->hcfCtx.IFB_FWIdentity.comp_id) == - COMP_ID_FW_STA) { - if (dev->flags & IFF_PROMISC) { - /* Enable promiscuous mode */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_PROMISCUOUS_MODE; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(1); - DBG_PRINT - ("Enabling Promiscuous mode (IFF_PROMISC)\n"); - hcf_put_info(&(lp->hcfCtx), - (LTVP) & (lp->ltvRecord)); - } else if ((netdev_mc_count(dev) > HCF_MAX_MULTICAST) - || (dev->flags & IFF_ALLMULTI)) { - /* Shutting off this filter will enable all multicast frames to - be sent up from the device; however, this is a static RID, so - a call to wl_apply() is needed */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_RX_ALL_GROUP_ADDR; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(0); - DBG_PRINT - ("Enabling all multicast mode (IFF_ALLMULTI)\n"); - hcf_put_info(&(lp->hcfCtx), - (LTVP) & (lp->ltvRecord)); - wl_apply(lp); - } else if (!netdev_mc_empty(dev)) { - /* Set the multicast addresses */ - lp->ltvRecord.len = - (netdev_mc_count(dev) * 3) + 1; - lp->ltvRecord.typ = CFG_GROUP_ADDR; - - x = 0; - netdev_for_each_mc_addr(ha, dev) - memcpy(& - (lp->ltvRecord.u.u8[x++ * ETH_ALEN]), - ha->addr, ETH_ALEN); - DBG_PRINT("Setting multicast list\n"); - hcf_put_info(&(lp->hcfCtx), - (LTVP) & (lp->ltvRecord)); - } else { - /* Disable promiscuous mode */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_PROMISCUOUS_MODE; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(0); - DBG_PRINT("Disabling Promiscuous mode\n"); - hcf_put_info(&(lp->hcfCtx), - (LTVP) & (lp->ltvRecord)); - - /* Disable multicast mode */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_GROUP_ADDR; - DBG_PRINT("Disabling Multicast mode\n"); - hcf_put_info(&(lp->hcfCtx), - (LTVP) & (lp->ltvRecord)); - - /* - * Turning on this filter will prevent all multicast frames from - * being sent up from the device; however, this is a static RID, - * so a call to wl_apply() is needed - */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CNF_RX_ALL_GROUP_ADDR; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(1); - DBG_PRINT - ("Disabling all multicast mode (IFF_ALLMULTI)\n"); - hcf_put_info(&(lp->hcfCtx), - (LTVP) & (lp->ltvRecord)); - wl_apply(lp); - } - } - wl_act_int_on(lp); - wl_unlock(lp, &flags); - } -#endif /* HCF_STA */ -} /* wl_multicast */ - -/*============================================================================*/ - -#else /* NEW_MULTICAST */ - -void wl_multicast(struct net_device *dev, int num_addrs, void *addrs) -{ - DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev); - DBG_PARAM(DbgInfo, "num_addrs", "%d", num_addrs); - DBG_PARAM(DbgInfo, "addrs", "0x%p", addrs); - -#error Obsolete set multicast interface! -} /* wl_multicast */ - -/*============================================================================*/ - -#endif /* NEW_MULTICAST */ - -static const struct net_device_ops wl_netdev_ops = { - .ndo_start_xmit = &wl_tx_port0, - - .ndo_set_config = &wl_config, - .ndo_get_stats = &wl_stats, - .ndo_set_rx_mode = &wl_multicast, - - .ndo_init = &wl_insert, - .ndo_open = &wl_adapter_open, - .ndo_stop = &wl_adapter_close, - .ndo_do_ioctl = &wl_ioctl, - - .ndo_tx_timeout = &wl_tx_timeout, - -#ifdef CONFIG_NET_POLL_CONTROLLER - .ndo_poll_controller = wl_poll, -#endif -}; - -/******************************************************************************* - * wl_device_alloc() - ******************************************************************************* - * - * DESCRIPTION: - * - * Create instances of net_device and wl_private for the new adapter - * and register the device's entry points in the net_device structure. - * - * PARAMETERS: - * - * N/A - * - * RETURNS: - * - * a pointer to an allocated and initialized net_device struct for this - * device. - * - ******************************************************************************/ -struct net_device *wl_device_alloc(void) -{ - struct net_device *dev = NULL; - struct wl_private *lp = NULL; - - /* Alloc a net_device struct */ - dev = alloc_etherdev(sizeof(struct wl_private)); - if (!dev) - return NULL; - - /* - * Initialize the 'next' pointer in the struct. - * Currently only used for PCI, - * but do it here just in case it's used - * for other buses in the future - */ - lp = wl_priv(dev); - - /* Check MTU */ - if (dev->mtu > MTU_MAX) { - DBG_WARNING(DbgInfo, "%s: MTU set too high, limiting to %d.\n", - dev->name, MTU_MAX); - dev->mtu = MTU_MAX; - } - - /* Setup the function table in the device structure. */ - - dev->wireless_handlers = (struct iw_handler_def *)&wl_iw_handler_def; - lp->wireless_data.spy_data = &lp->spy_data; - dev->wireless_data = &lp->wireless_data; - - dev->netdev_ops = &wl_netdev_ops; - - dev->watchdog_timeo = TX_TIMEOUT; - - dev->ethtool_ops = &wl_ethtool_ops; - - netif_stop_queue(dev); - - /* Allocate virtual devices for WDS support if needed */ - WL_WDS_DEVICE_ALLOC(lp); - - return dev; -} /* wl_device_alloc */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_device_dealloc() - ******************************************************************************* - * - * DESCRIPTION: - * - * Free instances of net_device and wl_private strcutres for an adapter - * and perform basic cleanup. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device structure. - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_device_dealloc(struct net_device *dev) -{ - /* Dealloc the WDS ports */ - WL_WDS_DEVICE_DEALLOC(lp); - - free_netdev(dev); -} /* wl_device_dealloc */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_tx_port0() - ******************************************************************************* - * - * DESCRIPTION: - * - * The handler routine for Tx over HCF_PORT_0. - * - * PARAMETERS: - * - * skb - a pointer to the sk_buff to transmit. - * dev - a pointer to a net_device structure representing HCF_PORT_0. - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -int wl_tx_port0(struct sk_buff *skb, struct net_device *dev) -{ - DBG_TX(DbgInfo, "Tx on Port 0\n"); - - return wl_tx(skb, dev, HCF_PORT_0); -#ifdef ENABLE_DMA - return wl_tx_dma(skb, dev, HCF_PORT_0); -#endif -} /* wl_tx_port0i */ - -/*============================================================================*/ - -#ifdef USE_WDS - -/******************************************************************************* - * wl_tx_port1() - ******************************************************************************* - * - * DESCRIPTION: - * - * The handler routine for Tx over HCF_PORT_1. - * - * PARAMETERS: - * - * skb - a pointer to the sk_buff to transmit. - * dev - a pointer to a net_device structure representing HCF_PORT_1. - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -int wl_tx_port1(struct sk_buff *skb, struct net_device *dev) -{ - DBG_TX(DbgInfo, "Tx on Port 1\n"); - return wl_tx(skb, dev, HCF_PORT_1); -} /* wl_tx_port1 */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_tx_port2() - ******************************************************************************* - * - * DESCRIPTION: - * - * The handler routine for Tx over HCF_PORT_2. - * - * PARAMETERS: - * - * skb - a pointer to the sk_buff to transmit. - * dev - a pointer to a net_device structure representing HCF_PORT_2. - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -int wl_tx_port2(struct sk_buff *skb, struct net_device *dev) -{ - DBG_TX(DbgInfo, "Tx on Port 2\n"); - return wl_tx(skb, dev, HCF_PORT_2); -} /* wl_tx_port2 */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_tx_port3() - ******************************************************************************* - * - * DESCRIPTION: - * - * The handler routine for Tx over HCF_PORT_3. - * - * PARAMETERS: - * - * skb - a pointer to the sk_buff to transmit. - * dev - a pointer to a net_device structure representing HCF_PORT_3. - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -int wl_tx_port3(struct sk_buff *skb, struct net_device *dev) -{ - DBG_TX(DbgInfo, "Tx on Port 3\n"); - return wl_tx(skb, dev, HCF_PORT_3); -} /* wl_tx_port3 */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_tx_port4() - ******************************************************************************* - * - * DESCRIPTION: - * - * The handler routine for Tx over HCF_PORT_4. - * - * PARAMETERS: - * - * skb - a pointer to the sk_buff to transmit. - * dev - a pointer to a net_device structure representing HCF_PORT_4. - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -int wl_tx_port4(struct sk_buff *skb, struct net_device *dev) -{ - DBG_TX(DbgInfo, "Tx on Port 4\n"); - return wl_tx(skb, dev, HCF_PORT_4); -} /* wl_tx_port4 */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_tx_port5() - ******************************************************************************* - * - * DESCRIPTION: - * - * The handler routine for Tx over HCF_PORT_5. - * - * PARAMETERS: - * - * skb - a pointer to the sk_buff to transmit. - * dev - a pointer to a net_device structure representing HCF_PORT_5. - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -int wl_tx_port5(struct sk_buff *skb, struct net_device *dev) -{ - DBG_TX(DbgInfo, "Tx on Port 5\n"); - return wl_tx(skb, dev, HCF_PORT_5); -} /* wl_tx_port5 */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_tx_port6() - ******************************************************************************* - * - * DESCRIPTION: - * - * The handler routine for Tx over HCF_PORT_6. - * - * PARAMETERS: - * - * skb - a pointer to the sk_buff to transmit. - * dev - a pointer to a net_device structure representing HCF_PORT_6. - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -int wl_tx_port6(struct sk_buff *skb, struct net_device *dev) -{ - DBG_TX(DbgInfo, "Tx on Port 6\n"); - return wl_tx(skb, dev, HCF_PORT_6); -} /* wl_tx_port6 */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_wds_device_alloc() - ******************************************************************************* - * - * DESCRIPTION: - * - * Create instances of net_device to represent the WDS ports, and register - * the device's entry points in the net_device structure. - * - * PARAMETERS: - * - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A, but will place pointers to the allocated and initialized net_device - * structs in the private adapter structure. - * - ******************************************************************************/ -void wl_wds_device_alloc(struct wl_private *lp) -{ - int count; - - /* WDS support requires additional net_device structs to be allocated, - so that user space apps can use these virtual devices to specify the - port on which to Tx/Rx */ - for (count = 0; count < NUM_WDS_PORTS; count++) { - struct net_device *dev_wds = NULL; - - dev_wds = kzalloc(sizeof(struct net_device), GFP_KERNEL); - if (!dev_wds) - return; - - ether_setup(dev_wds); - - lp->wds_port[count].dev = dev_wds; - - /* Re-use wl_init for all the devices, as it currently does nothing, but - * is required. Re-use the stats/tx_timeout handler for all as well; the - * WDS port which is requesting these operations can be determined by - * the net_device pointer. Set the private member of all devices to point - * to the same net_device struct; that way, all information gets - * funnelled through the one "real" net_device. Name the WDS ports - * "wds" - * */ - lp->wds_port[count].dev->init = &wl_init; - lp->wds_port[count].dev->get_stats = &wl_stats; - lp->wds_port[count].dev->tx_timeout = &wl_tx_timeout; - lp->wds_port[count].dev->watchdog_timeo = TX_TIMEOUT; - lp->wds_port[count].dev->priv = lp; - - sprintf(lp->wds_port[count].dev->name, "wds%d", count); - } - - /* Register the Tx handlers */ - lp->wds_port[0].dev->hard_start_xmit = &wl_tx_port1; - lp->wds_port[1].dev->hard_start_xmit = &wl_tx_port2; - lp->wds_port[2].dev->hard_start_xmit = &wl_tx_port3; - lp->wds_port[3].dev->hard_start_xmit = &wl_tx_port4; - lp->wds_port[4].dev->hard_start_xmit = &wl_tx_port5; - lp->wds_port[5].dev->hard_start_xmit = &wl_tx_port6; - - WL_WDS_NETIF_STOP_QUEUE(lp); -} /* wl_wds_device_alloc */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_wds_device_dealloc() - ******************************************************************************* - * - * DESCRIPTION: - * - * Free instances of net_device structures used to support WDS. - * - * PARAMETERS: - * - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wds_device_dealloc(struct wl_private *lp) -{ - int count; - - for (count = 0; count < NUM_WDS_PORTS; count++) { - struct net_device *dev_wds = NULL; - - dev_wds = lp->wds_port[count].dev; - - if (dev_wds != NULL) { - if (dev_wds->flags & IFF_UP) { - dev_close(dev_wds); - dev_wds->flags &= ~(IFF_UP | IFF_RUNNING); - } - - free_netdev(dev_wds); - lp->wds_port[count].dev = NULL; - } - } -} /* wl_wds_device_dealloc */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_wds_netif_start_queue() - ******************************************************************************* - * - * DESCRIPTION: - * - * Used to start the netif queues of all the "virtual" network devices - * which represent the WDS ports. - * - * PARAMETERS: - * - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wds_netif_start_queue(struct wl_private *lp) -{ - int count; - /*------------------------------------------------------------------------*/ - - if (lp != NULL) { - for (count = 0; count < NUM_WDS_PORTS; count++) { - if (lp->wds_port[count].is_registered && - lp->wds_port[count].netif_queue_on == FALSE) { - netif_start_queue(lp->wds_port[count].dev); - lp->wds_port[count].netif_queue_on = TRUE; - } - } - } -} /* wl_wds_netif_start_queue */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_wds_netif_stop_queue() - ******************************************************************************* - * - * DESCRIPTION: - * - * Used to stop the netif queues of all the "virtual" network devices - * which represent the WDS ports. - * - * PARAMETERS: - * - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wds_netif_stop_queue(struct wl_private *lp) -{ - int count; - /*------------------------------------------------------------------------*/ - - if (lp != NULL) { - for (count = 0; count < NUM_WDS_PORTS; count++) { - if (lp->wds_port[count].is_registered && - lp->wds_port[count].netif_queue_on == TRUE) { - netif_stop_queue(lp->wds_port[count].dev); - lp->wds_port[count].netif_queue_on = FALSE; - } - } - } -} /* wl_wds_netif_stop_queue */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_wds_netif_wake_queue() - ******************************************************************************* - * - * DESCRIPTION: - * - * Used to wake the netif queues of all the "virtual" network devices - * which represent the WDS ports. - * - * PARAMETERS: - * - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wds_netif_wake_queue(struct wl_private *lp) -{ - int count; - /*------------------------------------------------------------------------*/ - - if (lp != NULL) { - for (count = 0; count < NUM_WDS_PORTS; count++) { - if (lp->wds_port[count].is_registered && - lp->wds_port[count].netif_queue_on == FALSE) { - netif_wake_queue(lp->wds_port[count].dev); - lp->wds_port[count].netif_queue_on = TRUE; - } - } - } -} /* wl_wds_netif_wake_queue */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_wds_netif_carrier_on() - ******************************************************************************* - * - * DESCRIPTION: - * - * Used to signal the network layer that carrier is present on all of the - * "virtual" network devices which represent the WDS ports. - * - * PARAMETERS: - * - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wds_netif_carrier_on(struct wl_private *lp) -{ - int count; - /*------------------------------------------------------------------------*/ - - if (lp != NULL) { - for (count = 0; count < NUM_WDS_PORTS; count++) { - if (lp->wds_port[count].is_registered) - netif_carrier_on(lp->wds_port[count].dev); - } - } -} /* wl_wds_netif_carrier_on */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_wds_netif_carrier_off() - ******************************************************************************* - * - * DESCRIPTION: - * - * Used to signal the network layer that carrier is NOT present on all of - * the "virtual" network devices which represent the WDS ports. - * - * PARAMETERS: - * - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wds_netif_carrier_off(struct wl_private *lp) -{ - int count; - - if (lp != NULL) { - for (count = 0; count < NUM_WDS_PORTS; count++) { - if (lp->wds_port[count].is_registered) - netif_carrier_off(lp->wds_port[count].dev); - } - } - -} /* wl_wds_netif_carrier_off */ - -/*============================================================================*/ - -#endif /* USE_WDS */ - -#ifdef ENABLE_DMA -/******************************************************************************* - * wl_send_dma() - ******************************************************************************* - * - * DESCRIPTION: - * - * The routine which performs data transmits when using busmaster DMA. - * - * PARAMETERS: - * - * lp - a pointer to the device's wl_private struct. - * skb - a pointer to the network layer's data buffer. - * port - the Hermes port on which to transmit. - * - * RETURNS: - * - * 0 on success - * 1 on error - * - ******************************************************************************/ -int wl_send_dma(struct wl_private *lp, struct sk_buff *skb, int port) -{ - int len; - DESC_STRCT *desc = NULL; - DESC_STRCT *desc_next = NULL; - /*------------------------------------------------------------------------*/ - - if (lp == NULL) { - DBG_ERROR(DbgInfo, "Private adapter struct is NULL\n"); - return FALSE; - } - - if (lp->dev == NULL) { - DBG_ERROR(DbgInfo, "net_device struct in wl_private is NULL\n"); - return FALSE; - } - - /* AGAIN, ALL THE QUEUEING DONE HERE IN I/O MODE IS NOT PERFORMED */ - - if (skb == NULL) { - DBG_WARNING(DbgInfo, "Nothing to send.\n"); - return FALSE; - } - - len = skb->len; - - /* Get a free descriptor */ - desc = wl_pci_dma_get_tx_packet(lp); - - if (desc == NULL) { - if (lp->netif_queue_on == TRUE) { - netif_stop_queue(lp->dev); - WL_WDS_NETIF_STOP_QUEUE(lp); - lp->netif_queue_on = FALSE; - - dev_kfree_skb_any( skb ); - return 0; - } - } - - SET_BUF_CNT(desc, /*HCF_DMA_FD_CNT */ HFS_ADDR_DEST); - SET_BUF_SIZE(desc, HCF_DMA_TX_BUF1_SIZE); - - desc_next = desc->next_desc_addr; - - if (desc_next->buf_addr == NULL) { - DBG_ERROR(DbgInfo, "DMA descriptor buf_addr is NULL\n"); - return FALSE; - } - - /* Copy the payload into the DMA packet */ - memcpy(desc_next->buf_addr, skb->data, len); - - SET_BUF_CNT(desc_next, len); - SET_BUF_SIZE(desc_next, HCF_MAX_PACKET_SIZE); - - hcf_dma_tx_put(&(lp->hcfCtx), desc, 0); - - /* Free the skb and perform queue cleanup, as the buffer was - transmitted successfully */ - dev_consume_skb_any( skb ); - - return TRUE; -} /* wl_send_dma */ - -/*============================================================================*/ - -/******************************************************************************* - * wl_rx_dma() - ******************************************************************************* - * - * DESCRIPTION: - * - * The routine which performs data reception when using busmaster DMA. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device structure. - * - * RETURNS: - * - * 0 on success - * 1 on error - * - ******************************************************************************/ -int wl_rx_dma(struct net_device *dev) -{ - int port; - hcf_16 pktlen; - hcf_16 hfs_stat; - struct sk_buff *skb; - struct wl_private *lp = NULL; - DESC_STRCT *desc, *desc_next; - /*------------------------------------------------------------------------*/ - - DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev); - - lp = dev->priv; - if ((lp != NULL) && !(lp->flags & WVLAN2_UIL_BUSY)) { - -#ifdef USE_RTS - if (lp->useRTS == 1) { - DBG_PRINT("RTS: We're getting an Rx...\n"); - return -EIO; - } -#endif /* USE_RTS */ - - /* - *if( lp->dma.status == 0 ) - *{ - */ - desc = hcf_dma_rx_get(&(lp->hcfCtx)); - - if (desc != NULL) { - /* Check and see if we rcvd. a WMP frame */ - /* - if((( *(hcf_8 *)&desc->buf_addr[HFS_STAT] ) & - ( HFS_STAT_MSG_TYPE | HFS_STAT_ERR )) == HFS_STAT_WMP_MSG ) - { - DBG_TRACE( DbgInfo, "Got a WMP frame\n" ); - - x.len = sizeof( CFG_MB_INFO_RANGE2_STRCT ) / sizeof( hcf_16 ); - x.typ = CFG_MB_INFO; - x.base_typ = CFG_WMP; - x.frag_cnt = 2; - x.frag_buf[0].frag_len = GET_BUF_CNT( descp ) / sizeof( hcf_16 ); - x.frag_buf[0].frag_addr = (hcf_8 *) descp->buf_addr ; - x.frag_buf[1].frag_len = ( GET_BUF_CNT( descp->next_desc_addr ) + 1 ) / sizeof( hcf_16 ); - x.frag_buf[1].frag_addr = (hcf_8 *) descp->next_desc_addr->buf_addr ; - - hcf_put_info( &( lp->hcfCtx ), (LTVP)&x ); - } - */ - - desc_next = desc->next_desc_addr; - - /* Make sure the buffer isn't empty */ - if (GET_BUF_CNT(desc) == 0) { - DBG_WARNING(DbgInfo, "Buffer is empty!\n"); - - /* Give the descriptor back to the HCF */ - hcf_dma_rx_put(&(lp->hcfCtx), desc); - return -EIO; - } - - /* Read the HFS_STAT register from the lookahead buffer */ - hfs_stat = (hcf_16) (desc->buf_addr[HFS_STAT / 2]); - - /* Make sure the frame isn't bad */ - if ((hfs_stat & HFS_STAT_ERR) != HCF_SUCCESS) { - DBG_WARNING(DbgInfo, - "HFS_STAT_ERROR (0x%x) in Rx Packet\n", - desc->buf_addr[HFS_STAT / 2]); - - /* Give the descriptor back to the HCF */ - hcf_dma_rx_put(&(lp->hcfCtx), desc); - return -EIO; - } - - /* Determine what port this packet is for */ - port = (hfs_stat >> 8) & 0x0007; - DBG_RX(DbgInfo, "Rx frame for port %d\n", port); - - pktlen = GET_BUF_CNT(desc_next); - if (pktlen != 0) { - skb = ALLOC_SKB(pktlen); - if (skb != NULL) { - switch (port) { -#ifdef USE_WDS - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - skb->dev = - lp->wds_port[port - 1].dev; - break; -#endif /* USE_WDS */ - - case 0: - default: - skb->dev = dev; - break; - } - - GET_PACKET_DMA(skb->dev, skb, pktlen); - - /* Give the descriptor back to the HCF */ - hcf_dma_rx_put(&(lp->hcfCtx), desc); - - netif_rx(skb); - - if (port == 0) { - lp->stats.rx_packets++; - lp->stats.rx_bytes += pktlen; - } -#ifdef USE_WDS - else { - lp->wds_port[port - - 1].stats. - rx_packets++; - lp->wds_port[port - - 1].stats. - rx_bytes += pktlen; - } -#endif /* USE_WDS */ - - dev->last_rx = jiffies; - - } else { - DBG_ERROR(DbgInfo, - "Could not alloc skb\n"); - - if (port == 0) - lp->stats.rx_dropped++; -#ifdef USE_WDS - else { - lp->wds_port[port - - 1].stats. - rx_dropped++; - } -#endif /* USE_WDS */ - } - } - } - /*}*/ - } - - return 0; -} /* wl_rx_dma */ - -/*============================================================================*/ -#endif /* ENABLE_DMA */ diff --git a/drivers/staging/wlags49_h2/wl_netdev.h b/drivers/staging/wlags49_h2/wl_netdev.h deleted file mode 100644 index 95bfbebf35d6..000000000000 --- a/drivers/staging/wlags49_h2/wl_netdev.h +++ /dev/null @@ -1,154 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * Header describing information required by the network layerentry points - * into the driver. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -#ifndef __WL_NETDEV_H__ -#define __WL_NETDEV_H__ - - - - -/******************************************************************************* - * function prototypes - ******************************************************************************/ -int wl_init(struct net_device *dev); - -int wl_config(struct net_device *dev, struct ifmap *map); - -struct net_device *wl_device_alloc(void); - -void wl_device_dealloc(struct net_device *dev); - -int wl_open(struct net_device *dev); - -int wl_close(struct net_device *dev); - -int wl_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); - -int wl_tx(struct sk_buff *skb, struct net_device *dev, int port); - -int wl_send(struct wl_private *lp); - -int wl_rx(struct net_device *dev); - -void wl_tx_timeout(struct net_device *dev); - -struct net_device_stats *wl_stats(struct net_device *dev); - - -#ifdef ENABLE_DMA -int wl_send_dma(struct wl_private *lp, struct sk_buff *skb, int port); -int wl_rx_dma(struct net_device *dev); -#endif - -#ifdef NEW_MULTICAST -void wl_multicast(struct net_device *dev); -#else -void wl_multicast(struct net_device *dev, int num_addrs, void *addrs); -#endif /* NEW_MULTICAST */ - - -int wl_tx_port0(struct sk_buff *skb, struct net_device *dev); - - -#ifdef USE_WDS - -int wl_tx_port1(struct sk_buff *skb, struct net_device *dev); -int wl_tx_port2(struct sk_buff *skb, struct net_device *dev); -int wl_tx_port3(struct sk_buff *skb, struct net_device *dev); -int wl_tx_port4(struct sk_buff *skb, struct net_device *dev); -int wl_tx_port5(struct sk_buff *skb, struct net_device *dev); -int wl_tx_port6(struct sk_buff *skb, struct net_device *dev); - -void wl_wds_device_alloc(struct wl_private *lp); -void wl_wds_device_dealloc(struct wl_private *lp); -void wl_wds_netif_start_queue(struct wl_private *lp); -void wl_wds_netif_stop_queue(struct wl_private *lp); -void wl_wds_netif_wake_queue(struct wl_private *lp); -void wl_wds_netif_carrier_on(struct wl_private *lp); -void wl_wds_netif_carrier_off(struct wl_private *lp); - -#endif /* USE_WDS */ - - -#ifdef USE_WDS - -#define WL_WDS_DEVICE_ALLOC(ARG) wl_wds_device_alloc(ARG) -#define WL_WDS_DEVICE_DEALLOC(ARG) wl_wds_device_dealloc(ARG) -#define WL_WDS_NETIF_START_QUEUE(ARG) wl_wds_netif_start_queue(ARG) -#define WL_WDS_NETIF_STOP_QUEUE(ARG) wl_wds_netif_stop_queue(ARG) -#define WL_WDS_NETIF_WAKE_QUEUE(ARG) wl_wds_netif_wake_queue(ARG) -#define WL_WDS_NETIF_CARRIER_ON(ARG) wl_wds_netif_carrier_on(ARG) -#define WL_WDS_NETIF_CARRIER_OFF(ARG) wl_wds_netif_carrier_off(ARG) - -#else - -#define WL_WDS_DEVICE_ALLOC(ARG) -#define WL_WDS_DEVICE_DEALLOC(ARG) -#define WL_WDS_NETIF_START_QUEUE(ARG) -#define WL_WDS_NETIF_STOP_QUEUE(ARG) -#define WL_WDS_NETIF_WAKE_QUEUE(ARG) -#define WL_WDS_NETIF_CARRIER_ON(ARG) -#define WL_WDS_NETIF_CARRIER_OFF(ARG) - -#endif /* USE_WDS */ - - -#endif /* __WL_NETDEV_H__ */ diff --git a/drivers/staging/wlags49_h2/wl_priv.c b/drivers/staging/wlags49_h2/wl_priv.c deleted file mode 100644 index aff927350222..000000000000 --- a/drivers/staging/wlags49_h2/wl_priv.c +++ /dev/null @@ -1,1928 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * This file defines handling routines for the private IOCTLs - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -/******************************************************************************* - * include files - ******************************************************************************/ -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -int wvlan_uil_connect(struct uilreq *urq, struct wl_private *lp); -int wvlan_uil_disconnect(struct uilreq *urq, struct wl_private *lp); -int wvlan_uil_action(struct uilreq *urq, struct wl_private *lp); -int wvlan_uil_block(struct uilreq *urq, struct wl_private *lp); -int wvlan_uil_unblock(struct uilreq *urq, struct wl_private *lp); -int wvlan_uil_send_diag_msg(struct uilreq *urq, struct wl_private *lp); -int wvlan_uil_put_info(struct uilreq *urq, struct wl_private *lp); -int wvlan_uil_get_info(struct uilreq *urq, struct wl_private *lp); - -int cfg_driver_info(struct uilreq *urq, struct wl_private *lp); -int cfg_driver_identity(struct uilreq *urq, struct wl_private *lp); - - -/* If USE_UIL is not defined, then none of the UIL Interface code below will - be included in the build */ -#ifdef USE_UIL - -/******************************************************************************* - * wvlan_uil() - ******************************************************************************* - * - * DESCRIPTION: - * - * The handler function for the UIL interface. - * - * PARAMETERS: - * - * urq - a pointer to the UIL request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -int wvlan_uil(struct uilreq *urq, struct wl_private *lp) -{ - int ioctl_ret = 0; - - switch (urq->command) { - case UIL_FUN_CONNECT: - DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL -- WVLAN2_UIL_CONNECT\n"); - ioctl_ret = wvlan_uil_connect(urq, lp); - break; - case UIL_FUN_DISCONNECT: - DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL -- WVLAN2_UIL_DISCONNECT\n"); - ioctl_ret = wvlan_uil_disconnect(urq, lp); - break; - case UIL_FUN_ACTION: - DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL -- WVLAN2_UIL_ACTION\n"); - ioctl_ret = wvlan_uil_action(urq, lp); - break; - case UIL_FUN_SEND_DIAG_MSG: - DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL -- WVLAN2_UIL_SEND_DIAG_MSG\n"); - ioctl_ret = wvlan_uil_send_diag_msg(urq, lp); - break; - case UIL_FUN_GET_INFO: - DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL -- WVLAN2_UIL_GET_INFO\n"); - ioctl_ret = wvlan_uil_get_info(urq, lp); - break; - case UIL_FUN_PUT_INFO: - DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL -- WVLAN2_UIL_PUT_INFO\n"); - ioctl_ret = wvlan_uil_put_info(urq, lp); - break; - default: - DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL -- UNSUPPORTED UIL CODE: 0x%X", urq->command); - ioctl_ret = -EOPNOTSUPP; - break; - } - return ioctl_ret; -} /* wvlan_uil */ -/*============================================================================*/ - - - - -/******************************************************************************* - * wvlan_uil_connect() - ******************************************************************************* - * - * DESCRIPTION: - * - * Connect to the UIL in order to make a request. - * - * PARAMETERS: - * - * urq - a pointer to the UIL request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * UIL_SUCCESS - * UIL_ERR_xxx value otherwise - * - ******************************************************************************/ -int wvlan_uil_connect(struct uilreq *urq, struct wl_private *lp) -{ - if (!(lp->flags & WVLAN2_UIL_CONNECTED)) { - lp->flags |= WVLAN2_UIL_CONNECTED; - urq->hcfCtx = &(lp->hcfCtx); - urq->result = UIL_SUCCESS; - } else { - DBG_WARNING(DbgInfo, "UIL_ERR_IN_USE\n"); - urq->result = UIL_ERR_IN_USE; - } - - return 0; -} /* wvlan_uil_connect */ -/*============================================================================*/ - - - - -/******************************************************************************* - * wvlan_uil_disconnect() - ******************************************************************************* - * - * DESCRIPTION: - * - * Disconnect from the UIL after a request has been completed. - * - * PARAMETERS: - * - * urq - a pointer to the UIL request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * UIL_SUCCESS - * UIL_ERR_xxx value otherwise - * - ******************************************************************************/ -int wvlan_uil_disconnect(struct uilreq *urq, struct wl_private *lp) -{ - if (urq->hcfCtx == &(lp->hcfCtx)) { - if (lp->flags & WVLAN2_UIL_CONNECTED) { - lp->flags &= ~WVLAN2_UIL_CONNECTED; - /* - if (lp->flags & WVLAN2_UIL_BUSY) { - lp->flags &= ~WVLAN2_UIL_BUSY; - netif_start_queue(lp->dev); - } - */ - } - - urq->hcfCtx = NULL; - urq->result = UIL_SUCCESS; - } else { - DBG_ERROR(DbgInfo, "UIL_ERR_WRONG_IFB\n"); - urq->result = UIL_ERR_WRONG_IFB; - } - - return 0; -} /* wvlan_uil_disconnect */ -/*============================================================================*/ - - - - -/******************************************************************************* - * wvlan_uil_action() - ******************************************************************************* - * - * DESCRIPTION: - * - * Handler for the UIL_ACT_xxx subcodes associated with UIL_FUN_ACTION - * - * PARAMETERS: - * - * urq - a pointer to the UIL request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * UIL_SUCCESS - * UIL_ERR_xxx value otherwise - * - ******************************************************************************/ -int wvlan_uil_action(struct uilreq *urq, struct wl_private *lp) -{ - int result = 0; - ltv_t *ltv; - - if (urq->hcfCtx == &(lp->hcfCtx)) { - /* Make sure there's an LTV in the request buffer */ - ltv = (ltv_t *)urq->data; - if (ltv != NULL) { - /* Switch on the Type field of the LTV contained in the request - buffer */ - switch (ltv->typ) { - case UIL_ACT_BLOCK: - DBG_TRACE(DbgInfo, "UIL_ACT_BLOCK\n"); - result = wvlan_uil_block(urq, lp); - break; - case UIL_ACT_UNBLOCK: - DBG_TRACE(DbgInfo, "UIL_ACT_UNBLOCK\n"); - result = wvlan_uil_unblock(urq, lp); - break; - case UIL_ACT_SCAN: - DBG_TRACE(DbgInfo, "UIL_ACT_SCAN\n"); - urq->result = hcf_action(&(lp->hcfCtx), MDD_ACT_SCAN); - break; - case UIL_ACT_APPLY: - DBG_TRACE(DbgInfo, "UIL_ACT_APPLY\n"); - urq->result = wl_apply(lp); - break; - case UIL_ACT_RESET: - DBG_TRACE(DbgInfo, "UIL_ACT_RESET\n"); - urq->result = wl_go(lp); - break; - default: - DBG_WARNING(DbgInfo, "Unknown action code: 0x%x\n", ltv->typ); - break; - } - } else { - DBG_ERROR(DbgInfo, "Bad LTV for this action\n"); - urq->result = UIL_ERR_LEN; - } - } else { - DBG_ERROR(DbgInfo, "UIL_ERR_WRONG_IFB\n"); - urq->result = UIL_ERR_WRONG_IFB; - } - - return result; -} /* wvlan_uil_action */ -/*============================================================================*/ - - - - -/******************************************************************************* - * wvlan_uil_block() - ******************************************************************************* - * - * DESCRIPTION: - * - * Sets a block in the driver to prevent access to the card by other - * processes. - * - * PARAMETERS: - * - * urq - a pointer to the UIL request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * UIL_SUCCESS - * UIL_ERR_xxx value otherwise - * - ******************************************************************************/ - -int wvlan_uil_block(struct uilreq *urq, struct wl_private *lp) -{ - int result = 0; - - if (urq->hcfCtx == &(lp->hcfCtx)) { - if (capable(CAP_NET_ADMIN)) { - lp->flags |= WVLAN2_UIL_BUSY; - netif_stop_queue(lp->dev); - WL_WDS_NETIF_STOP_QUEUE(lp); - urq->result = UIL_SUCCESS; - } else { - DBG_ERROR(DbgInfo, "EPERM\n"); - urq->result = UIL_FAILURE; - result = -EPERM; - } - } else { - DBG_ERROR(DbgInfo, "UIL_ERR_WRONG_IFB\n"); - urq->result = UIL_ERR_WRONG_IFB; - } - - return result; -} /* wvlan_uil_block */ -/*============================================================================*/ - - - - -/******************************************************************************* - * wvlan_uil_unblock() - ******************************************************************************* - * - * DESCRIPTION: - * - * Unblocks the driver to restore access to the card by other processes. - * - * PARAMETERS: - * - * urq - a pointer to the UIL request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * UIL_SUCCESS - * UIL_ERR_xxx value otherwise - * - ******************************************************************************/ -int wvlan_uil_unblock(struct uilreq *urq, struct wl_private *lp) -{ - int result = 0; - - if (urq->hcfCtx == &(lp->hcfCtx)) { - if (capable(CAP_NET_ADMIN)) { - if (lp->flags & WVLAN2_UIL_BUSY) { - lp->flags &= ~WVLAN2_UIL_BUSY; - netif_wake_queue(lp->dev); - WL_WDS_NETIF_WAKE_QUEUE(lp); - } - } else { - DBG_ERROR(DbgInfo, "EPERM\n"); - urq->result = UIL_FAILURE; - result = -EPERM; - } - } else { - DBG_ERROR(DbgInfo, "UIL_ERR_WRONG_IFB\n"); - urq->result = UIL_ERR_WRONG_IFB; - } - - return result; -} /* wvlan_uil_unblock */ -/*============================================================================*/ - - - - -/******************************************************************************* - * wvlan_uil_send_diag_msg() - ******************************************************************************* - * - * DESCRIPTION: - * - * Sends a diagnostic message to the card. - * - * PARAMETERS: - * - * urq - a pointer to the UIL request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * UIL_SUCCESS - * UIL_ERR_xxx value otherwise - * - ******************************************************************************/ -int wvlan_uil_send_diag_msg(struct uilreq *urq, struct wl_private *lp) -{ - int result = 0; - DESC_STRCT Descp[1]; - - if (urq->hcfCtx == &(lp->hcfCtx)) { - if (capable(CAP_NET_ADMIN)) { - if ((urq->data != NULL) && (urq->len != 0)) { - if (lp->hcfCtx.IFB_RscInd != 0) { - u_char *data; - - /* Verify the user buffer */ - result = verify_area(VERIFY_READ, urq->data, urq->len); - if (result != 0) { - DBG_ERROR(DbgInfo, "verify_area failed, result: %d\n", result); - urq->result = UIL_FAILURE; - return result; - } - - data = kmalloc(urq->len, GFP_KERNEL); - if (data != NULL) { - memset(Descp, 0, sizeof(DESC_STRCT)); - memcpy(data, urq->data, urq->len); - - Descp[0].buf_addr = (wci_bufp)data; - Descp[0].BUF_CNT = urq->len; - Descp[0].next_desc_addr = 0; /* terminate list */ - - hcf_send_msg(&(lp->hcfCtx), &Descp[0], HCF_PORT_0); - kfree(data); - } else { - DBG_ERROR(DbgInfo, "ENOMEM\n"); - urq->result = UIL_FAILURE; - result = -ENOMEM; - return result; - } - - } else { - urq->result = UIL_ERR_BUSY; - } - - } else { - urq->result = UIL_FAILURE; - } - } else { - DBG_ERROR(DbgInfo, "EPERM\n"); - urq->result = UIL_FAILURE; - result = -EPERM; - } - } else { - DBG_ERROR(DbgInfo, "UIL_ERR_WRONG_IFB\n"); - urq->result = UIL_ERR_WRONG_IFB; - } - - return result; -} /* wvlan_uil_send_diag_msg */ -/*============================================================================*/ - - -/******************************************************************************* - * wvlan_uil_put_info() - ******************************************************************************* - * - * DESCRIPTION: - * - * Sends a specific RID directly to the driver to set configuration info. - * - * PARAMETERS: - * - * urq - a pointer to the UIL request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * UIL_SUCCESS - * UIL_ERR_xxx value otherwise - * - ******************************************************************************/ -int wvlan_uil_put_info(struct uilreq *urq, struct wl_private *lp) -{ - int result = 0; - ltv_t *pLtv; - bool_t ltvAllocated = FALSE; - ENCSTRCT sEncryption; - size_t len; - -#ifdef USE_WDS - hcf_16 hcfPort = HCF_PORT_0; -#endif /* USE_WDS */ - - if (urq->hcfCtx == &(lp->hcfCtx)) { - if (capable(CAP_NET_ADMIN)) { - if ((urq->data != NULL) && (urq->len != 0)) { - /* Make sure that we have at least a command and length to send. */ - if (urq->len < (sizeof(hcf_16) * 2)) { - urq->len = sizeof(lp->ltvRecord); - urq->result = UIL_ERR_LEN; - DBG_ERROR(DbgInfo, "No Length/Type in LTV!!!\n"); - DBG_ERROR(DbgInfo, "UIL_ERR_LEN\n"); - return result; - } - - /* Verify the user buffer */ - result = verify_area(VERIFY_READ, urq->data, urq->len); - if (result != 0) { - urq->result = UIL_FAILURE; - DBG_ERROR(DbgInfo, "verify_area(), VERIFY_READ FAILED\n"); - return result; - } - - /* Get only the command and length information. */ - copy_from_user(&(lp->ltvRecord), urq->data, sizeof(hcf_16) * 2); - - /* Make sure the incoming LTV record length is within the bounds of the - IOCTL length */ - if (((lp->ltvRecord.len + 1) * sizeof(hcf_16)) > urq->len) { - urq->len = sizeof(lp->ltvRecord); - urq->result = UIL_ERR_LEN; - DBG_ERROR(DbgInfo, "UIL_ERR_LEN\n"); - return result; - } - - /* If the requested length is greater than the size of our local - LTV record, try to allocate it from the kernel stack. - Otherwise, we just use our local LTV record. */ - if (urq->len > sizeof(lp->ltvRecord)) { - pLtv = kmalloc(urq->len, GFP_KERNEL); - if (pLtv != NULL) { - ltvAllocated = TRUE; - } else { - DBG_ERROR(DbgInfo, "Alloc FAILED\n"); - urq->len = sizeof(lp->ltvRecord); - urq->result = UIL_ERR_LEN; - result = -ENOMEM; - return result; - } - } else { - pLtv = &(lp->ltvRecord); - } - - /* Copy the data from the user's buffer into the local LTV - record data area. */ - copy_from_user(pLtv, urq->data, urq->len); - - - /* We need to snoop the commands to see if there is anything we - need to store for the purposes of a reset or start/stop - sequence. Perform endian translation as needed */ - switch (pLtv->typ) { - case CFG_CNF_PORT_TYPE: - lp->PortType = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_CNF_OWN_MAC_ADDR: - /* TODO: determine if we are going to store anything based on this */ - break; - case CFG_CNF_OWN_CHANNEL: - lp->Channel = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - /* CFG_CNF_OWN_SSID currently same as CNF_DESIRED_SSID. Do we - need separate storage for this? */ - /* case CFG_CNF_OWN_SSID: */ - case CFG_CNF_OWN_ATIM_WINDOW: - lp->atimWindow = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_CNF_SYSTEM_SCALE: - lp->DistanceBetweenAPs = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - - case CFG_CNF_MAX_DATA_LEN: - /* TODO: determine if we are going to store anything based - on this */ - break; - case CFG_CNF_PM_ENABLED: - lp->PMEnabled = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_CNF_MCAST_RX: - lp->MulticastReceive = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_CNF_MAX_SLEEP_DURATION: - lp->MaxSleepDuration = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_CNF_HOLDOVER_DURATION: - lp->holdoverDuration = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_CNF_OWN_NAME: - memset(lp->StationName, 0, sizeof(lp->StationName)); - len = min_t(size_t, pLtv->u.u16[0], sizeof(lp->StationName)); - strlcpy(lp->StationName, &pLtv->u.u8[2], len); - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_CNF_LOAD_BALANCING: - lp->loadBalancing = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_CNF_MEDIUM_DISTRIBUTION: - lp->mediumDistribution = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; -#ifdef WARP - case CFG_CNF_TX_POW_LVL: - lp->txPowLevel = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - /* case CFG_CNF_SHORT_RETRY_LIMIT: */ /* Short Retry Limit */ - /* case 0xFC33: */ /* Long Retry Limit */ - case CFG_SUPPORTED_RATE_SET_CNTL: /* Supported Rate Set Control */ - lp->srsc[0] = pLtv->u.u16[0]; - lp->srsc[1] = pLtv->u.u16[1]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - pLtv->u.u16[1] = CNV_INT_TO_LITTLE(pLtv->u.u16[1]); - break; - case CFG_BASIC_RATE_SET_CNTL: /* Basic Rate Set Control */ - lp->brsc[0] = pLtv->u.u16[0]; - lp->brsc[1] = pLtv->u.u16[1]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - pLtv->u.u16[1] = CNV_INT_TO_LITTLE(pLtv->u.u16[1]); - break; - case CFG_CNF_CONNECTION_CNTL: - lp->connectionControl = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - /* case CFG_PROBE_DATA_RATE: */ -#endif /* HERMES25 */ - -#if 1 /* ;? (HCF_TYPE) & HCF_TYPE_AP */ - /* ;?should we restore this to allow smaller memory footprint */ - - case CFG_CNF_OWN_DTIM_PERIOD: - lp->DTIMPeriod = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; -#ifdef WARP - case CFG_CNF_OWN_BEACON_INTERVAL: /* Own Beacon Interval */ - lp->ownBeaconInterval = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; -#endif /* WARP */ - case CFG_COEXISTENSE_BEHAVIOUR: /* Coexistence behavior */ - lp->coexistence = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; -#ifdef USE_WDS - case CFG_CNF_WDS_ADDR1: - memcpy(&lp->wds_port[0].wdsAddress, &pLtv->u.u8[0], ETH_ALEN); - hcfPort = HCF_PORT_1; - break; - case CFG_CNF_WDS_ADDR2: - memcpy(&lp->wds_port[1].wdsAddress, &pLtv->u.u8[0], ETH_ALEN); - hcfPort = HCF_PORT_2; - break; - case CFG_CNF_WDS_ADDR3: - memcpy(&lp->wds_port[2].wdsAddress, &pLtv->u.u8[0], ETH_ALEN); - hcfPort = HCF_PORT_3; - break; - case CFG_CNF_WDS_ADDR4: - memcpy(&lp->wds_port[3].wdsAddress, &pLtv->u.u8[0], ETH_ALEN); - hcfPort = HCF_PORT_4; - break; - case CFG_CNF_WDS_ADDR5: - memcpy(&lp->wds_port[4].wdsAddress, &pLtv->u.u8[0], ETH_ALEN); - hcfPort = HCF_PORT_5; - break; - case CFG_CNF_WDS_ADDR6: - memcpy(&lp->wds_port[5].wdsAddress, &pLtv->u.u8[0], ETH_ALEN); - hcfPort = HCF_PORT_6; - break; -#endif /* USE_WDS */ - - case CFG_CNF_MCAST_PM_BUF: - lp->multicastPMBuffering = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_CNF_REJECT_ANY: - lp->RejectAny = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; -#endif - - case CFG_CNF_ENCRYPTION: - lp->EnableEncryption = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_CNF_AUTHENTICATION: - lp->authentication = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; -#if 1 /* ;? (HCF_TYPE) & HCF_TYPE_AP */ - /* ;?should we restore this to allow smaller memory footprint */ - - /* case CFG_CNF_EXCL_UNENCRYPTED: - lp->ExcludeUnencrypted = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; */ - case CFG_CNF_MCAST_RATE: - /* TODO: determine if we are going to store anything based on this */ - break; - case CFG_CNF_INTRA_BSS_RELAY: - lp->intraBSSRelay = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; -#endif - - case CFG_CNF_MICRO_WAVE: - /* TODO: determine if we are going to store anything based on this */ - break; - /*case CFG_CNF_LOAD_BALANCING:*/ - /* TODO: determine if we are going to store anything based on this */ - /* break; */ - /* case CFG_CNF_MEDIUM_DISTRIBUTION: */ - /* TODO: determine if we are going to store anything based on this */ - /* break; */ - /* case CFG_CNF_RX_ALL_GROUP_ADDRESS: */ - /* TODO: determine if we are going to store anything based on this */ - /* break; */ - /* case CFG_CNF_COUNTRY_INFO: */ - /* TODO: determine if we are going to store anything based on this */ - /* break; */ - case CFG_CNF_OWN_SSID: - /* case CNF_DESIRED_SSID: */ - case CFG_DESIRED_SSID: - memset(lp->NetworkName, 0, sizeof(lp->NetworkName)); - memcpy((void *)lp->NetworkName, (void *)&pLtv->u.u8[2], (size_t)pLtv->u.u16[0]); - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - - /* take care of the special network name "ANY" case */ - if ((strlen(&pLtv->u.u8[2]) == 0) || - (strcmp(&pLtv->u.u8[2], "ANY") == 0) || - (strcmp(&pLtv->u.u8[2], "any") == 0)) { - /* set the SSID_STRCT llen field (u16[0]) to zero, and the - effectually null the string u8[2] */ - pLtv->u.u16[0] = 0; - pLtv->u.u8[2] = 0; - } - break; - case CFG_GROUP_ADDR: - /* TODO: determine if we are going to store anything based on this */ - break; - case CFG_CREATE_IBSS: - lp->CreateIBSS = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_RTS_THRH: - lp->RTSThreshold = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_TX_RATE_CNTL: - lp->TxRateControl[0] = pLtv->u.u16[0]; - lp->TxRateControl[1] = pLtv->u.u16[1]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - pLtv->u.u16[1] = CNV_INT_TO_LITTLE(pLtv->u.u16[1]); - break; - case CFG_PROMISCUOUS_MODE: - /* TODO: determine if we are going to store anything based on this */ - break; - /* case CFG_WAKE_ON_LAN: */ - /* TODO: determine if we are going to store anything based on this */ - /* break; */ -#if 1 /* ;? #if (HCF_TYPE) & HCF_TYPE_AP */ - /* ;?should we restore this to allow smaller memory footprint */ - case CFG_RTS_THRH0: - lp->RTSThreshold = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_TX_RATE_CNTL0: -/*;?no idea what this should be, get going so comment it out lp->TxRateControl = pLtv->u.u16[0];*/ - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; -#ifdef USE_WDS - case CFG_RTS_THRH1: - lp->wds_port[0].rtsThreshold = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - hcfPort = HCF_PORT_1; - break; - case CFG_RTS_THRH2: - lp->wds_port[1].rtsThreshold = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - hcfPort = HCF_PORT_2; - break; - case CFG_RTS_THRH3: - lp->wds_port[2].rtsThreshold = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - hcfPort = HCF_PORT_3; - break; - case CFG_RTS_THRH4: - lp->wds_port[3].rtsThreshold = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - hcfPort = HCF_PORT_4; - break; - case CFG_RTS_THRH5: - lp->wds_port[4].rtsThreshold = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - hcfPort = HCF_PORT_5; - break; - case CFG_RTS_THRH6: - lp->wds_port[5].rtsThreshold = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - hcfPort = HCF_PORT_6; - break; - case CFG_TX_RATE_CNTL1: - lp->wds_port[0].txRateCntl = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - hcfPort = HCF_PORT_1; - break; - case CFG_TX_RATE_CNTL2: - lp->wds_port[1].txRateCntl = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - hcfPort = HCF_PORT_2; - break; - case CFG_TX_RATE_CNTL3: - lp->wds_port[2].txRateCntl = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - hcfPort = HCF_PORT_3; - break; - case CFG_TX_RATE_CNTL4: - lp->wds_port[3].txRateCntl = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - hcfPort = HCF_PORT_4; - break; - case CFG_TX_RATE_CNTL5: - lp->wds_port[4].txRateCntl = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - hcfPort = HCF_PORT_5; - break; - case CFG_TX_RATE_CNTL6: - lp->wds_port[5].txRateCntl = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - hcfPort = HCF_PORT_6; - break; -#endif /* USE_WDS */ -#endif /* (HCF_TYPE) & HCF_TYPE_AP */ - - case CFG_DEFAULT_KEYS: - { - CFG_DEFAULT_KEYS_STRCT *pKeys = (CFG_DEFAULT_KEYS_STRCT *)pLtv; - - pKeys->key[0].len = CNV_INT_TO_LITTLE(pKeys->key[0].len); - pKeys->key[1].len = CNV_INT_TO_LITTLE(pKeys->key[1].len); - pKeys->key[2].len = CNV_INT_TO_LITTLE(pKeys->key[2].len); - pKeys->key[3].len = CNV_INT_TO_LITTLE(pKeys->key[3].len); - - memcpy((void *)&(lp->DefaultKeys), (void *)pKeys, - sizeof(CFG_DEFAULT_KEYS_STRCT)); - } - break; - case CFG_TX_KEY_ID: - lp->TransmitKeyID = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_SCAN_SSID: - /* TODO: determine if we are going to store anything based on this */ - break; - case CFG_TICK_TIME: - /* TODO: determine if we are going to store anything based on this */ - break; - /* these RIDS are Info RIDs, and should they be allowed for puts??? */ - case CFG_MAX_LOAD_TIME: - case CFG_DL_BUF: - /* case CFG_HSI_SUP_RANGE: */ - case CFG_NIC_SERIAL_NUMBER: - case CFG_NIC_IDENTITY: - case CFG_NIC_MFI_SUP_RANGE: - case CFG_NIC_CFI_SUP_RANGE: - case CFG_NIC_TEMP_TYPE: - case CFG_NIC_PROFILE: - case CFG_FW_IDENTITY: - case CFG_FW_SUP_RANGE: - case CFG_MFI_ACT_RANGES_STA: - case CFG_CFI_ACT_RANGES_STA: - case CFG_PORT_STAT: - case CFG_CUR_SSID: - case CFG_CUR_BSSID: - case CFG_COMMS_QUALITY: - case CFG_CUR_TX_RATE: - case CFG_CUR_BEACON_INTERVAL: - case CFG_CUR_SCALE_THRH: - case CFG_PROTOCOL_RSP_TIME: - case CFG_CUR_SHORT_RETRY_LIMIT: - case CFG_CUR_LONG_RETRY_LIMIT: - case CFG_MAX_TX_LIFETIME: - case CFG_MAX_RX_LIFETIME: - case CFG_CF_POLLABLE: - case CFG_AUTHENTICATION_ALGORITHMS: - case CFG_PRIVACY_OPT_IMPLEMENTED: - /* case CFG_CURRENT_REMOTE_RATES: */ - /* case CFG_CURRENT_USED_RATES: */ - /* case CFG_CURRENT_SYSTEM_SCALE: */ - /* case CFG_CURRENT_TX_RATE1: */ - /* case CFG_CURRENT_TX_RATE2: */ - /* case CFG_CURRENT_TX_RATE3: */ - /* case CFG_CURRENT_TX_RATE4: */ - /* case CFG_CURRENT_TX_RATE5: */ - /* case CFG_CURRENT_TX_RATE6: */ - case CFG_NIC_MAC_ADDR: - case CFG_PCF_INFO: - /* case CFG_CURRENT_COUNTRY_INFO: */ - case CFG_PHY_TYPE: - case CFG_CUR_CHANNEL: - /* case CFG_CURRENT_POWER_STATE: */ - /* case CFG_CCAMODE: */ - case CFG_SUPPORTED_DATA_RATES: - break; - case CFG_AP_MODE: -/*;? lp->DownloadFirmware = (pLtv->u.u16[0]) + 1; */ - DBG_ERROR(DbgInfo, "set CFG_AP_MODE no longer supported\n"); - break; - case CFG_ENCRYPT_STRING: - /* TODO: ENDIAN TRANSLATION HERE??? */ - memset(lp->szEncryption, 0, sizeof(lp->szEncryption)); - memcpy((void *)lp->szEncryption, (void *)&pLtv->u.u8[0], - (pLtv->len * sizeof(hcf_16))); - wl_wep_decode(CRYPT_CODE, &sEncryption, - lp->szEncryption); - - /* the Linux driver likes to use 1-4 for the key IDs, and then - convert to 0-3 when sending to the card. The Windows code - base used 0-3 in the API DLL, which was ported to Linux. For - the sake of the user experience, we decided to keep 0-3 as the - numbers used in the DLL; and will perform the +1 conversion here. - We could have converted the entire Linux driver, but this is - less obtrusive. This may be a "todo" to convert the whole driver */ - lp->TransmitKeyID = sEncryption.wTxKeyID + 1; - lp->EnableEncryption = sEncryption.wEnabled; - - memcpy(&lp->DefaultKeys, &sEncryption.EncStr, - sizeof(CFG_DEFAULT_KEYS_STRCT)); - break; - /*case CFG_COUNTRY_STRING: - memset(lp->countryString, 0, sizeof(lp->countryString)); - memcpy((void *)lp->countryString, (void *)&pLtv->u.u8[2], (size_t)pLtv->u.u16[0]); - break; - */ - - case CFG_DRIVER_ENABLE: - lp->driverEnable = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_WOLAS_ENABLE: - lp->wolasEnable = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_SET_WPA_AUTH_KEY_MGMT_SUITE: - lp->AuthKeyMgmtSuite = pLtv->u.u16[0]; - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_DISASSOCIATE_ADDR: - pLtv->u.u16[ETH_ALEN / 2] = CNV_INT_TO_LITTLE(pLtv->u.u16[ETH_ALEN / 2]); - break; - case CFG_ADD_TKIP_DEFAULT_KEY: - case CFG_REMOVE_TKIP_DEFAULT_KEY: - /* Endian convert the Tx Key Information */ - pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); - break; - case CFG_ADD_TKIP_MAPPED_KEY: - break; - case CFG_REMOVE_TKIP_MAPPED_KEY: - break; - /* some RIDs just can't be put */ - case CFG_MB_INFO: - case CFG_IFB: - default: - break; - } - - /* This code will prevent Static Configuration Entities from - being sent to the card, as they require a call to - UIL_ACT_APPLY to take effect. Dynamic Entities will be sent - immediately */ - switch (pLtv->typ) { - case CFG_CNF_PORT_TYPE: - case CFG_CNF_OWN_MAC_ADDR: - case CFG_CNF_OWN_CHANNEL: - case CFG_CNF_OWN_SSID: - case CFG_CNF_OWN_ATIM_WINDOW: - case CFG_CNF_SYSTEM_SCALE: - case CFG_CNF_MAX_DATA_LEN: - case CFG_CNF_PM_ENABLED: - case CFG_CNF_MCAST_RX: - case CFG_CNF_MAX_SLEEP_DURATION: - case CFG_CNF_HOLDOVER_DURATION: - case CFG_CNF_OWN_NAME: - case CFG_CNF_LOAD_BALANCING: - case CFG_CNF_MEDIUM_DISTRIBUTION: -#ifdef WARP - case CFG_CNF_TX_POW_LVL: - case CFG_CNF_CONNECTION_CNTL: - /*case CFG_PROBE_DATA_RATE: */ -#endif /* HERMES25 */ -#if 1 /*;? (HCF_TYPE) & HCF_TYPE_AP */ - /*;?should we restore this to allow smaller memory footprint */ - case CFG_CNF_OWN_DTIM_PERIOD: -#ifdef WARP - case CFG_CNF_OWN_BEACON_INTERVAL: /* Own Beacon Interval */ -#endif /* WARP */ -#ifdef USE_WDS - case CFG_CNF_WDS_ADDR1: - case CFG_CNF_WDS_ADDR2: - case CFG_CNF_WDS_ADDR3: - case CFG_CNF_WDS_ADDR4: - case CFG_CNF_WDS_ADDR5: - case CFG_CNF_WDS_ADDR6: -#endif - case CFG_CNF_MCAST_PM_BUF: - case CFG_CNF_REJECT_ANY: -#endif - - case CFG_CNF_ENCRYPTION: - case CFG_CNF_AUTHENTICATION: -#if 1 /* ;? (HCF_TYPE) & HCF_TYPE_AP */ - /* ;?should we restore this to allow smaller memory footprint */ - - case CFG_CNF_EXCL_UNENCRYPTED: - case CFG_CNF_MCAST_RATE: - case CFG_CNF_INTRA_BSS_RELAY: -#endif - - case CFG_CNF_MICRO_WAVE: - /* case CFG_CNF_LOAD_BALANCING: */ - /* case CFG_CNF_MEDIUM_DISTRIBUTION: */ - /* case CFG_CNF_RX_ALL_GROUP_ADDRESS: */ - /* case CFG_CNF_COUNTRY_INFO: */ - /* case CFG_COUNTRY_STRING: */ - case CFG_AP_MODE: - case CFG_ENCRYPT_STRING: - /* case CFG_DRIVER_ENABLE: */ - case CFG_WOLAS_ENABLE: - case CFG_MB_INFO: - case CFG_IFB: - break; - /* Deal with this dynamic MSF RID, as it's required for WPA */ - case CFG_DRIVER_ENABLE: - if (lp->driverEnable) { - hcf_cntl(&(lp->hcfCtx), HCF_CNTL_ENABLE | HCF_PORT_0); - hcf_cntl(&(lp->hcfCtx), HCF_CNTL_CONNECT); - } else { - hcf_cntl(&(lp->hcfCtx), HCF_CNTL_DISABLE | HCF_PORT_0); - hcf_cntl(&(lp->hcfCtx), HCF_CNTL_DISCONNECT); - } - break; - default: - wl_act_int_off(lp); - urq->result = hcf_put_info(&(lp->hcfCtx), (LTVP) pLtv); - wl_act_int_on(lp); - break; - } - - if (ltvAllocated) - kfree(pLtv); - } else { - urq->result = UIL_FAILURE; - } - } else { - DBG_ERROR(DbgInfo, "EPERM\n"); - urq->result = UIL_FAILURE; - result = -EPERM; - } - } else { - DBG_ERROR(DbgInfo, "UIL_ERR_WRONG_IFB\n"); - urq->result = UIL_ERR_WRONG_IFB; - } - - return result; -} /* wvlan_uil_put_info */ - -/*============================================================================*/ - -/******************************************************************************* - * wvlan_uil_get_info() - ******************************************************************************* - * - * DESCRIPTION: - * - * Sends a specific RID directly to the driver to retrieve configuration - * info. - * - * PARAMETERS: - * - * urq - a pointer to the UIL request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * UIL_SUCCESS - * UIL_ERR_xxx value otherwise - * - ******************************************************************************/ -int wvlan_uil_get_info(struct uilreq *urq, struct wl_private *lp) -{ - int result = 0; - int i; - - if (urq->hcfCtx == &(lp->hcfCtx)) { - if ((urq->data != NULL) && (urq->len != 0)) { - ltv_t *pLtv; - bool_t ltvAllocated = FALSE; - - /* Make sure that we have at least a command and length */ - if (urq->len < (sizeof(hcf_16) * 2)) { - urq->len = sizeof(lp->ltvRecord); - DBG_ERROR(DbgInfo, "No Length/Type in LTV!!!\n"); - DBG_ERROR(DbgInfo, "UIL_ERR_LEN\n"); - urq->result = UIL_ERR_LEN; - return result; - } - - /* Verify the user's LTV record header. */ - result = verify_area(VERIFY_READ, urq->data, sizeof(hcf_16) * 2); - if (result != 0) { - DBG_ERROR(DbgInfo, "verify_area(), VERIFY_READ FAILED\n"); - urq->result = UIL_FAILURE; - return result; - } - - /* Get only the command and length information. */ - result = copy_from_user(&(lp->ltvRecord), urq->data, sizeof(hcf_16) * 2); - - /* Make sure the incoming LTV record length is within the bounds of - the IOCTL length. */ - if (((lp->ltvRecord.len + 1) * sizeof(hcf_16)) > urq->len) { - DBG_ERROR(DbgInfo, "Incoming LTV too big\n"); - urq->len = sizeof(lp->ltvRecord); - urq->result = UIL_ERR_LEN; - return result; - } - - /* Determine if hcf_get_info() is needed or not */ - switch (lp->ltvRecord.typ) { - case CFG_NIC_IDENTITY: - memcpy(&lp->ltvRecord.u.u8[0], &lp->NICIdentity, sizeof(lp->NICIdentity)); - break; - case CFG_PRI_IDENTITY: - memcpy(&lp->ltvRecord.u.u8[0], &lp->PrimaryIdentity, sizeof(lp->PrimaryIdentity)); - break; - case CFG_AP_MODE: - DBG_ERROR(DbgInfo, "set CFG_AP_MODE no longer supported, so is get useful ????\n"); - lp->ltvRecord.u.u16[0] = - CNV_INT_TO_LITTLE(lp->hcfCtx.IFB_FWIdentity.comp_id) == COMP_ID_FW_AP; - break; - /* case CFG_DRV_INFO: */ - case CFG_ENCRYPT_STRING: - case CFG_COUNTRY_STRING: - case CFG_DRIVER_ENABLE: - case CFG_WOLAS_ENABLE: - /* TODO: determine if we're going to support these */ - urq->result = UIL_FAILURE; - break; - case CFG_DRV_INFO: - DBG_TRACE(DbgInfo, "Intercept CFG_DRV_INFO\n"); - result = cfg_driver_info(urq, lp); - break; - case CFG_DRV_IDENTITY: - DBG_TRACE(DbgInfo, "Intercept CFG_DRV_IDENTITY\n"); - result = cfg_driver_identity(urq, lp); - break; - case CFG_IFB: - /* IFB can be a security hole */ - if (!capable(CAP_NET_ADMIN)) { - result = -EPERM; - break; - } - - /* Else fall through to the default */ - - case CFG_FW_IDENTITY: /* For Hermes-1, this is cached */ - default: - - /* Verify the user buffer */ - result = verify_area(VERIFY_WRITE, urq->data, urq->len); - if (result != 0) { - DBG_ERROR(DbgInfo, "verify_area(), VERIFY_WRITE FAILED\n"); - urq->result = UIL_FAILURE; - break; - } - - /* If the requested length is greater than the size of our local - LTV record, try to allocate it from the kernel stack. - Otherwise, we just use our local LTV record. */ - if (urq->len > sizeof(lp->ltvRecord)) { - pLtv = kmalloc(urq->len, GFP_KERNEL); - if (pLtv != NULL) { - ltvAllocated = TRUE; - - /* Copy the command/length information into the new buffer. */ - memcpy(pLtv, &(lp->ltvRecord), sizeof(hcf_16) * 2); - } else { - urq->len = sizeof(lp->ltvRecord); - urq->result = UIL_ERR_LEN; - DBG_ERROR(DbgInfo, "kmalloc FAILED\n"); - DBG_ERROR(DbgInfo, "UIL_ERR_LEN\n"); - result = -ENOMEM; - break; - } - } else { - pLtv = &(lp->ltvRecord); - } - - wl_act_int_off(lp); - urq->result = hcf_get_info(&(lp->hcfCtx), (LTVP) pLtv); - wl_act_int_on(lp); - - /* Copy the LTV into the user's buffer. */ - /*copy_to_user(urq->data, pLtv, urq->len); */ - - /*if(ltvAllocated) - { - kfree(pLtv); - }*/ - - /* urq->result = UIL_SUCCESS; */ - break; - } - - /* Handle endian conversion of special fields */ - switch (lp->ltvRecord.typ) { - /* simple int gets just need the first hcf_16 byte flipped */ - case CFG_CNF_PORT_TYPE: - case CFG_CNF_OWN_CHANNEL: - case CFG_CNF_OWN_ATIM_WINDOW: - case CFG_CNF_SYSTEM_SCALE: - case CFG_CNF_MAX_DATA_LEN: - case CFG_CNF_PM_ENABLED: - case CFG_CNF_MCAST_RX: - case CFG_CNF_MAX_SLEEP_DURATION: - case CFG_CNF_HOLDOVER_DURATION: - case CFG_CNF_OWN_DTIM_PERIOD: - case CFG_CNF_MCAST_PM_BUF: - case CFG_CNF_REJECT_ANY: - case CFG_CNF_ENCRYPTION: - case CFG_CNF_AUTHENTICATION: - case CFG_CNF_EXCL_UNENCRYPTED: - case CFG_CNF_INTRA_BSS_RELAY: - case CFG_CNF_MICRO_WAVE: - case CFG_CNF_LOAD_BALANCING: - case CFG_CNF_MEDIUM_DISTRIBUTION: -#ifdef WARP - case CFG_CNF_TX_POW_LVL: - case CFG_CNF_CONNECTION_CNTL: - case CFG_CNF_OWN_BEACON_INTERVAL: /* Own Beacon Interval */ - case CFG_COEXISTENSE_BEHAVIOUR: /* Coexistence Behavior */ - /*case CFG_CNF_RX_ALL_GROUP_ADDRESS: */ -#endif /* HERMES25 */ - case CFG_CREATE_IBSS: - case CFG_RTS_THRH: - case CFG_PROMISCUOUS_MODE: - /*case CFG_WAKE_ON_LAN: */ - case CFG_RTS_THRH0: - case CFG_RTS_THRH1: - case CFG_RTS_THRH2: - case CFG_RTS_THRH3: - case CFG_RTS_THRH4: - case CFG_RTS_THRH5: - case CFG_RTS_THRH6: - case CFG_TX_RATE_CNTL0: - case CFG_TX_RATE_CNTL1: - case CFG_TX_RATE_CNTL2: - case CFG_TX_RATE_CNTL3: - case CFG_TX_RATE_CNTL4: - case CFG_TX_RATE_CNTL5: - case CFG_TX_RATE_CNTL6: - case CFG_TX_KEY_ID: - case CFG_TICK_TIME: - case CFG_MAX_LOAD_TIME: - case CFG_NIC_TEMP_TYPE: - case CFG_PORT_STAT: - case CFG_CUR_TX_RATE: - case CFG_CUR_BEACON_INTERVAL: - case CFG_PROTOCOL_RSP_TIME: - case CFG_CUR_SHORT_RETRY_LIMIT: - case CFG_CUR_LONG_RETRY_LIMIT: - case CFG_MAX_TX_LIFETIME: - case CFG_MAX_RX_LIFETIME: - case CFG_CF_POLLABLE: - case CFG_PRIVACY_OPT_IMPLEMENTED: - /* case CFG_CURRENT_REMOTE_RATES: */ - /* case CFG_CURRENT_USED_RATES: */ - /* case CFG_CURRENT_SYSTEM_SCALE: */ - /* case CFG_CURRENT_TX_RATE1: */ - /* case CFG_CURRENT_TX_RATE2: */ - /* case CFG_CURRENT_TX_RATE3: */ - /* case CFG_CURRENT_TX_RATE4: */ - /* case CFG_CURRENT_TX_RATE5: */ - /* case CFG_CURRENT_TX_RATE6: */ - case CFG_PHY_TYPE: - case CFG_CUR_CHANNEL: - /* case CFG_CURRENT_POWER_STATE: */ - /* case CFG_CCAMODE: */ - /* lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[0]); */ - /* break; */ - /* name string gets just need the first hcf_16 byte flipped (length of string) */ - case CFG_CNF_OWN_SSID: - case CFG_CNF_OWN_NAME: - /* case CNF_DESIRED_SSID: */ - case CFG_DESIRED_SSID: - case CFG_SCAN_SSID: - case CFG_CUR_SSID: - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[0]); - break; - /* non-length counted strings need no byte flipping */ - case CFG_CNF_OWN_MAC_ADDR: - /* this case is no longer valid: CFG_CNF_WDS_ADDR */ - case CFG_CNF_WDS_ADDR1: - case CFG_CNF_WDS_ADDR2: - case CFG_CNF_WDS_ADDR3: - case CFG_CNF_WDS_ADDR4: - case CFG_CNF_WDS_ADDR5: - case CFG_CNF_WDS_ADDR6: - case CFG_GROUP_ADDR: - case CFG_NIC_SERIAL_NUMBER: - case CFG_CUR_BSSID: - case CFG_NIC_MAC_ADDR: - case CFG_SUPPORTED_DATA_RATES: /* need to ensure we can treat this as a string */ - break; - /* case CFG_CNF_COUNTRY_INFO: */ /* special case, see page 75 of 022486, Rev C. */ - /* case CFG_CURRENT_COUNTRY_INFO: */ /* special case, see page 101 of 022486, Rev C. */ - /* - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[0]); - lp->ltvRecord.u.u16[3] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[3]); - - for(i = 4; i < lp->ltvRecord.len; i++) { - lp->ltvRecord.u.u16[i] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[i]); - } - break; - */ - - case CFG_DEFAULT_KEYS: - { - CFG_DEFAULT_KEYS_STRCT *pKeys = (CFG_DEFAULT_KEYS_STRCT *)&lp->ltvRecord.u.u8[0]; - - pKeys[0].len = CNV_INT_TO_LITTLE(pKeys[0].len); - pKeys[1].len = CNV_INT_TO_LITTLE(pKeys[1].len); - pKeys[2].len = CNV_INT_TO_LITTLE(pKeys[2].len); - pKeys[3].len = CNV_INT_TO_LITTLE(pKeys[3].len); - } - break; - case CFG_CNF_MCAST_RATE: - case CFG_TX_RATE_CNTL: - case CFG_SUPPORTED_RATE_SET_CNTL: /* Supported Rate Set Control */ - case CFG_BASIC_RATE_SET_CNTL: /* Basic Rate Set Control */ - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[0]); - lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[1]); - break; - case CFG_DL_BUF: - case CFG_NIC_IDENTITY: - case CFG_COMMS_QUALITY: - case CFG_PCF_INFO: - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[0]); - lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[1]); - lp->ltvRecord.u.u16[2] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[2]); - break; - case CFG_FW_IDENTITY: - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[0]); - lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[1]); - lp->ltvRecord.u.u16[2] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[2]); - lp->ltvRecord.u.u16[3] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[3]); - break; - /* case CFG_HSI_SUP_RANGE: */ - case CFG_NIC_MFI_SUP_RANGE: - case CFG_NIC_CFI_SUP_RANGE: - case CFG_NIC_PROFILE: - case CFG_FW_SUP_RANGE: - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[0]); - lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[1]); - lp->ltvRecord.u.u16[2] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[2]); - lp->ltvRecord.u.u16[3] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[3]); - lp->ltvRecord.u.u16[4] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[4]); - break; - case CFG_MFI_ACT_RANGES_STA: - case CFG_CFI_ACT_RANGES_STA: - case CFG_CUR_SCALE_THRH: - case CFG_AUTHENTICATION_ALGORITHMS: - for (i = 0; i < (lp->ltvRecord.len - 1); i++) - lp->ltvRecord.u.u16[i] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[i]); - break; - /* done at init time, and endian handled then */ - case CFG_PRI_IDENTITY: - break; - case CFG_MB_INFO: - /* wvlanEndianTranslateMailbox(pLtv); */ - break; - /* MSF and HCF RIDS */ - case CFG_IFB: - case CFG_DRV_INFO: - case CFG_AP_MODE: - case CFG_ENCRYPT_STRING: - case CFG_COUNTRY_STRING: - case CFG_DRIVER_ENABLE: - case CFG_WOLAS_ENABLE: - default: - break; - } - - /* Copy the LTV into the user's buffer. */ - copy_to_user(urq->data, &(lp->ltvRecord), urq->len); - - if (ltvAllocated) - kfree(&(lp->ltvRecord)); - urq->result = UIL_SUCCESS; - } else { - urq->result = UIL_FAILURE; - } - } else { - DBG_ERROR(DbgInfo, "UIL_ERR_WRONG_IFB\n"); - urq->result = UIL_ERR_WRONG_IFB; - } - - return result; -} /* wvlan_uil_get_info */ -/*============================================================================*/ - - - - - -/******************************************************************************* - * cfg_driver_info() - ******************************************************************************* - * - * DESCRIPTION: - * - * Retrieves driver information. - * - * PARAMETERS: - * - * urq - a pointer to the UIL request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * UIL_SUCCESS - * UIL_ERR_xxx value otherwise - * - ******************************************************************************/ -int cfg_driver_info(struct uilreq *urq, struct wl_private *lp) -{ - int result = 0; - - /* Make sure that user buffer can handle the driver information buffer */ - if (urq->len < sizeof(lp->driverInfo)) { - urq->len = sizeof(lp->driverInfo); - urq->result = UIL_ERR_LEN; - return result; - } - - /* Verify the user buffer. */ - result = verify_area(VERIFY_WRITE, urq->data, sizeof(lp->driverInfo)); - if (result != 0) { - urq->result = UIL_FAILURE; - return result; - } - - lp->driverInfo.card_stat = lp->hcfCtx.IFB_CardStat; - - /* Copy the driver information into the user's buffer. */ - urq->result = UIL_SUCCESS; - copy_to_user(urq->data, &(lp->driverInfo), sizeof(lp->driverInfo)); - - return result; -} /* cfg_driver_info */ -/*============================================================================*/ - - - - -/******************************************************************************* - * cfg_driver_identity() - ******************************************************************************* - * - * DESCRIPTION: - * - * Retrieves ID information from the card. - * - * PARAMETERS: - * - * urq - a pointer to the UIL request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * UIL_SUCCESS - * UIL_ERR_xxx value otherwise - * - ******************************************************************************/ -int cfg_driver_identity(struct uilreq *urq, struct wl_private *lp) -{ - int result = 0; - - /* Make sure that user buffer can handle the driver identity structure. */ - if (urq->len < sizeof(lp->driverIdentity)) { - urq->len = sizeof(lp->driverIdentity); - urq->result = UIL_ERR_LEN; - return result; - } - - /* Verify the user buffer. */ - result = verify_area(VERIFY_WRITE, urq->data, sizeof(lp->driverIdentity)); - if (result != 0) { - urq->result = UIL_FAILURE; - return result; - } - - /* Copy the driver identity into the user's buffer. */ - urq->result = UIL_SUCCESS; - copy_to_user(urq->data, &(lp->driverIdentity), sizeof(lp->driverIdentity)); - - return result; -} /* cfg_driver_identity */ -/*============================================================================*/ - - -#endif /* USE_UIL */ - - -/* If WIRELESS_EXT is not defined, then the functions that follow will not be - included in the build. */ -/* NOTE: Are these still even needed? */ -#ifdef WIRELESS_EXT - - -/******************************************************************************* - * wvlan_set_netname() - ******************************************************************************* - * - * DESCRIPTION: - * - * Set the ESSID of the card. - * - * PARAMETERS: - * - * wrq - a pointer to the wireless request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -int wvlan_set_netname(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, - char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - - wl_lock(lp, &flags); - - memset(lp->NetworkName, 0, sizeof(lp->NetworkName)); - memcpy(lp->NetworkName, extra, wrqu->data.length); - - /* Commit the adapter parameters */ - wl_apply(lp); - wl_unlock(lp, &flags); - - return 0; -} /* wvlan_set_netname */ -/*============================================================================*/ - - - - -/******************************************************************************* - * wvlan_get_netname() - ******************************************************************************* - * - * DESCRIPTION: - * - * Get the ESSID of the card. - * - * PARAMETERS: - * - * wrq - a pointer to the wireless request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -int wvlan_get_netname(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, - char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - int status = -1; - wvName_t *pName; - - wl_lock(lp, &flags); - - /* Get the current network name */ - lp->ltvRecord.len = 1 + (sizeof(*pName) / sizeof(hcf_16)); - lp->ltvRecord.typ = CFG_CUR_SSID; - - status = hcf_get_info(&(lp->hcfCtx), (LTVP)&(lp->ltvRecord)); - - if (status == HCF_SUCCESS) { - pName = (wvName_t *)&(lp->ltvRecord.u.u32); - - memset(extra, '\0', HCF_MAX_NAME_LEN); - wrqu->data.length = pName->length; - - memcpy(extra, pName->name, pName->length); - } else { - ret = -EFAULT; - } - - wl_unlock(lp, &flags); - - return ret; -} /* wvlan_get_netname */ -/*============================================================================*/ - - - - -/******************************************************************************* - * wvlan_set_station_nickname() - ******************************************************************************* - * - * DESCRIPTION: - * - * Set the card's station nickname. - * - * PARAMETERS: - * - * wrq - a pointer to the wireless request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -int wvlan_set_station_nickname(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, - char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - size_t len; - - wl_lock(lp, &flags); - - memset(lp->StationName, 0, sizeof(lp->StationName)); - len = min_t(size_t, wrqu->data.length, sizeof(lp->StationName)); - strlcpy(lp->StationName, extra, len); - - /* Commit the adapter parameters */ - wl_apply(lp); - wl_unlock(lp, &flags); - - return 0; -} /* wvlan_set_station_nickname */ -/*============================================================================*/ - - - - -/******************************************************************************* - * wvlan_get_station_nickname() - ******************************************************************************* - * - * DESCRIPTION: - * - * Get the card's station nickname. - * - * PARAMETERS: - * - * wrq - a pointer to the wireless request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -int wvlan_get_station_nickname(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, - char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - int status = -1; - wvName_t *pName; - - wl_lock(lp, &flags); - - /* Get the current station name */ - lp->ltvRecord.len = 1 + (sizeof(*pName) / sizeof(hcf_16)); - lp->ltvRecord.typ = CFG_CNF_OWN_NAME; - - status = hcf_get_info(&(lp->hcfCtx), (LTVP)&(lp->ltvRecord)); - - if (status == HCF_SUCCESS) { - pName = (wvName_t *)&(lp->ltvRecord.u.u32); - - memset(extra, '\0', HCF_MAX_NAME_LEN); - wrqu->data.length = pName->length; - memcpy(extra, pName->name, pName->length); - } else { - ret = -EFAULT; - } - - wl_unlock(lp, &flags); - -/* out: */ - return ret; -} /* wvlan_get_station_nickname */ -/*============================================================================*/ - - - - -/******************************************************************************* - * wvlan_set_porttype() - ******************************************************************************* - * - * DESCRIPTION: - * - * Set the card's porttype - * - * PARAMETERS: - * - * wrq - a pointer to the wireless request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -int wvlan_set_porttype(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, - char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - hcf_16 portType; - - wl_lock(lp, &flags); - - /* Validate the new value */ - portType = *((__u32 *)extra); - - if (!((portType == 1) || (portType == 3))) { - ret = -EINVAL; - goto out_unlock; - } - - lp->PortType = portType; - - /* Commit the adapter parameters */ - wl_apply(lp); - -out_unlock: - wl_unlock(lp, &flags); - -/* out: */ - return ret; -} - -/*============================================================================*/ - - -/******************************************************************************* - * wvlan_get_porttype() - ******************************************************************************* - * - * DESCRIPTION: - * - * Get the card's porttype - * - * PARAMETERS: - * - * wrq - a pointer to the wireless request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -int wvlan_get_porttype(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, - char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - int status = -1; - hcf_16 *pPortType; - __u32 *pData = (__u32 *)extra; - - wl_lock(lp, &flags); - - /* Get the current port type */ - lp->ltvRecord.len = 1 + (sizeof(*pPortType) / sizeof(hcf_16)); - lp->ltvRecord.typ = CFG_CNF_PORT_TYPE; - - status = hcf_get_info(&(lp->hcfCtx), (LTVP)&(lp->ltvRecord)); - - if (status == HCF_SUCCESS) { - pPortType = (hcf_16 *)&(lp->ltvRecord.u.u32); - - *pData = CNV_LITTLE_TO_INT(*pPortType); - } else { - ret = -EFAULT; - } - - wl_unlock(lp, &flags); - -/* out: */ - return ret; -} /* wvlan_get_porttype */ -/*============================================================================*/ - -#endif /* WIRELESS_EXT */ - - - - -#ifdef USE_RTS -/******************************************************************************* - * wvlan_rts() - ******************************************************************************* - * - * DESCRIPTION: - * - * IOCTL handler for RTS commands - * - * PARAMETERS: - * - * rrq - a pointer to the rts request buffer - * lp - a pointer to the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -int wvlan_rts(struct rtsreq *rrq, __u32 io_base) -{ - int ioctl_ret = 0; - - DBG_PRINT("io_base: 0x%08x\n", io_base); - - switch (rrq->typ) { - case WL_IOCTL_RTS_READ: - DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_RTS -- WL_IOCTL_RTS_READ\n"); - rrq->data[0] = IN_PORT_WORD(io_base + rrq->reg); - DBG_TRACE(DbgInfo, " reg 0x%04x ==> 0x%04x\n", rrq->reg, CNV_LITTLE_TO_SHORT(rrq->data[0])); - break; - case WL_IOCTL_RTS_WRITE: - DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_RTS -- WL_IOCTL_RTS_WRITE\n"); - OUT_PORT_WORD(io_base + rrq->reg, rrq->data[0]); - DBG_TRACE(DbgInfo, " reg 0x%04x <== 0x%04x\n", rrq->reg, CNV_LITTLE_TO_SHORT(rrq->data[0])); - break; - case WL_IOCTL_RTS_BATCH_READ: - DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_RTS -- WL_IOCTL_RTS_BATCH_READ\n"); - IN_PORT_STRING_16(io_base + rrq->reg, rrq->data, rrq->len); - DBG_TRACE(DbgInfo, " reg 0x%04x ==> %d bytes\n", rrq->reg, rrq->len * sizeof(__u16)); - break; - case WL_IOCTL_RTS_BATCH_WRITE: - DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_RTS -- WL_IOCTL_RTS_BATCH_WRITE\n"); - OUT_PORT_STRING_16(io_base + rrq->reg, rrq->data, rrq->len); - DBG_TRACE(DbgInfo, " reg 0x%04x <== %d bytes\n", rrq->reg, rrq->len * sizeof(__u16)); - break; - default: - - DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_RTS -- UNSUPPORTED RTS CODE: 0x%X", rrq->typ); - ioctl_ret = -EOPNOTSUPP; - break; - } - - return ioctl_ret; -} /* wvlan_rts */ -/*============================================================================*/ - -#endif /* USE_RTS */ diff --git a/drivers/staging/wlags49_h2/wl_priv.h b/drivers/staging/wlags49_h2/wl_priv.h deleted file mode 100644 index f35e79486428..000000000000 --- a/drivers/staging/wlags49_h2/wl_priv.h +++ /dev/null @@ -1,127 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * Header describing information required for the private IOCTL handlers. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -#ifndef __WL_PRIV_H__ -#define __WL_PRIV_H__ - - - - -/******************************************************************************* - * function prototypes - ******************************************************************************/ -#ifdef WIRELESS_EXT - - -int wvlan_set_netname(struct net_device *, struct iw_request_info *, - union iwreq_data *, char *extra); - -int wvlan_get_netname(struct net_device *, struct iw_request_info *, - union iwreq_data *, char *extra); - -int wvlan_set_station_nickname(struct net_device *, struct iw_request_info *, - union iwreq_data *, char *extra); - -int wvlan_get_station_nickname(struct net_device *, struct iw_request_info *, - union iwreq_data *, char *extra); - -int wvlan_set_porttype(struct net_device *, struct iw_request_info *, - union iwreq_data *, char *extra); - -int wvlan_get_porttype(struct net_device *, struct iw_request_info *, - union iwreq_data *, char *extra); - - -#endif /* WIRELESS_EXT */ - - - - -#ifdef USE_UIL - -int wvlan_uil(struct uilreq *urq, struct wl_private *lp); - -/* int wvlan_uil_connect( struct uilreq *urq, struct wl_private *lp ); */ -/* int wvlan_uil_disconnect( struct uilreq *urq, struct wl_private *lp ); */ -/* int wvlan_uil_action( struct uilreq *urq, struct wl_private *lp ); */ -/* int wvlan_uil_block( struct uilreq *urq, struct wl_private *lp ); */ -/* int wvlan_uil_unblock( struct uilreq *urq, struct wl_private *lp ); */ -/* int wvlan_uil_send_diag_msg( struct uilreq *urq, struct wl_private *lp ); */ -/* int wvlan_uil_put_info( struct uilreq *urq, struct wl_private *lp ); */ -/* int wvlan_uil_get_info( struct uilreq *urq, struct wl_private *lp ); */ - -/* int cfg_driver_info( struct uilreq *urq, struct wl_private *lp ); */ -/* int cfg_driver_identity( struct uilreq *urq, struct wl_private *lp ); */ - -#endif /* USE_UIL */ - - -#ifdef USE_RTS - -int wvlan_rts(struct rtsreq *rrq, __u32 io_base); -int wvlan_rts_read(__u16 reg, __u16 *val, __u32 io_base); -int wvlan_rts_write(__u16 reg, __u16 val, __u32 io_base); -int wvlan_rts_batch_read(struct rtsreq *rrq, __u32 io_base); -int wvlan_rts_batch_write(struct rtsreq *rrq, __u32 io_base); - -#endif /* USE_RTS */ - - -#endif /* __WL_PRIV_H__ */ diff --git a/drivers/staging/wlags49_h2/wl_profile.c b/drivers/staging/wlags49_h2/wl_profile.c deleted file mode 100644 index 28cc5765e5c1..000000000000 --- a/drivers/staging/wlags49_h2/wl_profile.c +++ /dev/null @@ -1,995 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * This file defines routines required to parse configuration parameters - * listed in a config file, if that config file exists. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -/* Only include this file if USE_PROFILE is defined */ -#ifdef USE_PROFILE - - - - -/******************************************************************************* - * constant definitions - ******************************************************************************/ - - -/* Allow support for calling system fcns to parse config file */ -#define __KERNEL_SYSCALLS__ - - - - -/******************************************************************************* - * include files - ******************************************************************************/ -#include - -#include -#include -#include -#include -#include - -#define BIN_DL 1 - -#include -#include -/* #include */ - -#include -#include -#include -#include -#include -#include - - -/* Definition needed to prevent unresolved external in unistd.h */ -static int errno; - -#if DBG -extern p_u32 DebugFlag; -#endif - -int parse_yes_no(char *value); - - -int parse_yes_no(char *value) -{ -int rc = 0; /* default to NO for invalid parameters */ - - if (strlen(value) == 1) { - if ((value[0] | ('Y'^'y')) == 'y') - rc = 1; - /* } else { */ - /* this should not be debug time info, it is an enduser data entry error ;? */ - /* DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_MICROWAVE_ROBUSTNESS); */ - } - return rc; -} /* parse_yes_no */ - - -/******************************************************************************* - * parse_config() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function opens the device's config file and parses the options from - * it, so that it can properly configure itself. If no configuration file - * or configuration is present, then continue to use the options already - * parsed from config.opts or wireless.opts. - * - * PARAMETERS: - * - * dev - a pointer to the device's net_device structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void parse_config(struct net_device *dev) -{ - int file_desc; -#if 0 /* BIN_DL */ - int rc; - char *cp = NULL; -#endif /* BIN_DL */ - char buffer[MAX_LINE_SIZE]; - char filename[MAX_LINE_SIZE]; - mm_segment_t fs; - struct wl_private *wvlan_config = NULL; - ENCSTRCT sEncryption; - - /* Get the wavelan specific info for this device */ - wvlan_config = dev->priv; - if (wvlan_config == NULL) { - DBG_ERROR(DbgInfo, "Wavelan specific info struct not present?\n"); - return; - } - - /* setup the default encryption string */ - strcpy(wvlan_config->szEncryption, DEF_CRYPT_STR); - - /* Obtain a user-space process context, storing the original context */ - fs = get_fs(); - set_fs(get_ds()); - - /* Determine the filename for this device and attempt to open it */ - sprintf(filename, "%s%s", ROOT_CONFIG_FILENAME, dev->name); - file_desc = open(filename, O_RDONLY, 0); - if (file_desc != -1) { - DBG_TRACE(DbgInfo, "Wireless config file found. Parsing options...\n"); - - /* Read out the options */ - while (readline(file_desc, buffer)) - translate_option(buffer, wvlan_config); - /* Close the file */ - close(file_desc); /* ;?even if file_desc == -1 ??? */ - } else { - DBG_TRACE(DbgInfo, "No iwconfig file found for this device; " - "config.opts or wireless.opts will be used\n"); - } - /* Return to the original context */ - set_fs(fs); - - /* convert the WEP keys, if read in as key1, key2, type of data */ - if (wvlan_config->EnableEncryption) { - memset(&sEncryption, 0, sizeof(sEncryption)); - - wl_wep_decode(CRYPT_CODE, &sEncryption, - wvlan_config->szEncryption); - - /* the Linux driver likes to use 1-4 for the key IDs, and then - convert to 0-3 when sending to the card. The Windows code - base used 0-3 in the API DLL, which was ported to Linux. For - the sake of the user experience, we decided to keep 0-3 as the - numbers used in the DLL; and will perform the +1 conversion here. - We could have converted the entire Linux driver, but this is - less obtrusive. This may be a "todo" to convert the whole driver */ - sEncryption.wEnabled = wvlan_config->EnableEncryption; - sEncryption.wTxKeyID = wvlan_config->TransmitKeyID - 1; - - memcpy(&sEncryption.EncStr, &wvlan_config->DefaultKeys, - sizeof(CFG_DEFAULT_KEYS_STRCT)); - - memset(wvlan_config->szEncryption, 0, sizeof(wvlan_config->szEncryption)); - - wl_wep_code(CRYPT_CODE, wvlan_config->szEncryption, &sEncryption, - sizeof(sEncryption)); - } - - /* decode the encryption string for the call to wl_commit() */ - wl_wep_decode(CRYPT_CODE, &sEncryption, wvlan_config->szEncryption); - - wvlan_config->TransmitKeyID = sEncryption.wTxKeyID + 1; - wvlan_config->EnableEncryption = sEncryption.wEnabled; - - memcpy(&wvlan_config->DefaultKeys, &sEncryption.EncStr, - sizeof(CFG_DEFAULT_KEYS_STRCT)); - -#if 0 /* BIN_DL */ - /* Obtain a user-space process context, storing the original context */ - fs = get_fs(); - set_fs(get_ds()); - - /* ;?just to fake something */ - strcpy(/*wvlan_config->fw_image_*/filename, "/etc/agere/fw.bin"); - file_desc = open(/*wvlan_config->fw_image_*/filename, 0, 0); - if (file_desc == -1) { - DBG_ERROR(DbgInfo, "No image file found\n"); - } else { - DBG_TRACE(DbgInfo, "F/W image file found\n"); -#define DHF_ALLOC_SIZE 96000 /* just below 96K, let's hope it suffices for now and for the future */ - cp = vmalloc(DHF_ALLOC_SIZE); - if (cp == NULL) { - DBG_ERROR(DbgInfo, "error in vmalloc\n"); - } else { - rc = read(file_desc, cp, DHF_ALLOC_SIZE); - if (rc == DHF_ALLOC_SIZE) { - DBG_ERROR(DbgInfo, "buffer too small, %d\n", DHF_ALLOC_SIZE); - } else if (rc > 0) { - DBG_TRACE(DbgInfo, "read O.K.: %d bytes %.12s\n", rc, cp); - rc = read(file_desc, &cp[rc], 1); - if (rc == 0) - DBG_TRACE(DbgInfo, "no more to read\n"); - } - if (rc != 0) { - DBG_ERROR(DbgInfo, "file not read in one swoop or other error"\ - ", give up, too complicated, rc = %0X\n", rc); - } - vfree(cp); - } - close(file_desc); - } - set_fs(fs); /* Return to the original context */ -#endif /* BIN_DL */ - - return; -} /* parse_config */ - -/******************************************************************************* - * readline() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function reads in data from a given file one line at a time, - * converting the detected newline character '\n' to a null '\0'. Note that - * the file descriptor must be valid before calling this function. - * - * PARAMETERS: - * - * filedesc - the file descriptor for the open configuration file - * buffer - a buffer pointer, passed in by the caller, to which the - * line will be stored. - * - * RETURNS: - * - * the number of bytes read - * -1 on error - * - ******************************************************************************/ -int readline(int filedesc, char *buffer) -{ - int result = -1; - int bytes_read = 0; - /*------------------------------------------------------------------------*/ - - /* Make sure the file descriptor is good */ - if (filedesc != -1) { - /* Read in from the file byte by byte until a newline is reached */ - while ((result = read(filedesc, &buffer[bytes_read], 1)) == 1) { - if (buffer[bytes_read] == '\n') { - buffer[bytes_read] = '\0'; - bytes_read++; - break; - } - bytes_read++; - } - } - - /* Return the number of bytes read */ - if (result == -1) - return result; - else - return bytes_read; -} /* readline */ -/*============================================================================*/ - -/******************************************************************************* - * translate_option() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function takes a line read in from the config file and parses out - * the key/value pairs. It then determines which key has been parsed and sets - * the card's configuration based on the value given. - * - * PARAMETERS: - * - * buffer - a buffer containing a line to translate - * config - a pointer to the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void translate_option(char *buffer, struct wl_private *lp) -{ - unsigned int value_convert = 0; - int string_length = 0; - char *key = NULL; - char *value = NULL; - u_char mac_value[ETH_ALEN]; - /*------------------------------------------------------------------------*/ - - if (buffer == NULL || lp == NULL) { - DBG_ERROR(DbgInfo, "Config file buffer and/or wavelan buffer ptr NULL\n"); - return; - } - - ParseConfigLine(buffer, &key, &value); - - if (key == NULL || value == NULL) - return; - - /* Determine which key it is and perform the appropriate action */ - - /* Configuration parameters used in all scenarios */ -#if DBG - /* handle DebugFlag as early as possible so it starts its influence as early - * as possible - */ - if (strcmp(key, PARM_NAME_DEBUG_FLAG) == 0) { - if (DebugFlag == ~0) { /* if DebugFlag is not specified on the command line */ - if (DbgInfo->DebugFlag == 0) { /* if pc_debug did not set DebugFlag (i.e.pc_debug is - * not specified or specified outside the 4-8 range - */ - DbgInfo->DebugFlag |= DBG_DEFAULTS; - } - } else { - DbgInfo->DebugFlag = simple_strtoul(value, NULL, 0); /* ;?DebugFlag; */ - } - DbgInfo->DebugFlag = simple_strtoul(value, NULL, 0); /* ;?Delete ASAP */ - } -#endif /* DBG */ - if (strcmp(key, PARM_NAME_AUTH_KEY_MGMT_SUITE) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_AUTH_KEY_MGMT_SUITE, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_AUTH_KEY_MGMT_SUITE) || (value_convert <= PARM_MAX_AUTH_KEY_MGMT_SUITE)) - lp->AuthKeyMgmtSuite = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_AUTH_KEY_MGMT_SUITE); - } else if (strcmp(key, PARM_NAME_BRSC_2GHZ) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_BRSC_2GHZ, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_BRSC) || (value_convert <= PARM_MAX_BRSC)) - lp->brsc[0] = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_BRSC_2GHZ); - } else if (strcmp(key, PARM_NAME_BRSC_5GHZ) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_BRSC_5GHZ, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_BRSC) || (value_convert <= PARM_MAX_BRSC)) - lp->brsc[1] = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_BRSC_5GHZ); - } else if ((strcmp(key, PARM_NAME_DESIRED_SSID) == 0) || (strcmp(key, PARM_NAME_OWN_SSID) == 0)) { - DBG_TRACE(DbgInfo, "SSID, value: %s\n", value); - - memset(lp->NetworkName, 0, (PARM_MAX_NAME_LEN + 1)); - - /* Make sure the value isn't too long */ - string_length = strlen(value); - if (string_length > PARM_MAX_NAME_LEN) { - DBG_WARNING(DbgInfo, "SSID too long; will be truncated\n"); - string_length = PARM_MAX_NAME_LEN; - } - - memcpy(lp->NetworkName, value, string_length); - } -#if 0 - else if (strcmp(key, PARM_NAME_DOWNLOAD_FIRMWARE) == 0) { - DBG_TRACE(DbgInfo, "DOWNLOAD_FIRMWARE, value: %s\n", value); - memset(lp->fw_image_filename, 0, (MAX_LINE_SIZE + 1)); - /* Make sure the value isn't too long */ - string_length = strlen(value); - if (string_length > MAX_LINE_SIZE) - DBG_WARNING(DbgInfo, "F/W image file name too long; will be ignored\n"); - else - memcpy(lp->fw_image_filename, value, string_length); - } -#endif - else if (strcmp(key, PARM_NAME_ENABLE_ENCRYPTION) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_ENABLE_ENCRYPTION, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_ENABLE_ENCRYPTION) && (value_convert <= PARM_MAX_ENABLE_ENCRYPTION)) - lp->EnableEncryption = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_ENABLE_ENCRYPTION); - } else if (strcmp(key, PARM_NAME_ENCRYPTION) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_ENCRYPTION, value); - - memset(lp->szEncryption, 0, sizeof(lp->szEncryption)); - - /* Make sure the value isn't too long */ - string_length = strlen(value); - if (string_length > sizeof(lp->szEncryption)) { - DBG_WARNING(DbgInfo, "%s too long; will be truncated\n", PARM_NAME_ENCRYPTION); - string_length = sizeof(lp->szEncryption); - } - - memcpy(lp->szEncryption, value, string_length); - } else if (strcmp(key, PARM_NAME_KEY1) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_KEY1, value); - - if (is_valid_key_string(value)) { - memset(lp->DefaultKeys.key[0].key, 0, MAX_KEY_SIZE); - - key_string2key(value, &lp->DefaultKeys.key[0]); - } else { - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_KEY1); - } - } else if (strcmp(key, PARM_NAME_KEY2) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_KEY2, value); - - if (is_valid_key_string(value)) { - memset(lp->DefaultKeys.key[1].key, 0, MAX_KEY_SIZE); - - key_string2key(value, &lp->DefaultKeys.key[1]); - } else { - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_KEY2); - } - } else if (strcmp(key, PARM_NAME_KEY3) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_KEY3, value); - - if (is_valid_key_string(value)) { - memset(lp->DefaultKeys.key[2].key, 0, MAX_KEY_SIZE); - - key_string2key(value, &lp->DefaultKeys.key[2]); - } else { - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_KEY3); - } - } else if (strcmp(key, PARM_NAME_KEY4) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_KEY4, value); - - if (is_valid_key_string(value)) { - memset(lp->DefaultKeys.key[3].key, 0, MAX_KEY_SIZE); - - key_string2key(value, &lp->DefaultKeys.key[3]); - } else { - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_KEY4); - } - } - /* New Parameters for WARP */ - else if (strcmp(key, PARM_NAME_LOAD_BALANCING) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_LOAD_BALANCING, value); - lp->loadBalancing = parse_yes_no(value); - } else if (strcmp(key, PARM_NAME_MEDIUM_DISTRIBUTION) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_MEDIUM_DISTRIBUTION, value); - lp->mediumDistribution = parse_yes_no(value); - } else if (strcmp(key, PARM_NAME_MICROWAVE_ROBUSTNESS) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_MICROWAVE_ROBUSTNESS, value); - lp->MicrowaveRobustness = parse_yes_no(value); - } else if (strcmp(key, PARM_NAME_MULTICAST_RATE) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_MULTICAST_RATE, value); - - value_convert = simple_strtoul(value, NULL, 0); - - if ((value_convert >= PARM_MIN_MULTICAST_RATE) && (value_convert <= PARM_MAX_MULTICAST_RATE)) - lp->MulticastRate[0] = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_MULTICAST_RATE); - } else if (strcmp(key, PARM_NAME_OWN_CHANNEL) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_OWN_CHANNEL, value); - - value_convert = simple_strtoul(value, NULL, 0); - if (wl_is_a_valid_chan(value_convert)) { - if (value_convert > 14) - value_convert = value_convert | 0x100; - lp->Channel = value_convert; - } else { - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_OWN_CHANNEL); - } - } else if (strcmp(key, PARM_NAME_OWN_NAME) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_OWN_NAME, value); - - memset(lp->StationName, 0, (PARM_MAX_NAME_LEN + 1)); - - /* Make sure the value isn't too long */ - string_length = strlen(value); - if (string_length > PARM_MAX_NAME_LEN) { - DBG_WARNING(DbgInfo, "%s too long; will be truncated\n", PARM_NAME_OWN_NAME); - string_length = PARM_MAX_NAME_LEN; - } - - memcpy(lp->StationName, value, string_length); - } else if (strcmp(key, PARM_NAME_RTS_THRESHOLD) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_RTS_THRESHOLD, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_RTS_THRESHOLD) && (value_convert <= PARM_MAX_RTS_THRESHOLD)) - lp->RTSThreshold = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_RTS_THRESHOLD); - } else if (strcmp(key, PARM_NAME_SRSC_2GHZ) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_SRSC_2GHZ, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_SRSC) || (value_convert <= PARM_MAX_SRSC)) - lp->srsc[0] = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_SRSC_2GHZ); - } else if (strcmp(key, PARM_NAME_SRSC_5GHZ) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_SRSC_5GHZ, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_SRSC) || (value_convert <= PARM_MAX_SRSC)) - lp->srsc[1] = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_SRSC_5GHZ); - } else if (strcmp(key, PARM_NAME_SYSTEM_SCALE) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_SYSTEM_SCALE, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_SYSTEM_SCALE) && (value_convert <= PARM_MAX_SYSTEM_SCALE)) - lp->DistanceBetweenAPs = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_SYSTEM_SCALE); - } else if (strcmp(key, PARM_NAME_TX_KEY) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_KEY, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_TX_KEY) && (value_convert <= PARM_MAX_TX_KEY)) - lp->TransmitKeyID = simple_strtoul(value, NULL, 0); - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_KEY); - } else if (strcmp(key, PARM_NAME_TX_RATE) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_RATE, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_TX_RATE) && (value_convert <= PARM_MAX_TX_RATE)) - lp->TxRateControl[0] = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_RATE); - } else if (strcmp(key, PARM_NAME_TX_POW_LEVEL) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_POW_LEVEL, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_TX_POW_LEVEL) || (value_convert <= PARM_MAX_TX_POW_LEVEL)) - lp->txPowLevel = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_POW_LEVEL); - } - - /* Need to add? : Country code, Short/Long retry */ - - /* Configuration parameters specific to STA mode */ -#if 1 /* ;? (HCF_TYPE) & HCF_TYPE_STA */ -/* ;?seems reasonable that even an AP-only driver could afford this small additional footprint */ - if (CNV_INT_TO_LITTLE(lp->hcfCtx.IFB_FWIdentity.comp_id) == COMP_ID_FW_STA) { - /* ;?should we return an error status in AP mode */ - if (strcmp(key, PARM_NAME_PORT_TYPE) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_PORT_TYPE, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert == PARM_MIN_PORT_TYPE) || (value_convert == PARM_MAX_PORT_TYPE)) - lp->PortType = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_PORT_TYPE); - } else if (strcmp(key, PARM_NAME_PM_ENABLED) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_PM_ENABLED, value); - value_convert = simple_strtoul(value, NULL, 0); - /* ;? how about wl_main.c containing - * VALID_PARAM(PARM_PM_ENABLED <= WVLAN_PM_STATE_STANDARD || - * (PARM_PM_ENABLED & 0x7FFF) <= WVLAN_PM_STATE_STANDARD); - */ - if ((value_convert & 0x7FFF) <= PARM_MAX_PM_ENABLED) { - lp->PMEnabled = value_convert; - } else { - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_PM_ENABLED); - /* ;?this is a data entry error, hence not a DBG_WARNING */ - } - } else if (strcmp(key, PARM_NAME_CREATE_IBSS) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_CREATE_IBSS, value); - lp->CreateIBSS = parse_yes_no(value); - } else if (strcmp(key, PARM_NAME_MULTICAST_RX) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_MULTICAST_RX, value); - lp->MulticastReceive = parse_yes_no(value); - } else if (strcmp(key, PARM_NAME_MAX_SLEEP) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_MAX_SLEEP, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= 0) && (value_convert <= 65535)) - lp->MaxSleepDuration = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_MAX_SLEEP); - } else if (strcmp(key, PARM_NAME_NETWORK_ADDR) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_NETWORK_ADDR, value); - - if (parse_mac_address(value, mac_value) == ETH_ALEN) - memcpy(lp->MACAddress, mac_value, ETH_ALEN); - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_NETWORK_ADDR); - } else if (strcmp(key, PARM_NAME_AUTHENTICATION) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_AUTHENTICATION, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_AUTHENTICATION) && (value_convert <= PARM_MAX_AUTHENTICATION)) - lp->authentication = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_AUTHENTICATION); - } else if (strcmp(key, PARM_NAME_OWN_ATIM_WINDOW) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_OWN_ATIM_WINDOW, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_OWN_ATIM_WINDOW) && (value_convert <= PARM_MAX_OWN_ATIM_WINDOW)) - lp->atimWindow = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_OWN_ATIM_WINDOW); - } else if (strcmp(key, PARM_NAME_PM_HOLDOVER_DURATION) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_PM_HOLDOVER_DURATION, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_PM_HOLDOVER_DURATION) && (value_convert <= PARM_MAX_PM_HOLDOVER_DURATION)) - lp->holdoverDuration = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_PM_HOLDOVER_DURATION); - } else if (strcmp(key, PARM_NAME_PROMISCUOUS_MODE) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_PROMISCUOUS_MODE, value); - lp->promiscuousMode = parse_yes_no(value); - } else if (strcmp(key, PARM_NAME_CONNECTION_CONTROL) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_CONNECTION_CONTROL, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_CONNECTION_CONTROL) && (value_convert <= PARM_MAX_CONNECTION_CONTROL)) - lp->connectionControl = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_CONNECTION_CONTROL); - } - - /* Need to add? : Probe Data Rate */ - } -#endif /* (HCF_TYPE) & HCF_TYPE_STA */ - - /* Configuration parameters specific to AP mode */ -#if 1 /* ;? (HCF_TYPE) & HCF_TYPE_AP */ - /* ;?should we restore this to allow smaller memory footprint */ - if (CNV_INT_TO_LITTLE(lp->hcfCtx.IFB_FWIdentity.comp_id) == COMP_ID_FW_AP) { - if (strcmp(key, PARM_NAME_OWN_DTIM_PERIOD) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_OWN_DTIM_PERIOD, value); - - value_convert = simple_strtoul(value, NULL, 0); - if (value_convert >= PARM_MIN_OWN_DTIM_PERIOD) - lp->DTIMPeriod = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_OWN_DTIM_PERIOD); - } else if (strcmp(key, PARM_NAME_REJECT_ANY) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_REJECT_ANY, value); - lp->RejectAny = parse_yes_no(value); - } else if (strcmp(key, PARM_NAME_EXCLUDE_UNENCRYPTED) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_EXCLUDE_UNENCRYPTED, value); - lp->ExcludeUnencrypted = parse_yes_no(value); - } else if (strcmp(key, PARM_NAME_MULTICAST_PM_BUFFERING) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_MULTICAST_PM_BUFFERING, value); - lp->ExcludeUnencrypted = parse_yes_no(value); - } else if (strcmp(key, PARM_NAME_INTRA_BSS_RELAY) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_INTRA_BSS_RELAY, value); - lp->ExcludeUnencrypted = parse_yes_no(value); - } else if (strcmp(key, PARM_NAME_OWN_BEACON_INTERVAL) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_OWN_BEACON_INTERVAL, value); - - value_convert = simple_strtoul(value, NULL, 0); - if (value_convert >= PARM_MIN_OWN_BEACON_INTERVAL) - lp->ownBeaconInterval = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_OWN_BEACON_INTERVAL); - } else if (strcmp(key, PARM_NAME_COEXISTENCE) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_COEXISTENCE, value); - - value_convert = simple_strtoul(value, NULL, 0); - if (value_convert >= PARM_MIN_COEXISTENCE) - lp->coexistence = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_COEXISTENCE); - } - -#ifdef USE_WDS - else if (strcmp(key, PARM_NAME_RTS_THRESHOLD1) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_RTS_THRESHOLD1, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_RTS_THRESHOLD) && (value_convert <= PARM_MAX_RTS_THRESHOLD)) - lp->wds_port[0].rtsThreshold = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_RTS_THRESHOLD1); - } else if (strcmp(key, PARM_NAME_RTS_THRESHOLD2) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_RTS_THRESHOLD2, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_RTS_THRESHOLD) && (value_convert <= PARM_MAX_RTS_THRESHOLD)) - lp->wds_port[1].rtsThreshold = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_RTS_THRESHOLD2); - } else if (strcmp(key, PARM_NAME_RTS_THRESHOLD3) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_RTS_THRESHOLD3, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_RTS_THRESHOLD) && (value_convert <= PARM_MAX_RTS_THRESHOLD)) - lp->wds_port[2].rtsThreshold = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_RTS_THRESHOLD3); - } else if (strcmp(key, PARM_NAME_RTS_THRESHOLD4) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_RTS_THRESHOLD4, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_RTS_THRESHOLD) && (value_convert <= PARM_MAX_RTS_THRESHOLD)) - lp->wds_port[3].rtsThreshold = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_RTS_THRESHOLD4); - } else if (strcmp(key, PARM_NAME_RTS_THRESHOLD5) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_RTS_THRESHOLD5, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_RTS_THRESHOLD) && (value_convert <= PARM_MAX_RTS_THRESHOLD)) - lp->wds_port[4].rtsThreshold = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_RTS_THRESHOLD5); - } else if (strcmp(key, PARM_NAME_RTS_THRESHOLD6) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_RTS_THRESHOLD6, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_RTS_THRESHOLD) && (value_convert <= PARM_MAX_RTS_THRESHOLD)) - lp->wds_port[5].rtsThreshold = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_RTS_THRESHOLD6); - } else if (strcmp(key, PARM_NAME_TX_RATE1) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_RATE1, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_TX_RATE) && (value_convert <= PARM_MAX_TX_RATE)) - lp->wds_port[0].txRateCntl = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_RATE1); - } else if (strcmp(key, PARM_NAME_TX_RATE2) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_RATE2, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_TX_RATE) && (value_convert <= PARM_MAX_TX_RATE)) - lp->wds_port[1].txRateCntl = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_RATE2); - } else if (strcmp(key, PARM_NAME_TX_RATE3) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_RATE3, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_TX_RATE) && (value_convert <= PARM_MAX_TX_RATE)) - lp->wds_port[2].txRateCntl = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_RATE3); - } else if (strcmp(key, PARM_NAME_TX_RATE4) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_RATE4, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_TX_RATE) && (value_convert <= PARM_MAX_TX_RATE)) - lp->wds_port[3].txRateCntl = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_RATE4); - } else if (strcmp(key, PARM_NAME_TX_RATE5) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_RATE5, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_TX_RATE) && (value_convert <= PARM_MAX_TX_RATE)) - lp->wds_port[4].txRateCntl = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_RATE5); - } else if (strcmp(key, PARM_NAME_TX_RATE6) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_RATE6, value); - - value_convert = simple_strtoul(value, NULL, 0); - if ((value_convert >= PARM_MIN_TX_RATE) && (value_convert <= PARM_MAX_TX_RATE)) - lp->wds_port[5].txRateCntl = value_convert; - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_RATE6); - } else if (strcmp(key, PARM_NAME_WDS_ADDRESS1) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_WDS_ADDRESS1, value); - - if (parse_mac_address(value, mac_value) == ETH_ALEN) - memcpy(lp->wds_port[0].wdsAddress, mac_value, ETH_ALEN); - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_WDS_ADDRESS1); - } else if (strcmp(key, PARM_NAME_WDS_ADDRESS2) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_WDS_ADDRESS2, value); - - if (parse_mac_address(value, mac_value) == ETH_ALEN) - memcpy(lp->wds_port[1].wdsAddress, mac_value, ETH_ALEN); - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_WDS_ADDRESS2); - } else if (strcmp(key, PARM_NAME_WDS_ADDRESS3) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_WDS_ADDRESS3, value); - - if (parse_mac_address(value, mac_value) == ETH_ALEN) - memcpy(lp->wds_port[2].wdsAddress, mac_value, ETH_ALEN); - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_WDS_ADDRESS3); - } else if (strcmp(key, PARM_NAME_WDS_ADDRESS4) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_WDS_ADDRESS4, value); - - if (parse_mac_address(value, mac_value) == ETH_ALEN) - memcpy(lp->wds_port[3].wdsAddress, mac_value, ETH_ALEN); - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_WDS_ADDRESS4); - } else if (strcmp(key, PARM_NAME_WDS_ADDRESS5) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_WDS_ADDRESS5, value); - - if (parse_mac_address(value, mac_value) == ETH_ALEN) - memcpy(lp->wds_port[4].wdsAddress, mac_value, ETH_ALEN); - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_WDS_ADDRESS5); - } else if (strcmp(key, PARM_NAME_WDS_ADDRESS6) == 0) { - DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_WDS_ADDRESS6, value); - - if (parse_mac_address(value, mac_value) == ETH_ALEN) - memcpy(lp->wds_port[5].wdsAddress, mac_value, ETH_ALEN); - else - DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_WDS_ADDRESS6); - } -#endif /* USE_WDS */ - } -#endif /* (HCF_TYPE) & HCF_TYPE_AP */ - - return; -} /* translate_option */ -/*============================================================================*/ - -/******************************************************************************* - * parse_mac_address() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function will parse a mac address string and convert it to a byte - * array. - * - * PARAMETERS: - * - * value - the MAC address, represented as a string - * byte_array - the MAC address, represented as a byte array of length - * ETH_ALEN - * - * RETURNS: - * - * The number of bytes in the final MAC address, should equal to ETH_ALEN. - * - ******************************************************************************/ -int parse_mac_address(char *value, u_char *byte_array) -{ - int value_offset = 0; - int array_offset = 0; - int field_offset = 0; - char byte_field[3]; - /*------------------------------------------------------------------------*/ - - memset(byte_field, '\0', 3); - - while (value[value_offset] != '\0') { - /* Skip over the colon chars separating the bytes, if they exist */ - if (value[value_offset] == ':') { - value_offset++; - continue; - } - - byte_field[field_offset] = value[value_offset]; - field_offset++; - value_offset++; - - /* Once the byte_field is filled, convert it and store it */ - if (field_offset == 2) { - byte_field[field_offset] = '\0'; - byte_array[array_offset] = simple_strtoul(byte_field, NULL, 16); - field_offset = 0; - array_offset++; - } - } - - /* Use the array_offset as a check; 6 bytes should be written to the - byte_array */ - return array_offset; -} /* parse_mac_address */ -/*============================================================================*/ - -/******************************************************************************* - * ParseConfigLine() - ******************************************************************************* - * - * DESCRIPTION: - * - * Parses a line from the configuration file into an L-val and an R-val, - * representing a key/value pair. - * - * PARAMETERS: - * - * pszLine - the line from the config file to parse - * ppszLVal - the resulting L-val (Key) - * ppszRVal - the resulting R-val (Value) - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void ParseConfigLine(char *pszLine, char **ppszLVal, char **ppszRVal) -{ - int i; - int size; - - /* get a snapshot of our string size */ - size = strlen(pszLine); - *ppszLVal = NULL; - *ppszRVal = NULL; - - if (pszLine[0] != '#' && /* skip the line if it is a comment */ - pszLine[0] != '\n' && /* if it's an empty UNIX line, do nothing */ - !(pszLine[0] == '\r' && pszLine[1] == '\n') /* if it's an empty MS-DOS line, do nothing */ - ) { - /* advance past any whitespace, and assign the L-value */ - for (i = 0; i < size; i++) { - if (pszLine[i] != ' ') { - *ppszLVal = &pszLine[i]; - break; - } - } - /* advance to the end of the l-value*/ - for (i++; i < size; i++) { - if (pszLine[i] == ' ' || pszLine[i] == '=') { - pszLine[i] = '\0'; - break; - } - } - /* make any whitespace and the equal sign a NULL character, and - advance to the R-Value */ - for (i++; i < size; i++) { - if (pszLine[i] == ' ' || pszLine[i] == '=') { - pszLine[i] = '\0'; - continue; - } - *ppszRVal = &pszLine[i]; - break; - } - /* make the line ending character(s) a NULL */ - for (i++; i < size; i++) { - if (pszLine[i] == '\n') - pszLine[i] = '\0'; - if ((pszLine[i] == '\r') && (pszLine[i+1] == '\n')) - pszLine[i] = '\0'; - } - } -} /* ParseConfigLine */ -/*============================================================================*/ - -#endif /* USE_PROFILE */ diff --git a/drivers/staging/wlags49_h2/wl_profile.h b/drivers/staging/wlags49_h2/wl_profile.h deleted file mode 100644 index d615c836f950..000000000000 --- a/drivers/staging/wlags49_h2/wl_profile.h +++ /dev/null @@ -1,87 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * Header describing information required for the config parsing routines. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -#ifndef __WL_PROFILE_H__ -#define __WL_PROFILE_H__ - - - - -/******************************************************************************* - * constant definitions - ******************************************************************************/ -#define ROOT_CONFIG_FILENAME "/etc/agere/iwconfig-" - - -/******************************************************************************* - * function prototypes - ******************************************************************************/ -void parse_config(struct net_device *dev); - -int readline(int filedesc, char *buffer); - -void translate_option(char *buffer, struct wl_private *lp); - -int parse_mac_address(char *value, u_char *byte_array); - -void ParseConfigLine(char *pszLine, char **ppszLVal, char **ppszRVal); - - -#endif /* __WL_PROFILE_H__ */ diff --git a/drivers/staging/wlags49_h2/wl_util.c b/drivers/staging/wlags49_h2/wl_util.c deleted file mode 100644 index 75019c171d57..000000000000 --- a/drivers/staging/wlags49_h2/wl_util.c +++ /dev/null @@ -1,1367 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * This file defines misc utility functions. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -/******************************************************************************* - * include files - ******************************************************************************/ -#include - -#include -// #include -// #include -#include -// #include -// #include -// #include -// #include -// #include -// #include -// // #include - -#include -#include -// #include -// #include -// #include - -#include -#include -// #include - -#include -#include -#include -#include -#include - - - -/******************************************************************************* - * global variables - ******************************************************************************/ - -/* A matrix which maps channels to frequencies */ -static const long chan_freq_list[][2] = -{ - {1,2412}, - {2,2417}, - {3,2422}, - {4,2427}, - {5,2432}, - {6,2437}, - {7,2442}, - {8,2447}, - {9,2452}, - {10,2457}, - {11,2462}, - {12,2467}, - {13,2472}, - {14,2484}, - {36,5180}, - {40,5200}, - {44,5220}, - {48,5240}, - {52,5260}, - {56,5280}, - {60,5300}, - {64,5320}, - {149,5745}, - {153,5765}, - {157,5785}, - {161,5805} -}; - -/******************************************************************************* - * dbm() - ******************************************************************************* - * - * DESCRIPTION: - * - * Return an energy value in dBm. - * - * PARAMETERS: - * - * value - the energy value to be converted - * - * RETURNS: - * - * the value in dBm - * - ******************************************************************************/ -int dbm( int value ) -{ - /* Truncate the value to be between min and max. */ - if( value < HCF_MIN_SIGNAL_LEVEL ) - value = HCF_MIN_SIGNAL_LEVEL; - - if( value > HCF_MAX_SIGNAL_LEVEL ) - value = HCF_MAX_SIGNAL_LEVEL; - - /* Return the energy value in dBm. */ - return ( value - HCF_0DBM_OFFSET ); -} // dbm -/*============================================================================*/ - - - -/******************************************************************************* - * is_valid_key_string() - ******************************************************************************* - * - * DESCRIPTION: - * - * Checks to determine if the WEP key string is valid - * - * PARAMETERS: - * - * s - the string in question - * - * RETURNS: - * - * non-zero if the string contains a valid key - * - ******************************************************************************/ -int is_valid_key_string( char *s ) -{ - int l; - int i; - /*------------------------------------------------------------------------*/ - - - l = strlen( s ); - - /* 0x followed by 5 or 13 hexadecimal digit pairs is valid */ - if( s[0] == '0' && ( s[1] == 'x' || s[1] == 'X' )) { - if( l == 12 || l == 28 ) { - for( i = 2; i < l; i++ ) { - if( !isxdigit( s[i] )) - return 0; - } - - return 1; - } else { - return 0; - } - } - - /* string with 0, 5, or 13 characters is valid */ - else - { - return( l == 0 || l == 5 || l == 13 ); - } -} // is_valid_key_string -/*============================================================================*/ - - - - -/******************************************************************************* - * key_string2key() - ******************************************************************************* - * - * DESCRIPTION: - * - * Converts a key_string to a key, Assumes the key_string is validated with - * is_valid_key_string(). - * - * PARAMETERS: - * - * ks - the valid key string - * key - a pointer to a KEY_STRUCT where the converted key information will - * be stored. - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void key_string2key( char *ks, KEY_STRCT *key ) -{ - int l,i,n; - char *p; - /*------------------------------------------------------------------------*/ - - - l = strlen( ks ); - - /* 0x followed by hexadecimal digit pairs */ - if( ks[0] == '0' && ( ks[1] == 'x' || ks[1] == 'X' )) { - n = 0; - p = (char *)key->key; - - for( i = 2; i < l; i+=2 ) { - *p++ = (hex_to_bin(ks[i]) << 4) + hex_to_bin(ks[i+1]); - n++; - } - - /* Note that endian translation of the length field is not needed here - because it's performed in wl_put_ltv() */ - key->len = n; - } - /* character string */ - else - { - strcpy( (char *)key->key, ks ); - key->len = l; - } - - return; -} // key_string2key -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_has_wep() - ******************************************************************************* - * - * DESCRIPTION: - * - * Checks to see if the device supports WEP - * - * PARAMETERS: - * - * ifbp - the IFB pointer of the device in question - * - * RETURNS: - * - * 1 if WEP is known enabled, else 0 - * - ******************************************************************************/ -int wl_has_wep (IFBP ifbp) -{ - CFG_PRIVACY_OPT_IMPLEMENTED_STRCT ltv; - int rc, privacy; - /*------------------------------------------------------------------------*/ - - - /* This function allows us to distiguish bronze cards from other types, to - know if WEP exists. Does not distinguish (because there's no way to) - between silver and gold cards. */ - ltv.len = 2; - ltv.typ = CFG_PRIVACY_OPT_IMPLEMENTED; - - rc = hcf_get_info( ifbp, (LTVP) <v ); - - privacy = CNV_LITTLE_TO_INT( ltv.privacy_opt_implemented ); - - //return rc ? 0 : privacy; - return 1; -} // wl_has_wep -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_hcf_error() - ******************************************************************************* - * - * DESCRIPTION: - * - * Report the type of HCF error message - * - * PARAMETERS: - * - * none - * - * RETURNS: - * - * A descriptive string indicating the error, quiet otherwise. - * - ******************************************************************************/ -void wl_hcf_error( struct net_device *dev, int hcfStatus ) -{ - char buffer[64], *pMsg; - /*------------------------------------------------------------------------*/ - - - if( hcfStatus != HCF_SUCCESS ) { - switch( hcfStatus ) { - - case HCF_ERR_TIME_OUT: - - pMsg = "Expected adapter event did not occur in expected time"; - break; - - - case HCF_ERR_NO_NIC: - - pMsg = "Card not found (ejected unexpectedly)"; - break; - - - case HCF_ERR_LEN: - - pMsg = "Command buffer size insufficient"; - break; - - - case HCF_ERR_INCOMP_PRI: - - pMsg = "Primary functions are not compatible"; - break; - - - case HCF_ERR_INCOMP_FW: - - pMsg = "Primary functions are compatible, " - "station/ap functions are not"; - break; - - - case HCF_ERR_BUSY: - - pMsg = "Inquire cmd while another Inquire in progress"; - break; - - - //case HCF_ERR_SEQ_BUG: - - // pMsg = "Unexpected command completed"; - // break; - - - case HCF_ERR_DEFUNCT_AUX: - - pMsg = "Timeout on ack for enable/disable of AUX registers"; - break; - - - case HCF_ERR_DEFUNCT_TIMER: - pMsg = "Timeout on timer calibration during initialization process"; - break; - - - case HCF_ERR_DEFUNCT_TIME_OUT: - pMsg = "Timeout on Busy bit drop during BAP setup"; - break; - - - case HCF_ERR_DEFUNCT_CMD_SEQ: - pMsg = "Hermes and HCF are out of sync"; - break; - - - default: - - sprintf( buffer, "Error code %d", hcfStatus ); - pMsg = buffer; - break; - } - - printk( KERN_INFO "%s: Wireless, HCF failure: \"%s\"\n", - dev->name, pMsg ); - } -} // wl_hcf_error -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_endian_translate_event() - ******************************************************************************* - * - * DESCRIPTION: - * - * Determines what type of data is in the mailbox and performs the proper - * endian translation. - * - * PARAMETERS: - * - * pLtv - an LTV pointer - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_endian_translate_event( ltv_t *pLtv ) -{ - switch( pLtv->typ ) { - case CFG_TALLIES: - break; - - - case CFG_SCAN: - { - int numAPs; - SCAN_RS_STRCT *pAps = (SCAN_RS_STRCT*)&pLtv->u.u8[0]; - - numAPs = (hcf_16)(( (size_t)( pLtv->len - 1 ) * 2 ) / - (sizeof( SCAN_RS_STRCT ))); - - while( numAPs >= 1 ) { - numAPs--; - - pAps[numAPs].channel_id = - CNV_LITTLE_TO_INT( pAps[numAPs].channel_id ); - - pAps[numAPs].noise_level = - CNV_LITTLE_TO_INT( pAps[numAPs].noise_level ); - - pAps[numAPs].signal_level = - CNV_LITTLE_TO_INT( pAps[numAPs].signal_level ); - - pAps[numAPs].beacon_interval_time = - CNV_LITTLE_TO_INT( pAps[numAPs].beacon_interval_time ); - - pAps[numAPs].capability = - CNV_LITTLE_TO_INT( pAps[numAPs].capability ); - - pAps[numAPs].ssid_len = - CNV_LITTLE_TO_INT( pAps[numAPs].ssid_len ); - - pAps[numAPs].ssid_val[pAps[numAPs].ssid_len] = 0; - - } - } - break; - - - case CFG_ACS_SCAN: - { - PROBE_RESP *probe_resp = (PROBE_RESP *)pLtv; - - probe_resp->frameControl = CNV_LITTLE_TO_INT( probe_resp->frameControl ); - probe_resp->durID = CNV_LITTLE_TO_INT( probe_resp->durID ); - probe_resp->sequence = CNV_LITTLE_TO_INT( probe_resp->sequence ); - probe_resp->dataLength = CNV_LITTLE_TO_INT( probe_resp->dataLength ); - -#ifndef WARP - probe_resp->lenType = CNV_LITTLE_TO_INT( probe_resp->lenType ); -#endif // WARP - - probe_resp->beaconInterval = CNV_LITTLE_TO_INT( probe_resp->beaconInterval ); - probe_resp->capability = CNV_LITTLE_TO_INT( probe_resp->capability ); - probe_resp->flags = CNV_LITTLE_TO_INT( probe_resp->flags ); - } - break; - - - case CFG_LINK_STAT: -#define ls ((LINK_STATUS_STRCT *)pLtv) - ls->linkStatus = CNV_LITTLE_TO_INT( ls->linkStatus ); - break; -#undef ls - - case CFG_ASSOC_STAT: - { - ASSOC_STATUS_STRCT *pAs = (ASSOC_STATUS_STRCT *)pLtv; - - pAs->assocStatus = CNV_LITTLE_TO_INT( pAs->assocStatus ); - } - break; - - - case CFG_SECURITY_STAT: - { - SECURITY_STATUS_STRCT *pSs = (SECURITY_STATUS_STRCT *)pLtv; - - pSs->securityStatus = CNV_LITTLE_TO_INT( pSs->securityStatus ); - pSs->reason = CNV_LITTLE_TO_INT( pSs->reason ); - } - break; - - - case CFG_WMP: - break; - - - case CFG_NULL: - break; - - - default: - break; - } -} // wl_endian_translate_event -/*============================================================================*/ - - -/******************************************************************************* - * msf_assert() - ******************************************************************************* - * - * DESCRIPTION: - * - * Print statement used to display asserts from within the HCF. Only called - * when asserts in the HCF are turned on. See hcfcfg.h for more information. - * - * PARAMETERS: - * - * file_namep - the filename in which the assert occurred. - * line_number - the line number on which the assert occurred. - * trace - a comment associated with the assert. - * qual - return code or other value related to the assert - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void msf_assert( unsigned int line_number, hcf_16 trace, hcf_32 qual ) -{ - DBG_PRINT( "HCF ASSERT: Line %d, VAL: 0x%.8x\n", line_number, /*;?*/(u32)qual ); -} // msf_assert -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_parse_ds_ie() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function parses the Direct Sequence Parameter Set IE, used to - * determine channel/frequency information. - * - * PARAMETERS: - * - * probe_rsp - a pointer to a PROBE_RESP structure containing the probe - * response. - * - * RETURNS: - * - * The channel on which the BSS represented by this probe response is - * transmitting. - * - ******************************************************************************/ -hcf_8 wl_parse_ds_ie( PROBE_RESP *probe_rsp ) -{ - int i; - int ie_length = 0; - hcf_8 *buf; - hcf_8 buf_size; - /*------------------------------------------------------------------------*/ - - - if( probe_rsp == NULL ) { - return 0; - } - - buf = probe_rsp->rawData; - buf_size = sizeof( probe_rsp->rawData ); - - - for( i = 0; i < buf_size; i++ ) { - if( buf[i] == DS_INFO_ELEM ) { - /* Increment by 1 to get the length, and test it; in a DS element, - length should always be 1 */ - i++; - ie_length = buf[i]; - - if( buf[i] == 1 ) { - /* Get the channel information */ - i++; - return buf[i]; - } - } - } - - /* If we get here, we didn't find a DS-IE, which is strange */ - return 0; -} // wl_parse_ds_ie - - -/******************************************************************************* - * wl_parse_wpa_ie() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function parses the Probe Response for a valid WPA-IE. - * - * PARAMETERS: - * - * probe_rsp - a pointer to a PROBE_RESP structure containing the probe - * response - * length - a pointer to an hcf_16 in which the size of the WPA-IE will - * be stored (if found). - * - * RETURNS: - * - * A pointer to the location in the probe response buffer where a valid - * WPA-IE lives. The length of this IE is written back to the 'length' - * argument passed to the function. - * - ******************************************************************************/ -hcf_8 * wl_parse_wpa_ie( PROBE_RESP *probe_rsp, hcf_16 *length ) -{ - int i; - int ie_length = 0; - hcf_8 *buf; - hcf_8 buf_size; - hcf_8 wpa_oui[] = WPA_OUI_TYPE; - /*------------------------------------------------------------------------*/ - - - if( probe_rsp == NULL || length == NULL ) { - return NULL; - } - - buf = probe_rsp->rawData; - buf_size = sizeof( probe_rsp->rawData ); - *length = 0; - - - for( i = 0; i < buf_size; i++ ) { - if( buf[i] == GENERIC_INFO_ELEM ) { - /* Increment by one to get the IE length */ - i++; - ie_length = probe_rsp->rawData[i]; - - /* Increment by one to point to the IE payload */ - i++; - - /* Does the IE contain a WPA OUI? If not, it's a proprietary IE */ - if( memcmp( &buf[i], &wpa_oui, WPA_SELECTOR_LEN ) == 0 ) { - /* Pass back length and return a pointer to the WPA-IE */ - /* NOTE: Length contained in the WPA-IE is only the length of - the payload. The entire WPA-IE, including the IE identifier - and the length, is 2 bytes larger */ - *length = ie_length + 2; - - /* Back up the pointer 2 bytes to include the IE identifier and - the length in the buffer returned */ - i -= 2; - return &buf[i]; - } - - /* Increment past this non-WPA IE and continue looking */ - i += ( ie_length - 1 ); - } - } - - /* If we're here, we didn't find a WPA-IE in the buffer */ - return NULL; -} // wl_parse_wpa_ie - - -/******************************************************************************* - * wl_print_wpa_ie() - ******************************************************************************* - * - * DESCRIPTION: - * - * Function used to take a WPA Information Element (WPA-IE) buffer and - * display it in a readable format. - * - * PARAMETERS: - * - * buffer - the byte buffer containing the WPA-IE - * length - the length of the above buffer - * - * RETURNS: - * - * A pointer to the formatted WPA-IE string. Note that the format used is - * byte-by-byte printing as %02x hex values with no spaces. This is - * required for proper operation with some WPA supplicants. - * - ******************************************************************************/ -hcf_8 * wl_print_wpa_ie( hcf_8 *buffer, int length ) -{ - int count; - int rows; - int remainder; - int rowsize = 4; - hcf_8 row_buf[64]; - static hcf_8 output[512]; - /*------------------------------------------------------------------------*/ - - - memset( output, 0, sizeof( output )); - memset( row_buf, 0, sizeof( row_buf )); - - - /* Determine how many rows will be needed, and the remainder */ - rows = length / rowsize; - remainder = length % rowsize; - - - /* Format the rows */ - for( count = 0; count < rows; count++ ) { - sprintf( row_buf, "%02x%02x%02x%02x", - buffer[count*rowsize], buffer[count*rowsize+1], - buffer[count*rowsize+2], buffer[count*rowsize+3]); - strcat( output, row_buf ); - } - - memset( row_buf, 0, sizeof( row_buf )); - - - /* Format the remainder */ - for( count = 0; count < remainder; count++ ) { - sprintf( row_buf, "%02x", buffer[(rows*rowsize)+count]); - strcat( output, row_buf ); - } - - return output; -} // wl_print_wpa_ie -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_is_a_valid_chan() - ******************************************************************************* - * - * DESCRIPTION: - * - * Checks if a given channel is valid - * - * PARAMETERS: - * - * channel - the channel - * - * RETURNS: - * - * 1 if TRUE - * 0 if FALSE - * - ******************************************************************************/ -int wl_is_a_valid_chan( int channel ) -{ - int i; - /*------------------------------------------------------------------------*/ - - - /* Strip out the high bit set by the FW for 802.11a channels */ - if( channel & 0x100 ) { - channel = channel & 0x0FF; - } - - /* Iterate through the matrix and retrieve the frequency */ - for( i = 0; i < ARRAY_SIZE(chan_freq_list); i++ ) { - if( chan_freq_list[i][0] == channel ) { - return 1; - } - } - - return 0; -} // wl_is_a_valid_chan -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_get_chan_from_freq() - ******************************************************************************* - * - * DESCRIPTION: - * - * Checks if a given frequency is valid - * - * PARAMETERS: - * - * freq - the frequency - * - * RETURNS: - * - * 1 if TRUE - * 0 if FALSE - * - ******************************************************************************/ -int wl_is_a_valid_freq( long frequency ) -{ - int i; - /*------------------------------------------------------------------------*/ - - - /* Iterate through the matrix and retrieve the channel */ - for( i = 0; i < ARRAY_SIZE(chan_freq_list); i++ ) { - if( chan_freq_list[i][1] == frequency ) { - return 1; - } - } - - return 0; -} // wl_is_a_valid_freq -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_get_freq_from_chan() - ******************************************************************************* - * - * DESCRIPTION: - * - * Function used to look up the frequency for a given channel on which the - * adapter is Tx/Rx. - * - * PARAMETERS: - * - * channel - the channel - * - * RETURNS: - * - * The corresponding frequency - * - ******************************************************************************/ -long wl_get_freq_from_chan( int channel ) -{ - int i; - /*------------------------------------------------------------------------*/ - - - /* Strip out the high bit set by the FW for 802.11a channels */ - if( channel & 0x100 ) { - channel = channel & 0x0FF; - } - - /* Iterate through the matrix and retrieve the frequency */ - for( i = 0; i < ARRAY_SIZE(chan_freq_list); i++ ) { - if( chan_freq_list[i][0] == channel ) { - return chan_freq_list[i][1]; - } - } - - return 0; -} // wl_get_freq_from_chan -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_get_chan_from_freq() - ******************************************************************************* - * - * DESCRIPTION: - * - * Function used to look up the channel for a given frequency on which the - * adapter is Tx/Rx. - * - * PARAMETERS: - * - * frequency - the frequency - * - * RETURNS: - * - * The corresponding channel - * - ******************************************************************************/ -int wl_get_chan_from_freq( long frequency ) -{ - int i; - /*------------------------------------------------------------------------*/ - - - /* Iterate through the matrix and retrieve the channel */ - for( i = 0; i < ARRAY_SIZE(chan_freq_list); i++ ) { - if( chan_freq_list[i][1] == frequency ) { - return chan_freq_list[i][0]; - } - } - - return 0; -} // wl_get_chan_from_freq -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_process_link_status() - ******************************************************************************* - * - * DESCRIPTION: - * - * Process the link status message signaled by the device. - * - * PARAMETERS: - * - * lp - a pointer to the device's private structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_process_link_status( struct wl_private *lp ) -{ - hcf_16 link_stat; - - if( lp != NULL ) { - //link_stat = lp->hcfCtx.IFB_DSLinkStat & CFG_LINK_STAT_FW; - link_stat = lp->hcfCtx.IFB_LinkStat & CFG_LINK_STAT_FW; - switch( link_stat ) { - case 1: - DBG_TRACE( DbgInfo, "Link Status : Connected\n" ); - wl_wext_event_ap( lp->dev ); - break; - case 2: - DBG_TRACE( DbgInfo, "Link Status : Disconnected\n" ); - break; - case 3: - DBG_TRACE( DbgInfo, "Link Status : Access Point Change\n" ); - break; - case 4: - DBG_TRACE( DbgInfo, "Link Status : Access Point Out of Range\n" ); - break; - case 5: - DBG_TRACE( DbgInfo, "Link Status : Access Point In Range\n" ); - break; - default: - DBG_TRACE( DbgInfo, "Link Status : UNKNOWN (0x%04x)\n", link_stat ); - break; - } - } -} // wl_process_link_status -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_process_probe_response() - ******************************************************************************* - * - * DESCRIPTION: - * - * Process the probe responses retunred by the device as a result of an - * active scan. - * - * PARAMETERS: - * - * lp - a pointer to the device's private structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_process_probe_response( struct wl_private *lp ) -{ - PROBE_RESP *probe_rsp; - hcf_8 *wpa_ie = NULL; - hcf_16 wpa_ie_len = 0; - - if( lp != NULL ) { - probe_rsp = (PROBE_RESP *)&lp->ProbeResp; - - wl_endian_translate_event( (ltv_t *)probe_rsp ); - - DBG_TRACE( DbgInfo, "(%s) =========================\n", lp->dev->name ); - DBG_TRACE( DbgInfo, "(%s) length : 0x%04x.\n", lp->dev->name, - probe_rsp->length ); - - if( probe_rsp->length > 1 ) { - DBG_TRACE( DbgInfo, "(%s) infoType : 0x%04x.\n", lp->dev->name, - probe_rsp->infoType ); - - DBG_TRACE( DbgInfo, "(%s) signal : 0x%02x.\n", lp->dev->name, - probe_rsp->signal ); - - DBG_TRACE( DbgInfo, "(%s) silence : 0x%02x.\n", lp->dev->name, - probe_rsp->silence ); - - DBG_TRACE( DbgInfo, "(%s) rxFlow : 0x%02x.\n", lp->dev->name, - probe_rsp->rxFlow ); - - DBG_TRACE( DbgInfo, "(%s) rate : 0x%02x.\n", lp->dev->name, - probe_rsp->rate ); - - DBG_TRACE( DbgInfo, "(%s) frame cntl : 0x%04x.\n", lp->dev->name, - probe_rsp->frameControl ); - - DBG_TRACE( DbgInfo, "(%s) durID : 0x%04x.\n", lp->dev->name, - probe_rsp->durID ); - - DBG_TRACE(DbgInfo, "(%s) address1 : %pM\n", lp->dev->name, - probe_rsp->address1); - - DBG_TRACE(DbgInfo, "(%s) address2 : %pM\n", lp->dev->name, - probe_rsp->address2); - - DBG_TRACE(DbgInfo, "(%s) BSSID : %pM\n", lp->dev->name, - probe_rsp->BSSID); - - DBG_TRACE( DbgInfo, "(%s) sequence : 0x%04x.\n", lp->dev->name, - probe_rsp->sequence ); - - DBG_TRACE(DbgInfo, "(%s) address4 : %pM\n", lp->dev->name, - probe_rsp->address4); - - DBG_TRACE( DbgInfo, "(%s) datalength : 0x%04x.\n", lp->dev->name, - probe_rsp->dataLength ); - - DBG_TRACE(DbgInfo, "(%s) DA : %pM\n", lp->dev->name, - probe_rsp->DA); - - DBG_TRACE(DbgInfo, "(%s) SA : %pM\n", lp->dev->name, - probe_rsp->SA); - -#ifdef WARP - - DBG_TRACE( DbgInfo, "(%s) channel : %d\n", lp->dev->name, - probe_rsp->channel ); - - DBG_TRACE( DbgInfo, "(%s) band : %d\n", lp->dev->name, - probe_rsp->band ); -#else - DBG_TRACE( DbgInfo, "(%s) lenType : 0x%04x.\n", lp->dev->name, - probe_rsp->lenType ); -#endif // WARP - - DBG_TRACE( DbgInfo, "(%s) timeStamp : %d.%d.%d.%d.%d.%d.%d.%d\n", - lp->dev->name, - probe_rsp->timeStamp[0], - probe_rsp->timeStamp[1], - probe_rsp->timeStamp[2], - probe_rsp->timeStamp[3], - probe_rsp->timeStamp[4], - probe_rsp->timeStamp[5], - probe_rsp->timeStamp[6], - probe_rsp->timeStamp[7]); - - DBG_TRACE( DbgInfo, "(%s) beaconInt : 0x%04x.\n", lp->dev->name, - probe_rsp->beaconInterval ); - - DBG_TRACE( DbgInfo, "(%s) capability : 0x%04x.\n", lp->dev->name, - probe_rsp->capability ); - - DBG_TRACE( DbgInfo, "(%s) SSID len : 0x%04x.\n", lp->dev->name, - probe_rsp->rawData[1] ); - - - if( probe_rsp->rawData[1] > 0 ) { - char ssid[HCF_MAX_NAME_LEN]; - - memset( ssid, 0, sizeof( ssid )); - strncpy( ssid, &probe_rsp->rawData[2], - probe_rsp->rawData[1] ); - - DBG_TRACE( DbgInfo, "(%s) SSID : %s\n", - lp->dev->name, ssid ); - } - - - /* Parse out the WPA-IE, if one exists */ - wpa_ie = wl_parse_wpa_ie( probe_rsp, &wpa_ie_len ); - if( wpa_ie != NULL ) { - DBG_TRACE( DbgInfo, "(%s) WPA-IE : %s\n", - lp->dev->name, wl_print_wpa_ie( wpa_ie, wpa_ie_len )); - } - - DBG_TRACE( DbgInfo, "(%s) flags : 0x%04x.\n", - lp->dev->name, probe_rsp->flags ); - } - - DBG_TRACE( DbgInfo, "\n" ); - - - /* If probe response length is 1, then the scan is complete */ - if( probe_rsp->length == 1 ) { - DBG_TRACE( DbgInfo, "SCAN COMPLETE\n" ); - lp->probe_results.num_aps = lp->probe_num_aps; - lp->probe_results.scan_complete = TRUE; - - /* Reset the counter for the next scan request */ - lp->probe_num_aps = 0; - - /* Send a wireless extensions event that the scan completed */ - wl_wext_event_scan_complete( lp->dev ); - } else { - /* Only copy to the table if the entry is unique; APs sometimes - respond more than once to a probe */ - if( lp->probe_num_aps == 0 ) { - /* Copy the info to the ScanResult structure in the private - adapter struct */ - memcpy( &( lp->probe_results.ProbeTable[lp->probe_num_aps] ), - probe_rsp, sizeof( PROBE_RESP )); - - /* Increment the number of APs detected */ - lp->probe_num_aps++; - } else { - int count; - int unique = 1; - - for( count = 0; count < lp->probe_num_aps; count++ ) { - if( memcmp( &( probe_rsp->BSSID ), - lp->probe_results.ProbeTable[count].BSSID, - ETH_ALEN ) == 0 ) { - unique = 0; - } - } - - if( unique ) { - /* Copy the info to the ScanResult structure in the - private adapter struct. Only copy if there's room in the - table */ - if( lp->probe_num_aps < MAX_NAPS ) - { - memcpy( &( lp->probe_results.ProbeTable[lp->probe_num_aps] ), - probe_rsp, sizeof( PROBE_RESP )); - } - else - { - DBG_WARNING( DbgInfo, "Num of scan results exceeds storage, truncating\n" ); - } - - /* Increment the number of APs detected. Note I do this - here even when I don't copy the probe response to the - buffer in order to detect the overflow condition */ - lp->probe_num_aps++; - } - } - } - } -} // wl_process_probe_response -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_process_updated_record() - ******************************************************************************* - * - * DESCRIPTION: - * - * Process the updated information record message signaled by the device. - * - * PARAMETERS: - * - * lp - a pointer to the device's private structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_process_updated_record( struct wl_private *lp ) -{ - if( lp != NULL ) { - lp->updatedRecord.u.u16[0] = CNV_LITTLE_TO_INT( lp->updatedRecord.u.u16[0] ); - - switch( lp->updatedRecord.u.u16[0] ) { - case CFG_CUR_COUNTRY_INFO: - DBG_TRACE( DbgInfo, "Updated Record: CFG_CUR_COUNTRY_INFO\n" ); - wl_connect( lp ); - break; - - case CFG_PORT_STAT: - DBG_TRACE( DbgInfo, "Updated Record: WAIT_FOR_CONNECT (0xFD40)\n" ); - //wl_connect( lp ); - break; - - default: - DBG_TRACE( DbgInfo, "UNKNOWN: 0x%04x\n", - lp->updatedRecord.u.u16[0] ); - } - } -} // wl_process_updated_record -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_process_assoc_status() - ******************************************************************************* - * - * DESCRIPTION: - * - * Process the association status event signaled by the device. - * - * PARAMETERS: - * - * lp - a pointer to the device's private structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_process_assoc_status( struct wl_private *lp ) -{ - ASSOC_STATUS_STRCT *assoc_stat; - - if( lp != NULL ) { - assoc_stat = (ASSOC_STATUS_STRCT *)&lp->assoc_stat; - - wl_endian_translate_event( (ltv_t *)assoc_stat ); - - switch( assoc_stat->assocStatus ) { - case 1: - DBG_TRACE( DbgInfo, "Association Status : STA Associated\n" ); - break; - - case 2: - DBG_TRACE( DbgInfo, "Association Status : STA Reassociated\n" ); - break; - - case 3: - DBG_TRACE( DbgInfo, "Association Status : STA Disassociated\n" ); - break; - - default: - DBG_TRACE( DbgInfo, "Association Status : UNKNOWN (0x%04x)\n", - assoc_stat->assocStatus ); - break; - } - - DBG_TRACE(DbgInfo, "STA Address : %pM\n", assoc_stat->staAddr); - - if(( assoc_stat->assocStatus == 2 ) && ( assoc_stat->len == 8 )) { - DBG_TRACE(DbgInfo, "Old AP Address : %pM\n", - assoc_stat->oldApAddr); - } - } -} // wl_process_assoc_status -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_process_security_status() - ******************************************************************************* - * - * DESCRIPTION: - * - * Process the security status message signaled by the device. - * - * PARAMETERS: - * - * lp - a pointer to the device's private structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_process_security_status( struct wl_private *lp ) -{ - SECURITY_STATUS_STRCT *sec_stat; - - if( lp != NULL ) { - sec_stat = (SECURITY_STATUS_STRCT *)&lp->sec_stat; - - wl_endian_translate_event( (ltv_t *)sec_stat ); - - switch( sec_stat->securityStatus ) { - case 1: - DBG_TRACE( DbgInfo, "Security Status : Dissassociate [AP]\n" ); - break; - - case 2: - DBG_TRACE( DbgInfo, "Security Status : Deauthenticate [AP]\n" ); - break; - - case 3: - DBG_TRACE( DbgInfo, "Security Status : Authenticate Fail [STA] or [AP]\n" ); - break; - - case 4: - DBG_TRACE( DbgInfo, "Security Status : MIC Fail\n" ); - break; - - case 5: - DBG_TRACE( DbgInfo, "Security Status : Associate Fail\n" ); - break; - - default: - DBG_TRACE( DbgInfo, "Security Status : UNKNOWN (0x%04x)\n", - sec_stat->securityStatus ); - break; - } - - DBG_TRACE(DbgInfo, "STA Address : %pM\n", sec_stat->staAddr); - DBG_TRACE(DbgInfo, "Reason : 0x%04x\n", sec_stat->reason); - - } -} // wl_process_security_status -/*============================================================================*/ - -int wl_get_tallies(struct wl_private *lp, - CFG_HERMES_TALLIES_STRCT *tallies) -{ - int ret = 0; - int status; - CFG_HERMES_TALLIES_STRCT *pTallies; - - /* Get the current tallies from the adapter */ - lp->ltvRecord.len = 1 + HCF_TOT_TAL_CNT * sizeof(hcf_16); - lp->ltvRecord.typ = CFG_TALLIES; - - status = hcf_get_info(&(lp->hcfCtx), (LTVP)&(lp->ltvRecord)); - - if( status == HCF_SUCCESS ) { - pTallies = (CFG_HERMES_TALLIES_STRCT *)&(lp->ltvRecord.u.u32); - memcpy(tallies, pTallies, sizeof(*tallies)); - DBG_TRACE( DbgInfo, "Get tallies okay, dixe: %d\n", sizeof(*tallies) ); - } else { - DBG_TRACE( DbgInfo, "Get tallies failed\n" ); - ret = -EFAULT; - } - - return ret; -} - diff --git a/drivers/staging/wlags49_h2/wl_util.h b/drivers/staging/wlags49_h2/wl_util.h deleted file mode 100644 index 57bfd7fac6fa..000000000000 --- a/drivers/staging/wlags49_h2/wl_util.h +++ /dev/null @@ -1,96 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * Header describing information required for utility functions used - * throughout the driver. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -#ifndef __WL_UTIL_H__ -#define __WL_UTIL_H__ - -/******************************************************************************* - * function prototypes - ******************************************************************************/ -int dbm(int value); - -int is_valid_key_string(char *s); - -void key_string2key(char *ks, KEY_STRCT *key); - -void wl_hcf_error(struct net_device *dev, int hcfStatus); - -void wl_endian_translate_event(ltv_t *pLtv); - -int wl_has_wep(IFBP ifbp); - -hcf_8 wl_parse_ds_ie(PROBE_RESP *probe_rsp); -hcf_8 *wl_parse_wpa_ie(PROBE_RESP *probe_rsp, hcf_16 *length); -hcf_8 *wl_print_wpa_ie(hcf_8 *buffer, int length); - -int wl_get_tallies(struct wl_private *, CFG_HERMES_TALLIES_STRCT *); -int wl_is_a_valid_chan(int channel); -int wl_is_a_valid_freq(long frequency); -long wl_get_freq_from_chan(int channel); -int wl_get_chan_from_freq(long frequency); - -void wl_process_link_status(struct wl_private *lp); -void wl_process_probe_response(struct wl_private *lp); -void wl_process_updated_record(struct wl_private *lp); -void wl_process_assoc_status(struct wl_private *lp); -void wl_process_security_status(struct wl_private *lp); - -#endif /* __WL_UTIL_H__ */ diff --git a/drivers/staging/wlags49_h2/wl_version.h b/drivers/staging/wlags49_h2/wl_version.h deleted file mode 100644 index bbc484a6b80f..000000000000 --- a/drivers/staging/wlags49_h2/wl_version.h +++ /dev/null @@ -1,146 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * This header file contains version information for the code base, as well as - * special definitions and macros needed by certain versions of the code. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -#ifndef __WL_VERSION_H__ -#define __WL_VERSION_H__ - -/******************************************************************************* - * include files - ******************************************************************************/ -//#include - -#ifndef CONFIG_MODVERSIONS -#define __NO_VERSION__ -#endif // CONFIG_MODVERSIONS - -/******************************************************************************* - * constant definitions - ******************************************************************************/ - -#define VENDOR_NAME "Agere Systems, http://www.agere.com" - -#define DRIVER_NAME "wlags49" -#define DRV_IDENTITY 49 - -#define DRV_MAJOR_VERSION 7 -#define DRV_MINOR_VERSION 22 -#define DRV_VERSION_STR "7.22" - - -#if defined BUS_PCMCIA -#define BUS_TYPE "PCMCIA" -#elif defined BUS_PCI -#define BUS_TYPE "PCI" -#else -err: define bus type; -#endif // BUS_XXX - -#if defined HERMES25 -#define HW_TYPE "HII.5" -#else -#define HW_TYPE "HII" -#endif // HERMES25 - -#if defined WARP -#define FW_TYPE "WARP" -#else -#define FW_TYPE "BEAGLE" -#endif // WARP - -#if defined HERMES25 -#if defined WARP -#define DRV_VARIANT 3 -#else -#define DRV_VARIANT 4 -#endif // WARP -#else -#define DRV_VARIANT 2 -#endif // HERMES25 - -#define VERSION_INFO KBUILD_MODNAME " v" DRV_VERSION_STR \ - " for " BUS_TYPE ", by " VENDOR_NAME - -/* The version of wireless extensions we support */ -#define WIRELESS_SUPPORT 21 - -/******************************************************************************* - * bus architecture specific defines, includes, etc. - ******************************************************************************/ -/* - * There doesn't seem to be a difference for PCMCIA and PCI anymore, at least - * for PCMCIA the same defines are needed now as previously only used for PCI - */ - -#define NEW_MULTICAST -#define ALLOC_SKB(len) dev_alloc_skb(len+2) -#define GET_PACKET(dev, skb, count)\ - skb_reserve((skb), 2); \ - BLOCK_INPUT(skb_put((skb), (count)), (count)); \ - (skb)->protocol = eth_type_trans((skb), (dev)) -#define GET_PACKET_DMA(dev, skb, count)\ - skb_reserve((skb), 2); \ - BLOCK_INPUT_DMA(skb_put((skb), (count)), (count)); \ - (skb)->protocol = eth_type_trans((skb), (dev)) - - - - -#endif // __WL_VERSION_H__ diff --git a/drivers/staging/wlags49_h2/wl_wext.c b/drivers/staging/wlags49_h2/wl_wext.c deleted file mode 100644 index 3aeff818afc2..000000000000 --- a/drivers/staging/wlags49_h2/wl_wext.c +++ /dev/null @@ -1,3794 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -/******************************************************************************* - * include files - ******************************************************************************/ -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -/* Set up the LTV to program the appropriate key */ -static int hermes_set_tkip_keys(ltv_t *ltv, u16 key_idx, u8 *addr, - int set_tx, u8 *seq, u8 *key, size_t key_len) -{ - int ret = -EINVAL; - int buf_idx = 0; - hcf_8 tsc[IW_ENCODE_SEQ_MAX_SIZE] = - { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00 }; - - /* - * Check the key index here; if 0, load as Pairwise Key, otherwise, - * load as a group key. Note that for the Hermes, the RIDs for - * group/pairwise keys are different from each other and different - * than the default WEP keys as well. - */ - switch (key_idx) { - case 0: - ltv->len = 28; - ltv->typ = CFG_ADD_TKIP_MAPPED_KEY; - - /* Load the BSSID */ - memcpy(<v->u.u8[buf_idx], addr, ETH_ALEN); - buf_idx += ETH_ALEN; - - /* Load the TKIP key */ - memcpy(<v->u.u8[buf_idx], &key[0], 16); - buf_idx += 16; - - /* Load the TSC */ - memcpy(<v->u.u8[buf_idx], tsc, IW_ENCODE_SEQ_MAX_SIZE); - buf_idx += IW_ENCODE_SEQ_MAX_SIZE; - - /* Load the RSC */ - memcpy(<v->u.u8[buf_idx], seq, IW_ENCODE_SEQ_MAX_SIZE); - buf_idx += IW_ENCODE_SEQ_MAX_SIZE; - - /* Load the TxMIC key */ - memcpy(<v->u.u8[buf_idx], &key[16], 8); - buf_idx += 8; - - /* Load the RxMIC key */ - memcpy(<v->u.u8[buf_idx], &key[24], 8); - - ret = 0; - break; - case 1: - case 2: - case 3: - ltv->len = 26; - ltv->typ = CFG_ADD_TKIP_DEFAULT_KEY; - - /* Load the key Index */ - - /* If this is a Tx Key, set bit 8000 */ - if (set_tx) - key_idx |= 0x8000; - ltv->u.u16[buf_idx] = cpu_to_le16(key_idx); - buf_idx += 2; - - /* Load the RSC */ - memcpy(<v->u.u8[buf_idx], seq, IW_ENCODE_SEQ_MAX_SIZE); - buf_idx += IW_ENCODE_SEQ_MAX_SIZE; - - /* Load the TKIP, TxMIC, and RxMIC keys in one shot, because in - CFG_ADD_TKIP_DEFAULT_KEY they are back-to-back */ - memcpy(<v->u.u8[buf_idx], key, key_len); - buf_idx += key_len; - - /* Load the TSC */ - memcpy(<v->u.u8[buf_idx], tsc, IW_ENCODE_SEQ_MAX_SIZE); - - ret = 0; - break; - default: - break; - } - - return ret; -} - -/* Set up the LTV to clear the appropriate key */ -static int hermes_clear_tkip_keys(ltv_t *ltv, u16 key_idx, u8 *addr) -{ - switch (key_idx) { - case 0: - if (!is_broadcast_ether_addr(addr)) { - ltv->len = 7; - ltv->typ = CFG_REMOVE_TKIP_MAPPED_KEY; - memcpy(<v->u.u8[0], addr, ETH_ALEN); - } - break; - case 1: - case 2: - case 3: - /* Clear the Group TKIP keys by index */ - ltv->len = 2; - ltv->typ = CFG_REMOVE_TKIP_DEFAULT_KEY; - ltv->u.u16[0] = cpu_to_le16(key_idx); - - break; - default: - break; - } - - return 0; -} - -/* Set the WEP keys in the wl_private structure */ -static int hermes_set_wep_keys(struct wl_private *lp, u16 key_idx, - u8 *key, size_t key_len, - bool enable, bool set_tx) -{ - hcf_8 encryption_state = lp->EnableEncryption; - int tk = lp->TransmitKeyID - 1; /* current key */ - int ret = 0; - - /* Is encryption supported? */ - if (!wl_has_wep(&(lp->hcfCtx))) { - DBG_WARNING(DbgInfo, "WEP not supported on this device\n"); - ret = -EOPNOTSUPP; - goto out; - } - - DBG_NOTICE(DbgInfo, "pointer: %p, length: %d\n", - key, key_len); - - /* Check the size of the key */ - switch (key_len) { - case MIN_KEY_SIZE: - case MAX_KEY_SIZE: - - /* Check the index */ - if ((key_idx < 0) || (key_idx >= MAX_KEYS)) - key_idx = tk; - - /* Cleanup */ - memset(lp->DefaultKeys.key[key_idx].key, 0, MAX_KEY_SIZE); - - /* Copy the key in the driver */ - memcpy(lp->DefaultKeys.key[key_idx].key, key, key_len); - - /* Set the length */ - lp->DefaultKeys.key[key_idx].len = key_len; - - DBG_NOTICE(DbgInfo, "encoding.length: %d\n", key_len); - DBG_NOTICE(DbgInfo, "set key: %s(%d) [%d]\n", - lp->DefaultKeys.key[key_idx].key, - lp->DefaultKeys.key[key_idx].len, key_idx); - - /* Enable WEP (if possible) */ - if ((key_idx == tk) && (lp->DefaultKeys.key[tk].len > 0)) - lp->EnableEncryption = 1; - - break; - - case 0: - /* Do we want to just set the current transmit key? */ - if (set_tx && (key_idx >= 0) && (key_idx < MAX_KEYS)) { - DBG_NOTICE(DbgInfo, "index: %d; len: %d\n", key_idx, - lp->DefaultKeys.key[key_idx].len); - - if (lp->DefaultKeys.key[key_idx].len > 0) { - lp->TransmitKeyID = key_idx + 1; - lp->EnableEncryption = 1; - } else { - DBG_WARNING(DbgInfo, "Problem setting the current TxKey\n"); - ret = -EINVAL; - } - } - break; - - default: - DBG_WARNING(DbgInfo, "Invalid Key length\n"); - ret = -EINVAL; - goto out; - } - - /* Read the flags */ - if (enable) { - lp->EnableEncryption = 1; - lp->wext_enc = IW_ENCODE_ALG_WEP; - } else { - lp->EnableEncryption = 0; /* disable encryption */ - lp->wext_enc = IW_ENCODE_ALG_NONE; - } - - DBG_TRACE(DbgInfo, "encryption_state : %d\n", encryption_state); - DBG_TRACE(DbgInfo, "lp->EnableEncryption : %d\n", lp->EnableEncryption); - DBG_TRACE(DbgInfo, "erq->length : %d\n", key_len); - - /* Write the changes to the card */ - if (ret == 0) { - DBG_NOTICE(DbgInfo, "encrypt: %d, ID: %d\n", lp->EnableEncryption, - lp->TransmitKeyID); - - if (lp->EnableEncryption == encryption_state) { - if (key_len != 0) { - /* Dynamic WEP key update */ - wl_set_wep_keys(lp); - } - } else { - /* To switch encryption on/off, soft reset is - * required */ - wl_apply(lp); - } - } - -out: - return ret; -} - -/******************************************************************************* - * wireless_commit() - ******************************************************************************* - * - * DESCRIPTION: - * - * Commit - * protocol used. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -static int wireless_commit(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *rqu, char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - wl_apply(lp); - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_commit -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_get_protocol() - ******************************************************************************* - * - * DESCRIPTION: - * - * Returns a vendor-defined string that should identify the wireless - * protocol used. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -static int wireless_get_protocol(struct net_device *dev, struct iw_request_info *info, char *name, char *extra) -{ - /* Originally, the driver was placing the string "Wireless" here. However, - the wireless extensions (/linux/wireless.h) indicate this string should - describe the wireless protocol. */ - - strcpy(name, "IEEE 802.11b"); - - return 0; -} // wireless_get_protocol -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_set_frequency() - ******************************************************************************* - * - * DESCRIPTION: - * - * Sets the frequency (channel) on which the card should Tx/Rx. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_set_frequency(struct net_device *dev, struct iw_request_info *info, struct iw_freq *freq, char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int channel = 0; - int ret = 0; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - if( !capable( CAP_NET_ADMIN )) { - ret = -EPERM; - return ret; - } - - - /* If frequency specified, look up channel */ - if( freq->e == 1 ) { - int f = freq->m / 100000; - channel = wl_get_chan_from_freq( f ); - } - - - /* Channel specified */ - if( freq->e == 0 ) { - channel = freq->m; - } - - - /* If the channel is an 802.11a channel, set Bit 8 */ - if( channel > 14 ) { - channel = channel | 0x100; - } - - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - lp->Channel = channel; - - - /* Commit the adapter parameters */ - wl_apply( lp ); - - /* Send an event that channel/freq has been set */ - wl_wext_event_freq( lp->dev ); - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_set_frequency -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_get_frequency() - ******************************************************************************* - * - * DESCRIPTION: - * - * Gets the frequency (channel) on which the card is Tx/Rx. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -static int wireless_get_frequency(struct net_device *dev, struct iw_request_info *info, struct iw_freq *freq, char *extra) - -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = -1; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CUR_CHANNEL; - - ret = hcf_get_info( &(lp->hcfCtx), (LTVP)&( lp->ltvRecord )); - if( ret == HCF_SUCCESS ) { - hcf_16 channel = CNV_LITTLE_TO_INT( lp->ltvRecord.u.u16[0] ); - - freq->m = wl_get_freq_from_chan( channel ) * 100000; - freq->e = 1; - } - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - - ret = (ret == HCF_SUCCESS ? 0 : -EFAULT); - -out: - return ret; -} // wireless_get_frequency -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_get_range() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function is used to provide misc info and statistics about the - * wireless device. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_get_range(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - struct iw_range *range = (struct iw_range *) extra; - int ret = 0; - int status = -1; - int count; - __u16 *pTxRate; - int retries = 0; - - /* Set range information */ - data->length = sizeof(struct iw_range); - memset(range, 0, sizeof(struct iw_range)); - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - /* Set range information */ - memset( range, 0, sizeof( struct iw_range )); - -retry: - /* Get the current transmit rate from the adapter */ - lp->ltvRecord.len = 1 + (sizeof(*pTxRate) / sizeof(hcf_16)); - lp->ltvRecord.typ = CFG_CUR_TX_RATE; - - status = hcf_get_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - if( status != HCF_SUCCESS ) { - /* Recovery action: reset and retry up to 10 times */ - DBG_TRACE( DbgInfo, "Get CFG_CUR_TX_RATE failed: 0x%x\n", status ); - - if (retries < 10) { - retries++; - - /* Holding the lock too long, makes a gap to allow other processes */ - wl_unlock(lp, &flags); - wl_lock( lp, &flags ); - - status = wl_reset( dev ); - if ( status != HCF_SUCCESS ) { - DBG_TRACE( DbgInfo, "reset failed: 0x%x\n", status ); - - ret = -EFAULT; - goto out_unlock; - } - - /* Holding the lock too long, makes a gap to allow other processes */ - wl_unlock(lp, &flags); - wl_lock( lp, &flags ); - - goto retry; - - } else { - DBG_TRACE( DbgInfo, "Get CFG_CUR_TX_RATE failed: %d retries\n", retries ); - ret = -EFAULT; - goto out_unlock; - } - } - - /* Holding the lock too long, makes a gap to allow other processes */ - wl_unlock(lp, &flags); - wl_lock( lp, &flags ); - - pTxRate = (__u16 *)&( lp->ltvRecord.u.u32 ); - - range->throughput = CNV_LITTLE_TO_INT( *pTxRate ) * MEGABIT; - - if (retries > 0) { - DBG_TRACE( DbgInfo, "Get CFG_CUR_TX_RATE succes: %d retries\n", retries ); - } - - // NWID - NOT SUPPORTED - - - /* Channel/Frequency Info */ - range->num_channels = RADIO_CHANNELS; - - - /* Signal Level Thresholds */ - range->sensitivity = RADIO_SENSITIVITY_LEVELS; - - - /* Link quality */ - range->max_qual.qual = (u_char)HCF_MAX_COMM_QUALITY; - - /* If the value returned in /proc/net/wireless is greater than the maximum range, - iwconfig assumes that the value is in dBm. Because an unsigned char is used, - it requires a bit of contorsion... */ - - range->max_qual.level = (u_char)( dbm( HCF_MIN_SIGNAL_LEVEL ) - 1 ); - range->max_qual.noise = (u_char)( dbm( HCF_MIN_NOISE_LEVEL ) - 1 ); - - - /* Set available rates */ - range->num_bitrates = 0; - - lp->ltvRecord.len = 6; - lp->ltvRecord.typ = CFG_SUPPORTED_DATA_RATES; - - status = hcf_get_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - if( status == HCF_SUCCESS ) { - for( count = 0; count < MAX_RATES; count++ ) - if( lp->ltvRecord.u.u8[count+2] != 0 ) { - range->bitrate[count] = lp->ltvRecord.u.u8[count+2] * MEGABIT / 2; - range->num_bitrates++; - } - } else { - DBG_TRACE( DbgInfo, "CFG_SUPPORTED_DATA_RATES: 0x%x\n", status ); - ret = -EFAULT; - goto out_unlock; - } - - /* RTS Threshold info */ - range->min_rts = MIN_RTS_BYTES; - range->max_rts = MAX_RTS_BYTES; - - // Frag Threshold info - NOT SUPPORTED - - // Power Management info - NOT SUPPORTED - - /* Encryption */ - - /* Holding the lock too long, makes a gap to allow other processes */ - wl_unlock(lp, &flags); - wl_lock( lp, &flags ); - - /* Is WEP supported? */ - - if( wl_has_wep( &( lp->hcfCtx ))) { - /* WEP: RC4 40 bits */ - range->encoding_size[0] = MIN_KEY_SIZE; - - /* RC4 ~128 bits */ - range->encoding_size[1] = MAX_KEY_SIZE; - range->num_encoding_sizes = 2; - range->max_encoding_tokens = MAX_KEYS; - } - - /* Tx Power Info */ - range->txpower_capa = IW_TXPOW_MWATT; - range->num_txpower = 1; - range->txpower[0] = RADIO_TX_POWER_MWATT; - - /* Wireless Extension Info */ - range->we_version_compiled = WIRELESS_EXT; - range->we_version_source = WIRELESS_SUPPORT; - - // Retry Limits and Lifetime - NOT SUPPORTED - - /* Holding the lock too long, makes a gap to allow other processes */ - wl_unlock(lp, &flags); - wl_lock( lp, &flags ); - - DBG_TRACE( DbgInfo, "calling wl_wireless_stats\n" ); - wl_wireless_stats( lp->dev ); - range->avg_qual = lp->wstats.qual; - DBG_TRACE( DbgInfo, "wl_wireless_stats done\n" ); - - /* Event capability (kernel + driver) */ - IW_EVENT_CAPA_SET_KERNEL(range->event_capa); - IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP); - IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN); - IW_EVENT_CAPA_SET(range->event_capa, IWEVREGISTERED); - IW_EVENT_CAPA_SET(range->event_capa, IWEVEXPIRED); - IW_EVENT_CAPA_SET(range->event_capa, IWEVMICHAELMICFAILURE); - IW_EVENT_CAPA_SET(range->event_capa, IWEVASSOCREQIE); - IW_EVENT_CAPA_SET(range->event_capa, IWEVASSOCRESPIE); - - range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_CIPHER_TKIP; - range->scan_capa = IW_SCAN_CAPA_NONE; - -out_unlock: - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - - return ret; -} // wireless_get_range -/*============================================================================*/ - - -/******************************************************************************* - * wireless_get_bssid() - ******************************************************************************* - * - * DESCRIPTION: - * - * Gets the BSSID the wireless device is currently associated with. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_get_bssid(struct net_device *dev, struct iw_request_info *info, struct sockaddr *ap_addr, char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; -#if 1 //;? (HCF_TYPE) & HCF_TYPE_STA - int status = -1; -#endif /* (HCF_TYPE) & HCF_TYPE_STA */ - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - ap_addr->sa_family = ARPHRD_ETHER; - - /* Assume AP mode here, which means the BSSID is our own MAC address. In - STA mode, this address will be overwritten with the actual BSSID using - the code below. */ - memcpy(&ap_addr->sa_data, lp->dev->dev_addr, ETH_ALEN); - - -#if 1 //;? (HCF_TYPE) & HCF_TYPE_STA - //;?should we return an error status in AP mode - - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_STA ) { - /* Get Current BSSID */ - lp->ltvRecord.typ = CFG_CUR_BSSID; - lp->ltvRecord.len = 4; - status = hcf_get_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - - if( status == HCF_SUCCESS ) { - /* Copy info into sockaddr struct */ - memcpy(&ap_addr->sa_data, lp->ltvRecord.u.u8, ETH_ALEN); - } else { - ret = -EFAULT; - } - } - -#endif // (HCF_TYPE) & HCF_TYPE_STA - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_get_bssid -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_get_ap_list() - ******************************************************************************* - * - * DESCRIPTION: - * - * Gets the results of a network scan. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - * NOTE: SIOCGIWAPLIST has been deprecated by SIOCSIWSCAN. This function - * implements SIOCGIWAPLIST only to provide backwards compatibility. For - * all systems using WIRELESS_EXT v14 and higher, use SIOCSIWSCAN! - * - ******************************************************************************/ -static int wireless_get_ap_list (struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret; - int num_aps = -1; - int sec_count = 0; - hcf_32 count; - struct sockaddr *hwa = NULL; - struct iw_quality *qual = NULL; -#ifdef WARP - ScanResult *p = &lp->scan_results; -#else - ProbeResult *p = &lp->probe_results; -#endif // WARP - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - /* Set the completion state to FALSE */ - lp->scan_results.scan_complete = FALSE; - lp->probe_results.scan_complete = FALSE; - /* Channels to scan */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_SCAN_CHANNELS_2GHZ; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( 0x7FFF ); - ret = hcf_put_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - DBG_TRACE( DbgInfo, "CFG_SCAN_CHANNELS_2GHZ result: 0x%x\n", ret ); - - /* Set the SCAN_SSID to "ANY". Using this RID for scan prevents the need to - disassociate from the network we are currently on */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_SCAN_SSID; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( 0 ); - ret = hcf_put_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - DBG_TRACE( DbgInfo, "CFG_SCAN_SSID to 'any' ret: 0x%x\n", ret ); - - /* Initiate the scan */ -#ifdef WARP - ret = hcf_action( &( lp->hcfCtx ), MDD_ACT_SCAN ); -#else - ret = hcf_action( &( lp->hcfCtx ), HCF_ACT_ACS_SCAN ); -#endif // WARP - - wl_act_int_on( lp ); - - //;? unlock? what about the access to lp below? is it broken? - wl_unlock(lp, &flags); - - if( ret == HCF_SUCCESS ) { - DBG_TRACE( DbgInfo, "SUCCESSFULLY INITIATED SCAN...\n" ); - while( (*p).scan_complete == FALSE && ret == HCF_SUCCESS ) { - DBG_TRACE( DbgInfo, "Waiting for scan results...\n" ); - /* Abort the scan if we've waited for more than MAX_SCAN_TIME_SEC */ - if( sec_count++ > MAX_SCAN_TIME_SEC ) { - ret = -EIO; - } else { - /* Wait for 1 sec in 10ms intervals, scheduling the kernel to do - other things in the meantime, This prevents system lockups by - giving some time back to the kernel */ - for( count = 0; count < 100; count ++ ) { - mdelay( 10 ); - schedule( ); - } - } - } - - rmb(); - - if ( ret != HCF_SUCCESS ) { - DBG_ERROR( DbgInfo, "timeout waiting for scan results\n" ); - } else { - num_aps = (*p)/*lp->probe_results*/.num_aps; - if (num_aps > IW_MAX_AP) { - num_aps = IW_MAX_AP; - } - data->length = num_aps; - hwa = (struct sockaddr *)extra; - qual = (struct iw_quality *) extra + - ( sizeof( struct sockaddr ) * num_aps ); - - /* This flag is used to tell the user if we provide quality - information. Since we provide signal/noise levels but no - quality info on a scan, this is set to 0. Setting to 1 and - providing a quality of 0 produces weird results. If we ever - provide quality (or can calculate it), this can be changed */ - data->flags = 0; - - for( count = 0; count < num_aps; count++ ) { -#ifdef WARP - memcpy( hwa[count].sa_data, - (*p)/*lp->scan_results*/.APTable[count].bssid, ETH_ALEN ); -#else //;?why use BSSID and bssid as names in seemingly very comparable situations - DBG_PRINT("BSSID: %pM\n", - (*p).ProbeTable[count].BSSID); - memcpy( hwa[count].sa_data, - (*p)/*lp->probe_results*/.ProbeTable[count].BSSID, ETH_ALEN ); -#endif // WARP - } - /* Once the data is copied to the wireless struct, invalidate the - scan result to initiate a rescan on the next request */ - (*p)/*lp->probe_results*/.scan_complete = FALSE; - /* Send the wireless event that the scan has completed, just in case - it's needed */ - wl_wext_event_scan_complete( lp->dev ); - } - } -out: - return ret; -} // wireless_get_ap_list -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_set_sensitivity() - ******************************************************************************* - * - * DESCRIPTION: - * - * Sets the sensitivity (distance between APs) of the wireless card. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_set_sensitivity(struct net_device *dev, struct iw_request_info *info, struct iw_param *sens, char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - int dens = sens->value; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - if(( dens < 1 ) || ( dens > 3 )) { - ret = -EINVAL; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - lp->DistanceBetweenAPs = dens; - wl_apply( lp ); - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_set_sensitivity -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_get_sensitivity() - ******************************************************************************* - * - * DESCRIPTION: - * - * Gets the sensitivity (distance between APs) of the wireless card. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_get_sensitivity(struct net_device *dev, struct iw_request_info *info, struct iw_param *sens, char *extra) -{ - struct wl_private *lp = wl_priv(dev); - int ret = 0; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - /* not worth locking ... */ - sens->value = lp->DistanceBetweenAPs; - sens->fixed = 0; /* auto */ -out: - return ret; -} // wireless_get_sensitivity -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_set_essid() - ******************************************************************************* - * - * DESCRIPTION: - * - * Sets the ESSID (network name) that the wireless device should associate - * with. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_set_essid(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *ssid) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - if (data->flags != 0 && data->length > HCF_MAX_NAME_LEN) { - ret = -EINVAL; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - memset( lp->NetworkName, 0, sizeof( lp->NetworkName )); - - /* data->flags is zero to ask for "any" */ - if( data->flags == 0 ) { - /* Need this because in STAP build PARM_DEFAULT_SSID is "LinuxAP" - * ;?but there ain't no STAP anymore*/ - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_STA ) { - strcpy( lp->NetworkName, "ANY" ); - } else { - //strcpy( lp->NetworkName, "ANY" ); - strcpy( lp->NetworkName, PARM_DEFAULT_SSID ); - } - } else { - memcpy( lp->NetworkName, ssid, data->length ); - } - - DBG_NOTICE( DbgInfo, "set NetworkName: %s\n", ssid ); - - /* Commit the adapter parameters */ - wl_apply( lp ); - - /* Send an event that ESSID has been set */ - wl_wext_event_essid( lp->dev ); - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_set_essid -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_get_essid() - ******************************************************************************* - * - * DESCRIPTION: - * - * Gets the ESSID (network name) that the wireless device is associated - * with. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_get_essid(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *essid) - -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - int status = -1; - wvName_t *pName; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - /* Get the desired network name */ - lp->ltvRecord.len = 1 + ( sizeof( *pName ) / sizeof( hcf_16 )); - - -#if 1 //;? (HCF_TYPE) & HCF_TYPE_STA - //;?should we return an error status in AP mode - - lp->ltvRecord.typ = CFG_DESIRED_SSID; - -#endif - - -#if 1 //;? (HCF_TYPE) & HCF_TYPE_AP - //;?should we restore this to allow smaller memory footprint - - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_AP ) { - lp->ltvRecord.typ = CFG_CNF_OWN_SSID; - } - -#endif // HCF_AP - - - status = hcf_get_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - if( status == HCF_SUCCESS ) { - pName = (wvName_t *)&( lp->ltvRecord.u.u32 ); - - /* Endian translate the string length */ - pName->length = CNV_LITTLE_TO_INT( pName->length ); - - /* Copy the information into the user buffer */ - data->length = pName->length; - - if( pName->length < HCF_MAX_NAME_LEN ) { - pName->name[pName->length] = '\0'; - } - - data->flags = 1; - - -#if 1 //;? (HCF_TYPE) & HCF_TYPE_STA - //;?should we return an error status in AP mode - - /* if desired is null ("any"), return current or "any" */ - if( pName->name[0] == '\0' ) { - /* Get the current network name */ - lp->ltvRecord.len = 1 + ( sizeof(*pName ) / sizeof( hcf_16 )); - lp->ltvRecord.typ = CFG_CUR_SSID; - - status = hcf_get_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - - if( status == HCF_SUCCESS ) { - pName = (wvName_t *)&( lp->ltvRecord.u.u32 ); - - /* Endian translate the string length */ - pName->length = CNV_LITTLE_TO_INT( pName->length ); - - /* Copy the information into the user buffer */ - data->length = pName->length; - data->flags = 1; - } else { - ret = -EFAULT; - goto out_unlock; - } - } - -#endif // HCF_STA - - if (pName->length > IW_ESSID_MAX_SIZE) { - ret = -EFAULT; - goto out_unlock; - } - - memcpy(essid, pName->name, pName->length); - } else { - ret = -EFAULT; - goto out_unlock; - } - -out_unlock: - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_get_essid -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_set_encode() - ******************************************************************************* - * - * DESCRIPTION: - * - * Sets the encryption keys and status (enable or disable). - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_set_encode(struct net_device *dev, struct iw_request_info *info, struct iw_point *erq, char *keybuf) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int key_idx = (erq->flags & IW_ENCODE_INDEX) - 1; - int ret = 0; - bool enable = true; - - if (lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - if (erq->flags & IW_ENCODE_DISABLED) - enable = false; - - wl_lock(lp, &flags); - - wl_act_int_off(lp); - - ret = hermes_set_wep_keys(lp, key_idx, keybuf, erq->length, - enable, true); - - /* Send an event that Encryption has been set */ - if (ret == 0) - wl_wext_event_encode(dev); - - wl_act_int_on(lp); - - wl_unlock(lp, &flags); - -out: - return ret; -} - -/******************************************************************************* - * wireless_get_encode() - ******************************************************************************* - * - * DESCRIPTION: - * - * Gets the encryption keys and status. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_get_encode(struct net_device *dev, struct iw_request_info *info, struct iw_point *erq, char *key) - -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - int index; - - DBG_NOTICE(DbgInfo, "GIWENCODE: encrypt: %d, ID: %d\n", lp->EnableEncryption, lp->TransmitKeyID); - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - /* Only super-user can see WEP key */ - if( !capable( CAP_NET_ADMIN )) { - ret = -EPERM; - return ret; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - /* Is it supported? */ - if( !wl_has_wep( &( lp->hcfCtx ))) { - ret = -EOPNOTSUPP; - goto out_unlock; - } - - /* Basic checking */ - index = (erq->flags & IW_ENCODE_INDEX ) - 1; - - - /* Set the flags */ - erq->flags = 0; - - if( lp->EnableEncryption == 0 ) { - erq->flags |= IW_ENCODE_DISABLED; - } - - /* Which key do we want */ - if(( index < 0 ) || ( index >= MAX_KEYS )) { - index = lp->TransmitKeyID - 1; - } - - erq->flags |= index + 1; - - /* Copy the key to the user buffer */ - erq->length = lp->DefaultKeys.key[index].len; - - memcpy(key, lp->DefaultKeys.key[index].key, erq->length); - -out_unlock: - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_get_encode -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_set_nickname() - ******************************************************************************* - * - * DESCRIPTION: - * - * Sets the nickname, or station name, of the wireless device. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_set_nickname(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *nickname) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - -#if 0 //;? Needed, was present in original code but not in 7.18 Linux 2.6 kernel version - if( !capable(CAP_NET_ADMIN )) { - ret = -EPERM; - return ret; - } -#endif - - /* Validate the new value */ - if(data->length > HCF_MAX_NAME_LEN) { - ret = -EINVAL; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - memset( lp->StationName, 0, sizeof( lp->StationName )); - - memcpy( lp->StationName, nickname, data->length ); - - /* Commit the adapter parameters */ - wl_apply( lp ); - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_set_nickname -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_get_nickname() - ******************************************************************************* - * - * DESCRIPTION: - * - * Gets the nickname, or station name, of the wireless device. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_get_nickname(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *nickname) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - int status = -1; - wvName_t *pName; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - /* Get the current station name */ - lp->ltvRecord.len = 1 + ( sizeof( *pName ) / sizeof( hcf_16 )); - lp->ltvRecord.typ = CFG_CNF_OWN_NAME; - - status = hcf_get_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - - if( status == HCF_SUCCESS ) { - pName = (wvName_t *)&( lp->ltvRecord.u.u32 ); - - /* Endian translate the length */ - pName->length = CNV_LITTLE_TO_INT( pName->length ); - - if ( pName->length > IW_ESSID_MAX_SIZE ) { - ret = -EFAULT; - } else { - /* Copy the information into the user buffer */ - data->length = pName->length; - memcpy(nickname, pName->name, pName->length); - } - } else { - ret = -EFAULT; - } - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_get_nickname -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_set_porttype() - ******************************************************************************* - * - * DESCRIPTION: - * - * Sets the port type of the wireless device. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_set_porttype(struct net_device *dev, struct iw_request_info *info, __u32 *mode, char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - hcf_16 portType; - hcf_16 createIBSS; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - /* Validate the new value */ - switch( *mode ) { - case IW_MODE_ADHOC: - - /* When user requests ad-hoc, set IBSS mode! */ - portType = 1; - createIBSS = 1; - - lp->DownloadFirmware = WVLAN_DRV_MODE_STA; //1; - - break; - - - case IW_MODE_AUTO: - case IW_MODE_INFRA: - - /* Both automatic and infrastructure set port to BSS/STA mode */ - portType = 1; - createIBSS = 0; - - lp->DownloadFirmware = WVLAN_DRV_MODE_STA; //1; - - break; - - -#if 0 //;? (HCF_TYPE) & HCF_TYPE_AP - - case IW_MODE_MASTER: - - /* Set BSS/AP mode */ - portType = 1; - - lp->CreateIBSS = 0; - lp->DownloadFirmware = WVLAN_DRV_MODE_AP; //2; - - break; - -#endif /* (HCF_TYPE) & HCF_TYPE_AP */ - - - default: - - portType = 0; - createIBSS = 0; - ret = -EINVAL; - } - - if( portType != 0 ) { - /* Only do something if there is a mode change */ - if( ( lp->PortType != portType ) || (lp->CreateIBSS != createIBSS)) { - lp->PortType = portType; - lp->CreateIBSS = createIBSS; - - /* Commit the adapter parameters */ - wl_go( lp ); - - /* Send an event that mode has been set */ - wl_wext_event_mode( lp->dev ); - } - } - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_set_porttype -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_get_porttype() - ******************************************************************************* - * - * DESCRIPTION: - * - * Gets the port type of the wireless device. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_get_porttype(struct net_device *dev, struct iw_request_info *info, __u32 *mode, char *extra) - -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - int status = -1; - hcf_16 *pPortType; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - /* Get the current port type */ - lp->ltvRecord.len = 1 + ( sizeof( *pPortType ) / sizeof( hcf_16 )); - lp->ltvRecord.typ = CFG_CNF_PORT_TYPE; - - status = hcf_get_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - - if( status == HCF_SUCCESS ) { - pPortType = (hcf_16 *)&( lp->ltvRecord.u.u32 ); - - *pPortType = CNV_LITTLE_TO_INT( *pPortType ); - - switch( *pPortType ) { - case 1: - -#if 0 -#if (HCF_TYPE) & HCF_TYPE_AP - - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_AP ) { - *mode = IW_MODE_MASTER; - } else { - *mode = IW_MODE_INFRA; - } - -#else - - *mode = IW_MODE_INFRA; - -#endif /* (HCF_TYPE) & HCF_TYPE_AP */ -#endif - - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_AP ) { - *mode = IW_MODE_MASTER; - } else { - if( lp->CreateIBSS ) { - *mode = IW_MODE_ADHOC; - } else { - *mode = IW_MODE_INFRA; - } - } - - break; - - - case 3: - *mode = IW_MODE_ADHOC; - break; - - default: - ret = -EFAULT; - break; - } - } else { - ret = -EFAULT; - } - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_get_porttype -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_set_power() - ******************************************************************************* - * - * DESCRIPTION: - * - * Sets the power management settings of the wireless device. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_set_power(struct net_device *dev, struct iw_request_info *info, struct iw_param *wrq, char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - DBG_PRINT( "THIS CORRUPTS PMEnabled ;?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" ); - -#if 0 //;? Needed, was present in original code but not in 7.18 Linux 2.6 kernel version - if( !capable( CAP_NET_ADMIN )) { - ret = -EPERM; - return ret; - } -#endif - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - /* Set the power management state based on the 'disabled' value */ - if( wrq->disabled ) { - lp->PMEnabled = 0; - } else { - lp->PMEnabled = 1; - } - - /* Commit the adapter parameters */ - wl_apply( lp ); - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_set_power -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_get_power() - ******************************************************************************* - * - * DESCRIPTION: - * - * Gets the power management settings of the wireless device. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_get_power(struct net_device *dev, struct iw_request_info *info, struct iw_param *rrq, char *extra) - -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - DBG_PRINT( "THIS IS PROBABLY AN OVER-SIMPLIFICATION ;?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" ); - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - rrq->flags = 0; - rrq->value = 0; - - if( lp->PMEnabled ) { - rrq->disabled = 0; - } else { - rrq->disabled = 1; - } - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_get_power -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_get_tx_power() - ******************************************************************************* - * - * DESCRIPTION: - * - * Gets the transmit power of the wireless device's radio. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_get_tx_power(struct net_device *dev, struct iw_request_info *info, struct iw_param *rrq, char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - -#ifdef USE_POWER_DBM - rrq->value = RADIO_TX_POWER_DBM; - rrq->flags = IW_TXPOW_DBM; -#else - rrq->value = RADIO_TX_POWER_MWATT; - rrq->flags = IW_TXPOW_MWATT; -#endif - rrq->fixed = 1; - rrq->disabled = 0; - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_get_tx_power -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_set_rts_threshold() - ******************************************************************************* - * - * DESCRIPTION: - * - * Sets the RTS threshold for the wireless card. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_set_rts_threshold (struct net_device *dev, struct iw_request_info *info, struct iw_param *rts, char *extra) -{ - int ret = 0; - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int rthr = rts->value; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - if(rts->fixed == 0) { - ret = -EINVAL; - goto out; - } - - if( rts->disabled ) { - rthr = 2347; - } - - if(( rthr < 256 ) || ( rthr > 2347 )) { - ret = -EINVAL; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - lp->RTSThreshold = rthr; - - wl_apply( lp ); - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_set_rts_threshold -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_get_rts_threshold() - ******************************************************************************* - * - * DESCRIPTION: - * - * Gets the RTS threshold for the wireless card. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_get_rts_threshold (struct net_device *dev, struct iw_request_info *info, struct iw_param *rts, char *extra) -{ - int ret = 0; - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - rts->value = lp->RTSThreshold; - - rts->disabled = ( rts->value == 2347 ); - - rts->fixed = 1; - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_get_rts_threshold -/*============================================================================*/ - - - - - -/******************************************************************************* - * wireless_set_rate() - ******************************************************************************* - * - * DESCRIPTION: - * - * Set the default data rate setting used by the wireless device. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_set_rate(struct net_device *dev, struct iw_request_info *info, struct iw_param *rrq, char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; -#ifdef WARP - int status = -1; - int index = 0; -#endif // WARP - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - -#ifdef WARP - - /* Determine if the card is operating in the 2.4 or 5.0 GHz band; check - if Bit 9 is set in the current channel RID */ - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_CUR_CHANNEL; - - status = hcf_get_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - - if( status == HCF_SUCCESS ) { - index = ( CNV_LITTLE_TO_INT( lp->ltvRecord.u.u16[0] ) & 0x100 ) ? 1 : 0; - - DBG_PRINT( "Index: %d\n", index ); - } else { - DBG_ERROR( DbgInfo, "Could not determine radio frequency\n" ); - ret = -EINVAL; - goto out_unlock; - } - - if( rrq->value > 0 && - rrq->value <= 1 * MEGABIT ) { - lp->TxRateControl[index] = 0x0001; - } - else if( rrq->value > 1 * MEGABIT && - rrq->value <= 2 * MEGABIT ) { - if( rrq->fixed == 1 ) { - lp->TxRateControl[index] = 0x0002; - } else { - lp->TxRateControl[index] = 0x0003; - } - } - else if( rrq->value > 2 * MEGABIT && - rrq->value <= 5 * MEGABIT ) { - if( rrq->fixed == 1 ) { - lp->TxRateControl[index] = 0x0004; - } else { - lp->TxRateControl[index] = 0x0007; - } - } - else if( rrq->value > 5 * MEGABIT && - rrq->value <= 6 * MEGABIT ) { - if( rrq->fixed == 1 ) { - lp->TxRateControl[index] = 0x0010; - } else { - lp->TxRateControl[index] = 0x0017; - } - } - else if( rrq->value > 6 * MEGABIT && - rrq->value <= 9 * MEGABIT ) { - if( rrq->fixed == 1 ) { - lp->TxRateControl[index] = 0x0020; - } else { - lp->TxRateControl[index] = 0x0037; - } - } - else if( rrq->value > 9 * MEGABIT && - rrq->value <= 11 * MEGABIT ) { - if( rrq->fixed == 1 ) { - lp->TxRateControl[index] = 0x0008; - } else { - lp->TxRateControl[index] = 0x003F; - } - } - else if( rrq->value > 11 * MEGABIT && - rrq->value <= 12 * MEGABIT ) { - if( rrq->fixed == 1 ) { - lp->TxRateControl[index] = 0x0040; - } else { - lp->TxRateControl[index] = 0x007F; - } - } - else if( rrq->value > 12 * MEGABIT && - rrq->value <= 18 * MEGABIT ) { - if( rrq->fixed == 1 ) { - lp->TxRateControl[index] = 0x0080; - } else { - lp->TxRateControl[index] = 0x00FF; - } - } - else if( rrq->value > 18 * MEGABIT && - rrq->value <= 24 * MEGABIT ) { - if( rrq->fixed == 1 ) { - lp->TxRateControl[index] = 0x0100; - } else { - lp->TxRateControl[index] = 0x01FF; - } - } - else if( rrq->value > 24 * MEGABIT && - rrq->value <= 36 * MEGABIT ) { - if( rrq->fixed == 1 ) { - lp->TxRateControl[index] = 0x0200; - } else { - lp->TxRateControl[index] = 0x03FF; - } - } - else if( rrq->value > 36 * MEGABIT && - rrq->value <= 48 * MEGABIT ) { - if( rrq->fixed == 1 ) { - lp->TxRateControl[index] = 0x0400; - } else { - lp->TxRateControl[index] = 0x07FF; - } - } - else if( rrq->value > 48 * MEGABIT && - rrq->value <= 54 * MEGABIT ) { - if( rrq->fixed == 1 ) { - lp->TxRateControl[index] = 0x0800; - } else { - lp->TxRateControl[index] = 0x0FFF; - } - } - else if( rrq->fixed == 0 ) { - /* In this case, the user has not specified a bitrate, only the "auto" - moniker. So, set to all supported rates */ - lp->TxRateControl[index] = PARM_MAX_TX_RATE; - } else { - rrq->value = 0; - ret = -EINVAL; - goto out_unlock; - } - - -#else - - if( rrq->value > 0 && - rrq->value <= 1 * MEGABIT ) { - lp->TxRateControl[0] = 1; - } - else if( rrq->value > 1 * MEGABIT && - rrq->value <= 2 * MEGABIT ) { - if( rrq->fixed ) { - lp->TxRateControl[0] = 2; - } else { - lp->TxRateControl[0] = 6; - } - } - else if( rrq->value > 2 * MEGABIT && - rrq->value <= 5 * MEGABIT ) { - if( rrq->fixed ) { - lp->TxRateControl[0] = 4; - } else { - lp->TxRateControl[0] = 7; - } - } - else if( rrq->value > 5 * MEGABIT && - rrq->value <= 11 * MEGABIT ) { - if( rrq->fixed) { - lp->TxRateControl[0] = 5; - } else { - lp->TxRateControl[0] = 3; - } - } - else if( rrq->fixed == 0 ) { - /* In this case, the user has not specified a bitrate, only the "auto" - moniker. So, set the rate to 11Mb auto */ - lp->TxRateControl[0] = 3; - } else { - rrq->value = 0; - ret = -EINVAL; - goto out_unlock; - } - -#endif // WARP - - - /* Commit the adapter parameters */ - wl_apply( lp ); - -out_unlock: - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_set_rate -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_get_rate() - ******************************************************************************* - * - * DESCRIPTION: - * - * Get the default data rate setting used by the wireless device. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_get_rate(struct net_device *dev, struct iw_request_info *info, struct iw_param *rrq, char *extra) - -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - int status = -1; - hcf_16 txRate; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - /* Get the current transmit rate from the adapter */ - lp->ltvRecord.len = 1 + ( sizeof(txRate)/sizeof(hcf_16)); - lp->ltvRecord.typ = CFG_CUR_TX_RATE; - - status = hcf_get_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - - if( status == HCF_SUCCESS ) { -#ifdef WARP - - txRate = CNV_LITTLE_TO_INT( lp->ltvRecord.u.u16[0] ); - - if( txRate & 0x0001 ) { - txRate = 1; - } - else if( txRate & 0x0002 ) { - txRate = 2; - } - else if( txRate & 0x0004 ) { - txRate = 5; - } - else if( txRate & 0x0008 ) { - txRate = 11; - } - else if( txRate & 0x00010 ) { - txRate = 6; - } - else if( txRate & 0x00020 ) { - txRate = 9; - } - else if( txRate & 0x00040 ) { - txRate = 12; - } - else if( txRate & 0x00080 ) { - txRate = 18; - } - else if( txRate & 0x00100 ) { - txRate = 24; - } - else if( txRate & 0x00200 ) { - txRate = 36; - } - else if( txRate & 0x00400 ) { - txRate = 48; - } - else if( txRate & 0x00800 ) { - txRate = 54; - } - -#else - - txRate = (hcf_16)CNV_LITTLE_TO_LONG( lp->ltvRecord.u.u32[0] ); - -#endif // WARP - - rrq->value = txRate * MEGABIT; - } else { - rrq->value = 0; - ret = -EFAULT; - } - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_get_rate -/*============================================================================*/ - - - - -#if 0 //;? Not used anymore -/******************************************************************************* - * wireless_get_private_interface() - ******************************************************************************* - * - * DESCRIPTION: - * - * Returns the Linux Wireless Extensions' compatible private interface of - * the driver. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -int wireless_get_private_interface( struct iwreq *wrq, struct wl_private *lp ) -{ - int ret = 0; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - if( wrq->u.data.pointer != NULL ) { - struct iw_priv_args priv[] = - { - { SIOCSIWNETNAME, IW_PRIV_TYPE_CHAR | HCF_MAX_NAME_LEN, 0, "snetwork_name" }, - { SIOCGIWNETNAME, 0, IW_PRIV_TYPE_CHAR | HCF_MAX_NAME_LEN, "gnetwork_name" }, - { SIOCSIWSTANAME, IW_PRIV_TYPE_CHAR | HCF_MAX_NAME_LEN, 0, "sstation_name" }, - { SIOCGIWSTANAME, 0, IW_PRIV_TYPE_CHAR | HCF_MAX_NAME_LEN, "gstation_name" }, - { SIOCSIWPORTTYPE, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, 0, "sport_type" }, - { SIOCGIWPORTTYPE, 0, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, "gport_type" }, - }; - - /* Verify the user buffer */ - ret = verify_area( VERIFY_WRITE, wrq->u.data.pointer, sizeof( priv )); - - if( ret != 0 ) - return ret; - - /* Copy the data into the user's buffer */ - wrq->u.data.length = NELEM( priv ); - copy_to_user( wrq->u.data.pointer, &priv, sizeof( priv )); - } - -out: - return ret; -} // wireless_get_private_interface -/*============================================================================*/ -#endif - - - -/******************************************************************************* - * wireless_set_scan() - ******************************************************************************* - * - * DESCRIPTION: - * - * Instructs the driver to initiate a network scan. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_set_scan(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - int status = -1; - int retries = 0; - - //;? Note: shows results as trace, returns always 0 unless BUSY - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - /* - * This looks like a nice place to test if the HCF is still - * communicating with the card. It seems that sometimes BAP_1 - * gets corrupted. By looking at the comments in HCF the - * cause is still a mystery. Okay, the communication to the - * card is dead, reset the card to revive. - */ - if((lp->hcfCtx.IFB_CardStat & CARD_STAT_DEFUNCT) != 0) - { - DBG_TRACE( DbgInfo, "CARD is in DEFUNCT mode, reset it to bring it back to life\n" ); - wl_reset( dev ); - } - -retry: - /* Set the completion state to FALSE */ - lp->probe_results.scan_complete = FALSE; - - - /* Channels to scan */ -#ifdef WARP - lp->ltvRecord.len = 5; - lp->ltvRecord.typ = CFG_SCAN_CHANNEL; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( 0x3FFF ); // 2.4 GHz Band - lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE( 0xFFFF ); // 5.0 GHz Band - lp->ltvRecord.u.u16[2] = CNV_INT_TO_LITTLE( 0xFFFF ); // .. - lp->ltvRecord.u.u16[3] = CNV_INT_TO_LITTLE( 0x0007 ); // .. -#else - lp->ltvRecord.len = 2; - lp->ltvRecord.typ = CFG_SCAN_CHANNEL; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( 0x7FFF ); -#endif // WARP - - status = hcf_put_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - - DBG_TRACE( DbgInfo, "CFG_SCAN_CHANNEL result : 0x%x\n", status ); - - // Holding the lock too long, makes a gap to allow other processes - wl_unlock(lp, &flags); - wl_lock( lp, &flags ); - - if( status != HCF_SUCCESS ) { - //Recovery - retries++; - if(retries <= 10) { - DBG_TRACE( DbgInfo, "Reset card to recover, attempt: %d\n", retries ); - wl_reset( dev ); - - // Holding the lock too long, makes a gap to allow other processes - wl_unlock(lp, &flags); - wl_lock( lp, &flags ); - - goto retry; - } - } - - /* Set the SCAN_SSID to "ANY". Using this RID for scan prevents the need to - disassociate from the network we are currently on */ - lp->ltvRecord.len = 18; - lp->ltvRecord.typ = CFG_SCAN_SSID; - lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( 0 ); - lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE( 0 ); - - status = hcf_put_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - - // Holding the lock too long, makes a gap to allow other processes - wl_unlock(lp, &flags); - wl_lock( lp, &flags ); - - DBG_TRACE( DbgInfo, "CFG_SCAN_SSID to 'any' status: 0x%x\n", status ); - - /* Initiate the scan */ - /* NOTE: Using HCF_ACT_SCAN has been removed, as using HCF_ACT_ACS_SCAN to - retrieve probe response must always be used to support WPA */ - status = hcf_action( &( lp->hcfCtx ), HCF_ACT_ACS_SCAN ); - - if( status == HCF_SUCCESS ) { - DBG_TRACE( DbgInfo, "SUCCESSFULLY INITIATED SCAN...\n" ); - } else { - DBG_TRACE( DbgInfo, "INITIATE SCAN FAILED...\n" ); - } - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_set_scan -/*============================================================================*/ - - - - -/******************************************************************************* - * wireless_get_scan() - ******************************************************************************* - * - * DESCRIPTION: - * - * Instructs the driver to gather and return the results of a network scan. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -static int wireless_get_scan(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret = 0; - int count; - char *buf; - char *buf_end; - struct iw_event iwe; - PROBE_RESP *probe_resp; - hcf_8 msg[512]; - hcf_8 *wpa_ie; - hcf_16 wpa_ie_len; - - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - /* If the scan is not done, tell the calling process to try again later */ - if( !lp->probe_results.scan_complete ) { - ret = -EAGAIN; - goto out_unlock; - } - - DBG_TRACE( DbgInfo, "SCAN COMPLETE, Num of APs: %d\n", - lp->probe_results.num_aps ); - - buf = extra; - buf_end = extra + IW_SCAN_MAX_DATA; - - for( count = 0; count < lp->probe_results.num_aps; count++ ) { - /* Reference the probe response from the table */ - probe_resp = (PROBE_RESP *)&lp->probe_results.ProbeTable[count]; - - - /* First entry MUST be the MAC address */ - memset( &iwe, 0, sizeof( iwe )); - - iwe.cmd = SIOCGIWAP; - iwe.u.ap_addr.sa_family = ARPHRD_ETHER; - memcpy( iwe.u.ap_addr.sa_data, probe_resp->BSSID, ETH_ALEN); - iwe.len = IW_EV_ADDR_LEN; - - buf = iwe_stream_add_event(info, buf, buf_end, - &iwe, IW_EV_ADDR_LEN); - - /* Use the mode to indicate if it's a station or AP */ - /* Won't always be an AP if in IBSS mode */ - memset( &iwe, 0, sizeof( iwe )); - - iwe.cmd = SIOCGIWMODE; - - if( probe_resp->capability & CAPABILITY_IBSS ) { - iwe.u.mode = IW_MODE_INFRA; - } else { - iwe.u.mode = IW_MODE_MASTER; - } - - iwe.len = IW_EV_UINT_LEN; - - buf = iwe_stream_add_event(info, buf, buf_end, - &iwe, IW_EV_UINT_LEN); - - /* Any quality information */ - memset(&iwe, 0, sizeof(iwe)); - - iwe.cmd = IWEVQUAL; - iwe.u.qual.level = dbm(probe_resp->signal); - iwe.u.qual.noise = dbm(probe_resp->silence); - iwe.u.qual.qual = iwe.u.qual.level - iwe.u.qual.noise; - iwe.u.qual.updated = lp->probe_results.scan_complete | IW_QUAL_DBM; - iwe.len = IW_EV_QUAL_LEN; - - buf = iwe_stream_add_event(info, buf, buf_end, - &iwe, IW_EV_QUAL_LEN); - - - /* ESSID information */ - if( probe_resp->rawData[1] > 0 ) { - memset( &iwe, 0, sizeof( iwe )); - - iwe.cmd = SIOCGIWESSID; - iwe.u.data.length = probe_resp->rawData[1]; - iwe.u.data.flags = 1; - - buf = iwe_stream_add_point(info, buf, buf_end, - &iwe, &probe_resp->rawData[2]); - } - - - /* Encryption Information */ - memset( &iwe, 0, sizeof( iwe )); - - iwe.cmd = SIOCGIWENCODE; - iwe.u.data.length = 0; - - /* Check the capabilities field of the Probe Response to see if - 'privacy' is supported on the AP in question */ - if( probe_resp->capability & CAPABILITY_PRIVACY ) { - iwe.u.data.flags |= IW_ENCODE_ENABLED; - } else { - iwe.u.data.flags |= IW_ENCODE_DISABLED; - } - - buf = iwe_stream_add_point(info, buf, buf_end, &iwe, NULL); - - - /* Frequency Info */ - memset( &iwe, 0, sizeof( iwe )); - - iwe.cmd = SIOCGIWFREQ; - iwe.len = IW_EV_FREQ_LEN; - iwe.u.freq.m = wl_parse_ds_ie( probe_resp ); - iwe.u.freq.e = 0; - - buf = iwe_stream_add_event(info, buf, buf_end, - &iwe, IW_EV_FREQ_LEN); - - - /* Custom info (Beacon Interval) */ - memset( &iwe, 0, sizeof( iwe )); - memset( msg, 0, sizeof( msg )); - - iwe.cmd = IWEVCUSTOM; - sprintf( msg, "beacon_interval=%d", probe_resp->beaconInterval ); - iwe.u.data.length = strlen( msg ); - - buf = iwe_stream_add_point(info, buf, buf_end, &iwe, msg); - - - /* WPA-IE */ - wpa_ie = NULL; - wpa_ie_len = 0; - - wpa_ie = wl_parse_wpa_ie( probe_resp, &wpa_ie_len ); - if( wpa_ie != NULL ) { - memset(&iwe, 0, sizeof(iwe)); - - iwe.cmd = IWEVGENIE; - iwe.u.data.length = wpa_ie_len; - - buf = iwe_stream_add_point(info, buf, buf_end, - &iwe, wpa_ie); - } - - /* Add other custom info in formatted string format as needed... */ - } - - data->length = buf - extra; - -out_unlock: - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_get_scan -/*============================================================================*/ - -#if DBG -static const char * const auth_names[] = { - "IW_AUTH_WPA_VERSION", - "IW_AUTH_CIPHER_PAIRWISE", - "IW_AUTH_CIPHER_GROUP", - "IW_AUTH_KEY_MGMT", - "IW_AUTH_TKIP_COUNTERMEASURES", - "IW_AUTH_DROP_UNENCRYPTED", - "IW_AUTH_80211_AUTH_ALG", - "IW_AUTH_WPA_ENABLED", - "IW_AUTH_RX_UNENCRYPTED_EAPOL", - "IW_AUTH_ROAMING_CONTROL", - "IW_AUTH_PRIVACY_INVOKED", - "IW_AUTH_CIPHER_GROUP_MGMT", - "IW_AUTH_MFP", - "Unsupported" -}; -#endif - -static int wireless_set_auth(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *data, char *extra) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - ltv_t ltv; - int ret; - int iwa_idx = data->flags & IW_AUTH_INDEX; - int iwa_val = data->value; - - if (lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - - if (iwa_idx > IW_AUTH_MFP) - iwa_idx = IW_AUTH_MFP + 1; - DBG_TRACE(DbgInfo, "%s\n", auth_names[iwa_idx]); - switch (iwa_idx) { - case IW_AUTH_WPA_VERSION: - /* We do support WPA */ - if ((iwa_val == IW_AUTH_WPA_VERSION_WPA) || - (iwa_val == IW_AUTH_WPA_VERSION_DISABLED)) - ret = 0; - else - ret = -EINVAL; - break; - - case IW_AUTH_WPA_ENABLED: - DBG_TRACE(DbgInfo, "val = %d\n", iwa_val); - if (iwa_val) - lp->EnableEncryption = 2; - else - lp->EnableEncryption = 0; - - /* Write straight to the card */ - ltv.len = 2; - ltv.typ = CFG_CNF_ENCRYPTION; - ltv.u.u16[0] = cpu_to_le16(lp->EnableEncryption); - ret = hcf_put_info(&lp->hcfCtx, (LTVP)<v); - - break; - - case IW_AUTH_TKIP_COUNTERMEASURES: - - /* Immediately disable card */ - lp->driverEnable = !iwa_val; - if (lp->driverEnable) - hcf_cntl(&(lp->hcfCtx), HCF_CNTL_ENABLE | HCF_PORT_0); - else - hcf_cntl(&(lp->hcfCtx), HCF_CNTL_DISABLE | HCF_PORT_0); - ret = 0; - break; - - case IW_AUTH_MFP: - /* Management Frame Protection not supported. - * Only fail if set to required. - */ - if (iwa_val == IW_AUTH_MFP_REQUIRED) - ret = -EINVAL; - else - ret = 0; - break; - - case IW_AUTH_KEY_MGMT: - - /* Record required management suite. - * Will take effect on next commit */ - if (iwa_val != 0) - lp->AuthKeyMgmtSuite = 4; - else - lp->AuthKeyMgmtSuite = 0; - - ret = -EINPROGRESS; - break; - - case IW_AUTH_80211_AUTH_ALG: - - /* Just record whether open or shared is required. - * Will take effect on next commit */ - ret = -EINPROGRESS; - - if (iwa_val & IW_AUTH_ALG_SHARED_KEY) - lp->authentication = 1; - else if (iwa_val & IW_AUTH_ALG_OPEN_SYSTEM) - lp->authentication = 0; - else - ret = -EINVAL; - break; - - case IW_AUTH_DROP_UNENCRYPTED: - /* Only needed for AP */ - lp->ExcludeUnencrypted = iwa_val; - ret = -EINPROGRESS; - break; - - case IW_AUTH_CIPHER_PAIRWISE: - case IW_AUTH_CIPHER_GROUP: - case IW_AUTH_RX_UNENCRYPTED_EAPOL: - case IW_AUTH_ROAMING_CONTROL: - case IW_AUTH_PRIVACY_INVOKED: - /* Not used. May need to do something with - * CIPHER_PAIRWISE and CIPHER_GROUP*/ - ret = -EINPROGRESS; - break; - - default: - DBG_TRACE(DbgInfo, "IW_AUTH_?? (%d) unknown\n", iwa_idx); - /* return an error */ - ret = -EOPNOTSUPP; - break; - } - - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - -out: - return ret; -} // wireless_set_auth -/*============================================================================*/ - - -static void flush_tx(struct wl_private *lp) -{ - ltv_t ltv; - int count; - - /* - * Make sure that there is no data queued up in the firmware - * before setting the TKIP keys. If this check is not - * performed, some data may be sent out with incorrect MIC - * and cause synchronization errors with the AP - */ - /* Check every 1ms for 100ms */ - for (count = 0; count < 100; count++) { - udelay(1000); - - ltv.len = 2; - ltv.typ = 0xFD91; /* This RID not defined in HCF yet!!! */ - ltv.u.u16[0] = 0; - - hcf_get_info(&(lp->hcfCtx), (LTVP)<v); - - if (ltv.u.u16[0] == 0) - break; - } - - if (count >= 100) - DBG_TRACE(DbgInfo, "Timed out waiting for TxQ flush!\n"); - -} - -static int wireless_set_encodeext(struct net_device *dev, - struct iw_request_info *info, - struct iw_point *erq, char *keybuf) -{ - struct wl_private *lp = wl_priv(dev); - unsigned long flags; - int ret; - int key_idx = (erq->flags & IW_ENCODE_INDEX) - 1; - ltv_t ltv; - struct iw_encode_ext *ext = (struct iw_encode_ext *)keybuf; - bool enable = true; - bool set_tx = false; - - if (lp->portState == WVLAN_PORT_STATE_DISABLED) { - ret = -EBUSY; - goto out; - } - - if (erq->flags & IW_ENCODE_DISABLED) { - ext->alg = IW_ENCODE_ALG_NONE; - enable = false; - } - - if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) - set_tx = true; - - wl_lock(lp, &flags); - - wl_act_int_off(lp); - - memset(<v, 0, sizeof(ltv)); - - switch (ext->alg) { - case IW_ENCODE_ALG_TKIP: - DBG_TRACE(DbgInfo, "IW_ENCODE_ALG_TKIP: key(%d)\n", key_idx); - - if (sizeof(ext->rx_seq) != 8) { - DBG_TRACE(DbgInfo, "rx_seq size mismatch\n"); - ret = -EINVAL; - goto out_unlock; - } - - ret = hermes_set_tkip_keys(<v, key_idx, ext->addr.sa_data, - set_tx, - ext->rx_seq, ext->key, ext->key_len); - - if (ret != 0) { - DBG_TRACE(DbgInfo, "hermes_set_tkip_keys returned != 0, key not set\n"); - goto out_unlock; - } - - flush_tx(lp); - - lp->wext_enc = IW_ENCODE_ALG_TKIP; - - /* Write the key */ - ret = hcf_put_info(&(lp->hcfCtx), (LTVP)<v); - break; - - case IW_ENCODE_ALG_WEP: - DBG_TRACE(DbgInfo, "IW_ENCODE_ALG_WEP: key(%d)\n", key_idx); - - if (erq->flags & IW_ENCODE_RESTRICTED) { - DBG_WARNING(DbgInfo, "IW_ENCODE_RESTRICTED invalid\n"); - ret = -EINVAL; - goto out_unlock; - } - - ret = hermes_set_wep_keys(lp, key_idx, ext->key, ext->key_len, - enable, set_tx); - - break; - - case IW_ENCODE_ALG_CCMP: - DBG_TRACE(DbgInfo, "IW_ENCODE_ALG_CCMP: key(%d)\n", key_idx); - ret = -EOPNOTSUPP; - break; - - case IW_ENCODE_ALG_NONE: - DBG_TRACE(DbgInfo, "IW_ENCODE_ALG_NONE: key(%d)\n", key_idx); - - if (lp->wext_enc == IW_ENCODE_ALG_TKIP) { - ret = hermes_clear_tkip_keys(<v, key_idx, - ext->addr.sa_data); - flush_tx(lp); - lp->wext_enc = IW_ENCODE_ALG_NONE; - ret = hcf_put_info(&(lp->hcfCtx), (LTVP)<v); - - } else if (lp->wext_enc == IW_ENCODE_ALG_WEP) { - ret = hermes_set_wep_keys(lp, key_idx, - ext->key, ext->key_len, - false, false); - } else { - ret = 0; - } - - break; - - default: - DBG_TRACE( DbgInfo, "IW_ENCODE_??: key(%d)\n", key_idx); - ret = -EOPNOTSUPP; - break; - } - -out_unlock: - - wl_act_int_on(lp); - - wl_unlock(lp, &flags); - -out: - return ret; -} -/*============================================================================*/ - - - -static int wireless_set_genie(struct net_device *dev, - struct iw_request_info *info, - struct iw_point *data, char *extra) - -{ - /* We can't write this to the card, but apparently this - * operation needs to succeed */ - - return 0; -} -/*============================================================================*/ - - -/******************************************************************************* - * wl_wireless_stats() - ******************************************************************************* - * - * DESCRIPTION: - * - * Return the current device wireless statistics. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -struct iw_statistics * wl_wireless_stats( struct net_device *dev ) -{ - struct iw_statistics *pStats; - struct wl_private *lp = wl_priv(dev); - - DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev); - - pStats = NULL; - - /* Initialize the statistics */ - pStats = &( lp->wstats ); - pStats->qual.updated = 0x00; - - if( !( lp->flags & WVLAN2_UIL_BUSY )) - { - CFG_COMMS_QUALITY_STRCT *pQual; - CFG_HERMES_TALLIES_STRCT tallies; - int status; - - /* Update driver status */ - pStats->status = 0; - - /* Get the current link quality information */ - lp->ltvRecord.len = 1 + ( sizeof( *pQual ) / sizeof( hcf_16 )); - lp->ltvRecord.typ = CFG_COMMS_QUALITY; - status = hcf_get_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - - if( status == HCF_SUCCESS ) { - pQual = (CFG_COMMS_QUALITY_STRCT *)&( lp->ltvRecord ); - - pStats->qual.qual = (u_char) CNV_LITTLE_TO_INT( pQual->coms_qual ); - pStats->qual.level = (u_char) dbm( CNV_LITTLE_TO_INT( pQual->signal_lvl )); - pStats->qual.noise = (u_char) dbm( CNV_LITTLE_TO_INT( pQual->noise_lvl )); - - pStats->qual.updated |= (IW_QUAL_QUAL_UPDATED | - IW_QUAL_LEVEL_UPDATED | - IW_QUAL_NOISE_UPDATED | - IW_QUAL_DBM); - } else { - memset( &( pStats->qual ), 0, sizeof( pStats->qual )); - } - - /* Get the current tallies from the adapter */ - /* Only possible when the device is open */ - if(lp->portState == WVLAN_PORT_STATE_DISABLED) { - if( wl_get_tallies( lp, &tallies ) == 0 ) { - /* No endian translation is needed here, as CFG_TALLIES is an - MSF RID; all processing is done on the host, not the card! */ - pStats->discard.nwid = 0L; - pStats->discard.code = tallies.RxWEPUndecryptable; - pStats->discard.misc = tallies.TxDiscards + - tallies.RxFCSErrors + - //tallies.RxDiscardsNoBuffer + - tallies.TxDiscardsWrongSA; - //;? Extra taken over from Linux driver based on 7.18 version - pStats->discard.retries = tallies.TxRetryLimitExceeded; - pStats->discard.fragment = tallies.RxMsgInBadMsgFragments; - } else { - memset( &( pStats->discard ), 0, sizeof( pStats->discard )); - } - } else { - memset( &( pStats->discard ), 0, sizeof( pStats->discard )); - } - } - - return pStats; -} // wl_wireless_stats -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_get_wireless_stats() - ******************************************************************************* - * - * DESCRIPTION: - * - * Return the current device wireless statistics. This function calls - * wl_wireless_stats, but acquires spinlocks first as it can be called - * directly by the network layer. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -struct iw_statistics * wl_get_wireless_stats( struct net_device *dev ) -{ - unsigned long flags; - struct wl_private *lp = wl_priv(dev); - struct iw_statistics *pStats = NULL; - - wl_lock( lp, &flags ); - - wl_act_int_off( lp ); - -#ifdef USE_RTS - if( lp->useRTS == 1 ) { - DBG_TRACE( DbgInfo, "Skipping wireless stats, in RTS mode\n" ); - } else -#endif - { - pStats = wl_wireless_stats( dev ); - } - wl_act_int_on( lp ); - - wl_unlock(lp, &flags); - - return pStats; -} // wl_get_wireless_stats - - -/******************************************************************************* - * wl_spy_gather() - ******************************************************************************* - * - * DESCRIPTION: - * - * Gather wireless spy statistics. - * - * PARAMETERS: - * - * wrq - the wireless request buffer - * lp - the device's private adapter structure - * - * RETURNS: - * - * 0 on success - * errno value otherwise - * - ******************************************************************************/ -inline void wl_spy_gather( struct net_device *dev, u_char *mac ) -{ - struct iw_quality wstats; - int status; - u_char stats[2]; - DESC_STRCT desc[1]; - struct wl_private *lp = wl_priv(dev); - /*------------------------------------------------------------------------*/ - - /* shortcut */ - if (!lp->spy_data.spy_number) { - return; - } - - /* Gather wireless spy statistics: for each packet, compare the source - address with out list, and if match, get the stats. */ - memset( stats, 0, sizeof(stats)); - memset( desc, 0, sizeof(DESC_STRCT)); - - desc[0].buf_addr = stats; - desc[0].BUF_SIZE = sizeof(stats); - desc[0].next_desc_addr = 0; // terminate list - - status = hcf_rcv_msg( &( lp->hcfCtx ), &desc[0], 0 ); - - if( status == HCF_SUCCESS ) { - wstats.level = (u_char) dbm(stats[1]); - wstats.noise = (u_char) dbm(stats[0]); - wstats.qual = wstats.level > wstats.noise ? wstats.level - wstats.noise : 0; - - wstats.updated = (IW_QUAL_QUAL_UPDATED | - IW_QUAL_LEVEL_UPDATED | - IW_QUAL_NOISE_UPDATED | - IW_QUAL_DBM); - - wireless_spy_update( dev, mac, &wstats ); - } -} // wl_spy_gather -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_wext_event_freq() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function is used to send an event that the channel/freq - * configuration for a specific device has changed. - * - * - * PARAMETERS: - * - * dev - the network device for which this event is to be issued - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wext_event_freq( struct net_device *dev ) -{ - union iwreq_data wrqu; - struct wl_private *lp = wl_priv(dev); - /*------------------------------------------------------------------------*/ - - - memset( &wrqu, 0, sizeof( wrqu )); - - wrqu.freq.m = lp->Channel; - wrqu.freq.e = 0; - - wireless_send_event( dev, SIOCSIWFREQ, &wrqu, NULL ); - - return; -} // wl_wext_event_freq -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_wext_event_mode() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function is used to send an event that the mode of operation - * for a specific device has changed. - * - * - * PARAMETERS: - * - * dev - the network device for which this event is to be issued - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wext_event_mode( struct net_device *dev ) -{ - union iwreq_data wrqu; - struct wl_private *lp = wl_priv(dev); - /*------------------------------------------------------------------------*/ - - - memset( &wrqu, 0, sizeof( wrqu )); - - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_STA ) { - wrqu.mode = IW_MODE_INFRA; - } else { - wrqu.mode = IW_MODE_MASTER; - } - - wireless_send_event( dev, SIOCSIWMODE, &wrqu, NULL ); - - return; -} // wl_wext_event_mode -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_wext_event_essid() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function is used to send an event that the ESSID configuration for - * a specific device has changed. - * - * - * PARAMETERS: - * - * dev - the network device for which this event is to be issued - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wext_event_essid( struct net_device *dev ) -{ - union iwreq_data wrqu; - struct wl_private *lp = wl_priv(dev); - /*------------------------------------------------------------------------*/ - - - memset( &wrqu, 0, sizeof( wrqu )); - - /* Fill out the buffer. Note that the buffer doesn't actually contain the - ESSID, but a pointer to the contents. In addition, the 'extra' field of - the call to wireless_send_event() must also point to where the ESSID - lives */ - wrqu.essid.length = strlen( lp->NetworkName ); - wrqu.essid.pointer = (void __user *)lp->NetworkName; - wrqu.essid.flags = 1; - - wireless_send_event( dev, SIOCSIWESSID, &wrqu, lp->NetworkName ); - - return; -} // wl_wext_event_essid -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_wext_event_encode() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function is used to send an event that the encryption configuration - * for a specific device has changed. - * - * - * PARAMETERS: - * - * dev - the network device for which this event is to be issued - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wext_event_encode( struct net_device *dev ) -{ - union iwreq_data wrqu; - struct wl_private *lp = wl_priv(dev); - int index = 0; - /*------------------------------------------------------------------------*/ - - - memset( &wrqu, 0, sizeof( wrqu )); - - if( lp->EnableEncryption == 0 ) { - wrqu.encoding.flags = IW_ENCODE_DISABLED; - } else { - wrqu.encoding.flags |= lp->TransmitKeyID; - - index = lp->TransmitKeyID - 1; - - /* Only set IW_ENCODE_RESTRICTED/OPEN flag using lp->ExcludeUnencrypted - if we're in AP mode */ -#if 1 //;? (HCF_TYPE) & HCF_TYPE_AP - //;?should we restore this to allow smaller memory footprint - - if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_AP ) { - if( lp->ExcludeUnencrypted ) { - wrqu.encoding.flags |= IW_ENCODE_RESTRICTED; - } else { - wrqu.encoding.flags |= IW_ENCODE_OPEN; - } - } - -#endif // HCF_TYPE_AP - - /* Only provide the key if permissions allow */ - if( capable( CAP_NET_ADMIN )) { - wrqu.encoding.pointer = (void __user *)lp->DefaultKeys.key[index].key; - wrqu.encoding.length = lp->DefaultKeys.key[index].len; - } else { - wrqu.encoding.flags |= IW_ENCODE_NOKEY; - } - } - - wireless_send_event( dev, SIOCSIWENCODE, &wrqu, - lp->DefaultKeys.key[index].key ); - - return; -} // wl_wext_event_encode -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_wext_event_ap() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function is used to send an event that the device has been - * associated to a new AP. - * - * - * PARAMETERS: - * - * dev - the network device for which this event is to be issued - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wext_event_ap( struct net_device *dev ) -{ - union iwreq_data wrqu; - struct wl_private *lp = wl_priv(dev); - int status; - /*------------------------------------------------------------------------*/ - - - /* Retrieve the WPA-IEs used by the firmware and send an event. We must send - this event BEFORE sending the association event, as there are timing - issues with the hostap supplicant. The supplicant will attempt to process - an EAPOL-Key frame from an AP before receiving this information, which - is required for a proper processed frame. */ - wl_wext_event_assoc_ie( dev ); - - /* Get the BSSID */ - lp->ltvRecord.typ = CFG_CUR_BSSID; - lp->ltvRecord.len = 4; - - status = hcf_get_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - if( status == HCF_SUCCESS ) { - memset( &wrqu, 0, sizeof( wrqu )); - - memcpy( wrqu.addr.sa_data, lp->ltvRecord.u.u8, ETH_ALEN ); - - wrqu.addr.sa_family = ARPHRD_ETHER; - - wireless_send_event( dev, SIOCGIWAP, &wrqu, NULL ); - } - - return; -} // wl_wext_event_ap -/*============================================================================*/ - - - -/******************************************************************************* - * wl_wext_event_scan_complete() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function is used to send an event that a request for a network scan - * has completed. - * - * - * PARAMETERS: - * - * dev - the network device for which this event is to be issued - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wext_event_scan_complete( struct net_device *dev ) -{ - union iwreq_data wrqu; - /*------------------------------------------------------------------------*/ - - - memset( &wrqu, 0, sizeof( wrqu )); - - wrqu.addr.sa_family = ARPHRD_ETHER; - wireless_send_event( dev, SIOCGIWSCAN, &wrqu, NULL ); - - return; -} // wl_wext_event_scan_complete -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_wext_event_new_sta() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function is used to send an event that an AP has registered a new - * station. - * - * - * PARAMETERS: - * - * dev - the network device for which this event is to be issued - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wext_event_new_sta( struct net_device *dev ) -{ - union iwreq_data wrqu; - /*------------------------------------------------------------------------*/ - - - memset( &wrqu, 0, sizeof( wrqu )); - - /* Send the station's mac address here */ - memcpy( wrqu.addr.sa_data, dev->dev_addr, ETH_ALEN ); - wrqu.addr.sa_family = ARPHRD_ETHER; - wireless_send_event( dev, IWEVREGISTERED, &wrqu, NULL ); - - return; -} // wl_wext_event_new_sta -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_wext_event_expired_sta() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function is used to send an event that an AP has deregistered a - * station. - * - * - * PARAMETERS: - * - * dev - the network device for which this event is to be issued - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wext_event_expired_sta( struct net_device *dev ) -{ - union iwreq_data wrqu; - /*------------------------------------------------------------------------*/ - - - memset( &wrqu, 0, sizeof( wrqu )); - - memcpy( wrqu.addr.sa_data, dev->dev_addr, ETH_ALEN ); - wrqu.addr.sa_family = ARPHRD_ETHER; - wireless_send_event( dev, IWEVEXPIRED, &wrqu, NULL ); - - return; -} // wl_wext_event_expired_sta -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_wext_event_mic_failed() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function is used to send an event that MIC calculations failed. - * - * - * PARAMETERS: - * - * dev - the network device for which this event is to be issued - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wext_event_mic_failed( struct net_device *dev ) -{ - union iwreq_data wrqu; - struct wl_private *lp = wl_priv(dev); - struct iw_michaelmicfailure wxmic; - int key_idx; - char *addr1; - char *addr2; - WVLAN_RX_WMP_HDR *hdr; - /*------------------------------------------------------------------------*/ - - - key_idx = lp->lookAheadBuf[HFS_STAT+1] >> 3; - key_idx &= 0x03; - - /* Cast the lookahead buffer into a RFS format */ - hdr = (WVLAN_RX_WMP_HDR *)&lp->lookAheadBuf[HFS_STAT]; - - /* Cast the addresses to byte buffers, as in the above RFS they are word - length */ - addr1 = (char *)hdr->address1; - addr2 = (char *)hdr->address2; - - DBG_PRINT( "MIC FAIL - KEY USED : %d, STATUS : 0x%04x\n", key_idx, - hdr->status ); - - memset(&wrqu, 0, sizeof(wrqu)); - memset(&wxmic, 0, sizeof(wxmic)); - - wxmic.flags = key_idx & IW_MICFAILURE_KEY_ID; - wxmic.flags |= (addr1[0] & 1) ? - IW_MICFAILURE_GROUP : IW_MICFAILURE_PAIRWISE; - wxmic.src_addr.sa_family = ARPHRD_ETHER; - memcpy(wxmic.src_addr.sa_data, addr2, ETH_ALEN); - - wrqu.data.length = sizeof(wxmic); - wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *)&wxmic); - - return; -} // wl_wext_event_mic_failed -/*============================================================================*/ - - - - -/******************************************************************************* - * wl_wext_event_assoc_ie() - ******************************************************************************* - * - * DESCRIPTION: - * - * This function is used to send an event containing the WPA-IE generated - * by the firmware in an association request. - * - * - * PARAMETERS: - * - * dev - the network device for which this event is to be issued - * - * RETURNS: - * - * N/A - * - ******************************************************************************/ -void wl_wext_event_assoc_ie( struct net_device *dev ) -{ - union iwreq_data wrqu; - struct wl_private *lp = wl_priv(dev); - int status; - PROBE_RESP data; - hcf_16 length; - hcf_8 *wpa_ie; - /*------------------------------------------------------------------------*/ - - - memset( &wrqu, 0, sizeof( wrqu )); - - /* Retrieve the Association Request IE */ - lp->ltvRecord.len = 45; - lp->ltvRecord.typ = CFG_CUR_ASSOC_REQ_INFO; - - status = hcf_get_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord )); - if( status == HCF_SUCCESS ) - { - length = 0; - memcpy( &data.rawData, &( lp->ltvRecord.u.u8[1] ), 88 ); - wpa_ie = wl_parse_wpa_ie( &data, &length ); - - if( length != 0 ) - { - wrqu.data.length = wpa_ie[1] + 2; - wireless_send_event(dev, IWEVASSOCREQIE, - &wrqu, wpa_ie); - - /* This bit is a hack. We send the respie - * event at the same time */ - wireless_send_event(dev, IWEVASSOCRESPIE, - &wrqu, wpa_ie); - } - } - - return; -} // wl_wext_event_assoc_ie -/*============================================================================*/ -/* Structures to export the Wireless Handlers */ - -static const iw_handler wl_handler[] = -{ - IW_HANDLER(SIOCSIWCOMMIT, (iw_handler) wireless_commit), - IW_HANDLER(SIOCGIWNAME, (iw_handler) wireless_get_protocol), - IW_HANDLER(SIOCSIWFREQ, (iw_handler) wireless_set_frequency), - IW_HANDLER(SIOCGIWFREQ, (iw_handler) wireless_get_frequency), - IW_HANDLER(SIOCSIWMODE, (iw_handler) wireless_set_porttype), - IW_HANDLER(SIOCGIWMODE, (iw_handler) wireless_get_porttype), - IW_HANDLER(SIOCSIWSENS, (iw_handler) wireless_set_sensitivity), - IW_HANDLER(SIOCGIWSENS, (iw_handler) wireless_get_sensitivity), - IW_HANDLER(SIOCGIWRANGE, (iw_handler) wireless_get_range), - IW_HANDLER(SIOCSIWSPY, iw_handler_set_spy), - IW_HANDLER(SIOCGIWSPY, iw_handler_get_spy), -#if 1 //;? (HCF_TYPE) & HCF_TYPE_STA - IW_HANDLER(SIOCGIWAP, (iw_handler) wireless_get_bssid), -#endif - IW_HANDLER(SIOCGIWAPLIST, (iw_handler) wireless_get_ap_list), - IW_HANDLER(SIOCSIWSCAN, (iw_handler) wireless_set_scan), - IW_HANDLER(SIOCGIWSCAN, (iw_handler) wireless_get_scan), - IW_HANDLER(SIOCSIWESSID, (iw_handler) wireless_set_essid), - IW_HANDLER(SIOCGIWESSID, (iw_handler) wireless_get_essid), - IW_HANDLER(SIOCSIWNICKN, (iw_handler) wireless_set_nickname), - IW_HANDLER(SIOCGIWNICKN, (iw_handler) wireless_get_nickname), - IW_HANDLER(SIOCSIWRATE, (iw_handler) wireless_set_rate), - IW_HANDLER(SIOCGIWRATE, (iw_handler) wireless_get_rate), - IW_HANDLER(SIOCSIWRTS, (iw_handler) wireless_set_rts_threshold), - IW_HANDLER(SIOCGIWRTS, (iw_handler) wireless_get_rts_threshold), - IW_HANDLER(SIOCGIWTXPOW, (iw_handler) wireless_get_tx_power), - IW_HANDLER(SIOCSIWENCODE, (iw_handler) wireless_set_encode), - IW_HANDLER(SIOCGIWENCODE, (iw_handler) wireless_get_encode), - IW_HANDLER(SIOCSIWPOWER, (iw_handler) wireless_set_power), - IW_HANDLER(SIOCGIWPOWER, (iw_handler) wireless_get_power), - IW_HANDLER(SIOCSIWGENIE, (iw_handler) wireless_set_genie), - IW_HANDLER(SIOCSIWAUTH, (iw_handler) wireless_set_auth), - IW_HANDLER(SIOCSIWENCODEEXT, (iw_handler) wireless_set_encodeext), -}; - -static const iw_handler wl_private_handler[] = -{ /* SIOCIWFIRSTPRIV + */ - wvlan_set_netname, /* 0: SIOCSIWNETNAME */ - wvlan_get_netname, /* 1: SIOCGIWNETNAME */ - wvlan_set_station_nickname, /* 2: SIOCSIWSTANAME */ - wvlan_get_station_nickname, /* 3: SIOCGIWSTANAME */ -#if 1 //;? (HCF_TYPE) & HCF_TYPE_STA - wvlan_set_porttype, /* 4: SIOCSIWPORTTYPE */ - wvlan_get_porttype, /* 5: SIOCGIWPORTTYPE */ -#endif -}; - -static struct iw_priv_args wl_priv_args[] = { - {SIOCSIWNETNAME, IW_PRIV_TYPE_CHAR | HCF_MAX_NAME_LEN, 0, "snetwork_name" }, - {SIOCGIWNETNAME, 0, IW_PRIV_TYPE_CHAR | HCF_MAX_NAME_LEN, "gnetwork_name" }, - {SIOCSIWSTANAME, IW_PRIV_TYPE_CHAR | HCF_MAX_NAME_LEN, 0, "sstation_name" }, - {SIOCGIWSTANAME, 0, IW_PRIV_TYPE_CHAR | HCF_MAX_NAME_LEN, "gstation_name" }, -#if 1 //;? #if (HCF_TYPE) & HCF_TYPE_STA - {SIOCSIWPORTTYPE, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "sport_type" }, - {SIOCGIWPORTTYPE, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "gport_type" }, -#endif -}; - -const struct iw_handler_def wl_iw_handler_def = -{ - .num_private = sizeof(wl_private_handler) / sizeof(iw_handler), - .private = (iw_handler *) wl_private_handler, - .private_args = (struct iw_priv_args *) wl_priv_args, - .num_private_args = sizeof(wl_priv_args) / sizeof(struct iw_priv_args), - .num_standard = sizeof(wl_handler) / sizeof(iw_handler), - .standard = (iw_handler *) wl_handler, - .get_wireless_stats = wl_get_wireless_stats, -}; diff --git a/drivers/staging/wlags49_h2/wl_wext.h b/drivers/staging/wlags49_h2/wl_wext.h deleted file mode 100644 index 4a85dc889a12..000000000000 --- a/drivers/staging/wlags49_h2/wl_wext.h +++ /dev/null @@ -1,88 +0,0 @@ -/******************************************************************************* - * Agere Systems Inc. - * Wireless device driver for Linux (wlags49). - * - * Copyright (c) 1998-2003 Agere Systems Inc. - * All rights reserved. - * http://www.agere.com - * - * Initially developed by TriplePoint, Inc. - * http://www.triplepoint.com - * - *------------------------------------------------------------------------------ - * - * Header describing information required for the wireless IOCTL handlers. - * - *------------------------------------------------------------------------------ - * - * SOFTWARE LICENSE - * - * This software is provided subject to the following terms and conditions, - * which you should read carefully before using the software. Using this - * software indicates your acceptance of these terms and conditions. If you do - * not agree with these terms and conditions, do not use the software. - * - * Copyright © 2003 Agere Systems Inc. - * All rights reserved. - * - * Redistribution and use in source or binary forms, with or without - * modifications, are permitted provided that the following conditions are met: - * - * . Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following Disclaimer as comments in the code as - * well as in the documentation and/or other materials provided with the - * distribution. - * - * . Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following Disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * . Neither the name of Agere Systems Inc. nor the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * Disclaimer - * - * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY - * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN - * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - ******************************************************************************/ - -#ifndef __WL_WEXT_H__ -#define __WL_WEXT_H__ - - -/******************************************************************************* - * function protoypes - ******************************************************************************/ - -struct iw_statistics *wl_wireless_stats( struct net_device *dev ); - -struct iw_statistics * wl_get_wireless_stats( struct net_device *dev ); - -inline void wl_spy_gather (struct net_device *dev, u_char *mac); - -void wl_wext_event_freq( struct net_device *dev ); -void wl_wext_event_mode( struct net_device *dev ); -void wl_wext_event_essid( struct net_device *dev ); -void wl_wext_event_encode( struct net_device *dev ); -void wl_wext_event_ap( struct net_device *dev ); -void wl_wext_event_scan_complete( struct net_device *dev ); -void wl_wext_event_new_sta( struct net_device *dev ); -void wl_wext_event_expired_sta( struct net_device *dev ); -void wl_wext_event_mic_failed( struct net_device *dev ); -void wl_wext_event_assoc_ie( struct net_device *dev ); - -extern const struct iw_handler_def wl_iw_handler_def; - -#endif /* __WL_WEXT_H__ */ diff --git a/drivers/staging/wlags49_h25/Kconfig b/drivers/staging/wlags49_h25/Kconfig deleted file mode 100644 index dd8dc4d62c64..000000000000 --- a/drivers/staging/wlags49_h25/Kconfig +++ /dev/null @@ -1,11 +0,0 @@ -config WLAGS49_H25 - tristate "Linksys HERMES II.5 WCF54G_Wireless-G_CompactFlash_Card" - depends on WLAN && PCMCIA - select WIRELESS_EXT - select WEXT_SPY - select WEXT_PRIV - ---help--- - Driver for wireless cards using Agere's HERMES II.5 chipset - which are identified with Manufacture ID: 0156,0004 - The software is a modified version of wl_lkm_722_abg.tar.gz - from the Agere Systems website, adapted for Ubuntu 9.04. diff --git a/drivers/staging/wlags49_h25/Makefile b/drivers/staging/wlags49_h25/Makefile deleted file mode 100644 index 513ba01c2d59..000000000000 --- a/drivers/staging/wlags49_h25/Makefile +++ /dev/null @@ -1,52 +0,0 @@ -# -# Makefile for wlags49_h2_cs.ko and wlags49_h25_cs.ko -# -# Default build for Hermes-II base cards (possibly identified with -# "manfid: 0x0156, 0x0003" in "pccardctl ident" output), comment -# -DHERMES25 below -# -# If you want to build for Hermes-II.5 base cards (possibly identified with -# "manfid: 0x0156, 0x0004" in "pccardctl ident" output), uncomment -# -DHERMES25 below -# -# If you want to build AP support (untested), comment out -DSTA_ONLY - -ccflags-y := -I$(KERNELDIR)/include -ccflags-y += -I$(src) \ - -DBUS_PCMCIA \ - -DUSE_WEXT \ - -DSTA_ONLY \ - -DWVLAN_49 \ - -DHERMES25 \ -# -DDBG \ -# -DDBG_LVL=5 \ -# -DUSE_UIL \ -# -DUSE_PROFILE \ - -ifeq ($(findstring HERMES25,$(ccflags-y)),) -WLNAME := wlags49_h2_cs -$(WLNAME)-y := sta_h2.o -ifeq ($(findstring STA_ONLY,$(ccflags-y)),) -$(WLNAME)-y += ap_h2.o -endif -else -WLNAME=wlags49_h25_cs -$(WLNAME)-y := sta_h25.o -ifeq ($(findstring STA_ONLY,$(ccflags-y)),) -$(WLNAME)-y += ap_h25.o -endif -endif - -obj-m += $(WLNAME).o - -$(WLNAME)-y += wl_profile.o \ - wl_wext.o \ - wl_priv.o \ - wl_main.o \ - wl_enc.o \ - wl_util.o \ - wl_netdev.o \ - wl_cs.o \ - mmd.o \ - hcf.o \ - dhf.o diff --git a/drivers/staging/wlags49_h25/README.txt b/drivers/staging/wlags49_h25/README.txt deleted file mode 100644 index 4c7a836972d7..000000000000 --- a/drivers/staging/wlags49_h25/README.txt +++ /dev/null @@ -1,30 +0,0 @@ -======================================================================= -WLAN driver for cards using the HERMES II and HERMES II.5 chipset - -HERMES II Card - -PCMCIA Info: "Agere Systems" "Wireless PC Card Model 0110" - Manufacture ID: 0156,0003 - -HERMES II.5 Card - -PCMCIA Info: "Linksys" "WCF54G_Wireless-G_CompactFlash_Card" - Manufacture ID: 0156,0004 - -Based on Agere Systems Linux LKM Wireless Driver Source Code, -Version 7.22; complies with Open Source BSD License. -======================================================================= - -DESCRIPTION - -This directory only contains files that refer to the source in wlags49_h2. -Only real sourcefiles are the Makefile which has been configured to build -the driver for the HERMES II.5 chipset and Kconfig to describe the driver. - -The wlags49_h2 directory contains the full source, including the files -exclusively used by this driver. - -For more information about the driver look at the wlags49_h2 direcory. - -======================================================================= - diff --git a/drivers/staging/wlags49_h25/TODO b/drivers/staging/wlags49_h25/TODO deleted file mode 100644 index ec71ad3245e4..000000000000 --- a/drivers/staging/wlags49_h25/TODO +++ /dev/null @@ -1,33 +0,0 @@ -First of all, the best thing would be that this driver becomes obsolete by -adding support for Hermes II and Hermes II.5 cards to the existing orinoco -driver. The orinoco driver currently only supports Hermes I based cards. -Since this will not happen by magic and has not happened until now this -driver provides a stop-gap solution for these type of cards. - -Having said that, the following wishlist comes to mind to make the driver -suitable as fully supported kernel driver. Feel free to expand/enhance the -list. - -TODO: - - verify against a Hermes II.5 card - - verify with WPA encryption (both with H2 and H2.5 cards) - - sometimes the card does not initialize correctly, retry mechanisms - are build in to catch most cases but not all - - once the driver runs it is very stable, but I have the impression - some the critical sections take to long - - the driver is split into a Hermes II and a Hermes II.5 part, it - would be nice to handle both with one module instead of two - - review by the wireless developer community - - verify the code against the coding standards for a proper linux - driver - - resolve license issues (?) - -DONE: - - verified against a Hermes II card (Thomson Speedtouch 110 PCMCIA - card) - - verified with WEP encryption - -Please send any patches or complaints about this driver to Greg -Kroah-Hartman and Cc: Henk de Groot -Don't bother the upstream wireless kernel developers about it, they -want nothing to do with it. diff --git a/drivers/staging/wlags49_h25/ap_h25.c b/drivers/staging/wlags49_h25/ap_h25.c deleted file mode 100644 index 0344fa58dda6..000000000000 --- a/drivers/staging/wlags49_h25/ap_h25.c +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/ap_h25.c" diff --git a/drivers/staging/wlags49_h25/debug.h b/drivers/staging/wlags49_h25/debug.h deleted file mode 100644 index b5fb136a2d54..000000000000 --- a/drivers/staging/wlags49_h25/debug.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/debug.h" diff --git a/drivers/staging/wlags49_h25/dhf.c b/drivers/staging/wlags49_h25/dhf.c deleted file mode 100644 index 81762c80189c..000000000000 --- a/drivers/staging/wlags49_h25/dhf.c +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/dhf.c" diff --git a/drivers/staging/wlags49_h25/dhf.h b/drivers/staging/wlags49_h25/dhf.h deleted file mode 100644 index 54181dc70a72..000000000000 --- a/drivers/staging/wlags49_h25/dhf.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/dhf.h" diff --git a/drivers/staging/wlags49_h25/dhfcfg.h b/drivers/staging/wlags49_h25/dhfcfg.h deleted file mode 100644 index 2586e3980214..000000000000 --- a/drivers/staging/wlags49_h25/dhfcfg.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/dhfcfg.h" diff --git a/drivers/staging/wlags49_h25/hcf.c b/drivers/staging/wlags49_h25/hcf.c deleted file mode 100644 index eeeba1f5553e..000000000000 --- a/drivers/staging/wlags49_h25/hcf.c +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/hcf.c" diff --git a/drivers/staging/wlags49_h25/hcf.h b/drivers/staging/wlags49_h25/hcf.h deleted file mode 100644 index d1143d9fce2d..000000000000 --- a/drivers/staging/wlags49_h25/hcf.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/hcf.h" diff --git a/drivers/staging/wlags49_h25/hcfcfg.h b/drivers/staging/wlags49_h25/hcfcfg.h deleted file mode 100644 index f88c4bcb3ff8..000000000000 --- a/drivers/staging/wlags49_h25/hcfcfg.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/hcfcfg.h" diff --git a/drivers/staging/wlags49_h25/hcfdef.h b/drivers/staging/wlags49_h25/hcfdef.h deleted file mode 100644 index f6a0060c3a53..000000000000 --- a/drivers/staging/wlags49_h25/hcfdef.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/hcfdef.h" diff --git a/drivers/staging/wlags49_h25/mdd.h b/drivers/staging/wlags49_h25/mdd.h deleted file mode 100644 index 4d8e142ffa34..000000000000 --- a/drivers/staging/wlags49_h25/mdd.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/mdd.h" diff --git a/drivers/staging/wlags49_h25/mmd.c b/drivers/staging/wlags49_h25/mmd.c deleted file mode 100644 index b20782d334d2..000000000000 --- a/drivers/staging/wlags49_h25/mmd.c +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/mmd.c" diff --git a/drivers/staging/wlags49_h25/mmd.h b/drivers/staging/wlags49_h25/mmd.h deleted file mode 100644 index 8284dd9155ed..000000000000 --- a/drivers/staging/wlags49_h25/mmd.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/mmd.h" diff --git a/drivers/staging/wlags49_h25/sta_h25.c b/drivers/staging/wlags49_h25/sta_h25.c deleted file mode 100644 index 83c76bbdc6e7..000000000000 --- a/drivers/staging/wlags49_h25/sta_h25.c +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/sta_h25.c" diff --git a/drivers/staging/wlags49_h25/wl_cs.c b/drivers/staging/wlags49_h25/wl_cs.c deleted file mode 100644 index e6e1f199ea68..000000000000 --- a/drivers/staging/wlags49_h25/wl_cs.c +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_cs.c" diff --git a/drivers/staging/wlags49_h25/wl_cs.h b/drivers/staging/wlags49_h25/wl_cs.h deleted file mode 100644 index 657acee525cb..000000000000 --- a/drivers/staging/wlags49_h25/wl_cs.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_cs.h" diff --git a/drivers/staging/wlags49_h25/wl_enc.c b/drivers/staging/wlags49_h25/wl_enc.c deleted file mode 100644 index fe59df145150..000000000000 --- a/drivers/staging/wlags49_h25/wl_enc.c +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_enc.c" diff --git a/drivers/staging/wlags49_h25/wl_enc.h b/drivers/staging/wlags49_h25/wl_enc.h deleted file mode 100644 index f2e860e14be9..000000000000 --- a/drivers/staging/wlags49_h25/wl_enc.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_enc.h" diff --git a/drivers/staging/wlags49_h25/wl_if.h b/drivers/staging/wlags49_h25/wl_if.h deleted file mode 100644 index 70d86f09f87a..000000000000 --- a/drivers/staging/wlags49_h25/wl_if.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_if.h" diff --git a/drivers/staging/wlags49_h25/wl_internal.h b/drivers/staging/wlags49_h25/wl_internal.h deleted file mode 100644 index c1687a3056cd..000000000000 --- a/drivers/staging/wlags49_h25/wl_internal.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_internal.h" diff --git a/drivers/staging/wlags49_h25/wl_main.c b/drivers/staging/wlags49_h25/wl_main.c deleted file mode 100644 index d2c06ad8f88a..000000000000 --- a/drivers/staging/wlags49_h25/wl_main.c +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_main.c" diff --git a/drivers/staging/wlags49_h25/wl_main.h b/drivers/staging/wlags49_h25/wl_main.h deleted file mode 100644 index c98376e71957..000000000000 --- a/drivers/staging/wlags49_h25/wl_main.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_main.h" diff --git a/drivers/staging/wlags49_h25/wl_netdev.c b/drivers/staging/wlags49_h25/wl_netdev.c deleted file mode 100644 index f7512c3891a8..000000000000 --- a/drivers/staging/wlags49_h25/wl_netdev.c +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_netdev.c" diff --git a/drivers/staging/wlags49_h25/wl_netdev.h b/drivers/staging/wlags49_h25/wl_netdev.h deleted file mode 100644 index 519cd5f0461c..000000000000 --- a/drivers/staging/wlags49_h25/wl_netdev.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_netdev.h" diff --git a/drivers/staging/wlags49_h25/wl_priv.c b/drivers/staging/wlags49_h25/wl_priv.c deleted file mode 100644 index 160c8014051a..000000000000 --- a/drivers/staging/wlags49_h25/wl_priv.c +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_priv.c" diff --git a/drivers/staging/wlags49_h25/wl_priv.h b/drivers/staging/wlags49_h25/wl_priv.h deleted file mode 100644 index 28492b362db4..000000000000 --- a/drivers/staging/wlags49_h25/wl_priv.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_priv.h" diff --git a/drivers/staging/wlags49_h25/wl_profile.c b/drivers/staging/wlags49_h25/wl_profile.c deleted file mode 100644 index 6baa201c132a..000000000000 --- a/drivers/staging/wlags49_h25/wl_profile.c +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_profile.c" diff --git a/drivers/staging/wlags49_h25/wl_profile.h b/drivers/staging/wlags49_h25/wl_profile.h deleted file mode 100644 index 5f253a5fb60e..000000000000 --- a/drivers/staging/wlags49_h25/wl_profile.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_profile.h" diff --git a/drivers/staging/wlags49_h25/wl_util.c b/drivers/staging/wlags49_h25/wl_util.c deleted file mode 100644 index 771bebeeac4c..000000000000 --- a/drivers/staging/wlags49_h25/wl_util.c +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_util.c" diff --git a/drivers/staging/wlags49_h25/wl_util.h b/drivers/staging/wlags49_h25/wl_util.h deleted file mode 100644 index ccd74e73a4be..000000000000 --- a/drivers/staging/wlags49_h25/wl_util.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_util.h" diff --git a/drivers/staging/wlags49_h25/wl_version.h b/drivers/staging/wlags49_h25/wl_version.h deleted file mode 100644 index ad38e8f7214c..000000000000 --- a/drivers/staging/wlags49_h25/wl_version.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_version.h" diff --git a/drivers/staging/wlags49_h25/wl_wext.c b/drivers/staging/wlags49_h25/wl_wext.c deleted file mode 100644 index f660e791b620..000000000000 --- a/drivers/staging/wlags49_h25/wl_wext.c +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_wext.c" diff --git a/drivers/staging/wlags49_h25/wl_wext.h b/drivers/staging/wlags49_h25/wl_wext.h deleted file mode 100644 index 31d63865c222..000000000000 --- a/drivers/staging/wlags49_h25/wl_wext.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Use common source from wlags49_h2 */ -#include "../wlags49_h2/wl_wext.h" -- cgit v1.2.3 From 3faece9ddcc9dc64e878caf65917c4858d3d852e Mon Sep 17 00:00:00 2001 From: Kevin McKinney Date: Thu, 3 Jul 2014 00:29:56 -0400 Subject: Staging: bcm: Add entry for bcm wimax driver support Add myself and Matthias Beyer as maintainers for the bcm wimax driver. Signed-off-by: Kevin McKinney Signed-off-by: Greg Kroah-Hartman --- MAINTAINERS | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'MAINTAINERS') diff --git a/MAINTAINERS b/MAINTAINERS index 0782374db6d6..70354e960e9f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1781,6 +1781,13 @@ W: http://bcache.evilpiepirate.org S: Maintained: F: drivers/md/bcache/ +BECEEM BCS200/BCS220-3/BCSM250 WIMAX SUPPORT +M: Kevin McKinney +M: Matthias Beyer +L: devel@driverdev.osuosl.org +S: Maintained +F: drivers/staging/bcm* + BEFS FILE SYSTEM S: Orphan F: Documentation/filesystems/befs.txt -- cgit v1.2.3 From f380790c98d6f2b3d5d1f03e6be8697a40409166 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Mon, 7 Jul 2014 17:08:25 -0700 Subject: MAINTAINERS: update staging removals and movements 3 sections have been deleted by various commits. The other, echo, has been moved to drivers/misc. The nominal maintainers of the echo subsystem haven't been modifying the code or acking/signing patches for several years, so don't keep the section either. Signed-off-by: Joe Perches Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- MAINTAINERS | 23 ----------------------- 1 file changed, 23 deletions(-) (limited to 'MAINTAINERS') diff --git a/MAINTAINERS b/MAINTAINERS index 70354e960e9f..01d8eaf9ea84 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -5061,13 +5061,6 @@ S: Maintained F: Documentation/hwmon/k8temp F: drivers/hwmon/k8temp.c -KTAP -M: Jovi Zhangwei -W: http://www.ktap.org -L: ktap@freelists.org -S: Maintained -F: drivers/staging/ktap/ - KCONFIG M: "Yann E. MORIN" L: linux-kbuild@vger.kernel.org @@ -8518,23 +8511,12 @@ L: devel@driverdev.osuosl.org S: Supported F: drivers/staging/ -STAGING - ASUS OLED -M: Jakub Schmidtke -S: Odd Fixes -F: drivers/staging/asus_oled/ - STAGING - COMEDI M: Ian Abbott M: H Hartley Sweeten S: Odd Fixes F: drivers/staging/comedi/ -STAGING - ECHO CANCELLER -M: Steve Underwood -M: David Rowe -S: Odd Fixes -F: drivers/staging/echo/ - STAGING - ET131X NETWORK DRIVER M: Mark Einon S: Odd Fixes @@ -8606,11 +8588,6 @@ L: linux-wireless@vger.kernel.org S: Maintained F: drivers/staging/rtl8723au/ -STAGING - SILICON MOTION SM7XX FRAME BUFFER DRIVER -M: Teddy Wang -S: Odd Fixes -F: drivers/staging/sm7xxfb/ - STAGING - SLICOSS M: Lior Dotan M: Christopher Harrer -- cgit v1.2.3 From 6d825f794206532c56d8bea415eac37b5945024e Mon Sep 17 00:00:00 2001 From: Daeseok Youn Date: Sat, 12 Jul 2014 01:25:42 +0900 Subject: MAINTAINERS: Adds Daeseok Youn to maintainers list for dgap Adds "Daeseok Youn" to maintainers list for dgap driver. Signed-off-by: Daeseok Youn Suggested-by: Dan Carpenter Cc: Greg Kroah-Hartman Signed-off-by: Greg Kroah-Hartman --- MAINTAINERS | 1 + 1 file changed, 1 insertion(+) (limited to 'MAINTAINERS') diff --git a/MAINTAINERS b/MAINTAINERS index 01d8eaf9ea84..e2d311c22230 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2851,6 +2851,7 @@ F: drivers/staging/dgnc/ DIGI EPCA PCI PRODUCTS M: Lidza Louina M: Mark Hounschell +M: Daeseok Youn L: driverdev-devel@linuxdriverproject.org S: Maintained F: drivers/staging/dgap/ -- cgit v1.2.3 From f190be7f39a5e480ddc5e0f49bbe670feb328c32 Mon Sep 17 00:00:00 2001 From: Kristina Martšenko Date: Wed, 16 Jul 2014 02:30:18 +0300 Subject: staging: tidspbridge: remove driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The driver has been broken and disabled for several kernel versions now. It doesn't have a maintainer anymore, and most of the people who've worked on it have moved on. There's also still a long list of issues in the TODO file before it can be moved out of staging. Until someone can put in the work to make the driver work again and move it out of staging, remove it from the kernel. Signed-off-by: Kristina Martšenko Cc: Omar Ramirez Luna Cc: Suman Anna Cc: Felipe Contreras Cc: Ohad Ben-Cohen Signed-off-by: Greg Kroah-Hartman --- MAINTAINERS | 5 - drivers/staging/Kconfig | 2 - drivers/staging/Makefile | 1 - .../staging/tidspbridge/Documentation/CONTRIBUTORS | 45 - drivers/staging/tidspbridge/Documentation/README | 70 - .../staging/tidspbridge/Documentation/error-codes | 157 - drivers/staging/tidspbridge/Kconfig | 69 - drivers/staging/tidspbridge/Makefile | 32 - drivers/staging/tidspbridge/TODO | 18 - drivers/staging/tidspbridge/core/_cmm.h | 45 - drivers/staging/tidspbridge/core/_deh.h | 35 - drivers/staging/tidspbridge/core/_msg_sm.h | 142 - drivers/staging/tidspbridge/core/_tiomap.h | 382 --- drivers/staging/tidspbridge/core/_tiomap_pwr.h | 85 - drivers/staging/tidspbridge/core/chnl_sm.c | 908 ------ drivers/staging/tidspbridge/core/dsp-clock.c | 391 --- drivers/staging/tidspbridge/core/io_sm.c | 2246 --------------- drivers/staging/tidspbridge/core/msg_sm.c | 564 ---- drivers/staging/tidspbridge/core/sync.c | 121 - drivers/staging/tidspbridge/core/tiomap3430.c | 1815 ------------ drivers/staging/tidspbridge/core/tiomap3430_pwr.c | 556 ---- drivers/staging/tidspbridge/core/tiomap_io.c | 440 --- drivers/staging/tidspbridge/core/tiomap_io.h | 104 - drivers/staging/tidspbridge/core/ue_deh.c | 272 -- drivers/staging/tidspbridge/core/wdt.c | 144 - drivers/staging/tidspbridge/dynload/cload.c | 1959 ------------- .../staging/tidspbridge/dynload/dload_internal.h | 344 --- drivers/staging/tidspbridge/dynload/doff.h | 354 --- drivers/staging/tidspbridge/dynload/getsection.c | 407 --- drivers/staging/tidspbridge/dynload/header.h | 49 - drivers/staging/tidspbridge/dynload/module_list.h | 159 - drivers/staging/tidspbridge/dynload/params.h | 226 -- drivers/staging/tidspbridge/dynload/reloc.c | 486 ---- drivers/staging/tidspbridge/dynload/reloc_table.h | 102 - .../tidspbridge/dynload/reloc_table_c6000.c | 257 -- drivers/staging/tidspbridge/dynload/tramp.c | 1143 -------- .../tidspbridge/dynload/tramp_table_c6000.c | 164 -- drivers/staging/tidspbridge/gen/gh.c | 141 - drivers/staging/tidspbridge/hw/EasiGlobal.h | 41 - drivers/staging/tidspbridge/hw/MMUAccInt.h | 76 - drivers/staging/tidspbridge/hw/MMURegAcM.h | 225 -- drivers/staging/tidspbridge/hw/hw_defs.h | 58 - drivers/staging/tidspbridge/hw/hw_mmu.c | 487 ---- drivers/staging/tidspbridge/hw/hw_mmu.h | 160 -- .../tidspbridge/include/dspbridge/_chnl_sm.h | 177 -- .../tidspbridge/include/dspbridge/brddefs.h | 37 - .../tidspbridge/include/dspbridge/cfgdefs.h | 61 - .../staging/tidspbridge/include/dspbridge/chnl.h | 80 - .../tidspbridge/include/dspbridge/chnldefs.h | 63 - .../tidspbridge/include/dspbridge/chnlpriv.h | 85 - .../staging/tidspbridge/include/dspbridge/clk.h | 101 - .../staging/tidspbridge/include/dspbridge/cmm.h | 337 --- .../tidspbridge/include/dspbridge/cmmdefs.h | 104 - .../staging/tidspbridge/include/dspbridge/cod.h | 329 --- .../staging/tidspbridge/include/dspbridge/dbdcd.h | 358 --- .../tidspbridge/include/dspbridge/dbdcddef.h | 78 - .../staging/tidspbridge/include/dspbridge/dbdefs.h | 488 ---- .../staging/tidspbridge/include/dspbridge/dbll.h | 56 - .../tidspbridge/include/dspbridge/dblldefs.h | 431 --- .../staging/tidspbridge/include/dspbridge/dev.h | 620 ---- .../tidspbridge/include/dspbridge/devdefs.h | 26 - .../staging/tidspbridge/include/dspbridge/disp.h | 186 -- .../staging/tidspbridge/include/dspbridge/dmm.h | 71 - .../staging/tidspbridge/include/dspbridge/drv.h | 468 --- .../tidspbridge/include/dspbridge/dspapi-ioctl.h | 467 --- .../staging/tidspbridge/include/dspbridge/dspapi.h | 167 -- .../tidspbridge/include/dspbridge/dspchnl.h | 72 - .../tidspbridge/include/dspbridge/dspdefs.h | 1048 ------- .../staging/tidspbridge/include/dspbridge/dspdeh.h | 43 - .../staging/tidspbridge/include/dspbridge/dspdrv.h | 60 - .../staging/tidspbridge/include/dspbridge/dspio.h | 41 - .../tidspbridge/include/dspbridge/dspioctl.h | 68 - .../staging/tidspbridge/include/dspbridge/dspmsg.h | 56 - .../tidspbridge/include/dspbridge/dynamic_loader.h | 490 ---- .../tidspbridge/include/dspbridge/getsection.h | 108 - drivers/staging/tidspbridge/include/dspbridge/gh.h | 32 - .../tidspbridge/include/dspbridge/host_os.h | 57 - drivers/staging/tidspbridge/include/dspbridge/io.h | 80 - .../staging/tidspbridge/include/dspbridge/io_sm.h | 160 -- .../staging/tidspbridge/include/dspbridge/mbx_sh.h | 144 - .../tidspbridge/include/dspbridge/memdefs.h | 30 - .../staging/tidspbridge/include/dspbridge/mgr.h | 205 -- .../tidspbridge/include/dspbridge/mgrpriv.h | 45 - .../staging/tidspbridge/include/dspbridge/msg.h | 59 - .../tidspbridge/include/dspbridge/msgdefs.h | 29 - .../staging/tidspbridge/include/dspbridge/nldr.h | 55 - .../tidspbridge/include/dspbridge/nldrdefs.h | 259 -- .../staging/tidspbridge/include/dspbridge/node.h | 524 ---- .../tidspbridge/include/dspbridge/nodedefs.h | 28 - .../tidspbridge/include/dspbridge/nodepriv.h | 181 -- .../staging/tidspbridge/include/dspbridge/ntfy.h | 217 -- .../staging/tidspbridge/include/dspbridge/proc.h | 591 ---- .../tidspbridge/include/dspbridge/procpriv.h | 25 - .../staging/tidspbridge/include/dspbridge/pwr.h | 113 - .../include/dspbridge/resourcecleanup.h | 41 - .../staging/tidspbridge/include/dspbridge/rmm.h | 156 - .../staging/tidspbridge/include/dspbridge/rms_sh.h | 86 - .../tidspbridge/include/dspbridge/rmstypes.h | 24 - .../staging/tidspbridge/include/dspbridge/strm.h | 306 -- .../tidspbridge/include/dspbridge/strmdefs.h | 44 - .../staging/tidspbridge/include/dspbridge/sync.h | 119 - .../tidspbridge/include/dspbridge/uuidutil.h | 24 - .../staging/tidspbridge/include/dspbridge/wdt.h | 79 - drivers/staging/tidspbridge/pmgr/chnl.c | 116 - drivers/staging/tidspbridge/pmgr/chnlobj.h | 46 - drivers/staging/tidspbridge/pmgr/cmm.c | 915 ------ drivers/staging/tidspbridge/pmgr/cod.c | 537 ---- drivers/staging/tidspbridge/pmgr/dbll.c | 1421 --------- drivers/staging/tidspbridge/pmgr/dev.c | 969 ------- drivers/staging/tidspbridge/pmgr/dmm.c | 487 ---- drivers/staging/tidspbridge/pmgr/dspapi.c | 1841 ------------ drivers/staging/tidspbridge/pmgr/io.c | 93 - drivers/staging/tidspbridge/pmgr/ioobj.h | 38 - drivers/staging/tidspbridge/pmgr/msg.c | 91 - drivers/staging/tidspbridge/pmgr/msgobj.h | 38 - drivers/staging/tidspbridge/rmgr/dbdcd.c | 1484 ---------- drivers/staging/tidspbridge/rmgr/disp.c | 655 ----- drivers/staging/tidspbridge/rmgr/drv.c | 816 ------ drivers/staging/tidspbridge/rmgr/drv_interface.c | 650 ----- drivers/staging/tidspbridge/rmgr/dspdrv.c | 139 - drivers/staging/tidspbridge/rmgr/mgr.c | 352 --- drivers/staging/tidspbridge/rmgr/nldr.c | 1861 ------------ drivers/staging/tidspbridge/rmgr/node.c | 3031 -------------------- drivers/staging/tidspbridge/rmgr/proc.c | 1836 ------------ drivers/staging/tidspbridge/rmgr/pwr.c | 176 -- drivers/staging/tidspbridge/rmgr/rmm.c | 456 --- drivers/staging/tidspbridge/rmgr/strm.c | 733 ----- 127 files changed, 44757 deletions(-) delete mode 100644 drivers/staging/tidspbridge/Documentation/CONTRIBUTORS delete mode 100644 drivers/staging/tidspbridge/Documentation/README delete mode 100644 drivers/staging/tidspbridge/Documentation/error-codes delete mode 100644 drivers/staging/tidspbridge/Kconfig delete mode 100644 drivers/staging/tidspbridge/Makefile delete mode 100644 drivers/staging/tidspbridge/TODO delete mode 100644 drivers/staging/tidspbridge/core/_cmm.h delete mode 100644 drivers/staging/tidspbridge/core/_deh.h delete mode 100644 drivers/staging/tidspbridge/core/_msg_sm.h delete mode 100644 drivers/staging/tidspbridge/core/_tiomap.h delete mode 100644 drivers/staging/tidspbridge/core/_tiomap_pwr.h delete mode 100644 drivers/staging/tidspbridge/core/chnl_sm.c delete mode 100644 drivers/staging/tidspbridge/core/dsp-clock.c delete mode 100644 drivers/staging/tidspbridge/core/io_sm.c delete mode 100644 drivers/staging/tidspbridge/core/msg_sm.c delete mode 100644 drivers/staging/tidspbridge/core/sync.c delete mode 100644 drivers/staging/tidspbridge/core/tiomap3430.c delete mode 100644 drivers/staging/tidspbridge/core/tiomap3430_pwr.c delete mode 100644 drivers/staging/tidspbridge/core/tiomap_io.c delete mode 100644 drivers/staging/tidspbridge/core/tiomap_io.h delete mode 100644 drivers/staging/tidspbridge/core/ue_deh.c delete mode 100644 drivers/staging/tidspbridge/core/wdt.c delete mode 100644 drivers/staging/tidspbridge/dynload/cload.c delete mode 100644 drivers/staging/tidspbridge/dynload/dload_internal.h delete mode 100644 drivers/staging/tidspbridge/dynload/doff.h delete mode 100644 drivers/staging/tidspbridge/dynload/getsection.c delete mode 100644 drivers/staging/tidspbridge/dynload/header.h delete mode 100644 drivers/staging/tidspbridge/dynload/module_list.h delete mode 100644 drivers/staging/tidspbridge/dynload/params.h delete mode 100644 drivers/staging/tidspbridge/dynload/reloc.c delete mode 100644 drivers/staging/tidspbridge/dynload/reloc_table.h delete mode 100644 drivers/staging/tidspbridge/dynload/reloc_table_c6000.c delete mode 100644 drivers/staging/tidspbridge/dynload/tramp.c delete mode 100644 drivers/staging/tidspbridge/dynload/tramp_table_c6000.c delete mode 100644 drivers/staging/tidspbridge/gen/gh.c delete mode 100644 drivers/staging/tidspbridge/hw/EasiGlobal.h delete mode 100644 drivers/staging/tidspbridge/hw/MMUAccInt.h delete mode 100644 drivers/staging/tidspbridge/hw/MMURegAcM.h delete mode 100644 drivers/staging/tidspbridge/hw/hw_defs.h delete mode 100644 drivers/staging/tidspbridge/hw/hw_mmu.c delete mode 100644 drivers/staging/tidspbridge/hw/hw_mmu.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/_chnl_sm.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/brddefs.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/cfgdefs.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/chnl.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/chnldefs.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/chnlpriv.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/clk.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/cmm.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/cmmdefs.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/cod.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dbdcd.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dbdcddef.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dbdefs.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dbll.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dblldefs.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dev.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/devdefs.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/disp.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dmm.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/drv.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dspapi-ioctl.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dspapi.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dspchnl.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dspdefs.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dspdeh.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dspdrv.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dspio.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dspioctl.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dspmsg.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/dynamic_loader.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/getsection.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/gh.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/host_os.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/io.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/io_sm.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/mbx_sh.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/memdefs.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/mgr.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/mgrpriv.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/msg.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/msgdefs.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/nldr.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/nldrdefs.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/node.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/nodedefs.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/nodepriv.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/ntfy.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/proc.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/procpriv.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/pwr.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/resourcecleanup.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/rmm.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/rms_sh.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/rmstypes.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/strm.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/strmdefs.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/sync.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/uuidutil.h delete mode 100644 drivers/staging/tidspbridge/include/dspbridge/wdt.h delete mode 100644 drivers/staging/tidspbridge/pmgr/chnl.c delete mode 100644 drivers/staging/tidspbridge/pmgr/chnlobj.h delete mode 100644 drivers/staging/tidspbridge/pmgr/cmm.c delete mode 100644 drivers/staging/tidspbridge/pmgr/cod.c delete mode 100644 drivers/staging/tidspbridge/pmgr/dbll.c delete mode 100644 drivers/staging/tidspbridge/pmgr/dev.c delete mode 100644 drivers/staging/tidspbridge/pmgr/dmm.c delete mode 100644 drivers/staging/tidspbridge/pmgr/dspapi.c delete mode 100644 drivers/staging/tidspbridge/pmgr/io.c delete mode 100644 drivers/staging/tidspbridge/pmgr/ioobj.h delete mode 100644 drivers/staging/tidspbridge/pmgr/msg.c delete mode 100644 drivers/staging/tidspbridge/pmgr/msgobj.h delete mode 100644 drivers/staging/tidspbridge/rmgr/dbdcd.c delete mode 100644 drivers/staging/tidspbridge/rmgr/disp.c delete mode 100644 drivers/staging/tidspbridge/rmgr/drv.c delete mode 100644 drivers/staging/tidspbridge/rmgr/drv_interface.c delete mode 100644 drivers/staging/tidspbridge/rmgr/dspdrv.c delete mode 100644 drivers/staging/tidspbridge/rmgr/mgr.c delete mode 100644 drivers/staging/tidspbridge/rmgr/nldr.c delete mode 100644 drivers/staging/tidspbridge/rmgr/node.c delete mode 100644 drivers/staging/tidspbridge/rmgr/proc.c delete mode 100644 drivers/staging/tidspbridge/rmgr/pwr.c delete mode 100644 drivers/staging/tidspbridge/rmgr/rmm.c delete mode 100644 drivers/staging/tidspbridge/rmgr/strm.c (limited to 'MAINTAINERS') diff --git a/MAINTAINERS b/MAINTAINERS index b85ecbea34a8..5ca5b5638495 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8624,11 +8624,6 @@ W: http://www.linux-speakup.org/ S: Odd Fixes F: drivers/staging/speakup/ -STAGING - TI DSP BRIDGE DRIVERS -M: Omar Ramirez Luna -S: Odd Fixes -F: drivers/staging/tidspbridge/ - STAGING - USB ENE SM/MS CARD READER DRIVER M: Al Cho S: Odd Fixes diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index 0fd87443412a..12b092ce0d0f 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -74,8 +74,6 @@ source "drivers/staging/iio/Kconfig" source "drivers/staging/xgifb/Kconfig" -source "drivers/staging/tidspbridge/Kconfig" - source "drivers/staging/quickstart/Kconfig" source "drivers/staging/emxx_udc/Kconfig" diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index 9aeecc9b07e0..29fa5df5b969 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -31,7 +31,6 @@ obj-$(CONFIG_VME_BUS) += vme/ obj-$(CONFIG_DX_SEP) += sep/ obj-$(CONFIG_IIO) += iio/ obj-$(CONFIG_FB_XGI) += xgifb/ -obj-$(CONFIG_TIDSPBRIDGE) += tidspbridge/ obj-$(CONFIG_ACPI_QUICKSTART) += quickstart/ obj-$(CONFIG_USB_EMXX) += emxx_udc/ obj-$(CONFIG_USB_ENESTORAGE) += keucr/ diff --git a/drivers/staging/tidspbridge/Documentation/CONTRIBUTORS b/drivers/staging/tidspbridge/Documentation/CONTRIBUTORS deleted file mode 100644 index 86f578727f91..000000000000 --- a/drivers/staging/tidspbridge/Documentation/CONTRIBUTORS +++ /dev/null @@ -1,45 +0,0 @@ -TI DSP/Bridge Driver - Contributors File - -The DSP/Bridge project wish to thank all of its contributors, current bridge -driver is the result of the work of all of them. If any name is accidentally -omitted, let us know by sending a mail to omar.ramirez@ti.com or -x095840@ti.com. - -Please keep the following list in alphabetical order. - - Suman Anna - Sripal Bagadia - Felipe Balbi - Ohad Ben-Cohen - Phil Carmody - Deepak Chitriki - Felipe Contreras - Hiroshi Doyu - Seth Forshee - Ivan Gomez Castellanos - Mark Grosen - Ramesh Gupta G - Fernando Guzman Lugo - Axel Haslam - Janet Head - Shivananda Hebbar - Hari Kanigeri - Tony Lindgren - Antonio Luna - Hari Nagalla - Nishanth Menon - Ameya Palande - Vijay Pasam - Gilbert Pitney - Omar Ramirez Luna - Ernesto Ramos - Chris Ring - Larry Schiefer - Rebecca Schultz Zavin - Bhavin Shah - Andy Shevchenko - Jeff Taylor - Roman Tereshonkov - Armando Uribe de Leon - Nischal Varide - Wenbiao Wang diff --git a/drivers/staging/tidspbridge/Documentation/README b/drivers/staging/tidspbridge/Documentation/README deleted file mode 100644 index df6d371161e0..000000000000 --- a/drivers/staging/tidspbridge/Documentation/README +++ /dev/null @@ -1,70 +0,0 @@ - Linux DSP/BIOS Bridge release - -DSP/BIOS Bridge overview -======================== - -DSP/BIOS Bridge is designed for platforms that contain a GPP and one or more -attached DSPs. The GPP is considered the master or "host" processor, and the -attached DSPs are processing resources that can be utilized by applications -and drivers running on the GPP. - -The abstraction that DSP/BIOS Bridge supplies, is a direct link between a GPP -program and a DSP task. This communication link is partitioned into two -types of sub-links: messaging (short, fixed-length packets) and data -streaming (multiple, large buffers). Each sub-link operates independently, -and features in-order delivery of data, meaning that messages are delivered -in the order they were submitted to the message link, and stream buffers are -delivered in the order they were submitted to the stream link. - -In addition, a GPP client can specify what inputs and outputs a DSP task -uses. DSP tasks typically use message objects for passing control and status -information and stream objects for efficient streaming of real-time data. - -GPP Software Architecture -========================= - -A GPP application communicates with its associated DSP task running on the -DSP subsystem using the DSP/BIOS Bridge API. For example, a GPP audio -application can use the API to pass messages to a DSP task that is managing -data flowing from analog-to-digital converters (ADCs) to digital-to-analog -converters (DACs). - -From the perspective of the GPP OS, the DSP is treated as just another -peripheral device. Most high level GPP OS typically support a device driver -model, whereby applications can safely access and share a hardware peripheral -through standard driver interfaces. Therefore, to allow multiple GPP -applications to share access to the DSP, the GPP side of DSP/BIOS Bridge -implements a device driver for the DSP. - -Since driver interfaces are not always standard across GPP OS, and to provide -some level of interoperability of application code using DSP/BIOS Bridge -between GPP OS, DSP/BIOS Bridge provides a standard library of APIs which -wrap calls into the device driver. So, rather than calling GPP OS specific -driver interfaces, applications (and even other device drivers) can use the -standard API library directly. - -DSP Software Architecture -========================= - -For DSP/BIOS, DSP/BIOS Bridge adds a device-independent streaming I/O (STRM) -interface, a messaging interface (NODE), and a Resource Manager (RM) Server. -The RM Server runs as a task of DSP/BIOS and is subservient to commands -and queries from the GPP. It executes commands to start and stop DSP signal -processing nodes in response to GPP programs making requests through the -(GPP-side) API. - -DSP tasks started by the RM Server are similar to any other DSP task with two -important differences: they must follow a specific task model consisting of -three C-callable functions (node create, execute, and delete), with specific -sets of arguments, and they have a pre-defined task environment established -by the RM Server. - -Tasks started by the RM Server communicate using the STRM and NODE interfaces -and act as servers for their corresponding GPP clients, performing signal -processing functions as requested by messages sent by their GPP client. -Typically, a DSP task moves data from source devices to sink devices using -device independent I/O streams, performing application-specific processing -and transformations on the data while it is moved. For example, an audio -task might perform audio decompression (ADPCM, MPEG, CELP) on data received -from a GPP audio driver and then send the decompressed linear samples to a -digital-to-analog converter. diff --git a/drivers/staging/tidspbridge/Documentation/error-codes b/drivers/staging/tidspbridge/Documentation/error-codes deleted file mode 100644 index ad73cba058eb..000000000000 --- a/drivers/staging/tidspbridge/Documentation/error-codes +++ /dev/null @@ -1,157 +0,0 @@ - DSP/Bridge Error Code Guide - - -Success code is always taken as 0, except for one case where a success status -different than 0 can be possible, this is when enumerating a series of dsp -objects, if the enumeration doesn't have any more objects it is considered as a -successful case. In this case a positive ENODATA is returned (TODO: Change to -avoid this case). - -Error codes are returned as a negative 1, if an specific code is expected, it -can be propagated to user space by reading errno symbol defined in errno.h, for -specific details on the implementation a copy of the standard used should be -read first. - -The error codes used by this driver are: - -[EPERM] - General driver failure. - - According to the use case the following might apply: - - Device is in 'sleep/suspend' mode due to DPM. - - User cannot mark end of stream on an input channel. - - Requested operation is invalid for the node type. - - Invalid alignment for the node messaging buffer. - - The specified direction is invalid for the stream. - - Invalid stream mode. - -[ENOENT] - The specified object or file was not found. - -[ESRCH] - A shared memory buffer contained in a message or stream could not be mapped - to the GPP client process's virtual space. - -[EIO] - Driver interface I/O error. - - or: - - Unable to plug channel ISR for configured IRQ. - - No free I/O request packets are available. - -[ENXIO] - Unable to find a named section in DSP executable or a non-existent memory - segment identifier was specified. - -[EBADF] - General error for file handling: - - - Unable to open file. - - Unable to read file. - - An error occurred while parsing the DSP executable file. - -[ENOMEM] - A memory allocation failure occurred. - -[EACCES] - - Unable to read content of DCD data section; this is typically caused by - improperly configured nodes. - - Unable to decode DCD data section content; this is typically caused by - changes to DSP/BIOS Bridge data structures. - - Unable to get pointer to DCD data section; this is typically caused by - improperly configured UUIDs. - - Unable to load file containing DCD data section; this is typically - caused by a missing COFF file. - - The specified COFF file does not contain a valid node registration - section. - -[EFAULT] - Invalid pointer or handler. - -[EEXIST] - Attempted to create a channel manager when one already exists. - -[EINVAL] - Invalid argument. - -[ESPIPE] - Symbol not found in the COFF file. DSPNode_Create will return this if - the iAlg function table for an xDAIS socket is not found in the COFF file. - In this case, force the symbol to be linked into the COFF file. - DSPNode_Create, DSPNode_Execute, and DSPNode_Delete will return this if - the create, execute, or delete phase function, respectively, could not be - found in the COFF file. - - - No symbol table is loaded/found for this board. - - Unable to initialize the ZL COFF parsing module. - -[EPIPE] - I/O is currently pending. - - - End of stream was already requested on this output channel. - -[EDOM] - A parameter is specified outside its valid range. - -[ENOSYS] - The indicated operation is not supported. - -[EIDRM] - During enumeration a change in the number or properties of the objects - has occurred. - -[ECHRNG] - Attempt to created channel manager with too many channels or channel ID out - of range. - -[EBADR] - The state of the specified object is incorrect for the requested operation. - - - Invalid segment ID. - -[ENODATA] - Unable to retrieve resource information from the registry. - - - No more registry values. - -[ETIME] - A timeout occurred before the requested operation could complete. - -[ENOSR] - A stream has been issued the maximum number of buffers allowed in the - stream at once; buffers must be reclaimed from the stream before any more - can be issued. - - - No free channels are available. - -[EILSEQ] - Error occurred in a dynamic loader library function. - -[EISCONN] - The Specified Connection already exists. - -[ENOTCONN] - Nodes not connected. - -[ETIMEDOUT] - Timeout occurred waiting for a response from the hardware. - - - Wait for flush operation on an output channel timed out. - -[ECONNREFUSED] - No more connections can be made for this node. - -[EALREADY] - Channel is already in use. - -[EREMOTEIO] - dwTimeOut parameter was CHNL_IOCNOWAIT, yet no I/O completions were - queued. - -[ECANCELED] - I/O has been cancelled on this channel. - -[ENOKEY] - Invalid subkey parameter. - - - UUID not found in registry. diff --git a/drivers/staging/tidspbridge/Kconfig b/drivers/staging/tidspbridge/Kconfig deleted file mode 100644 index b5e74e9de6bd..000000000000 --- a/drivers/staging/tidspbridge/Kconfig +++ /dev/null @@ -1,69 +0,0 @@ -# -# DSP Bridge Driver Support -# - -menuconfig TIDSPBRIDGE - tristate "DSP Bridge driver" - depends on ARCH_OMAP3 && !ARCH_MULTIPLATFORM && BROKEN - select MAILBOX - select OMAP2PLUS_MBOX - help - DSP/BIOS Bridge is designed for platforms that contain a GPP and - one or more attached DSPs. The GPP is considered the master or - "host" processor, and the attached DSPs are processing resources - that can be utilized by applications and drivers running on the GPP. - - This driver depends on OMAP Mailbox (OMAP_MBOX_FWK). - -config TIDSPBRIDGE_DVFS - bool "Enable Bridge Dynamic Voltage and Frequency Scaling (DVFS)" - depends on TIDSPBRIDGE && CPU_FREQ - help - DVFS allows DSP Bridge to initiate the operating point change to - scale the chip voltage and frequency in order to match the - performance and power consumption to the current processing - requirements. - -config TIDSPBRIDGE_MEMPOOL_SIZE - hex "Physical memory pool size (Byte)" - depends on TIDSPBRIDGE - default 0x600000 - help - Allocate specified size of memory at booting time to avoid allocation - failure under heavy memory fragmentation after some use time. - -config TIDSPBRIDGE_RECOVERY - bool "Recovery Support" - depends on TIDSPBRIDGE - default y - help - In case of DSP fatal error, BRIDGE driver will try to - recover itself. - -config TIDSPBRIDGE_CACHE_LINE_CHECK - bool "Check buffers to be 128 byte aligned" - depends on TIDSPBRIDGE - help - When the DSP processes data, the DSP cache controller loads 128-Byte - chunks (lines) from SDRAM and writes the data back in 128-Byte chunks. - If a DMM buffer does not start and end on a 128-Byte boundary, the data - preceding the start address (SA) from the 128-Byte boundary to the SA - and the data at addresses trailing the end address (EA) from the EA to - the next 128-Byte boundary will be loaded and written back as well. - This can lead to heap corruption. Say Y, to enforce the check for 128 - byte alignment, buffers failing this check will be rejected. - -config TIDSPBRIDGE_NTFY_PWRERR - bool "Notify power errors" - depends on TIDSPBRIDGE - help - Enable notifications to registered clients on the event of power error - trying to suspend bridge driver. Say Y, to signal this event as a fatal - error, this will require a bridge restart to recover. - -config TIDSPBRIDGE_BACKTRACE - bool "Dump backtraces on fatal errors" - depends on TIDSPBRIDGE - help - Enable useful information to backtrace fatal errors. Say Y if you - want to dump information for testing purposes. diff --git a/drivers/staging/tidspbridge/Makefile b/drivers/staging/tidspbridge/Makefile deleted file mode 100644 index adb21c53f747..000000000000 --- a/drivers/staging/tidspbridge/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -obj-$(CONFIG_TIDSPBRIDGE) += tidspbridge.o - -libgen = gen/gh.o -libcore = core/chnl_sm.o core/msg_sm.o core/io_sm.o core/tiomap3430.o \ - core/tiomap3430_pwr.o core/tiomap_io.o \ - core/ue_deh.o core/wdt.o core/dsp-clock.o core/sync.o -libpmgr = pmgr/chnl.o pmgr/io.o pmgr/msg.o pmgr/cod.o pmgr/dev.o pmgr/dspapi.o \ - pmgr/dmm.o pmgr/cmm.o pmgr/dbll.o -librmgr = rmgr/dbdcd.o rmgr/disp.o rmgr/drv.o rmgr/mgr.o rmgr/node.o \ - rmgr/proc.o rmgr/pwr.o rmgr/rmm.o rmgr/strm.o rmgr/dspdrv.o \ - rmgr/nldr.o rmgr/drv_interface.o -libdload = dynload/cload.o dynload/getsection.o dynload/reloc.o \ - dynload/tramp.o -libhw = hw/hw_mmu.o - -tidspbridge-y := $(libgen) $(libservices) $(libcore) $(libpmgr) $(librmgr) \ - $(libdload) $(libhw) - -#Machine dependent -ccflags-y += -D_TI_ -D_DB_TIOMAP -DTMS32060 \ - -DTICFG_PROC_VER -DTICFG_EVM_TYPE -DCHNL_SMCLASS \ - -DCHNL_MESSAGES -DUSE_LEVEL_1_MACROS - -ccflags-y += -Idrivers/staging/tidspbridge/include -ccflags-y += -Idrivers/staging/tidspbridge/services -ccflags-y += -Idrivers/staging/tidspbridge/core -ccflags-y += -Idrivers/staging/tidspbridge/pmgr -ccflags-y += -Idrivers/staging/tidspbridge/rmgr -ccflags-y += -Idrivers/staging/tidspbridge/dynload -ccflags-y += -Idrivers/staging/tidspbridge/hw -ccflags-y += -Iarch/arm - diff --git a/drivers/staging/tidspbridge/TODO b/drivers/staging/tidspbridge/TODO deleted file mode 100644 index 1c51e2dc7b56..000000000000 --- a/drivers/staging/tidspbridge/TODO +++ /dev/null @@ -1,18 +0,0 @@ -* Migrate to (and if necessary, extend) existing upstream code such as - iommu, wdt, mcbsp, gptimers -* Decouple hardware-specific code (e.g. bridge_brd_start/stop/delete/monitor) -* DOFF binary loader: consider pushing to user space. at the very least - eliminate the direct filesystem access -* Eliminate general services and libraries - use or extend existing kernel - libraries instead (e.g. gcf/lcm in nldr.c, global helpers in gen/) -* Eliminate direct manipulation of OMAP_SYSC_BASE -* Eliminate DSP_SUCCEEDED macros and their imposed redundant indentations - (adopt the kernel way of checking for return values) -* Audit interfaces exposed to user space -* Audit and clean up header files folder -* Use kernel coding style -* checkpatch.pl fixes -* allocate ext_mem_pool from consistent memory instead of using ioremap - -Please send any patches to Greg Kroah-Hartman -and Omar Ramirez Luna . diff --git a/drivers/staging/tidspbridge/core/_cmm.h b/drivers/staging/tidspbridge/core/_cmm.h deleted file mode 100644 index 7660bef6ebb3..000000000000 --- a/drivers/staging/tidspbridge/core/_cmm.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * _cmm.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Private header file defining CMM manager objects and defines needed - * by IO manager to register shared memory regions when DSP base image - * is loaded(bridge_io_on_loaded). - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _CMM_ -#define _CMM_ - -/* - * These target side symbols define the beginning and ending addresses - * of the section of shared memory used for shared memory manager CMM. - * They are defined in the *cfg.cmd file by cdb code. - */ -#define SHM0_SHARED_BASE_SYM "_SHM0_BEG" -#define SHM0_SHARED_END_SYM "_SHM0_END" -#define SHM0_SHARED_RESERVED_BASE_SYM "_SHM0_RSVDSTRT" - -/* - * Shared Memory Region #0(SHMSEG0) is used in the following way: - * - * |(_SHM0_BEG) | (_SHM0_RSVDSTRT) | (_SHM0_END) - * V V V - * ------------------------------------------------------------ - * | DSP-side allocations | GPP-side allocations | - * ------------------------------------------------------------ - * - * - */ - -#endif /* _CMM_ */ diff --git a/drivers/staging/tidspbridge/core/_deh.h b/drivers/staging/tidspbridge/core/_deh.h deleted file mode 100644 index 025d34320e7e..000000000000 --- a/drivers/staging/tidspbridge/core/_deh.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * _deh.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Private header for DEH module. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * Copyright (C) 2010 Felipe Contreras - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _DEH_ -#define _DEH_ - -#include -#include - -/* DEH Manager: only one created per board: */ -struct deh_mgr { - struct bridge_dev_context *bridge_context; /* Bridge context. */ - struct ntfy_object *ntfy_obj; /* NTFY object */ - - /* MMU Fault DPC */ - struct tasklet_struct dpc_tasklet; -}; - -#endif /* _DEH_ */ diff --git a/drivers/staging/tidspbridge/core/_msg_sm.h b/drivers/staging/tidspbridge/core/_msg_sm.h deleted file mode 100644 index f6e58e3f3b48..000000000000 --- a/drivers/staging/tidspbridge/core/_msg_sm.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - * _msg_sm.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Private header file defining msg_ctrl manager objects and defines needed - * by IO manager. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _MSG_SM_ -#define _MSG_SM_ - -#include -#include - -/* - * These target side symbols define the beginning and ending addresses - * of the section of shared memory used for messages. They are - * defined in the *cfg.cmd file by cdb code. - */ -#define MSG_SHARED_BUFFER_BASE_SYM "_MSG_BEG" -#define MSG_SHARED_BUFFER_LIMIT_SYM "_MSG_END" - -#ifndef _CHNL_WORDSIZE -#define _CHNL_WORDSIZE 4 /* default _CHNL_WORDSIZE is 2 bytes/word */ -#endif - -/* - * ======== msg_ctrl ======== - * There is a control structure for messages to the DSP, and a control - * structure for messages from the DSP. The shared memory region for - * transferring messages is partitioned as follows: - * - * ---------------------------------------------------------- - * |Control | Messages from DSP | Control | Messages to DSP | - * ---------------------------------------------------------- - * - * msg_ctrl control structure for messages to the DSP is used in the following - * way: - * - * buf_empty - This flag is set to FALSE by the GPP after it has output - * messages for the DSP. The DSP host driver sets it to - * TRUE after it has copied the messages. - * post_swi - Set to 1 by the GPP after it has written the messages, - * set the size, and set buf_empty to FALSE. - * The DSP Host driver uses SWI_andn of the post_swi field - * when a host interrupt occurs. The host driver clears - * this after posting the SWI. - * size - Number of messages to be read by the DSP. - * - * For messages from the DSP: - * buf_empty - This flag is set to FALSE by the DSP after it has output - * messages for the GPP. The DPC on the GPP sets it to - * TRUE after it has copied the messages. - * post_swi - Set to 1 the DPC on the GPP after copying the messages. - * size - Number of messages to be read by the GPP. - */ -struct msg_ctrl { - u32 buf_empty; /* to/from DSP buffer is empty */ - u32 post_swi; /* Set to "1" to post msg_ctrl SWI */ - u32 size; /* Number of messages to/from the DSP */ - u32 resvd; -}; - -/* - * ======== msg_mgr ======== - * The msg_mgr maintains a list of all MSG_QUEUEs. Each NODE object can - * have msg_queue to hold all messages that come up from the corresponding - * node on the DSP. The msg_mgr also has a shared queue of messages - * ready to go to the DSP. - */ -struct msg_mgr { - /* The first field must match that in msgobj.h */ - - /* Function interface to Bridge driver */ - struct bridge_drv_interface *intf_fxns; - - struct io_mgr *iomgr; /* IO manager */ - struct list_head queue_list; /* List of MSG_QUEUEs */ - spinlock_t msg_mgr_lock; /* For critical sections */ - /* Signalled when MsgFrame is available */ - struct sync_object *sync_event; - struct list_head msg_free_list; /* Free MsgFrames ready to be filled */ - struct list_head msg_used_list; /* MsgFrames ready to go to DSP */ - u32 msgs_pending; /* # of queued messages to go to DSP */ - u32 max_msgs; /* Max # of msgs that fit in buffer */ - msg_onexit on_exit; /* called when RMS_EXIT is received */ -}; - -/* - * ======== msg_queue ======== - * Each NODE has a msg_queue for receiving messages from the - * corresponding node on the DSP. The msg_queue object maintains a list - * of messages that have been sent to the host, but not yet read (MSG_Get), - * and a list of free frames that can be filled when new messages arrive - * from the DSP. - * The msg_queue's hSynEvent gets posted when a message is ready. - */ -struct msg_queue { - struct list_head list_elem; - struct msg_mgr *msg_mgr; - u32 max_msgs; /* Node message depth */ - u32 msgq_id; /* Node environment pointer */ - struct list_head msg_free_list; /* Free MsgFrames ready to be filled */ - /* Filled MsgFramess waiting to be read */ - struct list_head msg_used_list; - void *arg; /* Handle passed to mgr on_exit callback */ - struct sync_object *sync_event; /* Signalled when message is ready */ - struct sync_object *sync_done; /* For synchronizing cleanup */ - struct sync_object *sync_done_ack; /* For synchronizing cleanup */ - struct ntfy_object *ntfy_obj; /* For notification of message ready */ - bool done; /* TRUE <==> deleting the object */ - u32 io_msg_pend; /* Number of pending MSG_get/put calls */ -}; - -/* - * ======== msg_dspmsg ======== - */ -struct msg_dspmsg { - struct dsp_msg msg; - u32 msgq_id; /* Identifies the node the message goes to */ -}; - -/* - * ======== msg_frame ======== - */ -struct msg_frame { - struct list_head list_elem; - struct msg_dspmsg msg_data; -}; - -#endif /* _MSG_SM_ */ diff --git a/drivers/staging/tidspbridge/core/_tiomap.h b/drivers/staging/tidspbridge/core/_tiomap.h deleted file mode 100644 index 65971b784b78..000000000000 --- a/drivers/staging/tidspbridge/core/_tiomap.h +++ /dev/null @@ -1,382 +0,0 @@ -/* - * _tiomap.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Definitions and types private to this Bridge driver. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _TIOMAP_ -#define _TIOMAP_ - -/* - * XXX These powerdomain.h/clockdomain.h includes are wrong and should - * be removed. No driver should call pwrdm_* or clkdm_* functions - * directly; they should rely on OMAP core code to do this. - */ -#include -#include -/* - * XXX These mach-omap2/ includes are wrong and should be removed. No - * driver should read or write to PRM/CM registers directly; they - * should rely on OMAP core code to do this. - */ -#include -#include -#include -#include -#include -#include /* for bridge_ioctl_extproc defn */ -#include -#include - -struct map_l4_peripheral { - u32 phys_addr; - u32 dsp_virt_addr; -}; - -#define ARM_MAILBOX_START 0xfffcf000 -#define ARM_MAILBOX_LENGTH 0x800 - -/* New Registers in OMAP3.1 */ - -#define TESTBLOCK_ID_START 0xfffed400 -#define TESTBLOCK_ID_LENGTH 0xff - -/* ID Returned by OMAP1510 */ -#define TBC_ID_VALUE 0xB47002F - -#define SPACE_LENGTH 0x2000 -#define API_CLKM_DPLL_DMA 0xfffec000 -#define ARM_INTERRUPT_OFFSET 0xb00 - -#define BIOS24XX - -#define L4_PERIPHERAL_NULL 0x0 -#define DSPVA_PERIPHERAL_NULL 0x0 - -#define MAX_LOCK_TLB_ENTRIES 15 - -#define L4_PERIPHERAL_PRM 0x48306000 /*PRM L4 Peripheral */ -#define DSPVA_PERIPHERAL_PRM 0x1181e000 -#define L4_PERIPHERAL_SCM 0x48002000 /*SCM L4 Peripheral */ -#define DSPVA_PERIPHERAL_SCM 0x1181f000 -#define L4_PERIPHERAL_MMU 0x5D000000 /*MMU L4 Peripheral */ -#define DSPVA_PERIPHERAL_MMU 0x11820000 -#define L4_PERIPHERAL_CM 0x48004000 /* Core L4, Clock Management */ -#define DSPVA_PERIPHERAL_CM 0x1181c000 -#define L4_PERIPHERAL_PER 0x48005000 /* PER */ -#define DSPVA_PERIPHERAL_PER 0x1181d000 - -#define L4_PERIPHERAL_GPIO1 0x48310000 -#define DSPVA_PERIPHERAL_GPIO1 0x11809000 -#define L4_PERIPHERAL_GPIO2 0x49050000 -#define DSPVA_PERIPHERAL_GPIO2 0x1180a000 -#define L4_PERIPHERAL_GPIO3 0x49052000 -#define DSPVA_PERIPHERAL_GPIO3 0x1180b000 -#define L4_PERIPHERAL_GPIO4 0x49054000 -#define DSPVA_PERIPHERAL_GPIO4 0x1180c000 -#define L4_PERIPHERAL_GPIO5 0x49056000 -#define DSPVA_PERIPHERAL_GPIO5 0x1180d000 - -#define L4_PERIPHERAL_IVA2WDT 0x49030000 -#define DSPVA_PERIPHERAL_IVA2WDT 0x1180e000 - -#define L4_PERIPHERAL_DISPLAY 0x48050000 -#define DSPVA_PERIPHERAL_DISPLAY 0x1180f000 - -#define L4_PERIPHERAL_SSI 0x48058000 -#define DSPVA_PERIPHERAL_SSI 0x11804000 -#define L4_PERIPHERAL_GDD 0x48059000 -#define DSPVA_PERIPHERAL_GDD 0x11805000 -#define L4_PERIPHERAL_SS1 0x4805a000 -#define DSPVA_PERIPHERAL_SS1 0x11806000 -#define L4_PERIPHERAL_SS2 0x4805b000 -#define DSPVA_PERIPHERAL_SS2 0x11807000 - -#define L4_PERIPHERAL_CAMERA 0x480BC000 -#define DSPVA_PERIPHERAL_CAMERA 0x11819000 - -#define L4_PERIPHERAL_SDMA 0x48056000 -#define DSPVA_PERIPHERAL_SDMA 0x11810000 /* 0x1181d000 conflict w/ PER */ - -#define L4_PERIPHERAL_UART1 0x4806a000 -#define DSPVA_PERIPHERAL_UART1 0x11811000 -#define L4_PERIPHERAL_UART2 0x4806c000 -#define DSPVA_PERIPHERAL_UART2 0x11812000 -#define L4_PERIPHERAL_UART3 0x49020000 -#define DSPVA_PERIPHERAL_UART3 0x11813000 - -#define L4_PERIPHERAL_MCBSP1 0x48074000 -#define DSPVA_PERIPHERAL_MCBSP1 0x11814000 -#define L4_PERIPHERAL_MCBSP2 0x49022000 -#define DSPVA_PERIPHERAL_MCBSP2 0x11815000 -#define L4_PERIPHERAL_MCBSP3 0x49024000 -#define DSPVA_PERIPHERAL_MCBSP3 0x11816000 -#define L4_PERIPHERAL_MCBSP4 0x49026000 -#define DSPVA_PERIPHERAL_MCBSP4 0x11817000 -#define L4_PERIPHERAL_MCBSP5 0x48096000 -#define DSPVA_PERIPHERAL_MCBSP5 0x11818000 - -#define L4_PERIPHERAL_GPTIMER5 0x49038000 -#define DSPVA_PERIPHERAL_GPTIMER5 0x11800000 -#define L4_PERIPHERAL_GPTIMER6 0x4903a000 -#define DSPVA_PERIPHERAL_GPTIMER6 0x11801000 -#define L4_PERIPHERAL_GPTIMER7 0x4903c000 -#define DSPVA_PERIPHERAL_GPTIMER7 0x11802000 -#define L4_PERIPHERAL_GPTIMER8 0x4903e000 -#define DSPVA_PERIPHERAL_GPTIMER8 0x11803000 - -#define L4_PERIPHERAL_SPI1 0x48098000 -#define DSPVA_PERIPHERAL_SPI1 0x1181a000 -#define L4_PERIPHERAL_SPI2 0x4809a000 -#define DSPVA_PERIPHERAL_SPI2 0x1181b000 - -#define L4_PERIPHERAL_MBOX 0x48094000 -#define DSPVA_PERIPHERAL_MBOX 0x11808000 - -#define PM_GRPSEL_BASE 0x48307000 -#define DSPVA_GRPSEL_BASE 0x11821000 - -#define L4_PERIPHERAL_SIDETONE_MCBSP2 0x49028000 -#define DSPVA_PERIPHERAL_SIDETONE_MCBSP2 0x11824000 -#define L4_PERIPHERAL_SIDETONE_MCBSP3 0x4902a000 -#define DSPVA_PERIPHERAL_SIDETONE_MCBSP3 0x11825000 - -/* define a static array with L4 mappings */ -static const struct map_l4_peripheral l4_peripheral_table[] = { - {L4_PERIPHERAL_MBOX, DSPVA_PERIPHERAL_MBOX}, - {L4_PERIPHERAL_SCM, DSPVA_PERIPHERAL_SCM}, - {L4_PERIPHERAL_MMU, DSPVA_PERIPHERAL_MMU}, - {L4_PERIPHERAL_GPTIMER5, DSPVA_PERIPHERAL_GPTIMER5}, - {L4_PERIPHERAL_GPTIMER6, DSPVA_PERIPHERAL_GPTIMER6}, - {L4_PERIPHERAL_GPTIMER7, DSPVA_PERIPHERAL_GPTIMER7}, - {L4_PERIPHERAL_GPTIMER8, DSPVA_PERIPHERAL_GPTIMER8}, - {L4_PERIPHERAL_GPIO1, DSPVA_PERIPHERAL_GPIO1}, - {L4_PERIPHERAL_GPIO2, DSPVA_PERIPHERAL_GPIO2}, - {L4_PERIPHERAL_GPIO3, DSPVA_PERIPHERAL_GPIO3}, - {L4_PERIPHERAL_GPIO4, DSPVA_PERIPHERAL_GPIO4}, - {L4_PERIPHERAL_GPIO5, DSPVA_PERIPHERAL_GPIO5}, - {L4_PERIPHERAL_IVA2WDT, DSPVA_PERIPHERAL_IVA2WDT}, - {L4_PERIPHERAL_DISPLAY, DSPVA_PERIPHERAL_DISPLAY}, - {L4_PERIPHERAL_SSI, DSPVA_PERIPHERAL_SSI}, - {L4_PERIPHERAL_GDD, DSPVA_PERIPHERAL_GDD}, - {L4_PERIPHERAL_SS1, DSPVA_PERIPHERAL_SS1}, - {L4_PERIPHERAL_SS2, DSPVA_PERIPHERAL_SS2}, - {L4_PERIPHERAL_UART1, DSPVA_PERIPHERAL_UART1}, - {L4_PERIPHERAL_UART2, DSPVA_PERIPHERAL_UART2}, - {L4_PERIPHERAL_UART3, DSPVA_PERIPHERAL_UART3}, - {L4_PERIPHERAL_MCBSP1, DSPVA_PERIPHERAL_MCBSP1}, - {L4_PERIPHERAL_MCBSP2, DSPVA_PERIPHERAL_MCBSP2}, - {L4_PERIPHERAL_MCBSP3, DSPVA_PERIPHERAL_MCBSP3}, - {L4_PERIPHERAL_MCBSP4, DSPVA_PERIPHERAL_MCBSP4}, - {L4_PERIPHERAL_MCBSP5, DSPVA_PERIPHERAL_MCBSP5}, - {L4_PERIPHERAL_CAMERA, DSPVA_PERIPHERAL_CAMERA}, - {L4_PERIPHERAL_SPI1, DSPVA_PERIPHERAL_SPI1}, - {L4_PERIPHERAL_SPI2, DSPVA_PERIPHERAL_SPI2}, - {L4_PERIPHERAL_PRM, DSPVA_PERIPHERAL_PRM}, - {L4_PERIPHERAL_CM, DSPVA_PERIPHERAL_CM}, - {L4_PERIPHERAL_PER, DSPVA_PERIPHERAL_PER}, - {PM_GRPSEL_BASE, DSPVA_GRPSEL_BASE}, - {L4_PERIPHERAL_SIDETONE_MCBSP2, DSPVA_PERIPHERAL_SIDETONE_MCBSP2}, - {L4_PERIPHERAL_SIDETONE_MCBSP3, DSPVA_PERIPHERAL_SIDETONE_MCBSP3}, - {L4_PERIPHERAL_NULL, DSPVA_PERIPHERAL_NULL} -}; - -/* - * 15 10 0 - * --------------------------------- - * |0|0|1|0|0|0|c|c|c|i|i|i|i|i|i|i| - * --------------------------------- - * | (class) | (module specific) | - * - * where c -> Externel Clock Command: Clk & Autoidle Disable/Enable - * i -> External Clock ID Timers 5,6,7,8, McBSP1,2 and WDT3 - */ - -/* MBX_PM_CLK_IDMASK: DSP External clock id mask. */ -#define MBX_PM_CLK_IDMASK 0x7F - -/* MBX_PM_CLK_CMDSHIFT: DSP External clock command shift. */ -#define MBX_PM_CLK_CMDSHIFT 7 - -/* MBX_PM_CLK_CMDMASK: DSP External clock command mask. */ -#define MBX_PM_CLK_CMDMASK 7 - -/* MBX_PM_MAX_RESOURCES: CORE 1 Clock resources. */ -#define MBX_CORE1_RESOURCES 7 - -/* MBX_PM_MAX_RESOURCES: CORE 2 Clock Resources. */ -#define MBX_CORE2_RESOURCES 1 - -/* MBX_PM_MAX_RESOURCES: TOTAL Clock Resources. */ -#define MBX_PM_MAX_RESOURCES 11 - -/* Power Management Commands */ -#define BPWR_DISABLE_CLOCK 0 -#define BPWR_ENABLE_CLOCK 1 - -/* OMAP242x specific resources */ -enum bpwr_ext_clock_id { - BPWR_GP_TIMER5 = 0x10, - BPWR_GP_TIMER6, - BPWR_GP_TIMER7, - BPWR_GP_TIMER8, - BPWR_WD_TIMER3, - BPWR_MCBSP1, - BPWR_MCBSP2, - BPWR_MCBSP3, - BPWR_MCBSP4, - BPWR_MCBSP5, - BPWR_SSI = 0x20 -}; - -static const u32 bpwr_clkid[] = { - (u32) BPWR_GP_TIMER5, - (u32) BPWR_GP_TIMER6, - (u32) BPWR_GP_TIMER7, - (u32) BPWR_GP_TIMER8, - (u32) BPWR_WD_TIMER3, - (u32) BPWR_MCBSP1, - (u32) BPWR_MCBSP2, - (u32) BPWR_MCBSP3, - (u32) BPWR_MCBSP4, - (u32) BPWR_MCBSP5, - (u32) BPWR_SSI -}; - -struct bpwr_clk_t { - u32 clk_id; - enum dsp_clk_id clk; -}; - -static const struct bpwr_clk_t bpwr_clks[] = { - {(u32) BPWR_GP_TIMER5, DSP_CLK_GPT5}, - {(u32) BPWR_GP_TIMER6, DSP_CLK_GPT6}, - {(u32) BPWR_GP_TIMER7, DSP_CLK_GPT7}, - {(u32) BPWR_GP_TIMER8, DSP_CLK_GPT8}, - {(u32) BPWR_WD_TIMER3, DSP_CLK_WDT3}, - {(u32) BPWR_MCBSP1, DSP_CLK_MCBSP1}, - {(u32) BPWR_MCBSP2, DSP_CLK_MCBSP2}, - {(u32) BPWR_MCBSP3, DSP_CLK_MCBSP3}, - {(u32) BPWR_MCBSP4, DSP_CLK_MCBSP4}, - {(u32) BPWR_MCBSP5, DSP_CLK_MCBSP5}, - {(u32) BPWR_SSI, DSP_CLK_SSI} -}; - -/* Interrupt Register Offsets */ -#define INTH_IT_REG_OFFSET 0x00 /* Interrupt register offset */ -#define INTH_MASK_IT_REG_OFFSET 0x04 /* Mask Interrupt reg offset */ - -#define DSP_MAILBOX1_INT 10 -/* - * Bit definition of Interrupt Level Registers - */ - -/* Mail Box defines */ -#define MB_ARM2DSP1_REG_OFFSET 0x00 - -#define MB_ARM2DSP1B_REG_OFFSET 0x04 - -#define MB_DSP2ARM1B_REG_OFFSET 0x0C - -#define MB_ARM2DSP1_FLAG_REG_OFFSET 0x18 - -#define MB_ARM2DSP_FLAG 0x0001 - -#define MBOX_ARM2DSP HW_MBOX_ID0 -#define MBOX_DSP2ARM HW_MBOX_ID1 -#define MBOX_ARM HW_MBOX_U0_ARM -#define MBOX_DSP HW_MBOX_U1_DSP1 - -#define ENABLE true -#define DISABLE false - -#define HIGH_LEVEL true -#define LOW_LEVEL false - -/* Macro's */ -#define CLEAR_BIT(reg, mask) (reg &= ~mask) -#define SET_BIT(reg, mask) (reg |= mask) - -#define SET_GROUP_BITS16(reg, position, width, value) \ - do {\ - reg &= ~((0xFFFF >> (16 - (width))) << (position)); \ - reg |= ((value & (0xFFFF >> (16 - (width)))) << (position)); \ - } while (0); - -#define CLEAR_BIT_INDEX(reg, index) (reg &= ~(1 << (index))) - -/* This Bridge driver's device context: */ -struct bridge_dev_context { - struct dev_object *dev_obj; /* Handle to Bridge device object. */ - u32 dsp_base_addr; /* Arm's API to DSP virt base addr */ - /* - * DSP External memory prog address as seen virtually by the OS on - * the host side. - */ - u32 dsp_ext_base_addr; /* See the comment above */ - u32 api_reg_base; /* API mem map'd registers */ - void __iomem *dsp_mmu_base; /* DSP MMU Mapped registers */ - u32 api_clk_base; /* CLK Registers */ - u32 dsp_clk_m2_base; /* DSP Clock Module m2 */ - u32 public_rhea; /* Pub Rhea */ - u32 int_addr; /* MB INTR reg */ - u32 tc_endianism; /* TC Endianism register */ - u32 test_base; /* DSP MMU Mapped registers */ - u32 self_loop; /* Pointer to the selfloop */ - u32 dsp_start_add; /* API Boot vector */ - u32 internal_size; /* Internal memory size */ - - struct omap_mbox *mbox; /* Mail box handle */ - - struct cfg_hostres *resources; /* Host Resources */ - - /* - * Processor specific info is set when prog loaded and read from DCD. - * [See bridge_dev_ctrl()] PROC info contains DSP-MMU TLB entries. - */ - /* DMMU TLB entries */ - struct bridge_ioctl_extproc atlb_entry[BRDIOCTL_NUMOFMMUTLB]; - u32 brd_state; /* Last known board state. */ - - /* TC Settings */ - bool tc_word_swap_on; /* Traffic Controller Word Swap */ - struct pg_table_attrs *pt_attrs; - u32 dsp_per_clks; -}; - -/* - * If dsp_debug is true, do not branch to the DSP entry - * point and wait for DSP to boot. - */ -extern s32 dsp_debug; - -/* - * ======== sm_interrupt_dsp ======== - * Purpose: - * Set interrupt value & send an interrupt to the DSP processor(s). - * This is typically used when mailbox interrupt mechanisms allow data - * to be associated with interrupt such as for OMAP's CMD/DATA regs. - * Parameters: - * dev_context: Handle to Bridge driver defined device info. - * mb_val: Value associated with interrupt(e.g. mailbox value). - * Returns: - * 0: Interrupt sent; - * else: Unable to send interrupt. - * Requires: - * Ensures: - */ -int sm_interrupt_dsp(struct bridge_dev_context *dev_context, u16 mb_val); - -#endif /* _TIOMAP_ */ diff --git a/drivers/staging/tidspbridge/core/_tiomap_pwr.h b/drivers/staging/tidspbridge/core/_tiomap_pwr.h deleted file mode 100644 index 7bbd3802c15f..000000000000 --- a/drivers/staging/tidspbridge/core/_tiomap_pwr.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * _tiomap_pwr.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Definitions and types for the DSP wake/sleep routines. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _TIOMAP_PWR_ -#define _TIOMAP_PWR_ - -#ifdef CONFIG_PM -extern s32 dsp_test_sleepstate; -#endif - -extern struct mailbox_context mboxsetting; - -/* - * ======== wake_dsp ========= - * Wakes up the DSP from DeepSleep - */ -extern int wake_dsp(struct bridge_dev_context *dev_context, - void *pargs); - -/* - * ======== sleep_dsp ========= - * Places the DSP in DeepSleep. - */ -extern int sleep_dsp(struct bridge_dev_context *dev_context, - u32 dw_cmd, void *pargs); -/* - * ========interrupt_dsp======== - * Sends an interrupt to DSP unconditionally. - */ -extern void interrupt_dsp(struct bridge_dev_context *dev_context, - u16 mb_val); - -/* - * ======== wake_dsp ========= - * Wakes up the DSP from DeepSleep - */ -extern int dsp_peripheral_clk_ctrl(struct bridge_dev_context - *dev_context, void *pargs); -/* - * ======== handle_hibernation_from_dsp ======== - * Handle Hibernation requested from DSP - */ -int handle_hibernation_from_dsp(struct bridge_dev_context *dev_context); -/* - * ======== post_scale_dsp ======== - * Handle Post Scale notification to DSP - */ -int post_scale_dsp(struct bridge_dev_context *dev_context, - void *pargs); -/* - * ======== pre_scale_dsp ======== - * Handle Pre Scale notification to DSP - */ -int pre_scale_dsp(struct bridge_dev_context *dev_context, - void *pargs); -/* - * ======== handle_constraints_set ======== - * Handle constraints request from DSP - */ -int handle_constraints_set(struct bridge_dev_context *dev_context, - void *pargs); - -/* - * ======== dsp_clk_wakeup_event_ctrl ======== - * This function sets the group selction bits for while - * enabling/disabling. - */ -void dsp_clk_wakeup_event_ctrl(u32 clock_id, bool enable); - -#endif /* _TIOMAP_PWR_ */ diff --git a/drivers/staging/tidspbridge/core/chnl_sm.c b/drivers/staging/tidspbridge/core/chnl_sm.c deleted file mode 100644 index c855992f5950..000000000000 --- a/drivers/staging/tidspbridge/core/chnl_sm.c +++ /dev/null @@ -1,908 +0,0 @@ -/* - * chnl_sm.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Implements upper edge functions for Bridge driver channel module. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* - * The lower edge functions must be implemented by the Bridge driver - * writer, and are declared in chnl_sm.h. - * - * Care is taken in this code to prevent simultaneous access to channel - * queues from - * 1. Threads. - * 2. io_dpc(), scheduled from the io_isr() as an event. - * - * This is done primarily by: - * - Semaphores. - * - state flags in the channel object; and - * - ensuring the IO_Dispatch() routine, which is called from both - * CHNL_AddIOReq() and the DPC(if implemented), is not re-entered. - * - * Channel Invariant: - * There is an important invariant condition which must be maintained per - * channel outside of bridge_chnl_get_ioc() and IO_Dispatch(), violation of - * which may cause timeouts and/or failure of function sync_wait_on_event. - * This invariant condition is: - * - * list_empty(&pchnl->io_completions) ==> pchnl->sync_event is reset - * and - * !list_empty(&pchnl->io_completions) ==> pchnl->sync_event is set. - */ - -#include - -/* ----------------------------------- OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- OS Adaptation Layer */ -#include - -/* ----------------------------------- Bridge Driver */ -#include -#include -#include "_tiomap.h" - -/* ----------------------------------- Platform Manager */ -#include - -/* ----------------------------------- Others */ -#include - -/* ----------------------------------- Define for This */ -#define USERMODE_ADDR PAGE_OFFSET - -#define MAILBOX_IRQ INT_MAIL_MPU_IRQ - -/* ----------------------------------- Function Prototypes */ -static int create_chirp_list(struct list_head *list, u32 chirps); - -static void free_chirp_list(struct list_head *list); - -static int search_free_channel(struct chnl_mgr *chnl_mgr_obj, - u32 *chnl); - -/* - * ======== bridge_chnl_add_io_req ======== - * Enqueue an I/O request for data transfer on a channel to the DSP. - * The direction (mode) is specified in the channel object. Note the DSP - * address is specified for channels opened in direct I/O mode. - */ -int bridge_chnl_add_io_req(struct chnl_object *chnl_obj, void *host_buf, - u32 byte_size, u32 buf_size, - u32 dw_dsp_addr, u32 dw_arg) -{ - int status = 0; - struct chnl_object *pchnl = (struct chnl_object *)chnl_obj; - struct chnl_irp *chnl_packet_obj = NULL; - struct bridge_dev_context *dev_ctxt; - struct dev_object *dev_obj; - u8 dw_state; - bool is_eos; - struct chnl_mgr *chnl_mgr_obj; - u8 *host_sys_buf = NULL; - bool sched_dpc = false; - u16 mb_val = 0; - - is_eos = (byte_size == 0); - - /* Validate args */ - if (!host_buf || !pchnl) - return -EFAULT; - - if (is_eos && CHNL_IS_INPUT(pchnl->chnl_mode)) - return -EPERM; - - /* - * Check the channel state: only queue chirp if channel state - * allows it. - */ - dw_state = pchnl->state; - if (dw_state != CHNL_STATEREADY) { - if (dw_state & CHNL_STATECANCEL) - return -ECANCELED; - if ((dw_state & CHNL_STATEEOS) && - CHNL_IS_OUTPUT(pchnl->chnl_mode)) - return -EPIPE; - /* No other possible states left */ - } - - dev_obj = dev_get_first(); - dev_get_bridge_context(dev_obj, &dev_ctxt); - if (!dev_ctxt) - return -EFAULT; - - if (pchnl->chnl_type == CHNL_PCPY && pchnl->chnl_id > 1 && host_buf) { - if (!(host_buf < (void *)USERMODE_ADDR)) { - host_sys_buf = host_buf; - goto func_cont; - } - /* if addr in user mode, then copy to kernel space */ - host_sys_buf = kmalloc(buf_size, GFP_KERNEL); - if (host_sys_buf == NULL) - return -ENOMEM; - - if (CHNL_IS_OUTPUT(pchnl->chnl_mode)) { - status = copy_from_user(host_sys_buf, host_buf, - buf_size); - if (status) { - kfree(host_sys_buf); - host_sys_buf = NULL; - return -EFAULT; - } - } - } -func_cont: - /* Mailbox IRQ is disabled to avoid race condition with DMA/ZCPY - * channels. DPCCS is held to avoid race conditions with PCPY channels. - * If DPC is scheduled in process context (iosm_schedule) and any - * non-mailbox interrupt occurs, that DPC will run and break CS. Hence - * we disable ALL DPCs. We will try to disable ONLY IO DPC later. */ - chnl_mgr_obj = pchnl->chnl_mgr_obj; - spin_lock_bh(&chnl_mgr_obj->chnl_mgr_lock); - omap_mbox_disable_irq(dev_ctxt->mbox, IRQ_RX); - if (pchnl->chnl_type == CHNL_PCPY) { - /* This is a processor-copy channel. */ - if (CHNL_IS_OUTPUT(pchnl->chnl_mode)) { - /* Check buffer size on output channels for fit. */ - if (byte_size > io_buf_size( - pchnl->chnl_mgr_obj->iomgr)) { - status = -EINVAL; - goto out; - } - } - } - - /* Get a free chirp: */ - if (list_empty(&pchnl->free_packets_list)) { - status = -EIO; - goto out; - } - chnl_packet_obj = list_first_entry(&pchnl->free_packets_list, - struct chnl_irp, link); - list_del(&chnl_packet_obj->link); - - /* Enqueue the chirp on the chnl's IORequest queue: */ - chnl_packet_obj->host_user_buf = chnl_packet_obj->host_sys_buf = - host_buf; - if (pchnl->chnl_type == CHNL_PCPY && pchnl->chnl_id > 1) - chnl_packet_obj->host_sys_buf = host_sys_buf; - - /* - * Note: for dma chans dw_dsp_addr contains dsp address - * of SM buffer. - */ - /* DSP address */ - chnl_packet_obj->dsp_tx_addr = dw_dsp_addr / chnl_mgr_obj->word_size; - chnl_packet_obj->byte_size = byte_size; - chnl_packet_obj->buf_size = buf_size; - /* Only valid for output channel */ - chnl_packet_obj->arg = dw_arg; - chnl_packet_obj->status = (is_eos ? CHNL_IOCSTATEOS : - CHNL_IOCSTATCOMPLETE); - list_add_tail(&chnl_packet_obj->link, &pchnl->io_requests); - pchnl->cio_reqs++; - /* - * If end of stream, update the channel state to prevent - * more IOR's. - */ - if (is_eos) - pchnl->state |= CHNL_STATEEOS; - - /* Request IO from the DSP */ - io_request_chnl(chnl_mgr_obj->iomgr, pchnl, - (CHNL_IS_INPUT(pchnl->chnl_mode) ? IO_INPUT : - IO_OUTPUT), &mb_val); - sched_dpc = true; -out: - omap_mbox_enable_irq(dev_ctxt->mbox, IRQ_RX); - spin_unlock_bh(&chnl_mgr_obj->chnl_mgr_lock); - if (mb_val != 0) - sm_interrupt_dsp(dev_ctxt, mb_val); - - /* Schedule a DPC, to do the actual data transfer */ - if (sched_dpc) - iosm_schedule(chnl_mgr_obj->iomgr); - - return status; -} - -/* - * ======== bridge_chnl_cancel_io ======== - * Return all I/O requests to the client which have not yet been - * transferred. The channel's I/O completion object is - * signalled, and all the I/O requests are queued as IOC's, with the - * status field set to CHNL_IOCSTATCANCEL. - * This call is typically used in abort situations, and is a prelude to - * chnl_close(); - */ -int bridge_chnl_cancel_io(struct chnl_object *chnl_obj) -{ - struct chnl_object *pchnl = (struct chnl_object *)chnl_obj; - u32 chnl_id = -1; - s8 chnl_mode; - struct chnl_irp *chirp, *tmp; - struct chnl_mgr *chnl_mgr_obj = NULL; - - /* Check args: */ - if (!pchnl || !pchnl->chnl_mgr_obj) - return -EFAULT; - - chnl_id = pchnl->chnl_id; - chnl_mode = pchnl->chnl_mode; - chnl_mgr_obj = pchnl->chnl_mgr_obj; - - /* Mark this channel as cancelled, to prevent further IORequests or - * IORequests or dispatching. */ - spin_lock_bh(&chnl_mgr_obj->chnl_mgr_lock); - - pchnl->state |= CHNL_STATECANCEL; - - if (list_empty(&pchnl->io_requests)) { - spin_unlock_bh(&chnl_mgr_obj->chnl_mgr_lock); - return 0; - } - - if (pchnl->chnl_type == CHNL_PCPY) { - /* Indicate we have no more buffers available for transfer: */ - if (CHNL_IS_INPUT(pchnl->chnl_mode)) { - io_cancel_chnl(chnl_mgr_obj->iomgr, chnl_id); - } else { - /* Record that we no longer have output buffers - * available: */ - chnl_mgr_obj->output_mask &= ~(1 << chnl_id); - } - } - /* Move all IOR's to IOC queue: */ - list_for_each_entry_safe(chirp, tmp, &pchnl->io_requests, link) { - list_del(&chirp->link); - chirp->byte_size = 0; - chirp->status |= CHNL_IOCSTATCANCEL; - list_add_tail(&chirp->link, &pchnl->io_completions); - pchnl->cio_cs++; - pchnl->cio_reqs--; - } - - spin_unlock_bh(&chnl_mgr_obj->chnl_mgr_lock); - - return 0; -} - -/* - * ======== bridge_chnl_close ======== - * Purpose: - * Ensures all pending I/O on this channel is cancelled, discards all - * queued I/O completion notifications, then frees the resources allocated - * for this channel, and makes the corresponding logical channel id - * available for subsequent use. - */ -int bridge_chnl_close(struct chnl_object *chnl_obj) -{ - int status; - struct chnl_object *pchnl = (struct chnl_object *)chnl_obj; - - /* Check args: */ - if (!pchnl) - return -EFAULT; - /* Cancel IO: this ensures no further IO requests or notifications */ - status = bridge_chnl_cancel_io(chnl_obj); - if (status) - return status; - /* Invalidate channel object: Protects from CHNL_GetIOCompletion() */ - /* Free the slot in the channel manager: */ - pchnl->chnl_mgr_obj->channels[pchnl->chnl_id] = NULL; - spin_lock_bh(&pchnl->chnl_mgr_obj->chnl_mgr_lock); - pchnl->chnl_mgr_obj->open_channels -= 1; - spin_unlock_bh(&pchnl->chnl_mgr_obj->chnl_mgr_lock); - if (pchnl->ntfy_obj) { - ntfy_delete(pchnl->ntfy_obj); - kfree(pchnl->ntfy_obj); - pchnl->ntfy_obj = NULL; - } - /* Reset channel event: (NOTE: user_event freed in user context) */ - if (pchnl->sync_event) { - sync_reset_event(pchnl->sync_event); - kfree(pchnl->sync_event); - pchnl->sync_event = NULL; - } - /* Free I/O request and I/O completion queues: */ - free_chirp_list(&pchnl->io_completions); - pchnl->cio_cs = 0; - - free_chirp_list(&pchnl->io_requests); - pchnl->cio_reqs = 0; - - free_chirp_list(&pchnl->free_packets_list); - - /* Release channel object. */ - kfree(pchnl); - - return status; -} - -/* - * ======== bridge_chnl_create ======== - * Create a channel manager object, responsible for opening new channels - * and closing old ones for a given board. - */ -int bridge_chnl_create(struct chnl_mgr **channel_mgr, - struct dev_object *hdev_obj, - const struct chnl_mgrattrs *mgr_attrts) -{ - int status = 0; - struct chnl_mgr *chnl_mgr_obj = NULL; - u8 max_channels; - - /* Allocate channel manager object */ - chnl_mgr_obj = kzalloc(sizeof(struct chnl_mgr), GFP_KERNEL); - if (chnl_mgr_obj) { - /* - * The max_channels attr must equal the # of supported chnls for - * each transport(# chnls for PCPY = DDMA = ZCPY): i.e. - * mgr_attrts->max_channels = CHNL_MAXCHANNELS = - * DDMA_MAXDDMACHNLS = DDMA_MAXZCPYCHNLS. - */ - max_channels = CHNL_MAXCHANNELS + CHNL_MAXCHANNELS * CHNL_PCPY; - /* Create array of channels */ - chnl_mgr_obj->channels = kzalloc(sizeof(struct chnl_object *) - * max_channels, GFP_KERNEL); - if (chnl_mgr_obj->channels) { - /* Initialize chnl_mgr object */ - chnl_mgr_obj->type = CHNL_TYPESM; - chnl_mgr_obj->word_size = mgr_attrts->word_size; - /* Total # chnls supported */ - chnl_mgr_obj->max_channels = max_channels; - chnl_mgr_obj->open_channels = 0; - chnl_mgr_obj->output_mask = 0; - chnl_mgr_obj->last_output = 0; - chnl_mgr_obj->dev_obj = hdev_obj; - spin_lock_init(&chnl_mgr_obj->chnl_mgr_lock); - } else { - status = -ENOMEM; - } - } else { - status = -ENOMEM; - } - - if (status) { - bridge_chnl_destroy(chnl_mgr_obj); - *channel_mgr = NULL; - } else { - /* Return channel manager object to caller... */ - *channel_mgr = chnl_mgr_obj; - } - return status; -} - -/* - * ======== bridge_chnl_destroy ======== - * Purpose: - * Close all open channels, and destroy the channel manager. - */ -int bridge_chnl_destroy(struct chnl_mgr *hchnl_mgr) -{ - int status = 0; - struct chnl_mgr *chnl_mgr_obj = hchnl_mgr; - u32 chnl_id; - - if (hchnl_mgr) { - /* Close all open channels: */ - for (chnl_id = 0; chnl_id < chnl_mgr_obj->max_channels; - chnl_id++) { - status = - bridge_chnl_close(chnl_mgr_obj->channels - [chnl_id]); - if (status) - dev_dbg(bridge, "%s: Error status 0x%x\n", - __func__, status); - } - - /* Free channel manager object: */ - kfree(chnl_mgr_obj->channels); - - /* Set hchnl_mgr to NULL in device object. */ - dev_set_chnl_mgr(chnl_mgr_obj->dev_obj, NULL); - /* Free this Chnl Mgr object: */ - kfree(hchnl_mgr); - } else { - status = -EFAULT; - } - return status; -} - -/* - * ======== bridge_chnl_flush_io ======== - * purpose: - * Flushes all the outstanding data requests on a channel. - */ -int bridge_chnl_flush_io(struct chnl_object *chnl_obj, u32 timeout) -{ - int status = 0; - struct chnl_object *pchnl = (struct chnl_object *)chnl_obj; - s8 chnl_mode = -1; - struct chnl_mgr *chnl_mgr_obj; - struct chnl_ioc chnl_ioc_obj; - /* Check args: */ - if (pchnl) { - if ((timeout == CHNL_IOCNOWAIT) - && CHNL_IS_OUTPUT(pchnl->chnl_mode)) { - status = -EINVAL; - } else { - chnl_mode = pchnl->chnl_mode; - chnl_mgr_obj = pchnl->chnl_mgr_obj; - } - } else { - status = -EFAULT; - } - if (!status) { - /* Note: Currently, if another thread continues to add IO - * requests to this channel, this function will continue to - * flush all such queued IO requests. */ - if (CHNL_IS_OUTPUT(chnl_mode) - && (pchnl->chnl_type == CHNL_PCPY)) { - /* Wait for IO completions, up to the specified - * timeout: */ - while (!list_empty(&pchnl->io_requests) && !status) { - status = bridge_chnl_get_ioc(chnl_obj, - timeout, &chnl_ioc_obj); - if (status) - continue; - - if (chnl_ioc_obj.status & CHNL_IOCSTATTIMEOUT) - status = -ETIMEDOUT; - - } - } else { - status = bridge_chnl_cancel_io(chnl_obj); - /* Now, leave the channel in the ready state: */ - pchnl->state &= ~CHNL_STATECANCEL; - } - } - return status; -} - -/* - * ======== bridge_chnl_get_info ======== - * Purpose: - * Retrieve information related to a channel. - */ -int bridge_chnl_get_info(struct chnl_object *chnl_obj, - struct chnl_info *channel_info) -{ - int status = 0; - struct chnl_object *pchnl = (struct chnl_object *)chnl_obj; - - if (channel_info != NULL) { - if (pchnl) { - /* Return the requested information: */ - channel_info->chnl_mgr = pchnl->chnl_mgr_obj; - channel_info->event_obj = pchnl->user_event; - channel_info->cnhl_id = pchnl->chnl_id; - channel_info->mode = pchnl->chnl_mode; - channel_info->bytes_tx = pchnl->bytes_moved; - channel_info->process = pchnl->process; - channel_info->sync_event = pchnl->sync_event; - channel_info->cio_cs = pchnl->cio_cs; - channel_info->cio_reqs = pchnl->cio_reqs; - channel_info->state = pchnl->state; - } else { - status = -EFAULT; - } - } else { - status = -EFAULT; - } - return status; -} - -/* - * ======== bridge_chnl_get_ioc ======== - * Optionally wait for I/O completion on a channel. Dequeue an I/O - * completion record, which contains information about the completed - * I/O request. - * Note: Ensures Channel Invariant (see notes above). - */ -int bridge_chnl_get_ioc(struct chnl_object *chnl_obj, u32 timeout, - struct chnl_ioc *chan_ioc) -{ - int status = 0; - struct chnl_object *pchnl = (struct chnl_object *)chnl_obj; - struct chnl_irp *chnl_packet_obj; - int stat_sync; - bool dequeue_ioc = true; - struct chnl_ioc ioc = { NULL, 0, 0, 0, 0 }; - u8 *host_sys_buf = NULL; - struct bridge_dev_context *dev_ctxt; - struct dev_object *dev_obj; - - /* Check args: */ - if (!chan_ioc || !pchnl) { - status = -EFAULT; - } else if (timeout == CHNL_IOCNOWAIT) { - if (list_empty(&pchnl->io_completions)) - status = -EREMOTEIO; - - } - - dev_obj = dev_get_first(); - dev_get_bridge_context(dev_obj, &dev_ctxt); - if (!dev_ctxt) - status = -EFAULT; - - if (status) - goto func_end; - - ioc.status = CHNL_IOCSTATCOMPLETE; - if (timeout != - CHNL_IOCNOWAIT && list_empty(&pchnl->io_completions)) { - if (timeout == CHNL_IOCINFINITE) - timeout = SYNC_INFINITE; - - stat_sync = sync_wait_on_event(pchnl->sync_event, timeout); - if (stat_sync == -ETIME) { - /* No response from DSP */ - ioc.status |= CHNL_IOCSTATTIMEOUT; - dequeue_ioc = false; - } else if (stat_sync == -EPERM) { - /* This can occur when the user mode thread is - * aborted (^C), or when _VWIN32_WaitSingleObject() - * fails due to unknown causes. */ - /* Even though Wait failed, there may be something in - * the Q: */ - if (list_empty(&pchnl->io_completions)) { - ioc.status |= CHNL_IOCSTATCANCEL; - dequeue_ioc = false; - } - } - } - /* See comment in AddIOReq */ - spin_lock_bh(&pchnl->chnl_mgr_obj->chnl_mgr_lock); - omap_mbox_disable_irq(dev_ctxt->mbox, IRQ_RX); - if (dequeue_ioc) { - /* Dequeue IOC and set chan_ioc; */ - chnl_packet_obj = list_first_entry(&pchnl->io_completions, - struct chnl_irp, link); - list_del(&chnl_packet_obj->link); - /* Update chan_ioc from channel state and chirp: */ - pchnl->cio_cs--; - /* - * If this is a zero-copy channel, then set IOC's pbuf - * to the DSP's address. This DSP address will get - * translated to user's virtual addr later. - */ - host_sys_buf = chnl_packet_obj->host_sys_buf; - ioc.buf = chnl_packet_obj->host_user_buf; - ioc.byte_size = chnl_packet_obj->byte_size; - ioc.buf_size = chnl_packet_obj->buf_size; - ioc.arg = chnl_packet_obj->arg; - ioc.status |= chnl_packet_obj->status; - /* Place the used chirp on the free list: */ - list_add_tail(&chnl_packet_obj->link, - &pchnl->free_packets_list); - } else { - ioc.buf = NULL; - ioc.byte_size = 0; - ioc.arg = 0; - ioc.buf_size = 0; - } - /* Ensure invariant: If any IOC's are queued for this channel... */ - if (!list_empty(&pchnl->io_completions)) { - /* Since DSPStream_Reclaim() does not take a timeout - * parameter, we pass the stream's timeout value to - * bridge_chnl_get_ioc. We cannot determine whether or not - * we have waited in user mode. Since the stream's timeout - * value may be non-zero, we still have to set the event. - * Therefore, this optimization is taken out. - * - * if (timeout == CHNL_IOCNOWAIT) { - * ... ensure event is set.. - * sync_set_event(pchnl->sync_event); - * } */ - sync_set_event(pchnl->sync_event); - } else { - /* else, if list is empty, ensure event is reset. */ - sync_reset_event(pchnl->sync_event); - } - omap_mbox_enable_irq(dev_ctxt->mbox, IRQ_RX); - spin_unlock_bh(&pchnl->chnl_mgr_obj->chnl_mgr_lock); - if (dequeue_ioc - && (pchnl->chnl_type == CHNL_PCPY && pchnl->chnl_id > 1)) { - if (!(ioc.buf < (void *)USERMODE_ADDR)) - goto func_cont; - - /* If the addr is in user mode, then copy it */ - if (!host_sys_buf || !ioc.buf) { - status = -EFAULT; - goto func_cont; - } - if (!CHNL_IS_INPUT(pchnl->chnl_mode)) - goto func_cont1; - - /*host_user_buf */ - status = copy_to_user(ioc.buf, host_sys_buf, ioc.byte_size); - if (status) { - if (current->flags & PF_EXITING) - status = 0; - } - if (status) - status = -EFAULT; -func_cont1: - kfree(host_sys_buf); - } -func_cont: - /* Update User's IOC block: */ - *chan_ioc = ioc; -func_end: - return status; -} - -/* - * ======== bridge_chnl_get_mgr_info ======== - * Retrieve information related to the channel manager. - */ -int bridge_chnl_get_mgr_info(struct chnl_mgr *hchnl_mgr, u32 ch_id, - struct chnl_mgrinfo *mgr_info) -{ - struct chnl_mgr *chnl_mgr_obj = (struct chnl_mgr *)hchnl_mgr; - - if (!mgr_info || !hchnl_mgr) - return -EFAULT; - - if (ch_id > CHNL_MAXCHANNELS) - return -ECHRNG; - - /* Return the requested information: */ - mgr_info->chnl_obj = chnl_mgr_obj->channels[ch_id]; - mgr_info->open_channels = chnl_mgr_obj->open_channels; - mgr_info->type = chnl_mgr_obj->type; - /* total # of chnls */ - mgr_info->max_channels = chnl_mgr_obj->max_channels; - - return 0; -} - -/* - * ======== bridge_chnl_idle ======== - * Idles a particular channel. - */ -int bridge_chnl_idle(struct chnl_object *chnl_obj, u32 timeout, - bool flush_data) -{ - s8 chnl_mode; - struct chnl_mgr *chnl_mgr_obj; - int status = 0; - - chnl_mode = chnl_obj->chnl_mode; - chnl_mgr_obj = chnl_obj->chnl_mgr_obj; - - if (CHNL_IS_OUTPUT(chnl_mode) && !flush_data) { - /* Wait for IO completions, up to the specified timeout: */ - status = bridge_chnl_flush_io(chnl_obj, timeout); - } else { - status = bridge_chnl_cancel_io(chnl_obj); - - /* Reset the byte count and put channel back in ready state. */ - chnl_obj->bytes_moved = 0; - chnl_obj->state &= ~CHNL_STATECANCEL; - } - - return status; -} - -/* - * ======== bridge_chnl_open ======== - * Open a new half-duplex channel to the DSP board. - */ -int bridge_chnl_open(struct chnl_object **chnl, - struct chnl_mgr *hchnl_mgr, s8 chnl_mode, - u32 ch_id, const struct chnl_attr *pattrs) -{ - int status = 0; - struct chnl_mgr *chnl_mgr_obj = hchnl_mgr; - struct chnl_object *pchnl = NULL; - struct sync_object *sync_event = NULL; - - *chnl = NULL; - - /* Validate Args: */ - if (!pattrs->uio_reqs) - return -EINVAL; - - if (!hchnl_mgr) - return -EFAULT; - - if (ch_id != CHNL_PICKFREE) { - if (ch_id >= chnl_mgr_obj->max_channels) - return -ECHRNG; - if (chnl_mgr_obj->channels[ch_id] != NULL) - return -EALREADY; - } else { - /* Check for free channel */ - status = search_free_channel(chnl_mgr_obj, &ch_id); - if (status) - return status; - } - - - /* Create channel object: */ - pchnl = kzalloc(sizeof(struct chnl_object), GFP_KERNEL); - if (!pchnl) - return -ENOMEM; - - /* Protect queues from io_dpc: */ - pchnl->state = CHNL_STATECANCEL; - - /* Allocate initial IOR and IOC queues: */ - status = create_chirp_list(&pchnl->free_packets_list, - pattrs->uio_reqs); - if (status) - goto out_err; - - INIT_LIST_HEAD(&pchnl->io_requests); - INIT_LIST_HEAD(&pchnl->io_completions); - - pchnl->chnl_packets = pattrs->uio_reqs; - pchnl->cio_cs = 0; - pchnl->cio_reqs = 0; - - sync_event = kzalloc(sizeof(struct sync_object), GFP_KERNEL); - if (!sync_event) { - status = -ENOMEM; - goto out_err; - } - sync_init_event(sync_event); - - pchnl->ntfy_obj = kmalloc(sizeof(struct ntfy_object), GFP_KERNEL); - if (!pchnl->ntfy_obj) { - status = -ENOMEM; - goto out_err; - } - ntfy_init(pchnl->ntfy_obj); - - /* Initialize CHNL object fields: */ - pchnl->chnl_mgr_obj = chnl_mgr_obj; - pchnl->chnl_id = ch_id; - pchnl->chnl_mode = chnl_mode; - pchnl->user_event = sync_event; - pchnl->sync_event = sync_event; - /* Get the process handle */ - pchnl->process = current->tgid; - pchnl->cb_arg = 0; - pchnl->bytes_moved = 0; - /* Default to proc-copy */ - pchnl->chnl_type = CHNL_PCPY; - - /* Insert channel object in channel manager: */ - chnl_mgr_obj->channels[pchnl->chnl_id] = pchnl; - spin_lock_bh(&chnl_mgr_obj->chnl_mgr_lock); - chnl_mgr_obj->open_channels++; - spin_unlock_bh(&chnl_mgr_obj->chnl_mgr_lock); - /* Return result... */ - pchnl->state = CHNL_STATEREADY; - *chnl = pchnl; - - return status; - -out_err: - /* Free memory */ - free_chirp_list(&pchnl->io_completions); - free_chirp_list(&pchnl->io_requests); - free_chirp_list(&pchnl->free_packets_list); - - kfree(sync_event); - - if (pchnl->ntfy_obj) { - ntfy_delete(pchnl->ntfy_obj); - kfree(pchnl->ntfy_obj); - pchnl->ntfy_obj = NULL; - } - kfree(pchnl); - - return status; -} - -/* - * ======== bridge_chnl_register_notify ======== - * Registers for events on a particular channel. - */ -int bridge_chnl_register_notify(struct chnl_object *chnl_obj, - u32 event_mask, u32 notify_type, - struct dsp_notification *hnotification) -{ - int status = 0; - - - if (event_mask) - status = ntfy_register(chnl_obj->ntfy_obj, hnotification, - event_mask, notify_type); - else - status = ntfy_unregister(chnl_obj->ntfy_obj, hnotification); - - return status; -} - -/* - * ======== create_chirp_list ======== - * Purpose: - * Initialize a queue of channel I/O Request/Completion packets. - * Parameters: - * list: Pointer to a list_head - * chirps: Number of Chirps to allocate. - * Returns: - * 0 if successful, error code otherwise. - * Requires: - * Ensures: - */ -static int create_chirp_list(struct list_head *list, u32 chirps) -{ - struct chnl_irp *chirp; - u32 i; - - INIT_LIST_HEAD(list); - - /* Make N chirps and place on queue. */ - for (i = 0; i < chirps; i++) { - chirp = kzalloc(sizeof(struct chnl_irp), GFP_KERNEL); - if (!chirp) - break; - list_add_tail(&chirp->link, list); - } - - /* If we couldn't allocate all chirps, free those allocated: */ - if (i != chirps) { - free_chirp_list(list); - return -ENOMEM; - } - - return 0; -} - -/* - * ======== free_chirp_list ======== - * Purpose: - * Free the queue of Chirps. - */ -static void free_chirp_list(struct list_head *chirp_list) -{ - struct chnl_irp *chirp, *tmp; - - list_for_each_entry_safe(chirp, tmp, chirp_list, link) { - list_del(&chirp->link); - kfree(chirp); - } -} - -/* - * ======== search_free_channel ======== - * Search for a free channel slot in the array of channel pointers. - */ -static int search_free_channel(struct chnl_mgr *chnl_mgr_obj, - u32 *chnl) -{ - int status = -ENOSR; - u32 i; - - for (i = 0; i < chnl_mgr_obj->max_channels; i++) { - if (chnl_mgr_obj->channels[i] == NULL) { - status = 0; - *chnl = i; - break; - } - } - - return status; -} diff --git a/drivers/staging/tidspbridge/core/dsp-clock.c b/drivers/staging/tidspbridge/core/dsp-clock.c deleted file mode 100644 index a1aca4416ca7..000000000000 --- a/drivers/staging/tidspbridge/core/dsp-clock.c +++ /dev/null @@ -1,391 +0,0 @@ -/* - * clk.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Clock and Timer services. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#define L4_34XX_BASE 0x48000000 - -#include - -/* ----------------------------------- Host OS */ -#include -#include -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include -#include -#include -#include "_tiomap.h" - -/* ----------------------------------- This */ -#include - -/* ----------------------------------- Defines, Data Structures, Typedefs */ - -#define OMAP_SSI_OFFSET 0x58000 -#define OMAP_SSI_SIZE 0x1000 -#define OMAP_SSI_SYSCONFIG_OFFSET 0x10 - -#define SSI_AUTOIDLE (1 << 0) -#define SSI_SIDLE_SMARTIDLE (2 << 3) -#define SSI_MIDLE_NOIDLE (1 << 12) - -/* Clk types requested by the dsp */ -#define IVA2_CLK 0 -#define GPT_CLK 1 -#define WDT_CLK 2 -#define MCBSP_CLK 3 -#define SSI_CLK 4 - -/* Bridge GPT id (1 - 4), DM Timer id (5 - 8) */ -#define DMT_ID(id) ((id) + 4) -#define DM_TIMER_CLOCKS 4 - -/* Bridge MCBSP id (6 - 10), OMAP Mcbsp id (0 - 4) */ -#define MCBSP_ID(id) ((id) - 6) - -static struct omap_dm_timer *timer[4]; - -struct clk *iva2_clk; - -struct dsp_ssi { - struct clk *sst_fck; - struct clk *ssr_fck; - struct clk *ick; -}; - -static struct dsp_ssi ssi; - -static u32 dsp_clocks; - -static inline u32 is_dsp_clk_active(u32 clk, u8 id) -{ - return clk & (1 << id); -} - -static inline void set_dsp_clk_active(u32 *clk, u8 id) -{ - *clk |= (1 << id); -} - -static inline void set_dsp_clk_inactive(u32 *clk, u8 id) -{ - *clk &= ~(1 << id); -} - -static s8 get_clk_type(u8 id) -{ - s8 type; - - if (id == DSP_CLK_IVA2) - type = IVA2_CLK; - else if (id <= DSP_CLK_GPT8) - type = GPT_CLK; - else if (id == DSP_CLK_WDT3) - type = WDT_CLK; - else if (id <= DSP_CLK_MCBSP5) - type = MCBSP_CLK; - else if (id == DSP_CLK_SSI) - type = SSI_CLK; - else - type = -1; - - return type; -} - -/* - * ======== dsp_clk_exit ======== - * Purpose: - * Cleanup CLK module. - */ -void dsp_clk_exit(void) -{ - int i; - - dsp_clock_disable_all(dsp_clocks); - - for (i = 0; i < DM_TIMER_CLOCKS; i++) - omap_dm_timer_free(timer[i]); - - clk_unprepare(iva2_clk); - clk_put(iva2_clk); - clk_unprepare(ssi.sst_fck); - clk_put(ssi.sst_fck); - clk_unprepare(ssi.ssr_fck); - clk_put(ssi.ssr_fck); - clk_unprepare(ssi.ick); - clk_put(ssi.ick); -} - -/* - * ======== dsp_clk_init ======== - * Purpose: - * Initialize CLK module. - */ -void dsp_clk_init(void) -{ - static struct platform_device dspbridge_device; - int i, id; - - dspbridge_device.dev.bus = &platform_bus_type; - - for (i = 0, id = 5; i < DM_TIMER_CLOCKS; i++, id++) - timer[i] = omap_dm_timer_request_specific(id); - - iva2_clk = clk_get(&dspbridge_device.dev, "iva2_ck"); - if (IS_ERR(iva2_clk)) - dev_err(bridge, "failed to get iva2 clock %p\n", iva2_clk); - else - clk_prepare(iva2_clk); - - ssi.sst_fck = clk_get(&dspbridge_device.dev, "ssi_sst_fck"); - ssi.ssr_fck = clk_get(&dspbridge_device.dev, "ssi_ssr_fck"); - ssi.ick = clk_get(&dspbridge_device.dev, "ssi_ick"); - - if (IS_ERR(ssi.sst_fck) || IS_ERR(ssi.ssr_fck) || IS_ERR(ssi.ick)) { - dev_err(bridge, "failed to get ssi: sst %p, ssr %p, ick %p\n", - ssi.sst_fck, ssi.ssr_fck, ssi.ick); - } else { - clk_prepare(ssi.sst_fck); - clk_prepare(ssi.ssr_fck); - clk_prepare(ssi.ick); - } -} - -/** - * dsp_gpt_wait_overflow - set gpt overflow and wait for fixed timeout - * @clk_id: GP Timer clock id. - * @load: Overflow value. - * - * Sets an overflow interrupt for the desired GPT waiting for a timeout - * of 5 msecs for the interrupt to occur. - */ -void dsp_gpt_wait_overflow(short int clk_id, unsigned int load) -{ - struct omap_dm_timer *gpt = timer[clk_id - 1]; - unsigned long timeout; - - if (!gpt) - return; - - /* Enable overflow interrupt */ - omap_dm_timer_set_int_enable(gpt, OMAP_TIMER_INT_OVERFLOW); - - /* - * Set counter value to overflow counter after - * one tick and start timer. - */ - omap_dm_timer_set_load_start(gpt, 0, load); - - /* Wait 80us for timer to overflow */ - udelay(80); - - timeout = msecs_to_jiffies(5); - /* Check interrupt status and wait for interrupt */ - while (!(omap_dm_timer_read_status(gpt) & OMAP_TIMER_INT_OVERFLOW)) { - if (time_is_after_jiffies(timeout)) { - pr_err("%s: GPTimer interrupt failed\n", __func__); - break; - } - } -} - -/* - * ======== dsp_clk_enable ======== - * Purpose: - * Enable Clock . - * - */ -int dsp_clk_enable(enum dsp_clk_id clk_id) -{ - int status = 0; - - if (is_dsp_clk_active(dsp_clocks, clk_id)) { - dev_err(bridge, "WARN: clock id %d already enabled\n", clk_id); - goto out; - } - - switch (get_clk_type(clk_id)) { - case IVA2_CLK: - clk_enable(iva2_clk); - break; - case GPT_CLK: - status = omap_dm_timer_start(timer[clk_id - 1]); - break; -#ifdef CONFIG_SND_OMAP_SOC_MCBSP - case MCBSP_CLK: - omap_mcbsp_request(MCBSP_ID(clk_id)); - omap2_mcbsp_set_clks_src(MCBSP_ID(clk_id), MCBSP_CLKS_PAD_SRC); - break; -#endif - case WDT_CLK: - dev_err(bridge, "ERROR: DSP requested to enable WDT3 clk\n"); - break; - case SSI_CLK: - clk_enable(ssi.sst_fck); - clk_enable(ssi.ssr_fck); - clk_enable(ssi.ick); - - /* - * The SSI module need to configured not to have the Forced - * idle for master interface. If it is set to forced idle, - * the SSI module is transitioning to standby thereby causing - * the client in the DSP hang waiting for the SSI module to - * be active after enabling the clocks - */ - ssi_clk_prepare(true); - break; - default: - dev_err(bridge, "Invalid clock id for enable\n"); - status = -EPERM; - } - - if (!status) - set_dsp_clk_active(&dsp_clocks, clk_id); - -out: - return status; -} - -/** - * dsp_clock_enable_all - Enable clocks used by the DSP - * @dev_context Driver's device context strucure - * - * This function enables all the peripheral clocks that were requested by DSP. - */ -u32 dsp_clock_enable_all(u32 dsp_per_clocks) -{ - u32 clk_id; - u32 status = -EPERM; - - for (clk_id = 0; clk_id < DSP_CLK_NOT_DEFINED; clk_id++) { - if (is_dsp_clk_active(dsp_per_clocks, clk_id)) - status = dsp_clk_enable(clk_id); - } - - return status; -} - -/* - * ======== dsp_clk_disable ======== - * Purpose: - * Disable the clock. - * - */ -int dsp_clk_disable(enum dsp_clk_id clk_id) -{ - int status = 0; - - if (!is_dsp_clk_active(dsp_clocks, clk_id)) { - dev_err(bridge, "ERR: clock id %d already disabled\n", clk_id); - goto out; - } - - switch (get_clk_type(clk_id)) { - case IVA2_CLK: - clk_disable(iva2_clk); - break; - case GPT_CLK: - status = omap_dm_timer_stop(timer[clk_id - 1]); - break; -#ifdef CONFIG_SND_OMAP_SOC_MCBSP - case MCBSP_CLK: - omap2_mcbsp_set_clks_src(MCBSP_ID(clk_id), MCBSP_CLKS_PRCM_SRC); - omap_mcbsp_free(MCBSP_ID(clk_id)); - break; -#endif - case WDT_CLK: - dev_err(bridge, "ERROR: DSP requested to disable WDT3 clk\n"); - break; - case SSI_CLK: - ssi_clk_prepare(false); - ssi_clk_prepare(false); - clk_disable(ssi.sst_fck); - clk_disable(ssi.ssr_fck); - clk_disable(ssi.ick); - break; - default: - dev_err(bridge, "Invalid clock id for disable\n"); - status = -EPERM; - } - - if (!status) - set_dsp_clk_inactive(&dsp_clocks, clk_id); - -out: - return status; -} - -/** - * dsp_clock_disable_all - Disable all active clocks - * @dev_context Driver's device context structure - * - * This function disables all the peripheral clocks that were enabled by DSP. - * It is meant to be called only when DSP is entering hibernation or when DSP - * is in error state. - */ -u32 dsp_clock_disable_all(u32 dsp_per_clocks) -{ - u32 clk_id; - u32 status = -EPERM; - - for (clk_id = 0; clk_id < DSP_CLK_NOT_DEFINED; clk_id++) { - if (is_dsp_clk_active(dsp_per_clocks, clk_id)) - status = dsp_clk_disable(clk_id); - } - - return status; -} - -u32 dsp_clk_get_iva2_rate(void) -{ - u32 clk_speed_khz; - - clk_speed_khz = clk_get_rate(iva2_clk); - clk_speed_khz /= 1000; - dev_dbg(bridge, "%s: clk speed Khz = %d\n", __func__, clk_speed_khz); - - return clk_speed_khz; -} - -void ssi_clk_prepare(bool FLAG) -{ - void __iomem *ssi_base; - unsigned int value; - - ssi_base = ioremap(L4_34XX_BASE + OMAP_SSI_OFFSET, OMAP_SSI_SIZE); - if (!ssi_base) { - pr_err("%s: error, SSI not configured\n", __func__); - return; - } - - if (FLAG) { - /* Set Autoidle, SIDLEMode to smart idle, and MIDLEmode to - * no idle - */ - value = SSI_AUTOIDLE | SSI_SIDLE_SMARTIDLE | SSI_MIDLE_NOIDLE; - } else { - /* Set Autoidle, SIDLEMode to forced idle, and MIDLEmode to - * forced idle - */ - value = SSI_AUTOIDLE; - } - - __raw_writel(value, ssi_base + OMAP_SSI_SYSCONFIG_OFFSET); - iounmap(ssi_base); -} - diff --git a/drivers/staging/tidspbridge/core/io_sm.c b/drivers/staging/tidspbridge/core/io_sm.c deleted file mode 100644 index 42f94e157efd..000000000000 --- a/drivers/staging/tidspbridge/core/io_sm.c +++ /dev/null @@ -1,2246 +0,0 @@ -/* - * io_sm.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * IO dispatcher for a shared memory channel driver. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* - * Channel Invariant: - * There is an important invariant condition which must be maintained per - * channel outside of bridge_chnl_get_ioc() and IO_Dispatch(), violation of - * which may cause timeouts and/or failure of the sync_wait_on_event - * function. - */ -#include -#include - -/* Host OS */ -#include -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* Services Layer */ -#include -#include - -/* Hardware Abstraction Layer */ -#include -#include - -/* Bridge Driver */ -#include -#include -#include -#include -#include <_tiomap.h> -#include -#include <_tiomap_pwr.h> - -/* Platform Manager */ -#include -#include -#include - -/* Others */ -#include -#include -#include -#include "_cmm.h" -#include "module_list.h" - -/* This */ -#include -#include "_msg_sm.h" - -/* Defines, Data Structures, Typedefs */ -#define OUTPUTNOTREADY 0xffff -#define NOTENABLED 0xffff /* Channel(s) not enabled */ - -#define EXTEND "_EXT_END" - -#define SWAP_WORD(x) (x) -#define UL_PAGE_ALIGN_SIZE 0x10000 /* Page Align Size */ - -#define MAX_PM_REQS 32 - -#define MMU_FAULT_HEAD1 0xa5a5a5a5 -#define MMU_FAULT_HEAD2 0x96969696 -#define POLL_MAX 1000 -#define MAX_MMU_DBGBUFF 10240 - -/* IO Manager: only one created per board */ -struct io_mgr { - /* These four fields must be the first fields in a io_mgr_ struct */ - /* Bridge device context */ - struct bridge_dev_context *bridge_context; - /* Function interface to Bridge driver */ - struct bridge_drv_interface *intf_fxns; - struct dev_object *dev_obj; /* Device this board represents */ - - /* These fields initialized in bridge_io_create() */ - struct chnl_mgr *chnl_mgr; - struct shm *shared_mem; /* Shared Memory control */ - u8 *input; /* Address of input channel */ - u8 *output; /* Address of output channel */ - struct msg_mgr *msg_mgr; /* Message manager */ - /* Msg control for from DSP messages */ - struct msg_ctrl *msg_input_ctrl; - /* Msg control for to DSP messages */ - struct msg_ctrl *msg_output_ctrl; - u8 *msg_input; /* Address of input messages */ - u8 *msg_output; /* Address of output messages */ - u32 sm_buf_size; /* Size of a shared memory I/O channel */ - bool shared_irq; /* Is this IRQ shared? */ - u32 word_size; /* Size in bytes of DSP word */ - u16 intr_val; /* Interrupt value */ - /* Private extnd proc info; mmu setup */ - struct mgr_processorextinfo ext_proc_info; - struct cmm_object *cmm_mgr; /* Shared Mem Mngr */ - struct work_struct io_workq; /* workqueue */ -#if defined(CONFIG_TIDSPBRIDGE_BACKTRACE) - u32 trace_buffer_begin; /* Trace message start address */ - u32 trace_buffer_end; /* Trace message end address */ - u32 trace_buffer_current; /* Trace message current address */ - u32 gpp_read_pointer; /* GPP Read pointer to Trace buffer */ - u8 *msg; - u32 gpp_va; - u32 dsp_va; -#endif - /* IO Dpc */ - u32 dpc_req; /* Number of requested DPC's. */ - u32 dpc_sched; /* Number of executed DPC's. */ - struct tasklet_struct dpc_tasklet; - spinlock_t dpc_lock; - -}; - -struct shm_symbol_val { - u32 shm_base; - u32 shm_lim; - u32 msg_base; - u32 msg_lim; - u32 shm0_end; - u32 dyn_ext; - u32 ext_end; -}; - -/* Function Prototypes */ -static void io_dispatch_pm(struct io_mgr *pio_mgr); -static void notify_chnl_complete(struct chnl_object *pchnl, - struct chnl_irp *chnl_packet_obj); -static void input_chnl(struct io_mgr *pio_mgr, struct chnl_object *pchnl, - u8 io_mode); -static void output_chnl(struct io_mgr *pio_mgr, struct chnl_object *pchnl, - u8 io_mode); -static void input_msg(struct io_mgr *pio_mgr, struct msg_mgr *hmsg_mgr); -static void output_msg(struct io_mgr *pio_mgr, struct msg_mgr *hmsg_mgr); -static u32 find_ready_output(struct chnl_mgr *chnl_mgr_obj, - struct chnl_object *pchnl, u32 mask); - -/* Bus Addr (cached kernel) */ -static int register_shm_segs(struct io_mgr *hio_mgr, - struct cod_manager *cod_man, - u32 dw_gpp_base_pa); - -static inline void set_chnl_free(struct shm *sm, u32 chnl) -{ - sm->host_free_mask &= ~(1 << chnl); -} - -static inline void set_chnl_busy(struct shm *sm, u32 chnl) -{ - sm->host_free_mask |= 1 << chnl; -} - - -/* - * ======== bridge_io_create ======== - * Create an IO manager object. - */ -int bridge_io_create(struct io_mgr **io_man, - struct dev_object *hdev_obj, - const struct io_attrs *mgr_attrts) -{ - struct io_mgr *pio_mgr = NULL; - struct bridge_dev_context *hbridge_context = NULL; - struct cfg_devnode *dev_node_obj; - struct chnl_mgr *hchnl_mgr; - u8 dev_type; - - /* Check requirements */ - if (!io_man || !mgr_attrts || mgr_attrts->word_size == 0) - return -EFAULT; - - *io_man = NULL; - - dev_get_chnl_mgr(hdev_obj, &hchnl_mgr); - if (!hchnl_mgr || hchnl_mgr->iomgr) - return -EFAULT; - - /* - * Message manager will be created when a file is loaded, since - * size of message buffer in shared memory is configurable in - * the base image. - */ - dev_get_bridge_context(hdev_obj, &hbridge_context); - if (!hbridge_context) - return -EFAULT; - - dev_get_dev_type(hdev_obj, &dev_type); - - /* Allocate IO manager object */ - pio_mgr = kzalloc(sizeof(struct io_mgr), GFP_KERNEL); - if (!pio_mgr) - return -ENOMEM; - - /* Initialize chnl_mgr object */ - pio_mgr->chnl_mgr = hchnl_mgr; - pio_mgr->word_size = mgr_attrts->word_size; - - if (dev_type == DSP_UNIT) { - /* Create an IO DPC */ - tasklet_init(&pio_mgr->dpc_tasklet, io_dpc, (u32) pio_mgr); - - /* Initialize DPC counters */ - pio_mgr->dpc_req = 0; - pio_mgr->dpc_sched = 0; - - spin_lock_init(&pio_mgr->dpc_lock); - - if (dev_get_dev_node(hdev_obj, &dev_node_obj)) { - bridge_io_destroy(pio_mgr); - return -EIO; - } - } - - pio_mgr->bridge_context = hbridge_context; - pio_mgr->shared_irq = mgr_attrts->irq_shared; - if (dsp_wdt_init()) { - bridge_io_destroy(pio_mgr); - return -EPERM; - } - - /* Return IO manager object to caller... */ - hchnl_mgr->iomgr = pio_mgr; - *io_man = pio_mgr; - - return 0; -} - -/* - * ======== bridge_io_destroy ======== - * Purpose: - * Disable interrupts, destroy the IO manager. - */ -int bridge_io_destroy(struct io_mgr *hio_mgr) -{ - int status = 0; - - if (hio_mgr) { - /* Free IO DPC object */ - tasklet_kill(&hio_mgr->dpc_tasklet); - -#if defined(CONFIG_TIDSPBRIDGE_BACKTRACE) - kfree(hio_mgr->msg); -#endif - dsp_wdt_exit(); - /* Free this IO manager object */ - kfree(hio_mgr); - } else { - status = -EFAULT; - } - - return status; -} - -struct shm_symbol_val *_get_shm_symbol_values(struct io_mgr *hio_mgr) -{ - struct shm_symbol_val *s; - struct cod_manager *cod_man; - int status; - - s = kzalloc(sizeof(*s), GFP_KERNEL); - if (!s) - return ERR_PTR(-ENOMEM); - - status = dev_get_cod_mgr(hio_mgr->dev_obj, &cod_man); - if (status) - goto free_symbol; - - /* Get start and length of channel part of shared memory */ - status = cod_get_sym_value(cod_man, CHNL_SHARED_BUFFER_BASE_SYM, - &s->shm_base); - if (status) - goto free_symbol; - - status = cod_get_sym_value(cod_man, CHNL_SHARED_BUFFER_LIMIT_SYM, - &s->shm_lim); - if (status) - goto free_symbol; - - if (s->shm_lim <= s->shm_base) { - status = -EINVAL; - goto free_symbol; - } - - /* Get start and length of message part of shared memory */ - status = cod_get_sym_value(cod_man, MSG_SHARED_BUFFER_BASE_SYM, - &s->msg_base); - if (status) - goto free_symbol; - - status = cod_get_sym_value(cod_man, MSG_SHARED_BUFFER_LIMIT_SYM, - &s->msg_lim); - if (status) - goto free_symbol; - - if (s->msg_lim <= s->msg_base) { - status = -EINVAL; - goto free_symbol; - } - -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE - status = cod_get_sym_value(cod_man, DSP_TRACESEC_END, &s->shm0_end); -#else - status = cod_get_sym_value(cod_man, SHM0_SHARED_END_SYM, &s->shm0_end); -#endif - if (status) - goto free_symbol; - - status = cod_get_sym_value(cod_man, DYNEXTBASE, &s->dyn_ext); - if (status) - goto free_symbol; - - status = cod_get_sym_value(cod_man, EXTEND, &s->ext_end); - if (status) - goto free_symbol; - - return s; - -free_symbol: - kfree(s); - return ERR_PTR(status); -} - -/* - * ======== bridge_io_on_loaded ======== - * Purpose: - * Called when a new program is loaded to get shared memory buffer - * parameters from COFF file. ulSharedBufferBase and ulSharedBufferLimit - * are in DSP address units. - */ -int bridge_io_on_loaded(struct io_mgr *hio_mgr) -{ - struct bridge_dev_context *dc = hio_mgr->bridge_context; - struct cfg_hostres *cfg_res = dc->resources; - struct bridge_ioctl_extproc *eproc; - struct cod_manager *cod_man; - struct chnl_mgr *hchnl_mgr; - struct msg_mgr *hmsg_mgr; - struct shm_symbol_val *s; - int status; - u8 num_procs; - s32 ndx; - u32 i; - u32 mem_sz, msg_sz, pad_sz, shm_sz, shm_base_offs; - u32 seg0_sz, seg1_sz; - u32 pa, va, da; - u32 pa_curr, va_curr, da_curr; - u32 bytes; - u32 all_bits = 0; - u32 page_size[] = { - HW_PAGE_SIZE16MB, HW_PAGE_SIZE1MB, - HW_PAGE_SIZE64KB, HW_PAGE_SIZE4KB - }; - u32 map_attrs = DSP_MAPLITTLEENDIAN | DSP_MAPPHYSICALADDR | - DSP_MAPELEMSIZE32 | DSP_MAPDONOTLOCK; - - status = dev_get_cod_mgr(hio_mgr->dev_obj, &cod_man); - if (status) - return status; - - hchnl_mgr = hio_mgr->chnl_mgr; - - /* The message manager is destroyed when the board is stopped */ - dev_get_msg_mgr(hio_mgr->dev_obj, &hio_mgr->msg_mgr); - hmsg_mgr = hio_mgr->msg_mgr; - if (!hchnl_mgr || !hmsg_mgr) - return -EFAULT; - - if (hio_mgr->shared_mem) - hio_mgr->shared_mem = NULL; - - s = _get_shm_symbol_values(hio_mgr); - if (IS_ERR(s)) - return PTR_ERR(s); - - /* Get total length in bytes */ - shm_sz = (s->shm_lim - s->shm_base + 1) * hio_mgr->word_size; - - /* Calculate size of a PROCCOPY shared memory region */ - dev_dbg(bridge, "%s: (proc)proccopy shmmem size: 0x%x bytes\n", - __func__, shm_sz - sizeof(struct shm)); - - /* Length (bytes) of messaging part of shared memory */ - msg_sz = (s->msg_lim - s->msg_base + 1) * hio_mgr->word_size; - - /* Total length (bytes) of shared memory: chnl + msg */ - mem_sz = shm_sz + msg_sz; - - /* Get memory reserved in host resources */ - (void)mgr_enum_processor_info(0, - (struct dsp_processorinfo *) - &hio_mgr->ext_proc_info, - sizeof(struct mgr_processorextinfo), - &num_procs); - - /* IO supports only one DSP for now */ - if (num_procs != 1) { - status = -EINVAL; - goto free_symbol; - } - - /* The first MMU TLB entry(TLB_0) in DCD is ShmBase */ - pa = cfg_res->mem_phys[1]; - va = cfg_res->mem_base[1]; - - /* This is the virtual uncached ioremapped address!!! */ - /* Why can't we directly take the DSPVA from the symbols? */ - da = hio_mgr->ext_proc_info.ty_tlb[0].dsp_virt; - seg0_sz = (s->shm0_end - da) * hio_mgr->word_size; - seg1_sz = (s->ext_end - s->dyn_ext) * hio_mgr->word_size; - - /* 4K align */ - seg1_sz = (seg1_sz + 0xFFF) & (~0xFFFUL); - - /* 64K align */ - seg0_sz = (seg0_sz + 0xFFFF) & (~0xFFFFUL); - - pad_sz = UL_PAGE_ALIGN_SIZE - ((pa + seg1_sz) % UL_PAGE_ALIGN_SIZE); - if (pad_sz == UL_PAGE_ALIGN_SIZE) - pad_sz = 0x0; - - dev_dbg(bridge, "%s: pa %x, va %x, da %x\n", __func__, pa, va, da); - dev_dbg(bridge, - "shm0_end %x, dyn_ext %x, ext_end %x, seg0_sz %x seg1_sz %x\n", - s->shm0_end, s->dyn_ext, s->ext_end, seg0_sz, seg1_sz); - - if ((seg0_sz + seg1_sz + pad_sz) > cfg_res->mem_length[1]) { - pr_err("%s: shm Error, reserved 0x%x required 0x%x\n", - __func__, cfg_res->mem_length[1], - seg0_sz + seg1_sz + pad_sz); - status = -ENOMEM; - goto free_symbol; - } - - pa_curr = pa; - va_curr = s->dyn_ext * hio_mgr->word_size; - da_curr = va; - bytes = seg1_sz; - - /* - * Try to fit into TLB entries. If not possible, push them to page - * tables. It is quite possible that if sections are not on - * bigger page boundary, we may end up making several small pages. - * So, push them onto page tables, if that is the case. - */ - while (bytes) { - /* - * To find the max. page size with which both PA & VA are - * aligned. - */ - all_bits = pa_curr | va_curr; - dev_dbg(bridge, - "seg all_bits %x, pa_curr %x, va_curr %x, bytes %x\n", - all_bits, pa_curr, va_curr, bytes); - - for (i = 0; i < 4; i++) { - if ((bytes >= page_size[i]) && - ((all_bits & (page_size[i] - 1)) == 0)) { - status = hio_mgr->intf_fxns->brd_mem_map(dc, - pa_curr, va_curr, - page_size[i], map_attrs, - NULL); - if (status) - goto free_symbol; - - pa_curr += page_size[i]; - va_curr += page_size[i]; - da_curr += page_size[i]; - bytes -= page_size[i]; - /* - * Don't try smaller sizes. Hopefully we have - * reached an address aligned to a bigger page - * size. - */ - break; - } - } - } - - pa_curr += pad_sz; - va_curr += pad_sz; - da_curr += pad_sz; - bytes = seg0_sz; - va_curr = da * hio_mgr->word_size; - - eproc = kzalloc(sizeof(*eproc) * BRDIOCTL_NUMOFMMUTLB, GFP_KERNEL); - if (!eproc) { - status = -ENOMEM; - goto free_symbol; - } - - ndx = 0; - /* Configure the TLB entries for the next cacheable segment */ - while (bytes) { - /* - * To find the max. page size with which both PA & VA are - * aligned. - */ - all_bits = pa_curr | va_curr; - dev_dbg(bridge, - "seg1 all_bits %x, pa_curr %x, va_curr %x, bytes %x\n", - all_bits, pa_curr, va_curr, bytes); - - for (i = 0; i < 4; i++) { - if (!(bytes >= page_size[i]) || - !((all_bits & (page_size[i] - 1)) == 0)) - continue; - - if (ndx >= MAX_LOCK_TLB_ENTRIES) { - status = hio_mgr->intf_fxns->brd_mem_map(dc, - pa_curr, va_curr, - page_size[i], map_attrs, - NULL); - dev_dbg(bridge, - "PTE pa %x va %x dsp_va %x sz %x\n", - eproc[ndx].gpp_pa, - eproc[ndx].gpp_va, - eproc[ndx].dsp_va * - hio_mgr->word_size, page_size[i]); - if (status) - goto free_eproc; - } - - /* This is the physical address written to DSP MMU */ - eproc[ndx].gpp_pa = pa_curr; - - /* - * This is the virtual uncached ioremapped - * address!!! - */ - eproc[ndx].gpp_va = da_curr; - eproc[ndx].dsp_va = va_curr / hio_mgr->word_size; - eproc[ndx].size = page_size[i]; - eproc[ndx].endianism = HW_LITTLE_ENDIAN; - eproc[ndx].elem_size = HW_ELEM_SIZE16BIT; - eproc[ndx].mixed_mode = HW_MMU_CPUES; - dev_dbg(bridge, "%s: tlb pa %x va %x dsp_va %x sz %x\n", - __func__, eproc[ndx].gpp_pa, - eproc[ndx].gpp_va, - eproc[ndx].dsp_va * hio_mgr->word_size, - page_size[i]); - ndx++; - - pa_curr += page_size[i]; - va_curr += page_size[i]; - da_curr += page_size[i]; - bytes -= page_size[i]; - /* - * Don't try smaller sizes. Hopefully we have reached - * an address aligned to a bigger page size. - */ - break; - } - } - - /* - * Copy remaining entries from CDB. All entries are 1 MB and - * should not conflict with shm entries on MPU or DSP side. - */ - for (i = 3; i < 7 && ndx < BRDIOCTL_NUMOFMMUTLB; i++) { - struct mgr_processorextinfo *ep = &hio_mgr->ext_proc_info; - u32 word_sz = hio_mgr->word_size; - - if (ep->ty_tlb[i].gpp_phys == 0) - continue; - - if ((ep->ty_tlb[i].gpp_phys > pa - 0x100000 && - ep->ty_tlb[i].gpp_phys <= pa + seg0_sz) || - (ep->ty_tlb[i].dsp_virt > da - 0x100000 / word_sz && - ep->ty_tlb[i].dsp_virt <= da + seg0_sz / word_sz)) { - dev_dbg(bridge, - "err cdb%d pa %x da %x shm pa %x da %x sz %x\n", - i, ep->ty_tlb[i].gpp_phys, - ep->ty_tlb[i].dsp_virt, pa, da, seg0_sz); - status = -EPERM; - goto free_eproc; - } - - if (ndx >= MAX_LOCK_TLB_ENTRIES) { - status = hio_mgr->intf_fxns->brd_mem_map(dc, - ep->ty_tlb[i].gpp_phys, - ep->ty_tlb[i].dsp_virt, - 0x100000, map_attrs, NULL); - if (status) - goto free_eproc; - } - - eproc[ndx].dsp_va = ep->ty_tlb[i].dsp_virt; - eproc[ndx].gpp_pa = ep->ty_tlb[i].gpp_phys; - eproc[ndx].gpp_va = 0; - - /* 1 MB */ - eproc[ndx].size = 0x100000; - dev_dbg(bridge, "shm MMU entry pa %x da 0x%x\n", - eproc[ndx].gpp_pa, eproc[ndx].dsp_va); - ndx++; - } - - /* Map the L4 peripherals */ - i = 0; - while (l4_peripheral_table[i].phys_addr) { - status = hio_mgr->intf_fxns->brd_mem_map(dc, - l4_peripheral_table[i].phys_addr, - l4_peripheral_table[i].dsp_virt_addr, - HW_PAGE_SIZE4KB, map_attrs, NULL); - if (status) - goto free_eproc; - i++; - } - - for (i = ndx; i < BRDIOCTL_NUMOFMMUTLB; i++) { - eproc[i].dsp_va = 0; - eproc[i].gpp_pa = 0; - eproc[i].gpp_va = 0; - eproc[i].size = 0; - } - - /* - * Set the shm physical address entry (grayed out in CDB file) - * to the virtual uncached ioremapped address of shm reserved - * on MPU. - */ - hio_mgr->ext_proc_info.ty_tlb[0].gpp_phys = - (va + seg1_sz + pad_sz); - - /* - * Need shm Phys addr. IO supports only one DSP for now: - * num_procs = 1. - */ - if (!hio_mgr->ext_proc_info.ty_tlb[0].gpp_phys) - return -EFAULT; - - if (eproc[0].dsp_va > s->shm_base) - return -EPERM; - - /* shm_base may not be at ul_dsp_va address */ - shm_base_offs = (s->shm_base - eproc[0].dsp_va) * - hio_mgr->word_size; - /* - * bridge_dev_ctrl() will set dev context dsp-mmu info. In - * bridge_brd_start() the MMU will be re-programed with MMU - * DSPVa-GPPPa pair info while DSP is in a known - * (reset) state. - */ - status = hio_mgr->intf_fxns->dev_cntrl(hio_mgr->bridge_context, - BRDIOCTL_SETMMUCONFIG, eproc); - if (status) - goto free_eproc; - - s->shm_base = hio_mgr->ext_proc_info.ty_tlb[0].gpp_phys; - s->shm_base += shm_base_offs; - s->shm_base = (u32) MEM_LINEAR_ADDRESS((void *)s->shm_base, - mem_sz); - if (!s->shm_base) { - status = -EFAULT; - goto free_eproc; - } - - /* Register SM */ - status = register_shm_segs(hio_mgr, cod_man, eproc[0].gpp_pa); - - hio_mgr->shared_mem = (struct shm *)s->shm_base; - hio_mgr->input = (u8 *) hio_mgr->shared_mem + sizeof(struct shm); - hio_mgr->output = hio_mgr->input + (shm_sz - - sizeof(struct shm)) / 2; - hio_mgr->sm_buf_size = hio_mgr->output - hio_mgr->input; - - /* Set up Shared memory addresses for messaging */ - hio_mgr->msg_input_ctrl = - (struct msg_ctrl *)((u8 *) hio_mgr->shared_mem + shm_sz); - hio_mgr->msg_input = - (u8 *) hio_mgr->msg_input_ctrl + sizeof(struct msg_ctrl); - hio_mgr->msg_output_ctrl = - (struct msg_ctrl *)((u8 *) hio_mgr->msg_input_ctrl + - msg_sz / 2); - hio_mgr->msg_output = - (u8 *) hio_mgr->msg_output_ctrl + sizeof(struct msg_ctrl); - hmsg_mgr->max_msgs = - ((u8 *) hio_mgr->msg_output_ctrl - hio_mgr->msg_input) / - sizeof(struct msg_dspmsg); - - dev_dbg(bridge, "IO MGR shm details: shared_mem %p, input %p, " - "output %p, msg_input_ctrl %p, msg_input %p, " - "msg_output_ctrl %p, msg_output %p\n", - (u8 *) hio_mgr->shared_mem, hio_mgr->input, - hio_mgr->output, (u8 *) hio_mgr->msg_input_ctrl, - hio_mgr->msg_input, (u8 *) hio_mgr->msg_output_ctrl, - hio_mgr->msg_output); - dev_dbg(bridge, "(proc) Mas msgs in shared memory: 0x%x\n", - hmsg_mgr->max_msgs); - memset((void *)hio_mgr->shared_mem, 0, sizeof(struct shm)); - -#if defined(CONFIG_TIDSPBRIDGE_BACKTRACE) - /* Get the start address of trace buffer */ - status = cod_get_sym_value(cod_man, SYS_PUTCBEG, - &hio_mgr->trace_buffer_begin); - if (status) - goto free_eproc; - - hio_mgr->gpp_read_pointer = - hio_mgr->trace_buffer_begin = - (va + seg1_sz + pad_sz) + - (hio_mgr->trace_buffer_begin - da); - - /* Get the end address of trace buffer */ - status = cod_get_sym_value(cod_man, SYS_PUTCEND, - &hio_mgr->trace_buffer_end); - if (status) - goto free_eproc; - - hio_mgr->trace_buffer_end = - (va + seg1_sz + pad_sz) + - (hio_mgr->trace_buffer_end - da); - - /* Get the current address of DSP write pointer */ - status = cod_get_sym_value(cod_man, BRIDGE_SYS_PUTC_CURRENT, - &hio_mgr->trace_buffer_current); - if (status) - goto free_eproc; - - hio_mgr->trace_buffer_current = - (va + seg1_sz + pad_sz) + - (hio_mgr->trace_buffer_current - da); - - /* Calculate the size of trace buffer */ - kfree(hio_mgr->msg); - hio_mgr->msg = kmalloc(((hio_mgr->trace_buffer_end - - hio_mgr->trace_buffer_begin) * - hio_mgr->word_size) + 2, GFP_KERNEL); - if (!hio_mgr->msg) { - status = -ENOMEM; - goto free_eproc; - } - - hio_mgr->dsp_va = da; - hio_mgr->gpp_va = (va + seg1_sz + pad_sz); -#endif - -free_eproc: - kfree(eproc); -free_symbol: - kfree(s); - - return status; -} - -/* - * ======== io_buf_size ======== - * Size of shared memory I/O channel. - */ -u32 io_buf_size(struct io_mgr *hio_mgr) -{ - if (hio_mgr) - return hio_mgr->sm_buf_size; - else - return 0; -} - -/* - * ======== io_cancel_chnl ======== - * Cancel IO on a given PCPY channel. - */ -void io_cancel_chnl(struct io_mgr *hio_mgr, u32 chnl) -{ - struct io_mgr *pio_mgr = (struct io_mgr *)hio_mgr; - struct shm *sm; - - if (!hio_mgr) - goto func_end; - sm = hio_mgr->shared_mem; - - /* Inform DSP that we have no more buffers on this channel */ - set_chnl_free(sm, chnl); - - sm_interrupt_dsp(pio_mgr->bridge_context, MBX_PCPY_CLASS); -func_end: - return; -} - - -/* - * ======== io_dispatch_pm ======== - * Performs I/O dispatch on PM related messages from DSP - */ -static void io_dispatch_pm(struct io_mgr *pio_mgr) -{ - int status; - u32 parg[2]; - - /* Perform Power message processing here */ - parg[0] = pio_mgr->intr_val; - - /* Send the command to the Bridge clk/pwr manager to handle */ - if (parg[0] == MBX_PM_HIBERNATE_EN) { - dev_dbg(bridge, "PM: Hibernate command\n"); - status = pio_mgr->intf_fxns-> - dev_cntrl(pio_mgr->bridge_context, - BRDIOCTL_PWR_HIBERNATE, parg); - if (status) - pr_err("%s: hibernate cmd failed 0x%x\n", - __func__, status); - } else if (parg[0] == MBX_PM_OPP_REQ) { - parg[1] = pio_mgr->shared_mem->opp_request.rqst_opp_pt; - dev_dbg(bridge, "PM: Requested OPP = 0x%x\n", parg[1]); - status = pio_mgr->intf_fxns-> - dev_cntrl(pio_mgr->bridge_context, - BRDIOCTL_CONSTRAINT_REQUEST, parg); - if (status) - dev_dbg(bridge, "PM: Failed to set constraint " - "= 0x%x\n", parg[1]); - } else { - dev_dbg(bridge, "PM: clk control value of msg = 0x%x\n", - parg[0]); - status = pio_mgr->intf_fxns-> - dev_cntrl(pio_mgr->bridge_context, - BRDIOCTL_CLK_CTRL, parg); - if (status) - dev_dbg(bridge, "PM: Failed to ctrl the DSP clk" - "= 0x%x\n", *parg); - } -} - -/* - * ======== io_dpc ======== - * Deferred procedure call for shared memory channel driver ISR. Carries - * out the dispatch of I/O as a non-preemptible event. It can only be - * pre-empted by an ISR. - */ -void io_dpc(unsigned long ref_data) -{ - struct io_mgr *pio_mgr = (struct io_mgr *)ref_data; - struct chnl_mgr *chnl_mgr_obj; - struct msg_mgr *msg_mgr_obj; - struct deh_mgr *hdeh_mgr; - u32 requested; - u32 serviced; - - if (!pio_mgr) - goto func_end; - chnl_mgr_obj = pio_mgr->chnl_mgr; - dev_get_msg_mgr(pio_mgr->dev_obj, &msg_mgr_obj); - dev_get_deh_mgr(pio_mgr->dev_obj, &hdeh_mgr); - if (!chnl_mgr_obj) - goto func_end; - - requested = pio_mgr->dpc_req; - serviced = pio_mgr->dpc_sched; - - if (serviced == requested) - goto func_end; - - /* Process pending DPC's */ - do { - /* Check value of interrupt reg to ensure it's a valid error */ - if ((pio_mgr->intr_val > DEH_BASE) && - (pio_mgr->intr_val < DEH_LIMIT)) { - /* Notify DSP/BIOS exception */ - if (hdeh_mgr) { -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE - print_dsp_debug_trace(pio_mgr); -#endif - bridge_deh_notify(hdeh_mgr, DSP_SYSERROR, - pio_mgr->intr_val); - } - } - /* Proc-copy channel dispatch */ - input_chnl(pio_mgr, NULL, IO_SERVICE); - output_chnl(pio_mgr, NULL, IO_SERVICE); - -#ifdef CHNL_MESSAGES - if (msg_mgr_obj) { - /* Perform I/O dispatch on message queues */ - input_msg(pio_mgr, msg_mgr_obj); - output_msg(pio_mgr, msg_mgr_obj); - } - -#endif -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE - if (pio_mgr->intr_val & MBX_DBG_SYSPRINTF) { - /* Notify DSP Trace message */ - print_dsp_debug_trace(pio_mgr); - } -#endif - serviced++; - } while (serviced != requested); - pio_mgr->dpc_sched = requested; -func_end: - return; -} - -/* - * ======== io_mbox_msg ======== - * Main interrupt handler for the shared memory IO manager. - * Calls the Bridge's CHNL_ISR to determine if this interrupt is ours, then - * schedules a DPC to dispatch I/O. - */ -int io_mbox_msg(struct notifier_block *self, unsigned long len, void *msg) -{ - struct io_mgr *pio_mgr; - struct dev_object *dev_obj; - unsigned long flags; - - dev_obj = dev_get_first(); - dev_get_io_mgr(dev_obj, &pio_mgr); - - if (!pio_mgr) - return NOTIFY_BAD; - - pio_mgr->intr_val = (u16)((u32)msg); - if (pio_mgr->intr_val & MBX_PM_CLASS) - io_dispatch_pm(pio_mgr); - - if (pio_mgr->intr_val == MBX_DEH_RESET) { - pio_mgr->intr_val = 0; - } else { - spin_lock_irqsave(&pio_mgr->dpc_lock, flags); - pio_mgr->dpc_req++; - spin_unlock_irqrestore(&pio_mgr->dpc_lock, flags); - tasklet_schedule(&pio_mgr->dpc_tasklet); - } - return NOTIFY_OK; -} - -/* - * ======== io_request_chnl ======== - * Purpose: - * Request channel I/O from the DSP. Sets flags in shared memory, then - * interrupts the DSP. - */ -void io_request_chnl(struct io_mgr *io_manager, struct chnl_object *pchnl, - u8 io_mode, u16 *mbx_val) -{ - struct chnl_mgr *chnl_mgr_obj; - struct shm *sm; - - if (!pchnl || !mbx_val) - goto func_end; - chnl_mgr_obj = io_manager->chnl_mgr; - sm = io_manager->shared_mem; - if (io_mode == IO_INPUT) { - /* Indicate to the DSP we have a buffer available for input */ - set_chnl_busy(sm, pchnl->chnl_id); - *mbx_val = MBX_PCPY_CLASS; - } else if (io_mode == IO_OUTPUT) { - /* - * Record the fact that we have a buffer available for - * output. - */ - chnl_mgr_obj->output_mask |= (1 << pchnl->chnl_id); - } else { - } -func_end: - return; -} - -/* - * ======== iosm_schedule ======== - * Schedule DPC for IO. - */ -void iosm_schedule(struct io_mgr *io_manager) -{ - unsigned long flags; - - if (!io_manager) - return; - - /* Increment count of DPC's pending. */ - spin_lock_irqsave(&io_manager->dpc_lock, flags); - io_manager->dpc_req++; - spin_unlock_irqrestore(&io_manager->dpc_lock, flags); - - /* Schedule DPC */ - tasklet_schedule(&io_manager->dpc_tasklet); -} - -/* - * ======== find_ready_output ======== - * Search for a host output channel which is ready to send. If this is - * called as a result of servicing the DPC, then implement a round - * robin search; otherwise, this was called by a client thread (via - * IO_Dispatch()), so just start searching from the current channel id. - */ -static u32 find_ready_output(struct chnl_mgr *chnl_mgr_obj, - struct chnl_object *pchnl, u32 mask) -{ - u32 ret = OUTPUTNOTREADY; - u32 id, start_id; - u32 shift; - - id = (pchnl != - NULL ? pchnl->chnl_id : (chnl_mgr_obj->last_output + 1)); - id = ((id == CHNL_MAXCHANNELS) ? 0 : id); - if (id >= CHNL_MAXCHANNELS) - goto func_end; - if (mask) { - shift = (1 << id); - start_id = id; - do { - if (mask & shift) { - ret = id; - if (pchnl == NULL) - chnl_mgr_obj->last_output = id; - break; - } - id = id + 1; - id = ((id == CHNL_MAXCHANNELS) ? 0 : id); - shift = (1 << id); - } while (id != start_id); - } -func_end: - return ret; -} - -/* - * ======== input_chnl ======== - * Dispatch a buffer on an input channel. - */ -static void input_chnl(struct io_mgr *pio_mgr, struct chnl_object *pchnl, - u8 io_mode) -{ - struct chnl_mgr *chnl_mgr_obj; - struct shm *sm; - u32 chnl_id; - u32 bytes; - struct chnl_irp *chnl_packet_obj = NULL; - u32 dw_arg; - bool clear_chnl = false; - bool notify_client = false; - - sm = pio_mgr->shared_mem; - chnl_mgr_obj = pio_mgr->chnl_mgr; - - /* Attempt to perform input */ - if (!sm->input_full) - goto func_end; - - bytes = sm->input_size * chnl_mgr_obj->word_size; - chnl_id = sm->input_id; - dw_arg = sm->arg; - if (chnl_id >= CHNL_MAXCHANNELS) { - /* Shouldn't be here: would indicate corrupted shm. */ - goto func_end; - } - pchnl = chnl_mgr_obj->channels[chnl_id]; - if ((pchnl != NULL) && CHNL_IS_INPUT(pchnl->chnl_mode)) { - if ((pchnl->state & ~CHNL_STATEEOS) == CHNL_STATEREADY) { - /* Get the I/O request, and attempt a transfer */ - if (!list_empty(&pchnl->io_requests)) { - if (!pchnl->cio_reqs) - goto func_end; - - chnl_packet_obj = list_first_entry( - &pchnl->io_requests, - struct chnl_irp, link); - list_del(&chnl_packet_obj->link); - pchnl->cio_reqs--; - - /* - * Ensure we don't overflow the client's - * buffer. - */ - bytes = min(bytes, chnl_packet_obj->byte_size); - memcpy(chnl_packet_obj->host_sys_buf, - pio_mgr->input, bytes); - pchnl->bytes_moved += bytes; - chnl_packet_obj->byte_size = bytes; - chnl_packet_obj->arg = dw_arg; - chnl_packet_obj->status = CHNL_IOCSTATCOMPLETE; - - if (bytes == 0) { - /* - * This assertion fails if the DSP - * sends EOS more than once on this - * channel. - */ - if (pchnl->state & CHNL_STATEEOS) - goto func_end; - /* - * Zero bytes indicates EOS. Update - * IOC status for this chirp, and also - * the channel state. - */ - chnl_packet_obj->status |= - CHNL_IOCSTATEOS; - pchnl->state |= CHNL_STATEEOS; - /* - * Notify that end of stream has - * occurred. - */ - ntfy_notify(pchnl->ntfy_obj, - DSP_STREAMDONE); - } - /* Tell DSP if no more I/O buffers available */ - if (list_empty(&pchnl->io_requests)) - set_chnl_free(sm, pchnl->chnl_id); - clear_chnl = true; - notify_client = true; - } else { - /* - * Input full for this channel, but we have no - * buffers available. The channel must be - * "idling". Clear out the physical input - * channel. - */ - clear_chnl = true; - } - } else { - /* Input channel cancelled: clear input channel */ - clear_chnl = true; - } - } else { - /* DPC fired after host closed channel: clear input channel */ - clear_chnl = true; - } - if (clear_chnl) { - /* Indicate to the DSP we have read the input */ - sm->input_full = 0; - sm_interrupt_dsp(pio_mgr->bridge_context, MBX_PCPY_CLASS); - } - if (notify_client) { - /* Notify client with IO completion record */ - notify_chnl_complete(pchnl, chnl_packet_obj); - } -func_end: - return; -} - -/* - * ======== input_msg ======== - * Copies messages from shared memory to the message queues. - */ -static void input_msg(struct io_mgr *pio_mgr, struct msg_mgr *hmsg_mgr) -{ - u32 num_msgs; - u32 i; - u8 *msg_input; - struct msg_queue *msg_queue_obj; - struct msg_frame *pmsg; - struct msg_dspmsg msg; - struct msg_ctrl *msg_ctr_obj; - u32 input_empty; - u32 addr; - - msg_ctr_obj = pio_mgr->msg_input_ctrl; - /* Get the number of input messages to be read */ - input_empty = msg_ctr_obj->buf_empty; - num_msgs = msg_ctr_obj->size; - if (input_empty) - return; - - msg_input = pio_mgr->msg_input; - for (i = 0; i < num_msgs; i++) { - /* Read the next message */ - addr = (u32) &(((struct msg_dspmsg *)msg_input)->msg.cmd); - msg.msg.cmd = - read_ext32_bit_dsp_data(pio_mgr->bridge_context, addr); - addr = (u32) &(((struct msg_dspmsg *)msg_input)->msg.arg1); - msg.msg.arg1 = - read_ext32_bit_dsp_data(pio_mgr->bridge_context, addr); - addr = (u32) &(((struct msg_dspmsg *)msg_input)->msg.arg2); - msg.msg.arg2 = - read_ext32_bit_dsp_data(pio_mgr->bridge_context, addr); - addr = (u32) &(((struct msg_dspmsg *)msg_input)->msgq_id); - msg.msgq_id = - read_ext32_bit_dsp_data(pio_mgr->bridge_context, addr); - msg_input += sizeof(struct msg_dspmsg); - - /* Determine which queue to put the message in */ - dev_dbg(bridge, "input msg: cmd=0x%x arg1=0x%x " - "arg2=0x%x msgq_id=0x%x\n", msg.msg.cmd, - msg.msg.arg1, msg.msg.arg2, msg.msgq_id); - /* - * Interrupt may occur before shared memory and message - * input locations have been set up. If all nodes were - * cleaned up, hmsg_mgr->max_msgs should be 0. - */ - list_for_each_entry(msg_queue_obj, &hmsg_mgr->queue_list, - list_elem) { - if (msg.msgq_id != msg_queue_obj->msgq_id) - continue; - /* Found it */ - if (msg.msg.cmd == RMS_EXITACK) { - /* - * Call the node exit notification. - * The exit message does not get - * queued. - */ - (*hmsg_mgr->on_exit)(msg_queue_obj->arg, - msg.msg.arg1); - break; - } - /* - * Not an exit acknowledgement, queue - * the message. - */ - if (list_empty(&msg_queue_obj->msg_free_list)) { - /* - * No free frame to copy the - * message into. - */ - pr_err("%s: no free msg frames," - " discarding msg\n", - __func__); - break; - } - - pmsg = list_first_entry(&msg_queue_obj->msg_free_list, - struct msg_frame, list_elem); - list_del(&pmsg->list_elem); - pmsg->msg_data = msg; - list_add_tail(&pmsg->list_elem, - &msg_queue_obj->msg_used_list); - ntfy_notify(msg_queue_obj->ntfy_obj, - DSP_NODEMESSAGEREADY); - sync_set_event(msg_queue_obj->sync_event); - } - } - /* Set the post SWI flag */ - if (num_msgs > 0) { - /* Tell the DSP we've read the messages */ - msg_ctr_obj->buf_empty = true; - msg_ctr_obj->post_swi = true; - sm_interrupt_dsp(pio_mgr->bridge_context, MBX_PCPY_CLASS); - } -} - -/* - * ======== notify_chnl_complete ======== - * Purpose: - * Signal the channel event, notifying the client that I/O has completed. - */ -static void notify_chnl_complete(struct chnl_object *pchnl, - struct chnl_irp *chnl_packet_obj) -{ - bool signal_event; - - if (!pchnl || !pchnl->sync_event || !chnl_packet_obj) - goto func_end; - - /* - * Note: we signal the channel event only if the queue of IO - * completions is empty. If it is not empty, the event is sure to be - * signalled by the only IO completion list consumer: - * bridge_chnl_get_ioc(). - */ - signal_event = list_empty(&pchnl->io_completions); - /* Enqueue the IO completion info for the client */ - list_add_tail(&chnl_packet_obj->link, &pchnl->io_completions); - pchnl->cio_cs++; - - if (pchnl->cio_cs > pchnl->chnl_packets) - goto func_end; - /* Signal the channel event (if not already set) that IO is complete */ - if (signal_event) - sync_set_event(pchnl->sync_event); - - /* Notify that IO is complete */ - ntfy_notify(pchnl->ntfy_obj, DSP_STREAMIOCOMPLETION); -func_end: - return; -} - -/* - * ======== output_chnl ======== - * Purpose: - * Dispatch a buffer on an output channel. - */ -static void output_chnl(struct io_mgr *pio_mgr, struct chnl_object *pchnl, - u8 io_mode) -{ - struct chnl_mgr *chnl_mgr_obj; - struct shm *sm; - u32 chnl_id; - struct chnl_irp *chnl_packet_obj; - u32 dw_dsp_f_mask; - - chnl_mgr_obj = pio_mgr->chnl_mgr; - sm = pio_mgr->shared_mem; - /* Attempt to perform output */ - if (sm->output_full) - goto func_end; - - if (pchnl && !((pchnl->state & ~CHNL_STATEEOS) == CHNL_STATEREADY)) - goto func_end; - - /* Look to see if both a PC and DSP output channel are ready */ - dw_dsp_f_mask = sm->dsp_free_mask; - chnl_id = - find_ready_output(chnl_mgr_obj, pchnl, - (chnl_mgr_obj->output_mask & dw_dsp_f_mask)); - if (chnl_id == OUTPUTNOTREADY) - goto func_end; - - pchnl = chnl_mgr_obj->channels[chnl_id]; - if (!pchnl || list_empty(&pchnl->io_requests)) { - /* Shouldn't get here */ - goto func_end; - } - - if (!pchnl->cio_reqs) - goto func_end; - - /* Get the I/O request, and attempt a transfer */ - chnl_packet_obj = list_first_entry(&pchnl->io_requests, - struct chnl_irp, link); - list_del(&chnl_packet_obj->link); - - pchnl->cio_reqs--; - - /* Record fact that no more I/O buffers available */ - if (list_empty(&pchnl->io_requests)) - chnl_mgr_obj->output_mask &= ~(1 << chnl_id); - - /* Transfer buffer to DSP side */ - chnl_packet_obj->byte_size = min(pio_mgr->sm_buf_size, - chnl_packet_obj->byte_size); - memcpy(pio_mgr->output, chnl_packet_obj->host_sys_buf, - chnl_packet_obj->byte_size); - pchnl->bytes_moved += chnl_packet_obj->byte_size; - /* Write all 32 bits of arg */ - sm->arg = chnl_packet_obj->arg; -#if _CHNL_WORDSIZE == 2 - /* Access can be different SM access word size (e.g. 16/32 bit words) */ - sm->output_id = (u16) chnl_id; - sm->output_size = (u16) (chnl_packet_obj->byte_size + - chnl_mgr_obj->word_size - 1) / - (u16) chnl_mgr_obj->word_size; -#else - sm->output_id = chnl_id; - sm->output_size = (chnl_packet_obj->byte_size + - chnl_mgr_obj->word_size - 1) / chnl_mgr_obj->word_size; -#endif - sm->output_full = 1; - /* Indicate to the DSP we have written the output */ - sm_interrupt_dsp(pio_mgr->bridge_context, MBX_PCPY_CLASS); - /* Notify client with IO completion record (keep EOS) */ - chnl_packet_obj->status &= CHNL_IOCSTATEOS; - notify_chnl_complete(pchnl, chnl_packet_obj); - /* Notify if stream is done. */ - if (chnl_packet_obj->status & CHNL_IOCSTATEOS) - ntfy_notify(pchnl->ntfy_obj, DSP_STREAMDONE); - -func_end: - return; -} - -/* - * ======== output_msg ======== - * Copies messages from the message queues to the shared memory. - */ -static void output_msg(struct io_mgr *pio_mgr, struct msg_mgr *hmsg_mgr) -{ - u32 num_msgs = 0; - u32 i; - struct msg_dspmsg *msg_output; - struct msg_frame *pmsg; - struct msg_ctrl *msg_ctr_obj; - u32 val; - u32 addr; - - msg_ctr_obj = pio_mgr->msg_output_ctrl; - - /* Check if output has been cleared */ - if (!msg_ctr_obj->buf_empty) - return; - - num_msgs = (hmsg_mgr->msgs_pending > hmsg_mgr->max_msgs) ? - hmsg_mgr->max_msgs : hmsg_mgr->msgs_pending; - msg_output = (struct msg_dspmsg *) pio_mgr->msg_output; - - /* Copy num_msgs messages into shared memory */ - for (i = 0; i < num_msgs; i++) { - if (list_empty(&hmsg_mgr->msg_used_list)) - continue; - - pmsg = list_first_entry(&hmsg_mgr->msg_used_list, - struct msg_frame, list_elem); - list_del(&pmsg->list_elem); - - val = (pmsg->msg_data).msgq_id; - addr = (u32) &msg_output->msgq_id; - write_ext32_bit_dsp_data(pio_mgr->bridge_context, addr, val); - - val = (pmsg->msg_data).msg.cmd; - addr = (u32) &msg_output->msg.cmd; - write_ext32_bit_dsp_data(pio_mgr->bridge_context, addr, val); - - val = (pmsg->msg_data).msg.arg1; - addr = (u32) &msg_output->msg.arg1; - write_ext32_bit_dsp_data(pio_mgr->bridge_context, addr, val); - - val = (pmsg->msg_data).msg.arg2; - addr = (u32) &msg_output->msg.arg2; - write_ext32_bit_dsp_data(pio_mgr->bridge_context, addr, val); - - msg_output++; - list_add_tail(&pmsg->list_elem, &hmsg_mgr->msg_free_list); - sync_set_event(hmsg_mgr->sync_event); - } - - if (num_msgs > 0) { - hmsg_mgr->msgs_pending -= num_msgs; -#if _CHNL_WORDSIZE == 2 - /* - * Access can be different SM access word size - * (e.g. 16/32 bit words) - */ - msg_ctr_obj->size = (u16) num_msgs; -#else - msg_ctr_obj->size = num_msgs; -#endif - msg_ctr_obj->buf_empty = false; - /* Set the post SWI flag */ - msg_ctr_obj->post_swi = true; - /* Tell the DSP we have written the output. */ - sm_interrupt_dsp(pio_mgr->bridge_context, MBX_PCPY_CLASS); - } -} - -/* - * ======== register_shm_segs ======== - * purpose: - * Registers GPP SM segment with CMM. - */ -static int register_shm_segs(struct io_mgr *hio_mgr, - struct cod_manager *cod_man, - u32 dw_gpp_base_pa) -{ - int status = 0; - u32 ul_shm0_base = 0; - u32 shm0_end = 0; - u32 ul_shm0_rsrvd_start = 0; - u32 ul_rsrvd_size = 0; - u32 ul_gpp_phys; - u32 ul_dsp_virt; - u32 ul_shm_seg_id0 = 0; - u32 dw_offset, dw_gpp_base_va, ul_dsp_size; - - /* - * Read address and size info for first SM region. - * Get start of 1st SM Heap region. - */ - status = - cod_get_sym_value(cod_man, SHM0_SHARED_BASE_SYM, &ul_shm0_base); - if (ul_shm0_base == 0) { - status = -EPERM; - goto func_end; - } - /* Get end of 1st SM Heap region */ - if (!status) { - /* Get start and length of message part of shared memory */ - status = cod_get_sym_value(cod_man, SHM0_SHARED_END_SYM, - &shm0_end); - if (shm0_end == 0) { - status = -EPERM; - goto func_end; - } - } - /* Start of Gpp reserved region */ - if (!status) { - /* Get start and length of message part of shared memory */ - status = - cod_get_sym_value(cod_man, SHM0_SHARED_RESERVED_BASE_SYM, - &ul_shm0_rsrvd_start); - if (ul_shm0_rsrvd_start == 0) { - status = -EPERM; - goto func_end; - } - } - /* Register with CMM */ - if (!status) { - status = dev_get_cmm_mgr(hio_mgr->dev_obj, &hio_mgr->cmm_mgr); - if (!status) { - status = cmm_un_register_gppsm_seg(hio_mgr->cmm_mgr, - CMM_ALLSEGMENTS); - } - } - /* Register new SM region(s) */ - if (!status && (shm0_end - ul_shm0_base) > 0) { - /* Calc size (bytes) of SM the GPP can alloc from */ - ul_rsrvd_size = - (shm0_end - ul_shm0_rsrvd_start + 1) * hio_mgr->word_size; - if (ul_rsrvd_size <= 0) { - status = -EPERM; - goto func_end; - } - /* Calc size of SM DSP can alloc from */ - ul_dsp_size = - (ul_shm0_rsrvd_start - ul_shm0_base) * hio_mgr->word_size; - if (ul_dsp_size <= 0) { - status = -EPERM; - goto func_end; - } - /* First TLB entry reserved for Bridge SM use. */ - ul_gpp_phys = hio_mgr->ext_proc_info.ty_tlb[0].gpp_phys; - /* Get size in bytes */ - ul_dsp_virt = - hio_mgr->ext_proc_info.ty_tlb[0].dsp_virt * - hio_mgr->word_size; - /* - * Calc byte offset used to convert GPP phys <-> DSP byte - * address. - */ - if (dw_gpp_base_pa > ul_dsp_virt) - dw_offset = dw_gpp_base_pa - ul_dsp_virt; - else - dw_offset = ul_dsp_virt - dw_gpp_base_pa; - - if (ul_shm0_rsrvd_start * hio_mgr->word_size < ul_dsp_virt) { - status = -EPERM; - goto func_end; - } - /* - * Calc Gpp phys base of SM region. - * This is actually uncached kernel virtual address. - */ - dw_gpp_base_va = - ul_gpp_phys + ul_shm0_rsrvd_start * hio_mgr->word_size - - ul_dsp_virt; - /* - * Calc Gpp phys base of SM region. - * This is the physical address. - */ - dw_gpp_base_pa = - dw_gpp_base_pa + ul_shm0_rsrvd_start * hio_mgr->word_size - - ul_dsp_virt; - /* Register SM Segment 0. */ - status = - cmm_register_gppsm_seg(hio_mgr->cmm_mgr, dw_gpp_base_pa, - ul_rsrvd_size, dw_offset, - (dw_gpp_base_pa > - ul_dsp_virt) ? CMM_ADDTODSPPA : - CMM_SUBFROMDSPPA, - (u32) (ul_shm0_base * - hio_mgr->word_size), - ul_dsp_size, &ul_shm_seg_id0, - dw_gpp_base_va); - /* First SM region is seg_id = 1 */ - if (ul_shm_seg_id0 != 1) - status = -EPERM; - } -func_end: - return status; -} - -/* ZCPY IO routines. */ -/* - * ======== IO_SHMcontrol ======== - * Sets the requested shm setting. - */ -int io_sh_msetting(struct io_mgr *hio_mgr, u8 desc, void *pargs) -{ -#ifdef CONFIG_TIDSPBRIDGE_DVFS - u32 i; - struct dspbridge_platform_data *pdata = - omap_dspbridge_dev->dev.platform_data; - - switch (desc) { - case SHM_CURROPP: - /* Update the shared memory with requested OPP information */ - if (pargs != NULL) - hio_mgr->shared_mem->opp_table_struct.curr_opp_pt = - *(u32 *) pargs; - else - return -EPERM; - break; - case SHM_OPPINFO: - /* - * Update the shared memory with the voltage, frequency, - * min and max frequency values for an OPP. - */ - for (i = 0; i <= dsp_max_opps; i++) { - hio_mgr->shared_mem->opp_table_struct.opp_point[i]. - voltage = vdd1_dsp_freq[i][0]; - dev_dbg(bridge, "OPP-shm: voltage: %d\n", - vdd1_dsp_freq[i][0]); - hio_mgr->shared_mem->opp_table_struct. - opp_point[i].frequency = vdd1_dsp_freq[i][1]; - dev_dbg(bridge, "OPP-shm: frequency: %d\n", - vdd1_dsp_freq[i][1]); - hio_mgr->shared_mem->opp_table_struct.opp_point[i]. - min_freq = vdd1_dsp_freq[i][2]; - dev_dbg(bridge, "OPP-shm: min freq: %d\n", - vdd1_dsp_freq[i][2]); - hio_mgr->shared_mem->opp_table_struct.opp_point[i]. - max_freq = vdd1_dsp_freq[i][3]; - dev_dbg(bridge, "OPP-shm: max freq: %d\n", - vdd1_dsp_freq[i][3]); - } - hio_mgr->shared_mem->opp_table_struct.num_opp_pts = - dsp_max_opps; - dev_dbg(bridge, "OPP-shm: max OPP number: %d\n", dsp_max_opps); - /* Update the current OPP number */ - if (pdata->dsp_get_opp) - i = (*pdata->dsp_get_opp) (); - hio_mgr->shared_mem->opp_table_struct.curr_opp_pt = i; - dev_dbg(bridge, "OPP-shm: value programmed = %d\n", i); - break; - case SHM_GETOPP: - /* Get the OPP that DSP has requested */ - *(u32 *) pargs = hio_mgr->shared_mem->opp_request.rqst_opp_pt; - break; - default: - break; - } -#endif - return 0; -} - -/* - * ======== bridge_io_get_proc_load ======== - * Gets the Processor's Load information - */ -int bridge_io_get_proc_load(struct io_mgr *hio_mgr, - struct dsp_procloadstat *proc_lstat) -{ - if (!hio_mgr->shared_mem) - return -EFAULT; - - proc_lstat->curr_load = - hio_mgr->shared_mem->load_mon_info.curr_dsp_load; - proc_lstat->predicted_load = - hio_mgr->shared_mem->load_mon_info.pred_dsp_load; - proc_lstat->curr_dsp_freq = - hio_mgr->shared_mem->load_mon_info.curr_dsp_freq; - proc_lstat->predicted_freq = - hio_mgr->shared_mem->load_mon_info.pred_dsp_freq; - - dev_dbg(bridge, "Curr Load = %d, Pred Load = %d, Curr Freq = %d, " - "Pred Freq = %d\n", proc_lstat->curr_load, - proc_lstat->predicted_load, proc_lstat->curr_dsp_freq, - proc_lstat->predicted_freq); - return 0; -} - - -#if defined(CONFIG_TIDSPBRIDGE_BACKTRACE) -void print_dsp_debug_trace(struct io_mgr *hio_mgr) -{ - u32 ul_new_message_length = 0, ul_gpp_cur_pointer; - - while (true) { - /* Get the DSP current pointer */ - ul_gpp_cur_pointer = - *(u32 *) (hio_mgr->trace_buffer_current); - ul_gpp_cur_pointer = - hio_mgr->gpp_va + (ul_gpp_cur_pointer - - hio_mgr->dsp_va); - - /* No new debug messages available yet */ - if (ul_gpp_cur_pointer == hio_mgr->gpp_read_pointer) { - break; - } else if (ul_gpp_cur_pointer > hio_mgr->gpp_read_pointer) { - /* Continuous data */ - ul_new_message_length = - ul_gpp_cur_pointer - hio_mgr->gpp_read_pointer; - - memcpy(hio_mgr->msg, - (char *)hio_mgr->gpp_read_pointer, - ul_new_message_length); - hio_mgr->msg[ul_new_message_length] = '\0'; - /* - * Advance the GPP trace pointer to DSP current - * pointer. - */ - hio_mgr->gpp_read_pointer += ul_new_message_length; - /* Print the trace messages */ - pr_info("DSPTrace: %s\n", hio_mgr->msg); - } else if (ul_gpp_cur_pointer < hio_mgr->gpp_read_pointer) { - /* Handle trace buffer wraparound */ - memcpy(hio_mgr->msg, - (char *)hio_mgr->gpp_read_pointer, - hio_mgr->trace_buffer_end - - hio_mgr->gpp_read_pointer); - ul_new_message_length = - ul_gpp_cur_pointer - hio_mgr->trace_buffer_begin; - memcpy(&hio_mgr->msg[hio_mgr->trace_buffer_end - - hio_mgr->gpp_read_pointer], - (char *)hio_mgr->trace_buffer_begin, - ul_new_message_length); - hio_mgr->msg[hio_mgr->trace_buffer_end - - hio_mgr->gpp_read_pointer + - ul_new_message_length] = '\0'; - /* - * Advance the GPP trace pointer to DSP current - * pointer. - */ - hio_mgr->gpp_read_pointer = - hio_mgr->trace_buffer_begin + - ul_new_message_length; - /* Print the trace messages */ - pr_info("DSPTrace: %s\n", hio_mgr->msg); - } - } -} -#endif - -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE -/* - * ======== print_dsp_trace_buffer ======== - * Prints the trace buffer returned from the DSP (if DBG_Trace is enabled). - * Parameters: - * hdeh_mgr: Handle to DEH manager object - * number of extra carriage returns to generate. - * Returns: - * 0: Success. - * -ENOMEM: Unable to allocate memory. - * Requires: - * hdeh_mgr muse be valid. Checked in bridge_deh_notify. - */ -int print_dsp_trace_buffer(struct bridge_dev_context *hbridge_context) -{ - int status = 0; - struct cod_manager *cod_mgr; - u32 ul_trace_end; - u32 ul_trace_begin; - u32 trace_cur_pos; - u32 ul_num_bytes = 0; - u32 ul_num_words = 0; - u32 ul_word_size = 2; - char *psz_buf; - char *str_beg; - char *trace_end; - char *buf_end; - char *new_line; - - struct bridge_dev_context *pbridge_context = hbridge_context; - struct bridge_drv_interface *intf_fxns; - struct dev_object *dev_obj = (struct dev_object *) - pbridge_context->dev_obj; - - status = dev_get_cod_mgr(dev_obj, &cod_mgr); - - if (cod_mgr) { - /* Look for SYS_PUTCBEG/SYS_PUTCEND */ - status = - cod_get_sym_value(cod_mgr, COD_TRACEBEG, &ul_trace_begin); - } else { - status = -EFAULT; - } - if (!status) - status = - cod_get_sym_value(cod_mgr, COD_TRACEEND, &ul_trace_end); - - if (!status) - /* trace_cur_pos will hold the address of a DSP pointer */ - status = cod_get_sym_value(cod_mgr, COD_TRACECURPOS, - &trace_cur_pos); - - if (status) - goto func_end; - - ul_num_bytes = (ul_trace_end - ul_trace_begin); - - ul_num_words = ul_num_bytes * ul_word_size; - status = dev_get_intf_fxns(dev_obj, &intf_fxns); - - if (status) - goto func_end; - - psz_buf = kzalloc(ul_num_bytes + 2, GFP_ATOMIC); - if (psz_buf != NULL) { - /* Read trace buffer data */ - status = (*intf_fxns->brd_read)(pbridge_context, - (u8 *)psz_buf, (u32)ul_trace_begin, - ul_num_bytes, 0); - - if (status) - goto func_end; - - /* Pack and do newline conversion */ - pr_debug("PrintDspTraceBuffer: " - "before pack and unpack.\n"); - pr_debug("%s: DSP Trace Buffer Begin:\n" - "=======================\n%s\n", - __func__, psz_buf); - - /* Read the value at the DSP address in trace_cur_pos. */ - status = (*intf_fxns->brd_read)(pbridge_context, - (u8 *)&trace_cur_pos, (u32)trace_cur_pos, - 4, 0); - if (status) - goto func_end; - /* Pack and do newline conversion */ - pr_info("DSP Trace Buffer Begin:\n" - "=======================\n%s\n", - psz_buf); - - - /* convert to offset */ - trace_cur_pos = trace_cur_pos - ul_trace_begin; - - if (ul_num_bytes) { - /* - * The buffer is not full, find the end of the - * data -- buf_end will be >= pszBuf after - * while. - */ - buf_end = &psz_buf[ul_num_bytes+1]; - /* DSP print position */ - trace_end = &psz_buf[trace_cur_pos]; - - /* - * Search buffer for a new_line and replace it - * with '\0', then print as string. - * Continue until end of buffer is reached. - */ - str_beg = trace_end; - ul_num_bytes = buf_end - str_beg; - - while (str_beg < buf_end) { - new_line = strnchr(str_beg, ul_num_bytes, - '\n'); - if (new_line && new_line < buf_end) { - *new_line = 0; - pr_debug("%s\n", str_beg); - str_beg = ++new_line; - ul_num_bytes = buf_end - str_beg; - } else { - /* - * Assume buffer empty if it contains - * a zero - */ - if (*str_beg != '\0') { - str_beg[ul_num_bytes] = 0; - pr_debug("%s\n", str_beg); - } - str_beg = buf_end; - ul_num_bytes = 0; - } - } - /* - * Search buffer for a nNewLine and replace it - * with '\0', then print as string. - * Continue until buffer is exhausted. - */ - str_beg = psz_buf; - ul_num_bytes = trace_end - str_beg; - - while (str_beg < trace_end) { - new_line = strnchr(str_beg, ul_num_bytes, '\n'); - if (new_line != NULL && new_line < trace_end) { - *new_line = 0; - pr_debug("%s\n", str_beg); - str_beg = ++new_line; - ul_num_bytes = trace_end - str_beg; - } else { - /* - * Assume buffer empty if it contains - * a zero - */ - if (*str_beg != '\0') { - str_beg[ul_num_bytes] = 0; - pr_debug("%s\n", str_beg); - } - str_beg = trace_end; - ul_num_bytes = 0; - } - } - } - pr_info("\n=======================\n" - "DSP Trace Buffer End:\n"); - kfree(psz_buf); - } else { - status = -ENOMEM; - } -func_end: - if (status) - dev_dbg(bridge, "%s Failed, status 0x%x\n", __func__, status); - return status; -} - -/** - * dump_dsp_stack() - This function dumps the data on the DSP stack. - * @bridge_context: Bridge driver's device context pointer. - * - */ -int dump_dsp_stack(struct bridge_dev_context *bridge_context) -{ - int status = 0; - struct cod_manager *code_mgr; - struct node_mgr *node_mgr; - u32 trace_begin; - char name[256]; - struct { - u32 head[2]; - u32 size; - } mmu_fault_dbg_info; - u32 *buffer; - u32 *buffer_beg; - u32 *buffer_end; - u32 exc_type; - u32 dyn_ext_base; - u32 i; - u32 offset_output; - u32 total_size; - u32 poll_cnt; - const char *dsp_regs[] = {"EFR", "IERR", "ITSR", "NTSR", - "IRP", "NRP", "AMR", "SSR", - "ILC", "RILC", "IER", "CSR"}; - const char *exec_ctxt[] = {"Task", "SWI", "HWI", "Unknown"}; - struct bridge_drv_interface *intf_fxns; - struct dev_object *dev_object = bridge_context->dev_obj; - - status = dev_get_cod_mgr(dev_object, &code_mgr); - if (!code_mgr) { - pr_debug("%s: Failed on dev_get_cod_mgr.\n", __func__); - status = -EFAULT; - } - - if (!status) { - status = dev_get_node_manager(dev_object, &node_mgr); - if (!node_mgr) { - pr_debug("%s: Failed on dev_get_node_manager.\n", - __func__); - status = -EFAULT; - } - } - - if (!status) { - /* Look for SYS_PUTCBEG/SYS_PUTCEND: */ - status = - cod_get_sym_value(code_mgr, COD_TRACEBEG, &trace_begin); - pr_debug("%s: trace_begin Value 0x%x\n", - __func__, trace_begin); - if (status) - pr_debug("%s: Failed on cod_get_sym_value.\n", - __func__); - } - if (!status) - status = dev_get_intf_fxns(dev_object, &intf_fxns); - /* - * Check for the "magic number" in the trace buffer. If it has - * yet to appear then poll the trace buffer to wait for it. Its - * appearance signals that the DSP has finished dumping its state. - */ - mmu_fault_dbg_info.head[0] = 0; - mmu_fault_dbg_info.head[1] = 0; - if (!status) { - poll_cnt = 0; - while ((mmu_fault_dbg_info.head[0] != MMU_FAULT_HEAD1 || - mmu_fault_dbg_info.head[1] != MMU_FAULT_HEAD2) && - poll_cnt < POLL_MAX) { - - /* Read DSP dump size from the DSP trace buffer... */ - status = (*intf_fxns->brd_read)(bridge_context, - (u8 *)&mmu_fault_dbg_info, (u32)trace_begin, - sizeof(mmu_fault_dbg_info), 0); - - if (status) - break; - - poll_cnt++; - } - - if (mmu_fault_dbg_info.head[0] != MMU_FAULT_HEAD1 && - mmu_fault_dbg_info.head[1] != MMU_FAULT_HEAD2) { - status = -ETIME; - pr_err("%s:No DSP MMU-Fault information available.\n", - __func__); - } - } - - if (!status) { - total_size = mmu_fault_dbg_info.size; - /* Limit the size in case DSP went crazy */ - if (total_size > MAX_MMU_DBGBUFF) - total_size = MAX_MMU_DBGBUFF; - - buffer = kzalloc(total_size, GFP_ATOMIC); - if (!buffer) { - status = -ENOMEM; - pr_debug("%s: Failed to " - "allocate stack dump buffer.\n", __func__); - goto func_end; - } - - buffer_beg = buffer; - buffer_end = buffer + total_size / 4; - - /* Read bytes from the DSP trace buffer... */ - status = (*intf_fxns->brd_read)(bridge_context, - (u8 *)buffer, (u32)trace_begin, - total_size, 0); - if (status) { - pr_debug("%s: Failed to Read Trace Buffer.\n", - __func__); - goto func_end; - } - - pr_err("\nAproximate Crash Position:\n" - "--------------------------\n"); - - exc_type = buffer[3]; - if (!exc_type) - i = buffer[79]; /* IRP */ - else - i = buffer[80]; /* NRP */ - - status = - cod_get_sym_value(code_mgr, DYNEXTBASE, &dyn_ext_base); - if (status) { - status = -EFAULT; - goto func_end; - } - - if ((i > dyn_ext_base) && (node_find_addr(node_mgr, i, - 0x1000, &offset_output, name) == 0)) - pr_err("0x%-8x [\"%s\" + 0x%x]\n", i, name, - i - offset_output); - else - pr_err("0x%-8x [Unable to match to a symbol.]\n", i); - - buffer += 4; - - pr_err("\nExecution Info:\n" - "---------------\n"); - - if (*buffer < ARRAY_SIZE(exec_ctxt)) { - pr_err("Execution context \t%s\n", - exec_ctxt[*buffer++]); - } else { - pr_err("Execution context corrupt\n"); - kfree(buffer_beg); - return -EFAULT; - } - pr_err("Task Handle\t\t0x%x\n", *buffer++); - pr_err("Stack Pointer\t\t0x%x\n", *buffer++); - pr_err("Stack Top\t\t0x%x\n", *buffer++); - pr_err("Stack Bottom\t\t0x%x\n", *buffer++); - pr_err("Stack Size\t\t0x%x\n", *buffer++); - pr_err("Stack Size In Use\t0x%x\n", *buffer++); - - pr_err("\nCPU Registers\n" - "---------------\n"); - - for (i = 0; i < 32; i++) { - if (i == 4 || i == 6 || i == 8) - pr_err("A%d 0x%-8x [Function Argument %d]\n", - i, *buffer++, i-3); - else if (i == 15) - pr_err("A15 0x%-8x [Frame Pointer]\n", - *buffer++); - else - pr_err("A%d 0x%x\n", i, *buffer++); - } - - pr_err("\nB0 0x%x\n", *buffer++); - pr_err("B1 0x%x\n", *buffer++); - pr_err("B2 0x%x\n", *buffer++); - - if ((*buffer > dyn_ext_base) && (node_find_addr(node_mgr, - *buffer, 0x1000, &offset_output, name) == 0)) - - pr_err("B3 0x%-8x [Function Return Pointer:" - " \"%s\" + 0x%x]\n", *buffer, name, - *buffer - offset_output); - else - pr_err("B3 0x%-8x [Function Return Pointer:" - "Unable to match to a symbol.]\n", *buffer); - - buffer++; - - for (i = 4; i < 32; i++) { - if (i == 4 || i == 6 || i == 8) - pr_err("B%d 0x%-8x [Function Argument %d]\n", - i, *buffer++, i-2); - else if (i == 14) - pr_err("B14 0x%-8x [Data Page Pointer]\n", - *buffer++); - else - pr_err("B%d 0x%x\n", i, *buffer++); - } - - pr_err("\n"); - - for (i = 0; i < ARRAY_SIZE(dsp_regs); i++) - pr_err("%s 0x%x\n", dsp_regs[i], *buffer++); - - pr_err("\nStack:\n" - "------\n"); - - for (i = 0; buffer < buffer_end; i++, buffer++) { - if ((*buffer > dyn_ext_base) && ( - node_find_addr(node_mgr, *buffer , 0x600, - &offset_output, name) == 0)) - pr_err("[%d] 0x%-8x [\"%s\" + 0x%x]\n", - i, *buffer, name, - *buffer - offset_output); - else - pr_err("[%d] 0x%x\n", i, *buffer); - } - kfree(buffer_beg); - } -func_end: - return status; -} - -/** - * dump_dl_modules() - This functions dumps the _DLModules loaded in DSP side - * @bridge_context: Bridge driver's device context pointer. - * - */ -void dump_dl_modules(struct bridge_dev_context *bridge_context) -{ - struct cod_manager *code_mgr; - struct bridge_drv_interface *intf_fxns; - struct bridge_dev_context *bridge_ctxt = bridge_context; - struct dev_object *dev_object = bridge_ctxt->dev_obj; - struct modules_header modules_hdr; - struct dll_module *module_struct = NULL; - u32 module_dsp_addr; - u32 module_size; - u32 module_struct_size = 0; - u32 sect_ndx; - char *sect_str; - int status = 0; - - status = dev_get_intf_fxns(dev_object, &intf_fxns); - if (status) { - pr_debug("%s: Failed on dev_get_intf_fxns.\n", __func__); - goto func_end; - } - - status = dev_get_cod_mgr(dev_object, &code_mgr); - if (!code_mgr) { - pr_debug("%s: Failed on dev_get_cod_mgr.\n", __func__); - status = -EFAULT; - goto func_end; - } - - /* Lookup the address of the modules_header structure */ - status = cod_get_sym_value(code_mgr, "_DLModules", &module_dsp_addr); - if (status) { - pr_debug("%s: Failed on cod_get_sym_value for _DLModules.\n", - __func__); - goto func_end; - } - - pr_debug("%s: _DLModules at 0x%x\n", __func__, module_dsp_addr); - - /* Copy the modules_header structure from DSP memory. */ - status = (*intf_fxns->brd_read)(bridge_context, (u8 *) &modules_hdr, - (u32) module_dsp_addr, sizeof(modules_hdr), 0); - - if (status) { - pr_debug("%s: Failed failed to read modules header.\n", - __func__); - goto func_end; - } - - module_dsp_addr = modules_hdr.first_module; - module_size = modules_hdr.first_module_size; - - pr_debug("%s: dll_module_header 0x%x %d\n", __func__, module_dsp_addr, - module_size); - - pr_err("\nDynamically Loaded Modules:\n" - "---------------------------\n"); - - /* For each dll_module structure in the list... */ - while (module_size) { - /* - * Allocate/re-allocate memory to hold the dll_module - * structure. The memory is re-allocated only if the existing - * allocation is too small. - */ - if (module_size > module_struct_size) { - kfree(module_struct); - module_struct = kzalloc(module_size+128, GFP_ATOMIC); - module_struct_size = module_size+128; - pr_debug("%s: allocated module struct %p %d\n", - __func__, module_struct, module_struct_size); - if (!module_struct) - goto func_end; - } - /* Copy the dll_module structure from DSP memory */ - status = (*intf_fxns->brd_read)(bridge_context, - (u8 *)module_struct, module_dsp_addr, module_size, 0); - - if (status) { - pr_debug( - "%s: Failed to read dll_module struct for 0x%x.\n", - __func__, module_dsp_addr); - break; - } - - /* Update info regarding the _next_ module in the list. */ - module_dsp_addr = module_struct->next_module; - module_size = module_struct->next_module_size; - - pr_debug("%s: next module 0x%x %d, this module num sects %d\n", - __func__, module_dsp_addr, module_size, - module_struct->num_sects); - - /* - * The section name strings start immediately following - * the array of dll_sect structures. - */ - sect_str = (char *) &module_struct-> - sects[module_struct->num_sects]; - pr_err("%s\n", sect_str); - - /* - * Advance to the first section name string. - * Each string follows the one before. - */ - sect_str += strlen(sect_str) + 1; - - /* Access each dll_sect structure and its name string. */ - for (sect_ndx = 0; - sect_ndx < module_struct->num_sects; sect_ndx++) { - pr_err(" Section: 0x%x ", - module_struct->sects[sect_ndx].sect_load_adr); - - if (((u32) sect_str - (u32) module_struct) < - module_struct_size) { - pr_err("%s\n", sect_str); - /* Each string follows the one before. */ - sect_str += strlen(sect_str)+1; - } else { - pr_err("\n"); - pr_debug("%s: section name sting address " - "is invalid %p\n", __func__, sect_str); - } - } - } -func_end: - kfree(module_struct); -} -#endif diff --git a/drivers/staging/tidspbridge/core/msg_sm.c b/drivers/staging/tidspbridge/core/msg_sm.c deleted file mode 100644 index 7b517eb827fe..000000000000 --- a/drivers/staging/tidspbridge/core/msg_sm.c +++ /dev/null @@ -1,564 +0,0 @@ -/* - * msg_sm.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Implements upper edge functions for Bridge message module. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- OS Adaptation Layer */ -#include - -/* ----------------------------------- Platform Manager */ -#include - -/* ----------------------------------- Others */ -#include - -/* ----------------------------------- This */ -#include <_msg_sm.h> -#include - -/* ----------------------------------- Function Prototypes */ -static int add_new_msg(struct list_head *msg_list); -static void delete_msg_mgr(struct msg_mgr *hmsg_mgr); -static void delete_msg_queue(struct msg_queue *msg_queue_obj, u32 num_to_dsp); -static void free_msg_list(struct list_head *msg_list); - -/* - * ======== bridge_msg_create ======== - * Create an object to manage message queues. Only one of these objects - * can exist per device object. - */ -int bridge_msg_create(struct msg_mgr **msg_man, - struct dev_object *hdev_obj, - msg_onexit msg_callback) -{ - struct msg_mgr *msg_mgr_obj; - struct io_mgr *hio_mgr; - int status = 0; - - if (!msg_man || !msg_callback || !hdev_obj) - return -EFAULT; - - dev_get_io_mgr(hdev_obj, &hio_mgr); - if (!hio_mgr) - return -EFAULT; - - *msg_man = NULL; - /* Allocate msg_ctrl manager object */ - msg_mgr_obj = kzalloc(sizeof(struct msg_mgr), GFP_KERNEL); - if (!msg_mgr_obj) - return -ENOMEM; - - msg_mgr_obj->on_exit = msg_callback; - msg_mgr_obj->iomgr = hio_mgr; - /* List of MSG_QUEUEs */ - INIT_LIST_HEAD(&msg_mgr_obj->queue_list); - /* - * Queues of message frames for messages to the DSP. Message - * frames will only be added to the free queue when a - * msg_queue object is created. - */ - INIT_LIST_HEAD(&msg_mgr_obj->msg_free_list); - INIT_LIST_HEAD(&msg_mgr_obj->msg_used_list); - spin_lock_init(&msg_mgr_obj->msg_mgr_lock); - - /* - * Create an event to be used by bridge_msg_put() in waiting - * for an available free frame from the message manager. - */ - msg_mgr_obj->sync_event = - kzalloc(sizeof(struct sync_object), GFP_KERNEL); - if (!msg_mgr_obj->sync_event) { - kfree(msg_mgr_obj); - return -ENOMEM; - } - sync_init_event(msg_mgr_obj->sync_event); - - *msg_man = msg_mgr_obj; - - return status; -} - -/* - * ======== bridge_msg_create_queue ======== - * Create a msg_queue for sending/receiving messages to/from a node - * on the DSP. - */ -int bridge_msg_create_queue(struct msg_mgr *hmsg_mgr, struct msg_queue **msgq, - u32 msgq_id, u32 max_msgs, void *arg) -{ - u32 i; - u32 num_allocated = 0; - struct msg_queue *msg_q; - int status = 0; - - if (!hmsg_mgr || msgq == NULL) - return -EFAULT; - - *msgq = NULL; - /* Allocate msg_queue object */ - msg_q = kzalloc(sizeof(struct msg_queue), GFP_KERNEL); - if (!msg_q) - return -ENOMEM; - - msg_q->max_msgs = max_msgs; - msg_q->msg_mgr = hmsg_mgr; - msg_q->arg = arg; /* Node handle */ - msg_q->msgq_id = msgq_id; /* Node env (not valid yet) */ - /* Queues of Message frames for messages from the DSP */ - INIT_LIST_HEAD(&msg_q->msg_free_list); - INIT_LIST_HEAD(&msg_q->msg_used_list); - - /* Create event that will be signalled when a message from - * the DSP is available. */ - msg_q->sync_event = kzalloc(sizeof(struct sync_object), GFP_KERNEL); - if (!msg_q->sync_event) { - status = -ENOMEM; - goto out_err; - - } - sync_init_event(msg_q->sync_event); - - /* Create a notification list for message ready notification. */ - msg_q->ntfy_obj = kmalloc(sizeof(struct ntfy_object), GFP_KERNEL); - if (!msg_q->ntfy_obj) { - status = -ENOMEM; - goto out_err; - } - ntfy_init(msg_q->ntfy_obj); - - /* Create events that will be used to synchronize cleanup - * when the object is deleted. sync_done will be set to - * unblock threads in MSG_Put() or MSG_Get(). sync_done_ack - * will be set by the unblocked thread to signal that it - * is unblocked and will no longer reference the object. */ - msg_q->sync_done = kzalloc(sizeof(struct sync_object), GFP_KERNEL); - if (!msg_q->sync_done) { - status = -ENOMEM; - goto out_err; - } - sync_init_event(msg_q->sync_done); - - msg_q->sync_done_ack = kzalloc(sizeof(struct sync_object), GFP_KERNEL); - if (!msg_q->sync_done_ack) { - status = -ENOMEM; - goto out_err; - } - sync_init_event(msg_q->sync_done_ack); - - /* Enter critical section */ - spin_lock_bh(&hmsg_mgr->msg_mgr_lock); - /* Initialize message frames and put in appropriate queues */ - for (i = 0; i < max_msgs && !status; i++) { - status = add_new_msg(&hmsg_mgr->msg_free_list); - if (!status) { - num_allocated++; - status = add_new_msg(&msg_q->msg_free_list); - } - } - if (status) { - spin_unlock_bh(&hmsg_mgr->msg_mgr_lock); - goto out_err; - } - - list_add_tail(&msg_q->list_elem, &hmsg_mgr->queue_list); - *msgq = msg_q; - /* Signal that free frames are now available */ - if (!list_empty(&hmsg_mgr->msg_free_list)) - sync_set_event(hmsg_mgr->sync_event); - - /* Exit critical section */ - spin_unlock_bh(&hmsg_mgr->msg_mgr_lock); - - return 0; -out_err: - delete_msg_queue(msg_q, num_allocated); - return status; -} - -/* - * ======== bridge_msg_delete ======== - * Delete a msg_ctrl manager allocated in bridge_msg_create(). - */ -void bridge_msg_delete(struct msg_mgr *hmsg_mgr) -{ - delete_msg_mgr(hmsg_mgr); -} - -/* - * ======== bridge_msg_delete_queue ======== - * Delete a msg_ctrl queue allocated in bridge_msg_create_queue. - */ -void bridge_msg_delete_queue(struct msg_queue *msg_queue_obj) -{ - struct msg_mgr *hmsg_mgr; - u32 io_msg_pend; - - if (!msg_queue_obj || !msg_queue_obj->msg_mgr) - return; - - hmsg_mgr = msg_queue_obj->msg_mgr; - msg_queue_obj->done = true; - /* Unblock all threads blocked in MSG_Get() or MSG_Put(). */ - io_msg_pend = msg_queue_obj->io_msg_pend; - while (io_msg_pend) { - /* Unblock thread */ - sync_set_event(msg_queue_obj->sync_done); - /* Wait for acknowledgement */ - sync_wait_on_event(msg_queue_obj->sync_done_ack, SYNC_INFINITE); - io_msg_pend = msg_queue_obj->io_msg_pend; - } - /* Remove message queue from hmsg_mgr->queue_list */ - spin_lock_bh(&hmsg_mgr->msg_mgr_lock); - list_del(&msg_queue_obj->list_elem); - /* Free the message queue object */ - delete_msg_queue(msg_queue_obj, msg_queue_obj->max_msgs); - if (list_empty(&hmsg_mgr->msg_free_list)) - sync_reset_event(hmsg_mgr->sync_event); - spin_unlock_bh(&hmsg_mgr->msg_mgr_lock); -} - -/* - * ======== bridge_msg_get ======== - * Get a message from a msg_ctrl queue. - */ -int bridge_msg_get(struct msg_queue *msg_queue_obj, - struct dsp_msg *pmsg, u32 utimeout) -{ - struct msg_frame *msg_frame_obj; - struct msg_mgr *hmsg_mgr; - struct sync_object *syncs[2]; - u32 index; - int status = 0; - - if (!msg_queue_obj || pmsg == NULL) - return -ENOMEM; - - hmsg_mgr = msg_queue_obj->msg_mgr; - - spin_lock_bh(&hmsg_mgr->msg_mgr_lock); - /* If a message is already there, get it */ - if (!list_empty(&msg_queue_obj->msg_used_list)) { - msg_frame_obj = list_first_entry(&msg_queue_obj->msg_used_list, - struct msg_frame, list_elem); - list_del(&msg_frame_obj->list_elem); - *pmsg = msg_frame_obj->msg_data.msg; - list_add_tail(&msg_frame_obj->list_elem, - &msg_queue_obj->msg_free_list); - if (list_empty(&msg_queue_obj->msg_used_list)) - sync_reset_event(msg_queue_obj->sync_event); - spin_unlock_bh(&hmsg_mgr->msg_mgr_lock); - return 0; - } - - if (msg_queue_obj->done) { - spin_unlock_bh(&hmsg_mgr->msg_mgr_lock); - return -EPERM; - } - msg_queue_obj->io_msg_pend++; - spin_unlock_bh(&hmsg_mgr->msg_mgr_lock); - - /* - * Wait til message is available, timeout, or done. We don't - * have to schedule the DPC, since the DSP will send messages - * when they are available. - */ - syncs[0] = msg_queue_obj->sync_event; - syncs[1] = msg_queue_obj->sync_done; - status = sync_wait_on_multiple_events(syncs, 2, utimeout, &index); - - spin_lock_bh(&hmsg_mgr->msg_mgr_lock); - if (msg_queue_obj->done) { - msg_queue_obj->io_msg_pend--; - spin_unlock_bh(&hmsg_mgr->msg_mgr_lock); - /* - * Signal that we're not going to access msg_queue_obj - * anymore, so it can be deleted. - */ - sync_set_event(msg_queue_obj->sync_done_ack); - return -EPERM; - } - if (!status && !list_empty(&msg_queue_obj->msg_used_list)) { - /* Get msg from used list */ - msg_frame_obj = list_first_entry(&msg_queue_obj->msg_used_list, - struct msg_frame, list_elem); - list_del(&msg_frame_obj->list_elem); - /* Copy message into pmsg and put frame on the free list */ - *pmsg = msg_frame_obj->msg_data.msg; - list_add_tail(&msg_frame_obj->list_elem, - &msg_queue_obj->msg_free_list); - } - msg_queue_obj->io_msg_pend--; - /* Reset the event if there are still queued messages */ - if (!list_empty(&msg_queue_obj->msg_used_list)) - sync_set_event(msg_queue_obj->sync_event); - - spin_unlock_bh(&hmsg_mgr->msg_mgr_lock); - - return status; -} - -/* - * ======== bridge_msg_put ======== - * Put a message onto a msg_ctrl queue. - */ -int bridge_msg_put(struct msg_queue *msg_queue_obj, - const struct dsp_msg *pmsg, u32 utimeout) -{ - struct msg_frame *msg_frame_obj; - struct msg_mgr *hmsg_mgr; - struct sync_object *syncs[2]; - u32 index; - int status; - - if (!msg_queue_obj || !pmsg || !msg_queue_obj->msg_mgr) - return -EFAULT; - - hmsg_mgr = msg_queue_obj->msg_mgr; - - spin_lock_bh(&hmsg_mgr->msg_mgr_lock); - - /* If a message frame is available, use it */ - if (!list_empty(&hmsg_mgr->msg_free_list)) { - msg_frame_obj = list_first_entry(&hmsg_mgr->msg_free_list, - struct msg_frame, list_elem); - list_del(&msg_frame_obj->list_elem); - msg_frame_obj->msg_data.msg = *pmsg; - msg_frame_obj->msg_data.msgq_id = - msg_queue_obj->msgq_id; - list_add_tail(&msg_frame_obj->list_elem, - &hmsg_mgr->msg_used_list); - hmsg_mgr->msgs_pending++; - - if (list_empty(&hmsg_mgr->msg_free_list)) - sync_reset_event(hmsg_mgr->sync_event); - - /* Release critical section before scheduling DPC */ - spin_unlock_bh(&hmsg_mgr->msg_mgr_lock); - /* Schedule a DPC, to do the actual data transfer: */ - iosm_schedule(hmsg_mgr->iomgr); - return 0; - } - - if (msg_queue_obj->done) { - spin_unlock_bh(&hmsg_mgr->msg_mgr_lock); - return -EPERM; - } - msg_queue_obj->io_msg_pend++; - - spin_unlock_bh(&hmsg_mgr->msg_mgr_lock); - - /* Wait til a free message frame is available, timeout, or done */ - syncs[0] = hmsg_mgr->sync_event; - syncs[1] = msg_queue_obj->sync_done; - status = sync_wait_on_multiple_events(syncs, 2, utimeout, &index); - if (status) - return status; - - /* Enter critical section */ - spin_lock_bh(&hmsg_mgr->msg_mgr_lock); - if (msg_queue_obj->done) { - msg_queue_obj->io_msg_pend--; - /* Exit critical section */ - spin_unlock_bh(&hmsg_mgr->msg_mgr_lock); - /* - * Signal that we're not going to access msg_queue_obj - * anymore, so it can be deleted. - */ - sync_set_event(msg_queue_obj->sync_done_ack); - return -EPERM; - } - - if (list_empty(&hmsg_mgr->msg_free_list)) { - spin_unlock_bh(&hmsg_mgr->msg_mgr_lock); - return -EFAULT; - } - - /* Get msg from free list */ - msg_frame_obj = list_first_entry(&hmsg_mgr->msg_free_list, - struct msg_frame, list_elem); - /* - * Copy message into pmsg and put frame on the - * used list. - */ - list_del(&msg_frame_obj->list_elem); - msg_frame_obj->msg_data.msg = *pmsg; - msg_frame_obj->msg_data.msgq_id = msg_queue_obj->msgq_id; - list_add_tail(&msg_frame_obj->list_elem, &hmsg_mgr->msg_used_list); - hmsg_mgr->msgs_pending++; - /* - * Schedule a DPC, to do the actual - * data transfer. - */ - iosm_schedule(hmsg_mgr->iomgr); - - msg_queue_obj->io_msg_pend--; - /* Reset event if there are still frames available */ - if (!list_empty(&hmsg_mgr->msg_free_list)) - sync_set_event(hmsg_mgr->sync_event); - - /* Exit critical section */ - spin_unlock_bh(&hmsg_mgr->msg_mgr_lock); - - return 0; -} - -/* - * ======== bridge_msg_register_notify ======== - */ -int bridge_msg_register_notify(struct msg_queue *msg_queue_obj, - u32 event_mask, u32 notify_type, - struct dsp_notification *hnotification) -{ - int status = 0; - - if (!msg_queue_obj || !hnotification) { - status = -ENOMEM; - goto func_end; - } - - if (!(event_mask == DSP_NODEMESSAGEREADY || event_mask == 0)) { - status = -EPERM; - goto func_end; - } - - if (notify_type != DSP_SIGNALEVENT) { - status = -EBADR; - goto func_end; - } - - if (event_mask) - status = ntfy_register(msg_queue_obj->ntfy_obj, hnotification, - event_mask, notify_type); - else - status = ntfy_unregister(msg_queue_obj->ntfy_obj, - hnotification); - - if (status == -EINVAL) { - /* Not registered. Ok, since we couldn't have known. Node - * notifications are split between node state change handled - * by NODE, and message ready handled by msg_ctrl. */ - status = 0; - } -func_end: - return status; -} - -/* - * ======== bridge_msg_set_queue_id ======== - */ -void bridge_msg_set_queue_id(struct msg_queue *msg_queue_obj, u32 msgq_id) -{ - /* - * A message queue must be created when a node is allocated, - * so that node_register_notify() can be called before the node - * is created. Since we don't know the node environment until the - * node is created, we need this function to set msg_queue_obj->msgq_id - * to the node environment, after the node is created. - */ - if (msg_queue_obj) - msg_queue_obj->msgq_id = msgq_id; -} - -/* - * ======== add_new_msg ======== - * Must be called in message manager critical section. - */ -static int add_new_msg(struct list_head *msg_list) -{ - struct msg_frame *pmsg; - - pmsg = kzalloc(sizeof(struct msg_frame), GFP_ATOMIC); - if (!pmsg) - return -ENOMEM; - - list_add_tail(&pmsg->list_elem, msg_list); - - return 0; -} - -/* - * ======== delete_msg_mgr ======== - */ -static void delete_msg_mgr(struct msg_mgr *hmsg_mgr) -{ - if (!hmsg_mgr) - return; - - /* FIXME: free elements from queue_list? */ - free_msg_list(&hmsg_mgr->msg_free_list); - free_msg_list(&hmsg_mgr->msg_used_list); - kfree(hmsg_mgr->sync_event); - kfree(hmsg_mgr); -} - -/* - * ======== delete_msg_queue ======== - */ -static void delete_msg_queue(struct msg_queue *msg_queue_obj, u32 num_to_dsp) -{ - struct msg_mgr *hmsg_mgr; - struct msg_frame *pmsg, *tmp; - u32 i; - - if (!msg_queue_obj || !msg_queue_obj->msg_mgr) - return; - - hmsg_mgr = msg_queue_obj->msg_mgr; - - /* Pull off num_to_dsp message frames from Msg manager and free */ - i = 0; - list_for_each_entry_safe(pmsg, tmp, &hmsg_mgr->msg_free_list, - list_elem) { - list_del(&pmsg->list_elem); - kfree(pmsg); - if (i++ >= num_to_dsp) - break; - } - - free_msg_list(&msg_queue_obj->msg_free_list); - free_msg_list(&msg_queue_obj->msg_used_list); - - if (msg_queue_obj->ntfy_obj) { - ntfy_delete(msg_queue_obj->ntfy_obj); - kfree(msg_queue_obj->ntfy_obj); - } - - kfree(msg_queue_obj->sync_event); - kfree(msg_queue_obj->sync_done); - kfree(msg_queue_obj->sync_done_ack); - - kfree(msg_queue_obj); -} - -/* - * ======== free_msg_list ======== - */ -static void free_msg_list(struct list_head *msg_list) -{ - struct msg_frame *pmsg, *tmp; - - if (!msg_list) - return; - - list_for_each_entry_safe(pmsg, tmp, msg_list, list_elem) { - list_del(&pmsg->list_elem); - kfree(pmsg); - } -} diff --git a/drivers/staging/tidspbridge/core/sync.c b/drivers/staging/tidspbridge/core/sync.c deleted file mode 100644 index 743ff09d82d2..000000000000 --- a/drivers/staging/tidspbridge/core/sync.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - * sync.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Synchronization services. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- This */ -#include -#include - -DEFINE_SPINLOCK(sync_lock); - -/** - * sync_set_event() - set or signal and specified event - * @event: Event to be set.. - * - * set the @event, if there is an thread waiting for the event - * it will be waken up, this function only wakes one thread. - */ - -void sync_set_event(struct sync_object *event) -{ - spin_lock_bh(&sync_lock); - complete(&event->comp); - if (event->multi_comp) - complete(event->multi_comp); - spin_unlock_bh(&sync_lock); -} - -/** - * sync_wait_on_multiple_events() - waits for multiple events to be set. - * @events: Array of events to wait for them. - * @count: number of elements of the array. - * @timeout timeout on waiting for the evetns. - * @pu_index index of the event set. - * - * These functions will wait until any of the array element is set or until - * timeout. In case of success the function will return 0 and - * @pu_index will store the index of the array element set or in case - * of timeout the function will return -ETIME or in case of - * interrupting by a signal it will return -EPERM. - */ - -int sync_wait_on_multiple_events(struct sync_object **events, - unsigned count, unsigned timeout, - unsigned *index) -{ - unsigned i; - int status = -EPERM; - struct completion m_comp; - - init_completion(&m_comp); - - if (SYNC_INFINITE == timeout) - timeout = MAX_SCHEDULE_TIMEOUT; - - spin_lock_bh(&sync_lock); - for (i = 0; i < count; i++) { - if (completion_done(&events[i]->comp)) { - reinit_completion(&events[i]->comp); - *index = i; - spin_unlock_bh(&sync_lock); - status = 0; - goto func_end; - } - } - - for (i = 0; i < count; i++) - events[i]->multi_comp = &m_comp; - - spin_unlock_bh(&sync_lock); - - if (!wait_for_completion_interruptible_timeout(&m_comp, - msecs_to_jiffies(timeout))) - status = -ETIME; - - spin_lock_bh(&sync_lock); - for (i = 0; i < count; i++) { - if (completion_done(&events[i]->comp)) { - reinit_completion(&events[i]->comp); - *index = i; - status = 0; - } - events[i]->multi_comp = NULL; - } - spin_unlock_bh(&sync_lock); -func_end: - return status; -} - -/** - * dsp_notifier_event() - callback function to nofity events - * @this: pointer to itself struct notifier_block - * @event: event to be notified. - * @data: Currently not used. - * - */ -int dsp_notifier_event(struct notifier_block *this, unsigned long event, - void *data) -{ - struct ntfy_event *ne = container_of(this, struct ntfy_event, - noti_block); - if (ne->event & event) - sync_set_event(&ne->sync_obj); - return NOTIFY_OK; -} diff --git a/drivers/staging/tidspbridge/core/tiomap3430.c b/drivers/staging/tidspbridge/core/tiomap3430.c deleted file mode 100644 index f63dd8f4dde9..000000000000 --- a/drivers/staging/tidspbridge/core/tiomap3430.c +++ /dev/null @@ -1,1815 +0,0 @@ -/* - * tiomap.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Processor Manager Driver for TI OMAP3430 EVM. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include - -#include -/* ----------------------------------- Host OS */ -#include -#include -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- OS Adaptation Layer */ -#include -#include - -/* ------------------------------------ Hardware Abstraction Layer */ -#include -#include - -/* ----------------------------------- Link Driver */ -#include -#include -#include -#include -#include -#include -#include - -/* ----------------------------------- Platform Manager */ -#include -#include -#include -#include - -/* ----------------------------------- Local */ -#include "_tiomap.h" -#include "_tiomap_pwr.h" -#include "tiomap_io.h" - -/* Offset in shared mem to write to in order to synchronize start with DSP */ -#define SHMSYNCOFFSET 4 /* GPP byte offset */ - -#define BUFFERSIZE 1024 - -#define TIHELEN_ACKTIMEOUT 10000 - -#define MMU_SECTION_ADDR_MASK 0xFFF00000 -#define MMU_SSECTION_ADDR_MASK 0xFF000000 -#define MMU_LARGE_PAGE_MASK 0xFFFF0000 -#define MMU_SMALL_PAGE_MASK 0xFFFFF000 -#define OMAP3_IVA2_BOOTADDR_MASK 0xFFFFFC00 -#define PAGES_II_LVL_TABLE 512 -#define PHYS_TO_PAGE(phys) pfn_to_page((phys) >> PAGE_SHIFT) - -/* IVA Boot modes */ -#define DIRECT 0 -#define IDLE 1 - -/* Forward Declarations: */ -static int bridge_brd_monitor(struct bridge_dev_context *dev_ctxt); -static int bridge_brd_read(struct bridge_dev_context *dev_ctxt, - u8 *host_buff, - u32 dsp_addr, u32 ul_num_bytes, - u32 mem_type); -static int bridge_brd_start(struct bridge_dev_context *dev_ctxt, - u32 dsp_addr); -static int bridge_brd_status(struct bridge_dev_context *dev_ctxt, - int *board_state); -static int bridge_brd_stop(struct bridge_dev_context *dev_ctxt); -static int bridge_brd_write(struct bridge_dev_context *dev_ctxt, - u8 *host_buff, - u32 dsp_addr, u32 ul_num_bytes, - u32 mem_type); -static int bridge_brd_set_state(struct bridge_dev_context *dev_ctxt, - u32 brd_state); -static int bridge_brd_mem_copy(struct bridge_dev_context *dev_ctxt, - u32 dsp_dest_addr, u32 dsp_src_addr, - u32 ul_num_bytes, u32 mem_type); -static int bridge_brd_mem_write(struct bridge_dev_context *dev_ctxt, - u8 *host_buff, u32 dsp_addr, - u32 ul_num_bytes, u32 mem_type); -static int bridge_brd_mem_map(struct bridge_dev_context *dev_ctxt, - u32 ul_mpu_addr, u32 virt_addr, - u32 ul_num_bytes, u32 ul_map_attr, - struct page **mapped_pages); -static int bridge_brd_mem_un_map(struct bridge_dev_context *dev_ctxt, - u32 virt_addr, u32 ul_num_bytes); -static int bridge_dev_create(struct bridge_dev_context - **dev_cntxt, - struct dev_object *hdev_obj, - struct cfg_hostres *config_param); -static int bridge_dev_ctrl(struct bridge_dev_context *dev_context, - u32 dw_cmd, void *pargs); -static int bridge_dev_destroy(struct bridge_dev_context *dev_ctxt); -static u32 user_va2_pa(struct mm_struct *mm, u32 address); -static int pte_update(struct bridge_dev_context *dev_ctxt, u32 pa, - u32 va, u32 size, - struct hw_mmu_map_attrs_t *map_attrs); -static int pte_set(struct pg_table_attrs *pt, u32 pa, u32 va, - u32 size, struct hw_mmu_map_attrs_t *attrs); -static int mem_map_vmalloc(struct bridge_dev_context *dev_context, - u32 ul_mpu_addr, u32 virt_addr, - u32 ul_num_bytes, - struct hw_mmu_map_attrs_t *hw_attrs); - -bool wait_for_start(struct bridge_dev_context *dev_context, - void __iomem *sync_addr); - -/* ----------------------------------- Globals */ - -/* Attributes of L2 page tables for DSP MMU */ -struct page_info { - u32 num_entries; /* Number of valid PTEs in the L2 PT */ -}; - -/* Attributes used to manage the DSP MMU page tables */ -struct pg_table_attrs { - spinlock_t pg_lock; /* Critical section object handle */ - - u32 l1_base_pa; /* Physical address of the L1 PT */ - u32 l1_base_va; /* Virtual address of the L1 PT */ - u32 l1_size; /* Size of the L1 PT */ - u32 l1_tbl_alloc_pa; - /* Physical address of Allocated mem for L1 table. May not be aligned */ - u32 l1_tbl_alloc_va; - /* Virtual address of Allocated mem for L1 table. May not be aligned */ - u32 l1_tbl_alloc_sz; - /* Size of consistent memory allocated for L1 table. - * May not be aligned */ - - u32 l2_base_pa; /* Physical address of the L2 PT */ - u32 l2_base_va; /* Virtual address of the L2 PT */ - u32 l2_size; /* Size of the L2 PT */ - u32 l2_tbl_alloc_pa; - /* Physical address of Allocated mem for L2 table. May not be aligned */ - u32 l2_tbl_alloc_va; - /* Virtual address of Allocated mem for L2 table. May not be aligned */ - u32 l2_tbl_alloc_sz; - /* Size of consistent memory allocated for L2 table. - * May not be aligned */ - - u32 l2_num_pages; /* Number of allocated L2 PT */ - /* Array [l2_num_pages] of L2 PT info structs */ - struct page_info *pg_info; -}; - -/* - * This Bridge driver's function interface table. - */ -static struct bridge_drv_interface drv_interface_fxns = { - /* Bridge API ver. for which this bridge driver is built. */ - BRD_API_MAJOR_VERSION, - BRD_API_MINOR_VERSION, - bridge_dev_create, - bridge_dev_destroy, - bridge_dev_ctrl, - bridge_brd_monitor, - bridge_brd_start, - bridge_brd_stop, - bridge_brd_status, - bridge_brd_read, - bridge_brd_write, - bridge_brd_set_state, - bridge_brd_mem_copy, - bridge_brd_mem_write, - bridge_brd_mem_map, - bridge_brd_mem_un_map, - /* The following CHNL functions are provided by chnl_io.lib: */ - bridge_chnl_create, - bridge_chnl_destroy, - bridge_chnl_open, - bridge_chnl_close, - bridge_chnl_add_io_req, - bridge_chnl_get_ioc, - bridge_chnl_cancel_io, - bridge_chnl_flush_io, - bridge_chnl_get_info, - bridge_chnl_get_mgr_info, - bridge_chnl_idle, - bridge_chnl_register_notify, - /* The following IO functions are provided by chnl_io.lib: */ - bridge_io_create, - bridge_io_destroy, - bridge_io_on_loaded, - bridge_io_get_proc_load, - /* The following msg_ctrl functions are provided by chnl_io.lib: */ - bridge_msg_create, - bridge_msg_create_queue, - bridge_msg_delete, - bridge_msg_delete_queue, - bridge_msg_get, - bridge_msg_put, - bridge_msg_register_notify, - bridge_msg_set_queue_id, -}; - -static struct notifier_block dsp_mbox_notifier = { - .notifier_call = io_mbox_msg, -}; - -static inline void flush_all(struct bridge_dev_context *dev_context) -{ - if (dev_context->brd_state == BRD_DSP_HIBERNATION || - dev_context->brd_state == BRD_HIBERNATION) - wake_dsp(dev_context, NULL); - - hw_mmu_tlb_flush_all(dev_context->dsp_mmu_base); -} - -static void bad_page_dump(u32 pa, struct page *pg) -{ - pr_emerg("DSPBRIDGE: MAP function: COUNT 0 FOR PA 0x%x\n", pa); - pr_emerg("Bad page state in process '%s'\n" - "page:%p flags:0x%0*lx mapping:%p mapcount:%d count:%d\n" - "Backtrace:\n", - current->comm, pg, (int)(2 * sizeof(unsigned long)), - (unsigned long)pg->flags, pg->mapping, - page_mapcount(pg), page_count(pg)); - dump_stack(); -} - -/* - * ======== bridge_drv_entry ======== - * purpose: - * Bridge Driver entry point. - */ -void bridge_drv_entry(struct bridge_drv_interface **drv_intf, - const char *driver_file_name) -{ - if (strcmp(driver_file_name, "UMA") == 0) - *drv_intf = &drv_interface_fxns; - else - dev_dbg(bridge, "%s Unknown Bridge file name", __func__); - -} - -/* - * ======== bridge_brd_monitor ======== - * purpose: - * This bridge_brd_monitor puts DSP into a Loadable state. - * i.e Application can load and start the device. - * - * Preconditions: - * Device in 'OFF' state. - */ -static int bridge_brd_monitor(struct bridge_dev_context *dev_ctxt) -{ - struct bridge_dev_context *dev_context = dev_ctxt; - u32 temp; - struct omap_dsp_platform_data *pdata = - omap_dspbridge_dev->dev.platform_data; - - temp = (*pdata->dsp_prm_read)(OMAP3430_IVA2_MOD, OMAP2_PM_PWSTST) & - OMAP_POWERSTATEST_MASK; - if (!(temp & 0x02)) { - /* IVA2 is not in ON state */ - /* Read and set PM_PWSTCTRL_IVA2 to ON */ - (*pdata->dsp_prm_rmw_bits)(OMAP_POWERSTATEST_MASK, - PWRDM_POWER_ON, OMAP3430_IVA2_MOD, OMAP2_PM_PWSTCTRL); - /* Set the SW supervised state transition */ - (*pdata->dsp_cm_write)(OMAP34XX_CLKSTCTRL_FORCE_WAKEUP, - OMAP3430_IVA2_MOD, OMAP2_CM_CLKSTCTRL); - - /* Wait until the state has moved to ON */ - while ((*pdata->dsp_prm_read)(OMAP3430_IVA2_MOD, - OMAP2_PM_PWSTST) & - OMAP_INTRANSITION_MASK) - ; - /* Disable Automatic transition */ - (*pdata->dsp_cm_write)(OMAP34XX_CLKSTCTRL_DISABLE_AUTO, - OMAP3430_IVA2_MOD, OMAP2_CM_CLKSTCTRL); - } - (*pdata->dsp_prm_rmw_bits)(OMAP3430_RST2_IVA2_MASK, 0, - OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL); - dsp_clk_enable(DSP_CLK_IVA2); - - /* set the device state to IDLE */ - dev_context->brd_state = BRD_IDLE; - - return 0; -} - -/* - * ======== bridge_brd_read ======== - * purpose: - * Reads buffers for DSP memory. - */ -static int bridge_brd_read(struct bridge_dev_context *dev_ctxt, - u8 *host_buff, u32 dsp_addr, - u32 ul_num_bytes, u32 mem_type) -{ - int status = 0; - struct bridge_dev_context *dev_context = dev_ctxt; - u32 offset; - u32 dsp_base_addr = dev_ctxt->dsp_base_addr; - - if (dsp_addr < dev_context->dsp_start_add) { - status = -EPERM; - return status; - } - /* change here to account for the 3 bands of the DSP internal memory */ - if ((dsp_addr - dev_context->dsp_start_add) < - dev_context->internal_size) { - offset = dsp_addr - dev_context->dsp_start_add; - } else { - status = read_ext_dsp_data(dev_context, host_buff, dsp_addr, - ul_num_bytes, mem_type); - return status; - } - /* copy the data from DSP memory */ - memcpy(host_buff, (void *)(dsp_base_addr + offset), ul_num_bytes); - return status; -} - -/* - * ======== bridge_brd_set_state ======== - * purpose: - * This routine updates the Board status. - */ -static int bridge_brd_set_state(struct bridge_dev_context *dev_ctxt, - u32 brd_state) -{ - int status = 0; - struct bridge_dev_context *dev_context = dev_ctxt; - - dev_context->brd_state = brd_state; - return status; -} - -/* - * ======== bridge_brd_start ======== - * purpose: - * Initializes DSP MMU and Starts DSP. - * - * Preconditions: - * a) DSP domain is 'ACTIVE'. - * b) DSP_RST1 is asserted. - * b) DSP_RST2 is released. - */ -static int bridge_brd_start(struct bridge_dev_context *dev_ctxt, - u32 dsp_addr) -{ - int status = 0; - struct bridge_dev_context *dev_context = dev_ctxt; - void __iomem *sync_addr; - u32 ul_shm_base; /* Gpp Phys SM base addr(byte) */ - u32 ul_shm_base_virt; /* Dsp Virt SM base addr */ - u32 ul_tlb_base_virt; /* Base of MMU TLB entry */ - u32 shm_sync_pa; - /* Offset of shm_base_virt from tlb_base_virt */ - u32 ul_shm_offset_virt; - s32 entry_ndx; - s32 itmp_entry_ndx = 0; /* DSP-MMU TLB entry base address */ - struct cfg_hostres *resources = NULL; - u32 temp; - u32 ul_dsp_clk_rate; - u32 ul_dsp_clk_addr; - u32 ul_bios_gp_timer; - u32 clk_cmd; - struct io_mgr *hio_mgr; - u32 ul_load_monitor_timer; - u32 wdt_en = 0; - struct omap_dsp_platform_data *pdata = - omap_dspbridge_dev->dev.platform_data; - - /* The device context contains all the mmu setup info from when the - * last dsp base image was loaded. The first entry is always - * SHMMEM base. */ - /* Get SHM_BEG - convert to byte address */ - (void)dev_get_symbol(dev_context->dev_obj, SHMBASENAME, - &ul_shm_base_virt); - ul_shm_base_virt *= DSPWORDSIZE; - /* DSP Virtual address */ - ul_tlb_base_virt = dev_context->atlb_entry[0].dsp_va; - ul_shm_offset_virt = - ul_shm_base_virt - (ul_tlb_base_virt * DSPWORDSIZE); - /* Kernel logical address */ - ul_shm_base = dev_context->atlb_entry[0].gpp_va + ul_shm_offset_virt; - - /* SHM physical sync address */ - shm_sync_pa = dev_context->atlb_entry[0].gpp_pa + ul_shm_offset_virt + - SHMSYNCOFFSET; - - /* 2nd wd is used as sync field */ - sync_addr = ioremap(shm_sync_pa, SZ_32); - if (!sync_addr) - return -ENOMEM; - - /* Write a signature into the shm base + offset; this will - * get cleared when the DSP program starts. */ - if ((ul_shm_base_virt == 0) || (ul_shm_base == 0)) { - pr_err("%s: Illegal SM base\n", __func__); - status = -EPERM; - } else - __raw_writel(0xffffffff, sync_addr); - - if (!status) { - resources = dev_context->resources; - if (!resources) - status = -EPERM; - - /* Assert RST1 i.e only the RST only for DSP megacell */ - if (!status) { - (*pdata->dsp_prm_rmw_bits)(OMAP3430_RST1_IVA2_MASK, - OMAP3430_RST1_IVA2_MASK, - OMAP3430_IVA2_MOD, - OMAP2_RM_RSTCTRL); - - /* Mask address with 1K for compatibility */ - pdata->set_bootaddr(dsp_addr & - OMAP3_IVA2_BOOTADDR_MASK); - pdata->set_bootmode(dsp_debug ? IDLE : DIRECT); - } - } - if (!status) { - /* Reset and Unreset the RST2, so that BOOTADDR is copied to - * IVA2 SYSC register */ - (*pdata->dsp_prm_rmw_bits)(OMAP3430_RST2_IVA2_MASK, - OMAP3430_RST2_IVA2_MASK, OMAP3430_IVA2_MOD, - OMAP2_RM_RSTCTRL); - udelay(100); - (*pdata->dsp_prm_rmw_bits)(OMAP3430_RST2_IVA2_MASK, 0, - OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL); - udelay(100); - - /* Disbale the DSP MMU */ - hw_mmu_disable(resources->dmmu_base); - /* Disable TWL */ - hw_mmu_twl_disable(resources->dmmu_base); - - /* Only make TLB entry if both addresses are non-zero */ - for (entry_ndx = 0; entry_ndx < BRDIOCTL_NUMOFMMUTLB; - entry_ndx++) { - struct bridge_ioctl_extproc *e = - &dev_context->atlb_entry[entry_ndx]; - struct hw_mmu_map_attrs_t map_attrs = { - .endianism = e->endianism, - .element_size = e->elem_size, - .mixed_size = e->mixed_mode, - }; - - if (!e->gpp_pa || !e->dsp_va) - continue; - - dev_dbg(bridge, - "MMU %d, pa: 0x%x, va: 0x%x, size: 0x%x", - itmp_entry_ndx, - e->gpp_pa, - e->dsp_va, - e->size); - - hw_mmu_tlb_add(dev_context->dsp_mmu_base, - e->gpp_pa, - e->dsp_va, - e->size, - itmp_entry_ndx, - &map_attrs, 1, 1); - - itmp_entry_ndx++; - } - } - - /* Lock the above TLB entries and get the BIOS and load monitor timer - * information */ - if (!status) { - hw_mmu_num_locked_set(resources->dmmu_base, itmp_entry_ndx); - hw_mmu_victim_num_set(resources->dmmu_base, itmp_entry_ndx); - hw_mmu_ttb_set(resources->dmmu_base, - dev_context->pt_attrs->l1_base_pa); - hw_mmu_twl_enable(resources->dmmu_base); - /* Enable the SmartIdle and AutoIdle bit for MMU_SYSCONFIG */ - - temp = __raw_readl((resources->dmmu_base) + 0x10); - temp = (temp & 0xFFFFFFEF) | 0x11; - __raw_writel(temp, (resources->dmmu_base) + 0x10); - - /* Let the DSP MMU run */ - hw_mmu_enable(resources->dmmu_base); - - /* Enable the BIOS clock */ - (void)dev_get_symbol(dev_context->dev_obj, - BRIDGEINIT_BIOSGPTIMER, &ul_bios_gp_timer); - (void)dev_get_symbol(dev_context->dev_obj, - BRIDGEINIT_LOADMON_GPTIMER, - &ul_load_monitor_timer); - } - - if (!status) { - if (ul_load_monitor_timer != 0xFFFF) { - clk_cmd = (BPWR_ENABLE_CLOCK << MBX_PM_CLK_CMDSHIFT) | - ul_load_monitor_timer; - dsp_peripheral_clk_ctrl(dev_context, &clk_cmd); - } else { - dev_dbg(bridge, "Not able to get the symbol for Load " - "Monitor Timer\n"); - } - } - - if (!status) { - if (ul_bios_gp_timer != 0xFFFF) { - clk_cmd = (BPWR_ENABLE_CLOCK << MBX_PM_CLK_CMDSHIFT) | - ul_bios_gp_timer; - dsp_peripheral_clk_ctrl(dev_context, &clk_cmd); - } else { - dev_dbg(bridge, - "Not able to get the symbol for BIOS Timer\n"); - } - } - - if (!status) { - /* Set the DSP clock rate */ - (void)dev_get_symbol(dev_context->dev_obj, - "_BRIDGEINIT_DSP_FREQ", &ul_dsp_clk_addr); - /*Set Autoidle Mode for IVA2 PLL */ - (*pdata->dsp_cm_write)(1 << OMAP3430_AUTO_IVA2_DPLL_SHIFT, - OMAP3430_IVA2_MOD, OMAP3430_CM_AUTOIDLE_PLL); - - if ((unsigned int *)ul_dsp_clk_addr != NULL) { - /* Get the clock rate */ - ul_dsp_clk_rate = dsp_clk_get_iva2_rate(); - dev_dbg(bridge, "%s: DSP clock rate (KHZ): 0x%x \n", - __func__, ul_dsp_clk_rate); - (void)bridge_brd_write(dev_context, - (u8 *) &ul_dsp_clk_rate, - ul_dsp_clk_addr, sizeof(u32), 0); - } - /* - * Enable Mailbox events and also drain any pending - * stale messages. - */ - dev_context->mbox = omap_mbox_get("dsp", &dsp_mbox_notifier); - if (IS_ERR(dev_context->mbox)) { - dev_context->mbox = NULL; - pr_err("%s: Failed to get dsp mailbox handle\n", - __func__); - status = -EPERM; - } - - } - if (!status) { -/*PM_IVA2GRPSEL_PER = 0xC0;*/ - temp = readl(resources->per_pm_base + 0xA8); - temp = (temp & 0xFFFFFF30) | 0xC0; - writel(temp, resources->per_pm_base + 0xA8); - -/*PM_MPUGRPSEL_PER &= 0xFFFFFF3F; */ - temp = readl(resources->per_pm_base + 0xA4); - temp = (temp & 0xFFFFFF3F); - writel(temp, resources->per_pm_base + 0xA4); -/*CM_SLEEPDEP_PER |= 0x04; */ - temp = readl(resources->per_base + 0x44); - temp = (temp & 0xFFFFFFFB) | 0x04; - writel(temp, resources->per_base + 0x44); - -/*CM_CLKSTCTRL_IVA2 = 0x00000003 -To Allow automatic transitions */ - (*pdata->dsp_cm_write)(OMAP34XX_CLKSTCTRL_ENABLE_AUTO, - OMAP3430_IVA2_MOD, OMAP2_CM_CLKSTCTRL); - - /* Let DSP go */ - dev_dbg(bridge, "%s Unreset\n", __func__); - /* Enable DSP MMU Interrupts */ - hw_mmu_event_enable(resources->dmmu_base, - HW_MMU_ALL_INTERRUPTS); - /* release the RST1, DSP starts executing now .. */ - (*pdata->dsp_prm_rmw_bits)(OMAP3430_RST1_IVA2_MASK, 0, - OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL); - - dev_dbg(bridge, "Waiting for Sync @ 0x%x\n", *(u32 *)sync_addr); - dev_dbg(bridge, "DSP c_int00 Address = 0x%x\n", dsp_addr); - if (dsp_debug) - while (__raw_readw(sync_addr)) - ; - - /* Wait for DSP to clear word in shared memory */ - /* Read the Location */ - if (!wait_for_start(dev_context, sync_addr)) - status = -ETIMEDOUT; - - dev_get_symbol(dev_context->dev_obj, "_WDT_enable", &wdt_en); - if (wdt_en) { - /* Start wdt */ - dsp_wdt_sm_set((void *)ul_shm_base); - dsp_wdt_enable(true); - } - - status = dev_get_io_mgr(dev_context->dev_obj, &hio_mgr); - if (hio_mgr) { - io_sh_msetting(hio_mgr, SHM_OPPINFO, NULL); - /* Write the synchronization bit to indicate the - * completion of OPP table update to DSP - */ - __raw_writel(0XCAFECAFE, sync_addr); - - /* update board state */ - dev_context->brd_state = BRD_RUNNING; - /* (void)chnlsm_enable_interrupt(dev_context); */ - } else { - dev_context->brd_state = BRD_UNKNOWN; - } - } - - iounmap(sync_addr); - - return status; -} - -/* - * ======== bridge_brd_stop ======== - * purpose: - * Puts DSP in self loop. - * - * Preconditions : - * a) None - */ -static int bridge_brd_stop(struct bridge_dev_context *dev_ctxt) -{ - int status = 0; - struct bridge_dev_context *dev_context = dev_ctxt; - struct pg_table_attrs *pt_attrs; - u32 dsp_pwr_state; - struct omap_dsp_platform_data *pdata = - omap_dspbridge_dev->dev.platform_data; - - if (dev_context->brd_state == BRD_STOPPED) - return status; - - /* as per TRM, it is advised to first drive the IVA2 to 'Standby' mode, - * before turning off the clocks.. This is to ensure that there are no - * pending L3 or other transactons from IVA2 */ - dsp_pwr_state = (*pdata->dsp_prm_read) - (OMAP3430_IVA2_MOD, OMAP2_PM_PWSTST) & OMAP_POWERSTATEST_MASK; - if (dsp_pwr_state != PWRDM_POWER_OFF) { - (*pdata->dsp_prm_rmw_bits)(OMAP3430_RST2_IVA2_MASK, 0, - OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL); - sm_interrupt_dsp(dev_context, MBX_PM_DSPIDLE); - mdelay(10); - - /* IVA2 is not in OFF state */ - /* Set PM_PWSTCTRL_IVA2 to OFF */ - (*pdata->dsp_prm_rmw_bits)(OMAP_POWERSTATEST_MASK, - PWRDM_POWER_OFF, OMAP3430_IVA2_MOD, OMAP2_PM_PWSTCTRL); - /* Set the SW supervised state transition for Sleep */ - (*pdata->dsp_cm_write)(OMAP34XX_CLKSTCTRL_FORCE_SLEEP, - OMAP3430_IVA2_MOD, OMAP2_CM_CLKSTCTRL); - } - udelay(10); - /* Release the Ext Base virtual Address as the next DSP Program - * may have a different load address */ - if (dev_context->dsp_ext_base_addr) - dev_context->dsp_ext_base_addr = 0; - - dev_context->brd_state = BRD_STOPPED; /* update board state */ - - dsp_wdt_enable(false); - - /* This is a good place to clear the MMU page tables as well */ - if (dev_context->pt_attrs) { - pt_attrs = dev_context->pt_attrs; - memset((u8 *) pt_attrs->l1_base_va, 0x00, pt_attrs->l1_size); - memset((u8 *) pt_attrs->l2_base_va, 0x00, pt_attrs->l2_size); - memset((u8 *) pt_attrs->pg_info, 0x00, - (pt_attrs->l2_num_pages * sizeof(struct page_info))); - } - /* Disable the mailbox interrupts */ - if (dev_context->mbox) { - omap_mbox_disable_irq(dev_context->mbox, IRQ_RX); - omap_mbox_put(dev_context->mbox, &dsp_mbox_notifier); - dev_context->mbox = NULL; - } - /* Reset IVA2 clocks*/ - (*pdata->dsp_prm_write)(OMAP3430_RST1_IVA2_MASK | - OMAP3430_RST2_IVA2_MASK | OMAP3430_RST3_IVA2_MASK, - OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL); - - dsp_clock_disable_all(dev_context->dsp_per_clks); - dsp_clk_disable(DSP_CLK_IVA2); - - return status; -} - -/* - * ======== bridge_brd_status ======== - * Returns the board status. - */ -static int bridge_brd_status(struct bridge_dev_context *dev_ctxt, - int *board_state) -{ - struct bridge_dev_context *dev_context = dev_ctxt; - *board_state = dev_context->brd_state; - return 0; -} - -/* - * ======== bridge_brd_write ======== - * Copies the buffers to DSP internal or external memory. - */ -static int bridge_brd_write(struct bridge_dev_context *dev_ctxt, - u8 *host_buff, u32 dsp_addr, - u32 ul_num_bytes, u32 mem_type) -{ - int status = 0; - struct bridge_dev_context *dev_context = dev_ctxt; - - if (dsp_addr < dev_context->dsp_start_add) { - status = -EPERM; - return status; - } - if ((dsp_addr - dev_context->dsp_start_add) < - dev_context->internal_size) { - status = write_dsp_data(dev_ctxt, host_buff, dsp_addr, - ul_num_bytes, mem_type); - } else { - status = write_ext_dsp_data(dev_context, host_buff, dsp_addr, - ul_num_bytes, mem_type, false); - } - - return status; -} - -/* - * ======== bridge_dev_create ======== - * Creates a driver object. Puts DSP in self loop. - */ -static int bridge_dev_create(struct bridge_dev_context - **dev_cntxt, - struct dev_object *hdev_obj, - struct cfg_hostres *config_param) -{ - int status = 0; - struct bridge_dev_context *dev_context = NULL; - s32 entry_ndx; - struct cfg_hostres *resources = config_param; - struct pg_table_attrs *pt_attrs; - u32 pg_tbl_pa; - u32 pg_tbl_va; - u32 align_size; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - /* Allocate and initialize a data structure to contain the bridge driver - * state, which becomes the context for later calls into this driver */ - dev_context = kzalloc(sizeof(struct bridge_dev_context), GFP_KERNEL); - if (!dev_context) { - status = -ENOMEM; - goto func_end; - } - - dev_context->dsp_start_add = (u32) OMAP_GEM_BASE; - dev_context->self_loop = (u32) NULL; - dev_context->dsp_per_clks = 0; - dev_context->internal_size = OMAP_DSP_SIZE; - /* Clear dev context MMU table entries. - * These get set on bridge_io_on_loaded() call after program loaded. */ - for (entry_ndx = 0; entry_ndx < BRDIOCTL_NUMOFMMUTLB; entry_ndx++) { - dev_context->atlb_entry[entry_ndx].gpp_pa = - dev_context->atlb_entry[entry_ndx].dsp_va = 0; - } - dev_context->dsp_base_addr = (u32) MEM_LINEAR_ADDRESS((void *) - (config_param-> - mem_base - [3]), - config_param-> - mem_length - [3]); - if (!dev_context->dsp_base_addr) - status = -EPERM; - - pt_attrs = kzalloc(sizeof(struct pg_table_attrs), GFP_KERNEL); - if (pt_attrs != NULL) { - pt_attrs->l1_size = SZ_16K; /* 4096 entries of 32 bits */ - align_size = pt_attrs->l1_size; - /* Align sizes are expected to be power of 2 */ - /* we like to get aligned on L1 table size */ - pg_tbl_va = (u32) mem_alloc_phys_mem(pt_attrs->l1_size, - align_size, &pg_tbl_pa); - - /* Check if the PA is aligned for us */ - if ((pg_tbl_pa) & (align_size - 1)) { - /* PA not aligned to page table size , - * try with more allocation and align */ - mem_free_phys_mem((void *)pg_tbl_va, pg_tbl_pa, - pt_attrs->l1_size); - /* we like to get aligned on L1 table size */ - pg_tbl_va = - (u32) mem_alloc_phys_mem((pt_attrs->l1_size) * 2, - align_size, &pg_tbl_pa); - /* We should be able to get aligned table now */ - pt_attrs->l1_tbl_alloc_pa = pg_tbl_pa; - pt_attrs->l1_tbl_alloc_va = pg_tbl_va; - pt_attrs->l1_tbl_alloc_sz = pt_attrs->l1_size * 2; - /* Align the PA to the next 'align' boundary */ - pt_attrs->l1_base_pa = - ((pg_tbl_pa) + - (align_size - 1)) & (~(align_size - 1)); - pt_attrs->l1_base_va = - pg_tbl_va + (pt_attrs->l1_base_pa - pg_tbl_pa); - } else { - /* We got aligned PA, cool */ - pt_attrs->l1_tbl_alloc_pa = pg_tbl_pa; - pt_attrs->l1_tbl_alloc_va = pg_tbl_va; - pt_attrs->l1_tbl_alloc_sz = pt_attrs->l1_size; - pt_attrs->l1_base_pa = pg_tbl_pa; - pt_attrs->l1_base_va = pg_tbl_va; - } - if (pt_attrs->l1_base_va) - memset((u8 *) pt_attrs->l1_base_va, 0x00, - pt_attrs->l1_size); - - /* number of L2 page tables = DMM pool used + SHMMEM +EXTMEM + - * L4 pages */ - pt_attrs->l2_num_pages = ((DMMPOOLSIZE >> 20) + 6); - pt_attrs->l2_size = HW_MMU_COARSE_PAGE_SIZE * - pt_attrs->l2_num_pages; - align_size = 4; /* Make it u32 aligned */ - /* we like to get aligned on L1 table size */ - pg_tbl_va = (u32) mem_alloc_phys_mem(pt_attrs->l2_size, - align_size, &pg_tbl_pa); - pt_attrs->l2_tbl_alloc_pa = pg_tbl_pa; - pt_attrs->l2_tbl_alloc_va = pg_tbl_va; - pt_attrs->l2_tbl_alloc_sz = pt_attrs->l2_size; - pt_attrs->l2_base_pa = pg_tbl_pa; - pt_attrs->l2_base_va = pg_tbl_va; - - if (pt_attrs->l2_base_va) - memset((u8 *) pt_attrs->l2_base_va, 0x00, - pt_attrs->l2_size); - - pt_attrs->pg_info = kzalloc(pt_attrs->l2_num_pages * - sizeof(struct page_info), GFP_KERNEL); - dev_dbg(bridge, - "L1 pa %x, va %x, size %x\n L2 pa %x, va " - "%x, size %x\n", pt_attrs->l1_base_pa, - pt_attrs->l1_base_va, pt_attrs->l1_size, - pt_attrs->l2_base_pa, pt_attrs->l2_base_va, - pt_attrs->l2_size); - dev_dbg(bridge, "pt_attrs %p L2 NumPages %x pg_info %p\n", - pt_attrs, pt_attrs->l2_num_pages, pt_attrs->pg_info); - } - if ((pt_attrs != NULL) && (pt_attrs->l1_base_va != 0) && - (pt_attrs->l2_base_va != 0) && (pt_attrs->pg_info != NULL)) - dev_context->pt_attrs = pt_attrs; - else - status = -ENOMEM; - - if (!status) { - spin_lock_init(&pt_attrs->pg_lock); - dev_context->tc_word_swap_on = drv_datap->tc_wordswapon; - - /* Set the Clock Divisor for the DSP module */ - udelay(5); - /* MMU address is obtained from the host - * resources struct */ - dev_context->dsp_mmu_base = resources->dmmu_base; - } - if (!status) { - dev_context->dev_obj = hdev_obj; - /* Store current board state. */ - dev_context->brd_state = BRD_UNKNOWN; - dev_context->resources = resources; - dsp_clk_enable(DSP_CLK_IVA2); - bridge_brd_stop(dev_context); - /* Return ptr to our device state to the DSP API for storage */ - *dev_cntxt = dev_context; - } else { - if (pt_attrs != NULL) { - kfree(pt_attrs->pg_info); - - if (pt_attrs->l2_tbl_alloc_va) { - mem_free_phys_mem((void *) - pt_attrs->l2_tbl_alloc_va, - pt_attrs->l2_tbl_alloc_pa, - pt_attrs->l2_tbl_alloc_sz); - } - if (pt_attrs->l1_tbl_alloc_va) { - mem_free_phys_mem((void *) - pt_attrs->l1_tbl_alloc_va, - pt_attrs->l1_tbl_alloc_pa, - pt_attrs->l1_tbl_alloc_sz); - } - } - kfree(pt_attrs); - kfree(dev_context); - } -func_end: - return status; -} - -/* - * ======== bridge_dev_ctrl ======== - * Receives device specific commands. - */ -static int bridge_dev_ctrl(struct bridge_dev_context *dev_context, - u32 dw_cmd, void *pargs) -{ - int status = 0; - struct bridge_ioctl_extproc *pa_ext_proc = - (struct bridge_ioctl_extproc *)pargs; - s32 ndx; - - switch (dw_cmd) { - case BRDIOCTL_CHNLREAD: - break; - case BRDIOCTL_CHNLWRITE: - break; - case BRDIOCTL_SETMMUCONFIG: - /* store away dsp-mmu setup values for later use */ - for (ndx = 0; ndx < BRDIOCTL_NUMOFMMUTLB; ndx++, pa_ext_proc++) - dev_context->atlb_entry[ndx] = *pa_ext_proc; - break; - case BRDIOCTL_DEEPSLEEP: - case BRDIOCTL_EMERGENCYSLEEP: - /* Currently only DSP Idle is supported Need to update for - * later releases */ - status = sleep_dsp(dev_context, PWR_DEEPSLEEP, pargs); - break; - case BRDIOCTL_WAKEUP: - status = wake_dsp(dev_context, pargs); - break; - case BRDIOCTL_CLK_CTRL: - status = 0; - /* Looking For Baseport Fix for Clocks */ - status = dsp_peripheral_clk_ctrl(dev_context, pargs); - break; - case BRDIOCTL_PWR_HIBERNATE: - status = handle_hibernation_from_dsp(dev_context); - break; - case BRDIOCTL_PRESCALE_NOTIFY: - status = pre_scale_dsp(dev_context, pargs); - break; - case BRDIOCTL_POSTSCALE_NOTIFY: - status = post_scale_dsp(dev_context, pargs); - break; - case BRDIOCTL_CONSTRAINT_REQUEST: - status = handle_constraints_set(dev_context, pargs); - break; - default: - status = -EPERM; - break; - } - return status; -} - -/* - * ======== bridge_dev_destroy ======== - * Destroys the driver object. - */ -static int bridge_dev_destroy(struct bridge_dev_context *dev_ctxt) -{ - struct pg_table_attrs *pt_attrs; - int status = 0; - struct bridge_dev_context *dev_context = (struct bridge_dev_context *) - dev_ctxt; - struct cfg_hostres *host_res; - u32 shm_size; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - /* It should never happen */ - if (!dev_ctxt) - return -EFAULT; - - /* first put the device to stop state */ - bridge_brd_stop(dev_context); - if (dev_context->pt_attrs) { - pt_attrs = dev_context->pt_attrs; - kfree(pt_attrs->pg_info); - - if (pt_attrs->l2_tbl_alloc_va) { - mem_free_phys_mem((void *)pt_attrs->l2_tbl_alloc_va, - pt_attrs->l2_tbl_alloc_pa, - pt_attrs->l2_tbl_alloc_sz); - } - if (pt_attrs->l1_tbl_alloc_va) { - mem_free_phys_mem((void *)pt_attrs->l1_tbl_alloc_va, - pt_attrs->l1_tbl_alloc_pa, - pt_attrs->l1_tbl_alloc_sz); - } - kfree(pt_attrs); - - } - - if (dev_context->resources) { - host_res = dev_context->resources; - shm_size = drv_datap->shm_size; - if (shm_size >= 0x10000) { - if ((host_res->mem_base[1]) && - (host_res->mem_phys[1])) { - mem_free_phys_mem((void *) - host_res->mem_base - [1], - host_res->mem_phys - [1], shm_size); - } - } else { - dev_dbg(bridge, "%s: Error getting shm size " - "from registry: %x. Not calling " - "mem_free_phys_mem\n", __func__, - status); - } - host_res->mem_base[1] = 0; - host_res->mem_phys[1] = 0; - - if (host_res->mem_base[0]) - iounmap((void *)host_res->mem_base[0]); - if (host_res->mem_base[2]) - iounmap((void *)host_res->mem_base[2]); - if (host_res->mem_base[3]) - iounmap((void *)host_res->mem_base[3]); - if (host_res->mem_base[4]) - iounmap((void *)host_res->mem_base[4]); - if (host_res->dmmu_base) - iounmap(host_res->dmmu_base); - if (host_res->per_base) - iounmap(host_res->per_base); - if (host_res->per_pm_base) - iounmap((void *)host_res->per_pm_base); - if (host_res->core_pm_base) - iounmap((void *)host_res->core_pm_base); - - host_res->mem_base[0] = (u32) NULL; - host_res->mem_base[2] = (u32) NULL; - host_res->mem_base[3] = (u32) NULL; - host_res->mem_base[4] = (u32) NULL; - host_res->dmmu_base = NULL; - - kfree(host_res); - } - - /* Free the driver's device context: */ - kfree(drv_datap->base_img); - kfree((void *)dev_ctxt); - return status; -} - -static int bridge_brd_mem_copy(struct bridge_dev_context *dev_ctxt, - u32 dsp_dest_addr, u32 dsp_src_addr, - u32 ul_num_bytes, u32 mem_type) -{ - int status = 0; - u32 src_addr = dsp_src_addr; - u32 dest_addr = dsp_dest_addr; - u32 copy_bytes = 0; - u32 total_bytes = ul_num_bytes; - u8 host_buf[BUFFERSIZE]; - struct bridge_dev_context *dev_context = dev_ctxt; - - while (total_bytes > 0 && !status) { - copy_bytes = - total_bytes > BUFFERSIZE ? BUFFERSIZE : total_bytes; - /* Read from External memory */ - status = read_ext_dsp_data(dev_ctxt, host_buf, src_addr, - copy_bytes, mem_type); - if (!status) { - if (dest_addr < (dev_context->dsp_start_add + - dev_context->internal_size)) { - /* Write to Internal memory */ - status = write_dsp_data(dev_ctxt, host_buf, - dest_addr, copy_bytes, - mem_type); - } else { - /* Write to External memory */ - status = - write_ext_dsp_data(dev_ctxt, host_buf, - dest_addr, copy_bytes, - mem_type, false); - } - } - total_bytes -= copy_bytes; - src_addr += copy_bytes; - dest_addr += copy_bytes; - } - return status; -} - -/* Mem Write does not halt the DSP to write unlike bridge_brd_write */ -static int bridge_brd_mem_write(struct bridge_dev_context *dev_ctxt, - u8 *host_buff, u32 dsp_addr, - u32 ul_num_bytes, u32 mem_type) -{ - int status = 0; - struct bridge_dev_context *dev_context = dev_ctxt; - u32 ul_remain_bytes = 0; - u32 ul_bytes = 0; - - ul_remain_bytes = ul_num_bytes; - while (ul_remain_bytes > 0 && !status) { - ul_bytes = - ul_remain_bytes > BUFFERSIZE ? BUFFERSIZE : ul_remain_bytes; - if (dsp_addr < (dev_context->dsp_start_add + - dev_context->internal_size)) { - status = - write_dsp_data(dev_ctxt, host_buff, dsp_addr, - ul_bytes, mem_type); - } else { - status = write_ext_dsp_data(dev_ctxt, host_buff, - dsp_addr, ul_bytes, - mem_type, true); - } - ul_remain_bytes -= ul_bytes; - dsp_addr += ul_bytes; - host_buff = host_buff + ul_bytes; - } - return status; -} - -/* - * ======== bridge_brd_mem_map ======== - * This function maps MPU buffer to the DSP address space. It performs - * linear to physical address translation if required. It translates each - * page since linear addresses can be physically non-contiguous - * All address & size arguments are assumed to be page aligned (in proc.c) - * - * TODO: Disable MMU while updating the page tables (but that'll stall DSP) - */ -static int bridge_brd_mem_map(struct bridge_dev_context *dev_ctxt, - u32 ul_mpu_addr, u32 virt_addr, - u32 ul_num_bytes, u32 ul_map_attr, - struct page **mapped_pages) -{ - u32 attrs; - int status = 0; - struct bridge_dev_context *dev_context = dev_ctxt; - struct hw_mmu_map_attrs_t hw_attrs; - struct vm_area_struct *vma; - struct mm_struct *mm = current->mm; - u32 write = 0; - u32 num_usr_pgs = 0; - struct page *mapped_page, *pg; - s32 pg_num; - u32 va = virt_addr; - struct task_struct *curr_task = current; - u32 pg_i = 0; - u32 mpu_addr, pa; - - dev_dbg(bridge, - "%s hDevCtxt %p, pa %x, va %x, size %x, ul_map_attr %x\n", - __func__, dev_ctxt, ul_mpu_addr, virt_addr, ul_num_bytes, - ul_map_attr); - if (ul_num_bytes == 0) - return -EINVAL; - - if (ul_map_attr & DSP_MAP_DIR_MASK) { - attrs = ul_map_attr; - } else { - /* Assign default attributes */ - attrs = ul_map_attr | (DSP_MAPVIRTUALADDR | DSP_MAPELEMSIZE16); - } - /* Take mapping properties */ - if (attrs & DSP_MAPBIGENDIAN) - hw_attrs.endianism = HW_BIG_ENDIAN; - else - hw_attrs.endianism = HW_LITTLE_ENDIAN; - - hw_attrs.mixed_size = (enum hw_mmu_mixed_size_t) - ((attrs & DSP_MAPMIXEDELEMSIZE) >> 2); - /* Ignore element_size if mixed_size is enabled */ - if (hw_attrs.mixed_size == 0) { - if (attrs & DSP_MAPELEMSIZE8) { - /* Size is 8 bit */ - hw_attrs.element_size = HW_ELEM_SIZE8BIT; - } else if (attrs & DSP_MAPELEMSIZE16) { - /* Size is 16 bit */ - hw_attrs.element_size = HW_ELEM_SIZE16BIT; - } else if (attrs & DSP_MAPELEMSIZE32) { - /* Size is 32 bit */ - hw_attrs.element_size = HW_ELEM_SIZE32BIT; - } else if (attrs & DSP_MAPELEMSIZE64) { - /* Size is 64 bit */ - hw_attrs.element_size = HW_ELEM_SIZE64BIT; - } else { - /* - * Mixedsize isn't enabled, so size can't be - * zero here - */ - return -EINVAL; - } - } - if (attrs & DSP_MAPDONOTLOCK) - hw_attrs.donotlockmpupage = 1; - else - hw_attrs.donotlockmpupage = 0; - - if (attrs & DSP_MAPVMALLOCADDR) { - return mem_map_vmalloc(dev_ctxt, ul_mpu_addr, virt_addr, - ul_num_bytes, &hw_attrs); - } - /* - * Do OS-specific user-va to pa translation. - * Combine physically contiguous regions to reduce TLBs. - * Pass the translated pa to pte_update. - */ - if ((attrs & DSP_MAPPHYSICALADDR)) { - status = pte_update(dev_context, ul_mpu_addr, virt_addr, - ul_num_bytes, &hw_attrs); - goto func_cont; - } - - /* - * Important Note: ul_mpu_addr is mapped from user application process - * to current process - it must lie completely within the current - * virtual memory address space in order to be of use to us here! - */ - down_read(&mm->mmap_sem); - vma = find_vma(mm, ul_mpu_addr); - if (vma) - dev_dbg(bridge, - "VMAfor UserBuf: ul_mpu_addr=%x, ul_num_bytes=%x, " - "vm_start=%lx, vm_end=%lx, vm_flags=%lx\n", ul_mpu_addr, - ul_num_bytes, vma->vm_start, vma->vm_end, - vma->vm_flags); - - /* - * It is observed that under some circumstances, the user buffer is - * spread across several VMAs. So loop through and check if the entire - * user buffer is covered - */ - while ((vma) && (ul_mpu_addr + ul_num_bytes > vma->vm_end)) { - /* jump to the next VMA region */ - vma = find_vma(mm, vma->vm_end + 1); - dev_dbg(bridge, - "VMA for UserBuf ul_mpu_addr=%x ul_num_bytes=%x, " - "vm_start=%lx, vm_end=%lx, vm_flags=%lx\n", ul_mpu_addr, - ul_num_bytes, vma->vm_start, vma->vm_end, - vma->vm_flags); - } - if (!vma) { - pr_err("%s: Failed to get VMA region for 0x%x (%d)\n", - __func__, ul_mpu_addr, ul_num_bytes); - status = -EINVAL; - up_read(&mm->mmap_sem); - goto func_cont; - } - - if (vma->vm_flags & VM_IO) { - num_usr_pgs = ul_num_bytes / PG_SIZE4K; - mpu_addr = ul_mpu_addr; - - /* Get the physical addresses for user buffer */ - for (pg_i = 0; pg_i < num_usr_pgs; pg_i++) { - pa = user_va2_pa(mm, mpu_addr); - if (!pa) { - status = -EPERM; - pr_err("DSPBRIDGE: VM_IO mapping physical" - "address is invalid\n"); - break; - } - if (pfn_valid(__phys_to_pfn(pa))) { - pg = PHYS_TO_PAGE(pa); - get_page(pg); - if (page_count(pg) < 1) { - pr_err("Bad page in VM_IO buffer\n"); - bad_page_dump(pa, pg); - } - } - status = pte_set(dev_context->pt_attrs, pa, - va, HW_PAGE_SIZE4KB, &hw_attrs); - if (status) - break; - - va += HW_PAGE_SIZE4KB; - mpu_addr += HW_PAGE_SIZE4KB; - pa += HW_PAGE_SIZE4KB; - } - } else { - num_usr_pgs = ul_num_bytes / PG_SIZE4K; - if (vma->vm_flags & (VM_WRITE | VM_MAYWRITE)) - write = 1; - - for (pg_i = 0; pg_i < num_usr_pgs; pg_i++) { - pg_num = get_user_pages(curr_task, mm, ul_mpu_addr, 1, - write, 1, &mapped_page, NULL); - if (pg_num > 0) { - if (page_count(mapped_page) < 1) { - pr_err("Bad page count after doing" - "get_user_pages on" - "user buffer\n"); - bad_page_dump(page_to_phys(mapped_page), - mapped_page); - } - status = pte_set(dev_context->pt_attrs, - page_to_phys(mapped_page), va, - HW_PAGE_SIZE4KB, &hw_attrs); - if (status) - break; - - if (mapped_pages) - mapped_pages[pg_i] = mapped_page; - - va += HW_PAGE_SIZE4KB; - ul_mpu_addr += HW_PAGE_SIZE4KB; - } else { - pr_err("DSPBRIDGE: get_user_pages FAILED," - "MPU addr = 0x%x," - "vma->vm_flags = 0x%lx," - "get_user_pages Err" - "Value = %d, Buffer" - "size=0x%x\n", ul_mpu_addr, - vma->vm_flags, pg_num, ul_num_bytes); - status = -EPERM; - break; - } - } - } - up_read(&mm->mmap_sem); -func_cont: - if (status) { - /* - * Roll out the mapped pages incase it failed in middle of - * mapping - */ - if (pg_i) { - bridge_brd_mem_un_map(dev_context, virt_addr, - (pg_i * PG_SIZE4K)); - } - status = -EPERM; - } - /* - * In any case, flush the TLB - * This is called from here instead from pte_update to avoid unnecessary - * repetition while mapping non-contiguous physical regions of a virtual - * region - */ - flush_all(dev_context); - dev_dbg(bridge, "%s status %x\n", __func__, status); - return status; -} - -/* - * ======== bridge_brd_mem_un_map ======== - * Invalidate the PTEs for the DSP VA block to be unmapped. - * - * PTEs of a mapped memory block are contiguous in any page table - * So, instead of looking up the PTE address for every 4K block, - * we clear consecutive PTEs until we unmap all the bytes - */ -static int bridge_brd_mem_un_map(struct bridge_dev_context *dev_ctxt, - u32 virt_addr, u32 ul_num_bytes) -{ - u32 l1_base_va; - u32 l2_base_va; - u32 l2_base_pa; - u32 l2_page_num; - u32 pte_val; - u32 pte_size; - u32 pte_count; - u32 pte_addr_l1; - u32 pte_addr_l2 = 0; - u32 rem_bytes; - u32 rem_bytes_l2; - u32 va_curr; - struct page *pg = NULL; - int status = 0; - struct bridge_dev_context *dev_context = dev_ctxt; - struct pg_table_attrs *pt = dev_context->pt_attrs; - u32 temp; - u32 paddr; - u32 numof4k_pages = 0; - - va_curr = virt_addr; - rem_bytes = ul_num_bytes; - rem_bytes_l2 = 0; - l1_base_va = pt->l1_base_va; - pte_addr_l1 = hw_mmu_pte_addr_l1(l1_base_va, va_curr); - dev_dbg(bridge, "%s dev_ctxt %p, va %x, NumBytes %x l1_base_va %x, " - "pte_addr_l1 %x\n", __func__, dev_ctxt, virt_addr, - ul_num_bytes, l1_base_va, pte_addr_l1); - - while (rem_bytes && !status) { - u32 va_curr_orig = va_curr; - /* Find whether the L1 PTE points to a valid L2 PT */ - pte_addr_l1 = hw_mmu_pte_addr_l1(l1_base_va, va_curr); - pte_val = *(u32 *) pte_addr_l1; - pte_size = hw_mmu_pte_size_l1(pte_val); - - if (pte_size != HW_MMU_COARSE_PAGE_SIZE) - goto skip_coarse_page; - - /* - * Get the L2 PA from the L1 PTE, and find - * corresponding L2 VA - */ - l2_base_pa = hw_mmu_pte_coarse_l1(pte_val); - l2_base_va = l2_base_pa - pt->l2_base_pa + pt->l2_base_va; - l2_page_num = - (l2_base_pa - pt->l2_base_pa) / HW_MMU_COARSE_PAGE_SIZE; - /* - * Find the L2 PTE address from which we will start - * clearing, the number of PTEs to be cleared on this - * page, and the size of VA space that needs to be - * cleared on this L2 page - */ - pte_addr_l2 = hw_mmu_pte_addr_l2(l2_base_va, va_curr); - pte_count = pte_addr_l2 & (HW_MMU_COARSE_PAGE_SIZE - 1); - pte_count = (HW_MMU_COARSE_PAGE_SIZE - pte_count) / sizeof(u32); - if (rem_bytes < (pte_count * PG_SIZE4K)) - pte_count = rem_bytes / PG_SIZE4K; - rem_bytes_l2 = pte_count * PG_SIZE4K; - - /* - * Unmap the VA space on this L2 PT. A quicker way - * would be to clear pte_count entries starting from - * pte_addr_l2. However, below code checks that we don't - * clear invalid entries or less than 64KB for a 64KB - * entry. Similar checking is done for L1 PTEs too - * below - */ - while (rem_bytes_l2 && !status) { - pte_val = *(u32 *) pte_addr_l2; - pte_size = hw_mmu_pte_size_l2(pte_val); - /* va_curr aligned to pte_size? */ - if (pte_size == 0 || rem_bytes_l2 < pte_size || - va_curr & (pte_size - 1)) { - status = -EPERM; - break; - } - - /* Collect Physical addresses from VA */ - paddr = (pte_val & ~(pte_size - 1)); - if (pte_size == HW_PAGE_SIZE64KB) - numof4k_pages = 16; - else - numof4k_pages = 1; - temp = 0; - while (temp++ < numof4k_pages) { - if (!pfn_valid(__phys_to_pfn(paddr))) { - paddr += HW_PAGE_SIZE4KB; - continue; - } - pg = PHYS_TO_PAGE(paddr); - if (page_count(pg) < 1) { - pr_info("DSPBRIDGE: UNMAP function: " - "COUNT 0 FOR PA 0x%x, size = " - "0x%x\n", paddr, ul_num_bytes); - bad_page_dump(paddr, pg); - } else { - set_page_dirty(pg); - page_cache_release(pg); - } - paddr += HW_PAGE_SIZE4KB; - } - if (hw_mmu_pte_clear(pte_addr_l2, va_curr, pte_size)) { - status = -EPERM; - goto EXIT_LOOP; - } - - status = 0; - rem_bytes_l2 -= pte_size; - va_curr += pte_size; - pte_addr_l2 += (pte_size >> 12) * sizeof(u32); - } - spin_lock(&pt->pg_lock); - if (rem_bytes_l2 == 0) { - pt->pg_info[l2_page_num].num_entries -= pte_count; - if (pt->pg_info[l2_page_num].num_entries == 0) { - /* - * Clear the L1 PTE pointing to the L2 PT - */ - if (!hw_mmu_pte_clear(l1_base_va, va_curr_orig, - HW_MMU_COARSE_PAGE_SIZE)) - status = 0; - else { - status = -EPERM; - spin_unlock(&pt->pg_lock); - goto EXIT_LOOP; - } - } - rem_bytes -= pte_count * PG_SIZE4K; - } else - status = -EPERM; - - spin_unlock(&pt->pg_lock); - continue; -skip_coarse_page: - /* va_curr aligned to pte_size? */ - /* pte_size = 1 MB or 16 MB */ - if (pte_size == 0 || rem_bytes < pte_size || - va_curr & (pte_size - 1)) { - status = -EPERM; - break; - } - - if (pte_size == HW_PAGE_SIZE1MB) - numof4k_pages = 256; - else - numof4k_pages = 4096; - temp = 0; - /* Collect Physical addresses from VA */ - paddr = (pte_val & ~(pte_size - 1)); - while (temp++ < numof4k_pages) { - if (pfn_valid(__phys_to_pfn(paddr))) { - pg = PHYS_TO_PAGE(paddr); - if (page_count(pg) < 1) { - pr_info("DSPBRIDGE: UNMAP function: " - "COUNT 0 FOR PA 0x%x, size = " - "0x%x\n", paddr, ul_num_bytes); - bad_page_dump(paddr, pg); - } else { - set_page_dirty(pg); - page_cache_release(pg); - } - } - paddr += HW_PAGE_SIZE4KB; - } - if (!hw_mmu_pte_clear(l1_base_va, va_curr, pte_size)) { - status = 0; - rem_bytes -= pte_size; - va_curr += pte_size; - } else { - status = -EPERM; - goto EXIT_LOOP; - } - } - /* - * It is better to flush the TLB here, so that any stale old entries - * get flushed - */ -EXIT_LOOP: - flush_all(dev_context); - dev_dbg(bridge, - "%s: va_curr %x, pte_addr_l1 %x pte_addr_l2 %x rem_bytes %x," - " rem_bytes_l2 %x status %x\n", __func__, va_curr, pte_addr_l1, - pte_addr_l2, rem_bytes, rem_bytes_l2, status); - return status; -} - -/* - * ======== user_va2_pa ======== - * Purpose: - * This function walks through the page tables to convert a userland - * virtual address to physical address - */ -static u32 user_va2_pa(struct mm_struct *mm, u32 address) -{ - pgd_t *pgd; - pud_t *pud; - pmd_t *pmd; - pte_t *ptep, pte; - - pgd = pgd_offset(mm, address); - if (pgd_none(*pgd) || pgd_bad(*pgd)) - return 0; - - pud = pud_offset(pgd, address); - if (pud_none(*pud) || pud_bad(*pud)) - return 0; - - pmd = pmd_offset(pud, address); - if (pmd_none(*pmd) || pmd_bad(*pmd)) - return 0; - - ptep = pte_offset_map(pmd, address); - if (ptep) { - pte = *ptep; - if (pte_present(pte)) - return pte & PAGE_MASK; - } - - return 0; -} - -/* - * ======== pte_update ======== - * This function calculates the optimum page-aligned addresses and sizes - * Caller must pass page-aligned values - */ -static int pte_update(struct bridge_dev_context *dev_ctxt, u32 pa, - u32 va, u32 size, - struct hw_mmu_map_attrs_t *map_attrs) -{ - u32 i; - u32 all_bits; - u32 pa_curr = pa; - u32 va_curr = va; - u32 num_bytes = size; - struct bridge_dev_context *dev_context = dev_ctxt; - int status = 0; - u32 page_size[] = { HW_PAGE_SIZE16MB, HW_PAGE_SIZE1MB, - HW_PAGE_SIZE64KB, HW_PAGE_SIZE4KB - }; - - while (num_bytes && !status) { - /* To find the max. page size with which both PA & VA are - * aligned */ - all_bits = pa_curr | va_curr; - - for (i = 0; i < 4; i++) { - if ((num_bytes >= page_size[i]) && ((all_bits & - (page_size[i] - - 1)) == 0)) { - status = - pte_set(dev_context->pt_attrs, pa_curr, - va_curr, page_size[i], map_attrs); - pa_curr += page_size[i]; - va_curr += page_size[i]; - num_bytes -= page_size[i]; - /* Don't try smaller sizes. Hopefully we have - * reached an address aligned to a bigger page - * size */ - break; - } - } - } - - return status; -} - -/* - * ======== pte_set ======== - * This function calculates PTE address (MPU virtual) to be updated - * It also manages the L2 page tables - */ -static int pte_set(struct pg_table_attrs *pt, u32 pa, u32 va, - u32 size, struct hw_mmu_map_attrs_t *attrs) -{ - u32 i; - u32 pte_val; - u32 pte_addr_l1; - u32 pte_size; - /* Base address of the PT that will be updated */ - u32 pg_tbl_va; - u32 l1_base_va; - /* Compiler warns that the next three variables might be used - * uninitialized in this function. Doesn't seem so. Working around, - * anyways. */ - u32 l2_base_va = 0; - u32 l2_base_pa = 0; - u32 l2_page_num = 0; - int status = 0; - - l1_base_va = pt->l1_base_va; - pg_tbl_va = l1_base_va; - if ((size == HW_PAGE_SIZE64KB) || (size == HW_PAGE_SIZE4KB)) { - /* Find whether the L1 PTE points to a valid L2 PT */ - pte_addr_l1 = hw_mmu_pte_addr_l1(l1_base_va, va); - if (pte_addr_l1 <= (pt->l1_base_va + pt->l1_size)) { - pte_val = *(u32 *) pte_addr_l1; - pte_size = hw_mmu_pte_size_l1(pte_val); - } else { - return -EPERM; - } - spin_lock(&pt->pg_lock); - if (pte_size == HW_MMU_COARSE_PAGE_SIZE) { - /* Get the L2 PA from the L1 PTE, and find - * corresponding L2 VA */ - l2_base_pa = hw_mmu_pte_coarse_l1(pte_val); - l2_base_va = - l2_base_pa - pt->l2_base_pa + pt->l2_base_va; - l2_page_num = - (l2_base_pa - - pt->l2_base_pa) / HW_MMU_COARSE_PAGE_SIZE; - } else if (pte_size == 0) { - /* L1 PTE is invalid. Allocate a L2 PT and - * point the L1 PTE to it */ - /* Find a free L2 PT. */ - for (i = 0; (i < pt->l2_num_pages) && - (pt->pg_info[i].num_entries != 0); i++) - ; - if (i < pt->l2_num_pages) { - l2_page_num = i; - l2_base_pa = pt->l2_base_pa + (l2_page_num * - HW_MMU_COARSE_PAGE_SIZE); - l2_base_va = pt->l2_base_va + (l2_page_num * - HW_MMU_COARSE_PAGE_SIZE); - /* Endianness attributes are ignored for - * HW_MMU_COARSE_PAGE_SIZE */ - status = - hw_mmu_pte_set(l1_base_va, l2_base_pa, va, - HW_MMU_COARSE_PAGE_SIZE, - attrs); - } else { - status = -ENOMEM; - } - } else { - /* Found valid L1 PTE of another size. - * Should not overwrite it. */ - status = -EPERM; - } - if (!status) { - pg_tbl_va = l2_base_va; - if (size == HW_PAGE_SIZE64KB) - pt->pg_info[l2_page_num].num_entries += 16; - else - pt->pg_info[l2_page_num].num_entries++; - dev_dbg(bridge, "PTE: L2 BaseVa %x, BasePa %x, PageNum " - "%x, num_entries %x\n", l2_base_va, - l2_base_pa, l2_page_num, - pt->pg_info[l2_page_num].num_entries); - } - spin_unlock(&pt->pg_lock); - } - if (!status) { - dev_dbg(bridge, "PTE: pg_tbl_va %x, pa %x, va %x, size %x\n", - pg_tbl_va, pa, va, size); - dev_dbg(bridge, "PTE: endianism %x, element_size %x, " - "mixed_size %x\n", attrs->endianism, - attrs->element_size, attrs->mixed_size); - status = hw_mmu_pte_set(pg_tbl_va, pa, va, size, attrs); - } - - return status; -} - -/* Memory map kernel VA -- memory allocated with vmalloc */ -static int mem_map_vmalloc(struct bridge_dev_context *dev_context, - u32 ul_mpu_addr, u32 virt_addr, - u32 ul_num_bytes, - struct hw_mmu_map_attrs_t *hw_attrs) -{ - int status = 0; - struct page *page[1]; - u32 i; - u32 pa_curr; - u32 pa_next; - u32 va_curr; - u32 size_curr; - u32 num_pages; - u32 pa; - u32 num_of4k_pages; - u32 temp = 0; - - /* - * Do Kernel va to pa translation. - * Combine physically contiguous regions to reduce TLBs. - * Pass the translated pa to pte_update. - */ - num_pages = ul_num_bytes / PAGE_SIZE; /* PAGE_SIZE = OS page size */ - i = 0; - va_curr = ul_mpu_addr; - page[0] = vmalloc_to_page((void *)va_curr); - pa_next = page_to_phys(page[0]); - while (!status && (i < num_pages)) { - /* - * Reuse pa_next from the previous iteration to avoid - * an extra va2pa call - */ - pa_curr = pa_next; - size_curr = PAGE_SIZE; - /* - * If the next page is physically contiguous, - * map it with the current one by increasing - * the size of the region to be mapped - */ - while (++i < num_pages) { - page[0] = - vmalloc_to_page((void *)(va_curr + size_curr)); - pa_next = page_to_phys(page[0]); - - if (pa_next == (pa_curr + size_curr)) - size_curr += PAGE_SIZE; - else - break; - - } - if (pa_next == 0) { - status = -ENOMEM; - break; - } - pa = pa_curr; - num_of4k_pages = size_curr / HW_PAGE_SIZE4KB; - while (temp++ < num_of4k_pages) { - get_page(PHYS_TO_PAGE(pa)); - pa += HW_PAGE_SIZE4KB; - } - status = pte_update(dev_context, pa_curr, virt_addr + - (va_curr - ul_mpu_addr), size_curr, - hw_attrs); - va_curr += size_curr; - } - /* - * In any case, flush the TLB - * This is called from here instead from pte_update to avoid unnecessary - * repetition while mapping non-contiguous physical regions of a virtual - * region - */ - flush_all(dev_context); - dev_dbg(bridge, "%s status %x\n", __func__, status); - return status; -} - -/* - * ======== wait_for_start ======== - * Wait for the singal from DSP that it has started, or time out. - */ -bool wait_for_start(struct bridge_dev_context *dev_context, - void __iomem *sync_addr) -{ - u16 timeout = TIHELEN_ACKTIMEOUT; - - /* Wait for response from board */ - while (__raw_readw(sync_addr) && --timeout) - udelay(10); - - /* If timed out: return false */ - if (!timeout) { - pr_err("%s: Timed out waiting DSP to Start\n", __func__); - return false; - } - return true; -} diff --git a/drivers/staging/tidspbridge/core/tiomap3430_pwr.c b/drivers/staging/tidspbridge/core/tiomap3430_pwr.c deleted file mode 100644 index 657104f37f7d..000000000000 --- a/drivers/staging/tidspbridge/core/tiomap3430_pwr.c +++ /dev/null @@ -1,556 +0,0 @@ -/* - * tiomap_pwr.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Implementation of DSP wake/sleep routines. - * - * Copyright (C) 2007-2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* ----------------------------------- Host OS */ -#include - -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include -#include -#include - -/* ----------------------------------- Platform Manager */ -#include -#include -#include - -/* ------------------------------------ Hardware Abstraction Layer */ -#include -#include - -#include - -/* ----------------------------------- Bridge Driver */ -#include -#include - -/* ----------------------------------- specific to this file */ -#include "_tiomap.h" -#include "_tiomap_pwr.h" -#include -#include - -#define PWRSTST_TIMEOUT 200 - -/* - * ======== handle_constraints_set ======== - * Sets new DSP constraint - */ -int handle_constraints_set(struct bridge_dev_context *dev_context, - void *pargs) -{ -#ifdef CONFIG_TIDSPBRIDGE_DVFS - u32 *constraint_val; - struct omap_dsp_platform_data *pdata = - omap_dspbridge_dev->dev.platform_data; - - constraint_val = (u32 *) (pargs); - /* Read the target value requested by DSP */ - dev_dbg(bridge, "OPP: %s opp requested = 0x%x\n", __func__, - (u32) *(constraint_val + 1)); - - /* Set the new opp value */ - if (pdata->dsp_set_min_opp) - (*pdata->dsp_set_min_opp) ((u32) *(constraint_val + 1)); -#endif /* #ifdef CONFIG_TIDSPBRIDGE_DVFS */ - return 0; -} - -/* - * ======== handle_hibernation_from_dsp ======== - * Handle Hibernation requested from DSP - */ -int handle_hibernation_from_dsp(struct bridge_dev_context *dev_context) -{ - int status = 0; -#ifdef CONFIG_PM - u16 timeout = PWRSTST_TIMEOUT / 10; - u32 pwr_state; -#ifdef CONFIG_TIDSPBRIDGE_DVFS - u32 opplevel; - struct io_mgr *hio_mgr; -#endif - struct omap_dsp_platform_data *pdata = - omap_dspbridge_dev->dev.platform_data; - - pwr_state = (*pdata->dsp_prm_read)(OMAP3430_IVA2_MOD, OMAP2_PM_PWSTST) & - OMAP_POWERSTATEST_MASK; - /* Wait for DSP to move into OFF state */ - while ((pwr_state != PWRDM_POWER_OFF) && --timeout) { - if (msleep_interruptible(10)) { - pr_err("Waiting for DSP OFF mode interrupted\n"); - return -EPERM; - } - pwr_state = (*pdata->dsp_prm_read)(OMAP3430_IVA2_MOD, - OMAP2_PM_PWSTST) & - OMAP_POWERSTATEST_MASK; - } - if (timeout == 0) { - pr_err("%s: Timed out waiting for DSP off mode\n", __func__); - status = -ETIMEDOUT; - return status; - } else { - - /* Save mailbox settings */ - omap_mbox_save_ctx(dev_context->mbox); - - /* Turn off DSP Peripheral clocks and DSP Load monitor timer */ - status = dsp_clock_disable_all(dev_context->dsp_per_clks); - - /* Disable wdt on hibernation. */ - dsp_wdt_enable(false); - - if (!status) { - /* Update the Bridger Driver state */ - dev_context->brd_state = BRD_DSP_HIBERNATION; -#ifdef CONFIG_TIDSPBRIDGE_DVFS - status = - dev_get_io_mgr(dev_context->dev_obj, &hio_mgr); - if (!hio_mgr) { - status = DSP_EHANDLE; - return status; - } - io_sh_msetting(hio_mgr, SHM_GETOPP, &opplevel); - - /* - * Set the OPP to low level before moving to OFF - * mode - */ - if (pdata->dsp_set_min_opp) - (*pdata->dsp_set_min_opp) (VDD1_OPP1); - status = 0; -#endif /* CONFIG_TIDSPBRIDGE_DVFS */ - } - } -#endif - return status; -} - -/* - * ======== sleep_dsp ======== - * Put DSP in low power consuming state. - */ -int sleep_dsp(struct bridge_dev_context *dev_context, u32 dw_cmd, - void *pargs) -{ - int status = 0; -#ifdef CONFIG_PM -#ifdef CONFIG_TIDSPBRIDGE_NTFY_PWRERR - struct deh_mgr *hdeh_mgr; -#endif /* CONFIG_TIDSPBRIDGE_NTFY_PWRERR */ - u16 timeout = PWRSTST_TIMEOUT / 10; - u32 pwr_state, target_pwr_state; - struct omap_dsp_platform_data *pdata = - omap_dspbridge_dev->dev.platform_data; - - /* Check if sleep code is valid */ - if ((dw_cmd != PWR_DEEPSLEEP) && (dw_cmd != PWR_EMERGENCYDEEPSLEEP)) - return -EINVAL; - - switch (dev_context->brd_state) { - case BRD_RUNNING: - omap_mbox_save_ctx(dev_context->mbox); - if (dsp_test_sleepstate == PWRDM_POWER_OFF) { - sm_interrupt_dsp(dev_context, MBX_PM_DSPHIBERNATE); - dev_dbg(bridge, "PM: %s - sent hibernate cmd to DSP\n", - __func__); - target_pwr_state = PWRDM_POWER_OFF; - } else { - sm_interrupt_dsp(dev_context, MBX_PM_DSPRETENTION); - target_pwr_state = PWRDM_POWER_RET; - } - break; - case BRD_RETENTION: - omap_mbox_save_ctx(dev_context->mbox); - if (dsp_test_sleepstate == PWRDM_POWER_OFF) { - sm_interrupt_dsp(dev_context, MBX_PM_DSPHIBERNATE); - target_pwr_state = PWRDM_POWER_OFF; - } else - return 0; - break; - case BRD_HIBERNATION: - case BRD_DSP_HIBERNATION: - /* Already in Hibernation, so just return */ - dev_dbg(bridge, "PM: %s - DSP already in hibernation\n", - __func__); - return 0; - case BRD_STOPPED: - dev_dbg(bridge, "PM: %s - Board in STOP state\n", __func__); - return 0; - default: - dev_dbg(bridge, "PM: %s - Bridge in Illegal state\n", __func__); - return -EPERM; - } - - /* Get the PRCM DSP power domain status */ - pwr_state = (*pdata->dsp_prm_read)(OMAP3430_IVA2_MOD, OMAP2_PM_PWSTST) & - OMAP_POWERSTATEST_MASK; - - /* Wait for DSP to move into target power state */ - while ((pwr_state != target_pwr_state) && --timeout) { - if (msleep_interruptible(10)) { - pr_err("Waiting for DSP to Suspend interrupted\n"); - return -EPERM; - } - pwr_state = (*pdata->dsp_prm_read)(OMAP3430_IVA2_MOD, - OMAP2_PM_PWSTST) & - OMAP_POWERSTATEST_MASK; - } - - if (!timeout) { - pr_err("%s: Timed out waiting for DSP off mode, state %x\n", - __func__, pwr_state); -#ifdef CONFIG_TIDSPBRIDGE_NTFY_PWRERR - dev_get_deh_mgr(dev_context->dev_obj, &hdeh_mgr); - bridge_deh_notify(hdeh_mgr, DSP_PWRERROR, 0); -#endif /* CONFIG_TIDSPBRIDGE_NTFY_PWRERR */ - return -ETIMEDOUT; - } else { - /* Update the Bridger Driver state */ - if (dsp_test_sleepstate == PWRDM_POWER_OFF) - dev_context->brd_state = BRD_HIBERNATION; - else - dev_context->brd_state = BRD_RETENTION; - - /* Disable wdt on hibernation. */ - dsp_wdt_enable(false); - - /* Turn off DSP Peripheral clocks */ - status = dsp_clock_disable_all(dev_context->dsp_per_clks); - if (status) - return status; -#ifdef CONFIG_TIDSPBRIDGE_DVFS - else if (target_pwr_state == PWRDM_POWER_OFF) { - /* - * Set the OPP to low level before moving to OFF mode - */ - if (pdata->dsp_set_min_opp) - (*pdata->dsp_set_min_opp) (VDD1_OPP1); - } -#endif /* CONFIG_TIDSPBRIDGE_DVFS */ - } -#endif /* CONFIG_PM */ - return status; -} - -/* - * ======== wake_dsp ======== - * Wake up DSP from sleep. - */ -int wake_dsp(struct bridge_dev_context *dev_context, void *pargs) -{ - int status = 0; -#ifdef CONFIG_PM - - /* Check the board state, if it is not 'SLEEP' then return */ - if (dev_context->brd_state == BRD_RUNNING || - dev_context->brd_state == BRD_STOPPED) { - /* The Device is in 'RET' or 'OFF' state and Bridge state is not - * 'SLEEP', this means state inconsistency, so return */ - return 0; - } - - /* Send a wakeup message to DSP */ - sm_interrupt_dsp(dev_context, MBX_PM_DSPWAKEUP); - - /* Set the device state to RUNNIG */ - dev_context->brd_state = BRD_RUNNING; -#endif /* CONFIG_PM */ - return status; -} - -/* - * ======== dsp_peripheral_clk_ctrl ======== - * Enable/Disable the DSP peripheral clocks as needed.. - */ -int dsp_peripheral_clk_ctrl(struct bridge_dev_context *dev_context, - void *pargs) -{ - u32 ext_clk = 0; - u32 ext_clk_id = 0; - u32 ext_clk_cmd = 0; - u32 clk_id_index = MBX_PM_MAX_RESOURCES; - u32 tmp_index; - u32 dsp_per_clks_before; - int status = 0; - - dsp_per_clks_before = dev_context->dsp_per_clks; - - ext_clk = (u32) *((u32 *) pargs); - ext_clk_id = ext_clk & MBX_PM_CLK_IDMASK; - - /* process the power message -- TODO, keep it in a separate function */ - for (tmp_index = 0; tmp_index < MBX_PM_MAX_RESOURCES; tmp_index++) { - if (ext_clk_id == bpwr_clkid[tmp_index]) { - clk_id_index = tmp_index; - break; - } - } - /* TODO -- Assert may be a too hard restriction here.. May be we should - * just return with failure when the CLK ID does not match */ - if (clk_id_index == MBX_PM_MAX_RESOURCES) { - /* return with a more meaningfull error code */ - return -EPERM; - } - ext_clk_cmd = (ext_clk >> MBX_PM_CLK_CMDSHIFT) & MBX_PM_CLK_CMDMASK; - switch (ext_clk_cmd) { - case BPWR_DISABLE_CLOCK: - status = dsp_clk_disable(bpwr_clks[clk_id_index].clk); - dsp_clk_wakeup_event_ctrl(bpwr_clks[clk_id_index].clk_id, - false); - if (!status) { - (dev_context->dsp_per_clks) &= - (~((u32) (1 << bpwr_clks[clk_id_index].clk))); - } - break; - case BPWR_ENABLE_CLOCK: - status = dsp_clk_enable(bpwr_clks[clk_id_index].clk); - dsp_clk_wakeup_event_ctrl(bpwr_clks[clk_id_index].clk_id, true); - if (!status) - (dev_context->dsp_per_clks) |= - (1 << bpwr_clks[clk_id_index].clk); - break; - default: - dev_dbg(bridge, "%s: Unsupported CMD\n", __func__); - /* unsupported cmd */ - /* TODO -- provide support for AUTOIDLE Enable/Disable - * commands */ - } - return status; -} - -/* - * ========pre_scale_dsp======== - * Sends prescale notification to DSP - * - */ -int pre_scale_dsp(struct bridge_dev_context *dev_context, void *pargs) -{ -#ifdef CONFIG_TIDSPBRIDGE_DVFS - u32 level; - u32 voltage_domain; - - voltage_domain = *((u32 *) pargs); - level = *((u32 *) pargs + 1); - - dev_dbg(bridge, "OPP: %s voltage_domain = %x, level = 0x%x\n", - __func__, voltage_domain, level); - if ((dev_context->brd_state == BRD_HIBERNATION) || - (dev_context->brd_state == BRD_RETENTION) || - (dev_context->brd_state == BRD_DSP_HIBERNATION)) { - dev_dbg(bridge, "OPP: %s IVA in sleep. No message to DSP\n"); - return 0; - } else if (dev_context->brd_state == BRD_RUNNING) { - /* Send a prenotification to DSP */ - dev_dbg(bridge, "OPP: %s sent notification to DSP\n", __func__); - sm_interrupt_dsp(dev_context, MBX_PM_SETPOINT_PRENOTIFY); - return 0; - } else { - return -EPERM; - } -#endif /* #ifdef CONFIG_TIDSPBRIDGE_DVFS */ - return 0; -} - -/* - * ========post_scale_dsp======== - * Sends postscale notification to DSP - * - */ -int post_scale_dsp(struct bridge_dev_context *dev_context, - void *pargs) -{ - int status = 0; -#ifdef CONFIG_TIDSPBRIDGE_DVFS - u32 level; - u32 voltage_domain; - struct io_mgr *hio_mgr; - - status = dev_get_io_mgr(dev_context->dev_obj, &hio_mgr); - if (!hio_mgr) - return -EFAULT; - - voltage_domain = *((u32 *) pargs); - level = *((u32 *) pargs + 1); - dev_dbg(bridge, "OPP: %s voltage_domain = %x, level = 0x%x\n", - __func__, voltage_domain, level); - if ((dev_context->brd_state == BRD_HIBERNATION) || - (dev_context->brd_state == BRD_RETENTION) || - (dev_context->brd_state == BRD_DSP_HIBERNATION)) { - /* Update the OPP value in shared memory */ - io_sh_msetting(hio_mgr, SHM_CURROPP, &level); - dev_dbg(bridge, "OPP: %s IVA in sleep. Wrote to shm\n", - __func__); - } else if (dev_context->brd_state == BRD_RUNNING) { - /* Update the OPP value in shared memory */ - io_sh_msetting(hio_mgr, SHM_CURROPP, &level); - /* Send a post notification to DSP */ - sm_interrupt_dsp(dev_context, MBX_PM_SETPOINT_POSTNOTIFY); - dev_dbg(bridge, - "OPP: %s wrote to shm. Sent post notification to DSP\n", - __func__); - } else { - status = -EPERM; - } -#endif /* #ifdef CONFIG_TIDSPBRIDGE_DVFS */ - return status; -} - -void dsp_clk_wakeup_event_ctrl(u32 clock_id, bool enable) -{ - struct cfg_hostres *resources; - int status = 0; - u32 iva2_grpsel; - u32 mpu_grpsel; - struct dev_object *hdev_object = NULL; - struct bridge_dev_context *bridge_context = NULL; - - hdev_object = (struct dev_object *)drv_get_first_dev_object(); - if (!hdev_object) - return; - - status = dev_get_bridge_context(hdev_object, &bridge_context); - if (!bridge_context) - return; - - resources = bridge_context->resources; - if (!resources) - return; - - switch (clock_id) { - case BPWR_GP_TIMER5: - iva2_grpsel = readl(resources->per_pm_base + 0xA8); - mpu_grpsel = readl(resources->per_pm_base + 0xA4); - if (enable) { - iva2_grpsel |= OMAP3430_GRPSEL_GPT5_MASK; - mpu_grpsel &= ~OMAP3430_GRPSEL_GPT5_MASK; - } else { - mpu_grpsel |= OMAP3430_GRPSEL_GPT5_MASK; - iva2_grpsel &= ~OMAP3430_GRPSEL_GPT5_MASK; - } - writel(iva2_grpsel, resources->per_pm_base + 0xA8); - writel(mpu_grpsel, resources->per_pm_base + 0xA4); - break; - case BPWR_GP_TIMER6: - iva2_grpsel = readl(resources->per_pm_base + 0xA8); - mpu_grpsel = readl(resources->per_pm_base + 0xA4); - if (enable) { - iva2_grpsel |= OMAP3430_GRPSEL_GPT6_MASK; - mpu_grpsel &= ~OMAP3430_GRPSEL_GPT6_MASK; - } else { - mpu_grpsel |= OMAP3430_GRPSEL_GPT6_MASK; - iva2_grpsel &= ~OMAP3430_GRPSEL_GPT6_MASK; - } - writel(iva2_grpsel, resources->per_pm_base + 0xA8); - writel(mpu_grpsel, resources->per_pm_base + 0xA4); - break; - case BPWR_GP_TIMER7: - iva2_grpsel = readl(resources->per_pm_base + 0xA8); - mpu_grpsel = readl(resources->per_pm_base + 0xA4); - if (enable) { - iva2_grpsel |= OMAP3430_GRPSEL_GPT7_MASK; - mpu_grpsel &= ~OMAP3430_GRPSEL_GPT7_MASK; - } else { - mpu_grpsel |= OMAP3430_GRPSEL_GPT7_MASK; - iva2_grpsel &= ~OMAP3430_GRPSEL_GPT7_MASK; - } - writel(iva2_grpsel, resources->per_pm_base + 0xA8); - writel(mpu_grpsel, resources->per_pm_base + 0xA4); - break; - case BPWR_GP_TIMER8: - iva2_grpsel = readl(resources->per_pm_base + 0xA8); - mpu_grpsel = readl(resources->per_pm_base + 0xA4); - if (enable) { - iva2_grpsel |= OMAP3430_GRPSEL_GPT8_MASK; - mpu_grpsel &= ~OMAP3430_GRPSEL_GPT8_MASK; - } else { - mpu_grpsel |= OMAP3430_GRPSEL_GPT8_MASK; - iva2_grpsel &= ~OMAP3430_GRPSEL_GPT8_MASK; - } - writel(iva2_grpsel, resources->per_pm_base + 0xA8); - writel(mpu_grpsel, resources->per_pm_base + 0xA4); - break; - case BPWR_MCBSP1: - iva2_grpsel = readl(resources->core_pm_base + 0xA8); - mpu_grpsel = readl(resources->core_pm_base + 0xA4); - if (enable) { - iva2_grpsel |= OMAP3430_GRPSEL_MCBSP1_MASK; - mpu_grpsel &= ~OMAP3430_GRPSEL_MCBSP1_MASK; - } else { - mpu_grpsel |= OMAP3430_GRPSEL_MCBSP1_MASK; - iva2_grpsel &= ~OMAP3430_GRPSEL_MCBSP1_MASK; - } - writel(iva2_grpsel, resources->core_pm_base + 0xA8); - writel(mpu_grpsel, resources->core_pm_base + 0xA4); - break; - case BPWR_MCBSP2: - iva2_grpsel = readl(resources->per_pm_base + 0xA8); - mpu_grpsel = readl(resources->per_pm_base + 0xA4); - if (enable) { - iva2_grpsel |= OMAP3430_GRPSEL_MCBSP2_MASK; - mpu_grpsel &= ~OMAP3430_GRPSEL_MCBSP2_MASK; - } else { - mpu_grpsel |= OMAP3430_GRPSEL_MCBSP2_MASK; - iva2_grpsel &= ~OMAP3430_GRPSEL_MCBSP2_MASK; - } - writel(iva2_grpsel, resources->per_pm_base + 0xA8); - writel(mpu_grpsel, resources->per_pm_base + 0xA4); - break; - case BPWR_MCBSP3: - iva2_grpsel = readl(resources->per_pm_base + 0xA8); - mpu_grpsel = readl(resources->per_pm_base + 0xA4); - if (enable) { - iva2_grpsel |= OMAP3430_GRPSEL_MCBSP3_MASK; - mpu_grpsel &= ~OMAP3430_GRPSEL_MCBSP3_MASK; - } else { - mpu_grpsel |= OMAP3430_GRPSEL_MCBSP3_MASK; - iva2_grpsel &= ~OMAP3430_GRPSEL_MCBSP3_MASK; - } - writel(iva2_grpsel, resources->per_pm_base + 0xA8); - writel(mpu_grpsel, resources->per_pm_base + 0xA4); - break; - case BPWR_MCBSP4: - iva2_grpsel = readl(resources->per_pm_base + 0xA8); - mpu_grpsel = readl(resources->per_pm_base + 0xA4); - if (enable) { - iva2_grpsel |= OMAP3430_GRPSEL_MCBSP4_MASK; - mpu_grpsel &= ~OMAP3430_GRPSEL_MCBSP4_MASK; - } else { - mpu_grpsel |= OMAP3430_GRPSEL_MCBSP4_MASK; - iva2_grpsel &= ~OMAP3430_GRPSEL_MCBSP4_MASK; - } - writel(iva2_grpsel, resources->per_pm_base + 0xA8); - writel(mpu_grpsel, resources->per_pm_base + 0xA4); - break; - case BPWR_MCBSP5: - iva2_grpsel = readl(resources->per_pm_base + 0xA8); - mpu_grpsel = readl(resources->per_pm_base + 0xA4); - if (enable) { - iva2_grpsel |= OMAP3430_GRPSEL_MCBSP5_MASK; - mpu_grpsel &= ~OMAP3430_GRPSEL_MCBSP5_MASK; - } else { - mpu_grpsel |= OMAP3430_GRPSEL_MCBSP5_MASK; - iva2_grpsel &= ~OMAP3430_GRPSEL_MCBSP5_MASK; - } - writel(iva2_grpsel, resources->per_pm_base + 0xA8); - writel(mpu_grpsel, resources->per_pm_base + 0xA4); - break; - } -} diff --git a/drivers/staging/tidspbridge/core/tiomap_io.c b/drivers/staging/tidspbridge/core/tiomap_io.c deleted file mode 100644 index 28364672c7f8..000000000000 --- a/drivers/staging/tidspbridge/core/tiomap_io.c +++ /dev/null @@ -1,440 +0,0 @@ -/* - * tiomap_io.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Implementation for the io read/write routines. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- Platform Manager */ -#include -#include - -/* ----------------------------------- OS Adaptation Layer */ -#include - -/* ----------------------------------- specific to this file */ -#include "_tiomap.h" -#include "_tiomap_pwr.h" -#include "tiomap_io.h" - -static u32 ul_ext_base; -static u32 ul_ext_end; - -static u32 shm0_end; -static u32 ul_dyn_ext_base; -static u32 ul_trace_sec_beg; -static u32 ul_trace_sec_end; -static u32 ul_shm_base_virt; - -bool symbols_reloaded = true; - -/* - * ======== read_ext_dsp_data ======== - * Copies DSP external memory buffers to the host side buffers. - */ -int read_ext_dsp_data(struct bridge_dev_context *dev_ctxt, - u8 *host_buff, u32 dsp_addr, - u32 ul_num_bytes, u32 mem_type) -{ - int status = 0; - struct bridge_dev_context *dev_context = dev_ctxt; - u32 offset; - u32 ul_tlb_base_virt = 0; - u32 ul_shm_offset_virt = 0; - u32 dw_ext_prog_virt_mem; - u32 dw_base_addr = dev_context->dsp_ext_base_addr; - bool trace_read = false; - - if (!ul_shm_base_virt) { - status = dev_get_symbol(dev_context->dev_obj, - SHMBASENAME, &ul_shm_base_virt); - } - - /* Check if it is a read of Trace section */ - if (!status && !ul_trace_sec_beg) { - status = dev_get_symbol(dev_context->dev_obj, - DSP_TRACESEC_BEG, &ul_trace_sec_beg); - } - - if (!status && !ul_trace_sec_end) { - status = dev_get_symbol(dev_context->dev_obj, - DSP_TRACESEC_END, &ul_trace_sec_end); - } - - if (!status) { - if ((dsp_addr <= ul_trace_sec_end) && - (dsp_addr >= ul_trace_sec_beg)) - trace_read = true; - } - - /* If reading from TRACE, force remap/unmap */ - if (trace_read && dw_base_addr) { - dw_base_addr = 0; - dev_context->dsp_ext_base_addr = 0; - } - - if (!dw_base_addr) { - /* Initialize ul_ext_base and ul_ext_end */ - ul_ext_base = 0; - ul_ext_end = 0; - - /* Get DYNEXT_BEG, EXT_BEG and EXT_END. */ - if (!status && !ul_dyn_ext_base) { - status = dev_get_symbol(dev_context->dev_obj, - DYNEXTBASE, &ul_dyn_ext_base); - } - - if (!status) { - status = dev_get_symbol(dev_context->dev_obj, - EXTBASE, &ul_ext_base); - } - - if (!status) { - status = dev_get_symbol(dev_context->dev_obj, - EXTEND, &ul_ext_end); - } - - /* Trace buffer is right after the shm SEG0, - * so set the base address to SHMBASE */ - if (trace_read) { - ul_ext_base = ul_shm_base_virt; - ul_ext_end = ul_trace_sec_end; - } - - - if (ul_ext_end < ul_ext_base) - status = -EPERM; - - if (!status) { - ul_tlb_base_virt = - dev_context->atlb_entry[0].dsp_va * DSPWORDSIZE; - dw_ext_prog_virt_mem = - dev_context->atlb_entry[0].gpp_va; - - if (!trace_read) { - ul_shm_offset_virt = - ul_shm_base_virt - ul_tlb_base_virt; - ul_shm_offset_virt += - PG_ALIGN_HIGH(ul_ext_end - ul_dyn_ext_base + - 1, HW_PAGE_SIZE64KB); - dw_ext_prog_virt_mem -= ul_shm_offset_virt; - dw_ext_prog_virt_mem += - (ul_ext_base - ul_dyn_ext_base); - dev_context->dsp_ext_base_addr = - dw_ext_prog_virt_mem; - - /* - * This dsp_ext_base_addr will get cleared - * only when the board is stopped. - */ - if (!dev_context->dsp_ext_base_addr) - status = -EPERM; - } - - dw_base_addr = dw_ext_prog_virt_mem; - } - } - - if (!dw_base_addr || !ul_ext_base || !ul_ext_end) - status = -EPERM; - - offset = dsp_addr - ul_ext_base; - - if (!status) - memcpy(host_buff, (u8 *) dw_base_addr + offset, ul_num_bytes); - - return status; -} - -/* - * ======== write_dsp_data ======== - * purpose: - * Copies buffers to the DSP internal/external memory. - */ -int write_dsp_data(struct bridge_dev_context *dev_context, - u8 *host_buff, u32 dsp_addr, u32 ul_num_bytes, - u32 mem_type) -{ - u32 offset; - u32 dw_base_addr = dev_context->dsp_base_addr; - struct cfg_hostres *resources = dev_context->resources; - int status = 0; - u32 base1, base2, base3; - - base1 = OMAP_DSP_MEM1_SIZE; - base2 = OMAP_DSP_MEM2_BASE - OMAP_DSP_MEM1_BASE; - base3 = OMAP_DSP_MEM3_BASE - OMAP_DSP_MEM1_BASE; - - if (!resources) - return -EPERM; - - offset = dsp_addr - dev_context->dsp_start_add; - if (offset < base1) { - dw_base_addr = MEM_LINEAR_ADDRESS(resources->mem_base[2], - resources->mem_length[2]); - } else if (offset > base1 && offset < base2 + OMAP_DSP_MEM2_SIZE) { - dw_base_addr = MEM_LINEAR_ADDRESS(resources->mem_base[3], - resources->mem_length[3]); - offset = offset - base2; - } else if (offset >= base2 + OMAP_DSP_MEM2_SIZE && - offset < base3 + OMAP_DSP_MEM3_SIZE) { - dw_base_addr = MEM_LINEAR_ADDRESS(resources->mem_base[4], - resources->mem_length[4]); - offset = offset - base3; - } else { - return -EPERM; - } - if (ul_num_bytes) - memcpy((u8 *) (dw_base_addr + offset), host_buff, ul_num_bytes); - else - *((u32 *) host_buff) = dw_base_addr + offset; - - return status; -} - -/* - * ======== write_ext_dsp_data ======== - * purpose: - * Copies buffers to the external memory. - * - */ -int write_ext_dsp_data(struct bridge_dev_context *dev_context, - u8 *host_buff, u32 dsp_addr, - u32 ul_num_bytes, u32 mem_type, - bool dynamic_load) -{ - u32 dw_base_addr = dev_context->dsp_ext_base_addr; - u32 dw_offset = 0; - u8 temp_byte1, temp_byte2; - u8 remain_byte[4]; - s32 i; - int ret = 0; - u32 dw_ext_prog_virt_mem; - u32 ul_tlb_base_virt = 0; - u32 ul_shm_offset_virt = 0; - struct cfg_hostres *host_res = dev_context->resources; - bool trace_load = false; - - temp_byte1 = 0x0; - temp_byte2 = 0x0; - - if (symbols_reloaded) { - /* Check if it is a load to Trace section */ - ret = dev_get_symbol(dev_context->dev_obj, - DSP_TRACESEC_BEG, &ul_trace_sec_beg); - if (!ret) - ret = dev_get_symbol(dev_context->dev_obj, - DSP_TRACESEC_END, - &ul_trace_sec_end); - } - if (!ret) { - if ((dsp_addr <= ul_trace_sec_end) && - (dsp_addr >= ul_trace_sec_beg)) - trace_load = true; - } - - /* If dynamic, force remap/unmap */ - if ((dynamic_load || trace_load) && dw_base_addr) { - dw_base_addr = 0; - MEM_UNMAP_LINEAR_ADDRESS((void *) - dev_context->dsp_ext_base_addr); - dev_context->dsp_ext_base_addr = 0x0; - } - if (!dw_base_addr) { - if (symbols_reloaded) - /* Get SHM_BEG EXT_BEG and EXT_END. */ - ret = dev_get_symbol(dev_context->dev_obj, - SHMBASENAME, &ul_shm_base_virt); - if (dynamic_load) { - if (!ret) { - if (symbols_reloaded) - ret = - dev_get_symbol - (dev_context->dev_obj, DYNEXTBASE, - &ul_ext_base); - } - if (!ret) { - /* DR OMAPS00013235 : DLModules array may be - * in EXTMEM. It is expected that DYNEXTMEM and - * EXTMEM are contiguous, so checking for the - * upper bound at EXTEND should be Ok. */ - if (symbols_reloaded) - ret = - dev_get_symbol - (dev_context->dev_obj, EXTEND, - &ul_ext_end); - } - } else { - if (symbols_reloaded) { - if (!ret) - ret = - dev_get_symbol - (dev_context->dev_obj, EXTBASE, - &ul_ext_base); - if (!ret) - ret = - dev_get_symbol - (dev_context->dev_obj, EXTEND, - &ul_ext_end); - } - } - /* Trace buffer it right after the shm SEG0, so set the - * base address to SHMBASE */ - if (trace_load) - ul_ext_base = ul_shm_base_virt; - - if (ul_ext_end < ul_ext_base) - ret = -EPERM; - - if (!ret) { - ul_tlb_base_virt = - dev_context->atlb_entry[0].dsp_va * DSPWORDSIZE; - - if (symbols_reloaded) { - ret = dev_get_symbol - (dev_context->dev_obj, - DSP_TRACESEC_END, &shm0_end); - if (!ret) { - ret = - dev_get_symbol - (dev_context->dev_obj, DYNEXTBASE, - &ul_dyn_ext_base); - } - } - ul_shm_offset_virt = - ul_shm_base_virt - ul_tlb_base_virt; - if (trace_load) { - dw_ext_prog_virt_mem = - dev_context->atlb_entry[0].gpp_va; - } else { - dw_ext_prog_virt_mem = host_res->mem_base[1]; - dw_ext_prog_virt_mem += - (ul_ext_base - ul_dyn_ext_base); - } - - dev_context->dsp_ext_base_addr = - (u32) MEM_LINEAR_ADDRESS((void *) - dw_ext_prog_virt_mem, - ul_ext_end - ul_ext_base); - dw_base_addr += dev_context->dsp_ext_base_addr; - /* This dsp_ext_base_addr will get cleared only when - * the board is stopped. */ - if (!dev_context->dsp_ext_base_addr) - ret = -EPERM; - } - } - if (!dw_base_addr || !ul_ext_base || !ul_ext_end) - ret = -EPERM; - - if (!ret) { - for (i = 0; i < 4; i++) - remain_byte[i] = 0x0; - - dw_offset = dsp_addr - ul_ext_base; - /* Also make sure the dsp_addr is < ul_ext_end */ - if (dsp_addr > ul_ext_end || dw_offset > dsp_addr) - ret = -EPERM; - } - if (!ret) { - if (ul_num_bytes) - memcpy((u8 *) dw_base_addr + dw_offset, host_buff, - ul_num_bytes); - else - *((u32 *) host_buff) = dw_base_addr + dw_offset; - } - /* Unmap here to force remap for other Ext loads */ - if ((dynamic_load || trace_load) && dev_context->dsp_ext_base_addr) { - MEM_UNMAP_LINEAR_ADDRESS((void *) - dev_context->dsp_ext_base_addr); - dev_context->dsp_ext_base_addr = 0x0; - } - symbols_reloaded = false; - return ret; -} - -int sm_interrupt_dsp(struct bridge_dev_context *dev_context, u16 mb_val) -{ -#ifdef CONFIG_TIDSPBRIDGE_DVFS - u32 opplevel = 0; -#endif - struct omap_dsp_platform_data *pdata = - omap_dspbridge_dev->dev.platform_data; - struct cfg_hostres *resources = dev_context->resources; - int status = 0; - u32 temp; - - if (!dev_context->mbox) - return 0; - - if (!resources) - return -EPERM; - - if (dev_context->brd_state == BRD_DSP_HIBERNATION || - dev_context->brd_state == BRD_HIBERNATION) { -#ifdef CONFIG_TIDSPBRIDGE_DVFS - if (pdata->dsp_get_opp) - opplevel = (*pdata->dsp_get_opp) (); - if (opplevel == VDD1_OPP1) { - if (pdata->dsp_set_min_opp) - (*pdata->dsp_set_min_opp) (VDD1_OPP2); - } -#endif - /* Restart the peripheral clocks */ - dsp_clock_enable_all(dev_context->dsp_per_clks); - dsp_wdt_enable(true); - - /* - * 2:0 AUTO_IVA2_DPLL - Enabling IVA2 DPLL auto control - * in CM_AUTOIDLE_PLL_IVA2 register - */ - (*pdata->dsp_cm_write)(1 << OMAP3430_AUTO_IVA2_DPLL_SHIFT, - OMAP3430_IVA2_MOD, OMAP3430_CM_AUTOIDLE_PLL); - - /* - * 7:4 IVA2_DPLL_FREQSEL - IVA2 internal frq set to - * 0.75 MHz - 1.0 MHz - * 2:0 EN_IVA2_DPLL - Enable IVA2 DPLL in lock mode - */ - (*pdata->dsp_cm_rmw_bits)(OMAP3430_IVA2_DPLL_FREQSEL_MASK | - OMAP3430_EN_IVA2_DPLL_MASK, - 0x3 << OMAP3430_IVA2_DPLL_FREQSEL_SHIFT | - 0x7 << OMAP3430_EN_IVA2_DPLL_SHIFT, - OMAP3430_IVA2_MOD, OMAP3430_CM_CLKEN_PLL); - - /* Restore mailbox settings */ - omap_mbox_restore_ctx(dev_context->mbox); - - /* Access MMU SYS CONFIG register to generate a short wakeup */ - temp = readl(resources->dmmu_base + 0x10); - - dev_context->brd_state = BRD_RUNNING; - } else if (dev_context->brd_state == BRD_RETENTION) { - /* Restart the peripheral clocks */ - dsp_clock_enable_all(dev_context->dsp_per_clks); - } - - status = omap_mbox_msg_send(dev_context->mbox, mb_val); - - if (status) { - pr_err("omap_mbox_msg_send Fail and status = %d\n", status); - status = -EPERM; - } - - return 0; -} diff --git a/drivers/staging/tidspbridge/core/tiomap_io.h b/drivers/staging/tidspbridge/core/tiomap_io.h deleted file mode 100644 index a3f19c7b79f3..000000000000 --- a/drivers/staging/tidspbridge/core/tiomap_io.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * tiomap_io.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Definitions, types and function prototypes for the io (r/w external mem). - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _TIOMAP_IO_ -#define _TIOMAP_IO_ - -/* - * Symbol that defines beginning of shared memory. - * For OMAP (Helen) this is the DSP Virtual base address of SDRAM. - * This will be used to program DSP MMU to map DSP Virt to GPP phys. - * (see dspMmuTlbEntry()). - */ -#define SHMBASENAME "SHM_BEG" -#define EXTBASE "EXT_BEG" -#define EXTEND "_EXT_END" -#define DYNEXTBASE "_DYNEXT_BEG" -#define DYNEXTEND "_DYNEXT_END" -#define IVAEXTMEMBASE "_IVAEXTMEM_BEG" -#define IVAEXTMEMEND "_IVAEXTMEM_END" - -#define DSP_TRACESEC_BEG "_BRIDGE_TRACE_BEG" -#define DSP_TRACESEC_END "_BRIDGE_TRACE_END" - -#define SYS_PUTCBEG "_SYS_PUTCBEG" -#define SYS_PUTCEND "_SYS_PUTCEND" -#define BRIDGE_SYS_PUTC_CURRENT "_BRIDGE_SYS_PUTC_current" - -#define WORDSWAP_ENABLE 0x3 /* Enable word swap */ - -/* - * ======== read_ext_dsp_data ======== - * Reads it from DSP External memory. The external memory for the DSP - * is configured by the combination of DSP MMU and shm Memory manager in the CDB - */ -extern int read_ext_dsp_data(struct bridge_dev_context *dev_ctxt, - u8 *host_buff, u32 dsp_addr, - u32 ul_num_bytes, u32 mem_type); - -/* - * ======== write_dsp_data ======== - */ -extern int write_dsp_data(struct bridge_dev_context *dev_context, - u8 *host_buff, u32 dsp_addr, - u32 ul_num_bytes, u32 mem_type); - -/* - * ======== write_ext_dsp_data ======== - * Writes to the DSP External memory for external program. - * The ext mem for progra is configured by the combination of DSP MMU and - * shm Memory manager in the CDB - */ -extern int write_ext_dsp_data(struct bridge_dev_context *dev_context, - u8 *host_buff, u32 dsp_addr, - u32 ul_num_bytes, u32 mem_type, - bool dynamic_load); - -/* - * ======== write_ext32_bit_dsp_data ======== - * Writes 32 bit data to the external memory - */ -extern inline void write_ext32_bit_dsp_data(const - struct bridge_dev_context *dev_context, - u32 dsp_addr, u32 val) -{ - *(u32 *) dsp_addr = ((dev_context->tc_word_swap_on) ? (((val << 16) & - 0xFFFF0000) | - ((val >> 16) & - 0x0000FFFF)) : - val); -} - -/* - * ======== read_ext32_bit_dsp_data ======== - * Reads 32 bit data from the external memory - */ -extern inline u32 read_ext32_bit_dsp_data(const struct bridge_dev_context - *dev_context, u32 dsp_addr) -{ - u32 ret; - ret = *(u32 *) dsp_addr; - - ret = ((dev_context->tc_word_swap_on) ? (((ret << 16) - & 0xFFFF0000) | ((ret >> 16) & - 0x0000FFFF)) - : ret); - return ret; -} - -#endif /* _TIOMAP_IO_ */ diff --git a/drivers/staging/tidspbridge/core/ue_deh.c b/drivers/staging/tidspbridge/core/ue_deh.c deleted file mode 100644 index e68f0ba8e12b..000000000000 --- a/drivers/staging/tidspbridge/core/ue_deh.c +++ /dev/null @@ -1,272 +0,0 @@ -/* - * ue_deh.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Implements upper edge DSP exception handling (DEH) functions. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * Copyright (C) 2010 Felipe Contreras - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -#include - -#include -#include -#include -#include "_tiomap.h" -#include "_deh.h" - -#include -#include -#include - -static u32 fault_addr; - -static void mmu_fault_dpc(unsigned long data) -{ - struct deh_mgr *deh = (void *)data; - - if (!deh) - return; - - bridge_deh_notify(deh, DSP_MMUFAULT, 0); -} - -static irqreturn_t mmu_fault_isr(int irq, void *data) -{ - struct deh_mgr *deh = data; - struct cfg_hostres *resources; - u32 event; - - if (!deh) - return IRQ_HANDLED; - - resources = deh->bridge_context->resources; - if (!resources) { - dev_dbg(bridge, "%s: Failed to get Host Resources\n", - __func__); - return IRQ_HANDLED; - } - - hw_mmu_event_status(resources->dmmu_base, &event); - if (event == HW_MMU_TRANSLATION_FAULT) { - hw_mmu_fault_addr_read(resources->dmmu_base, &fault_addr); - dev_dbg(bridge, "%s: event=0x%x, fault_addr=0x%x\n", __func__, - event, fault_addr); - /* - * Schedule a DPC directly. In the future, it may be - * necessary to check if DSP MMU fault is intended for - * Bridge. - */ - tasklet_schedule(&deh->dpc_tasklet); - - /* Disable the MMU events, else once we clear it will - * start to raise INTs again */ - hw_mmu_event_disable(resources->dmmu_base, - HW_MMU_TRANSLATION_FAULT); - } else { - hw_mmu_event_disable(resources->dmmu_base, - HW_MMU_ALL_INTERRUPTS); - } - return IRQ_HANDLED; -} - -int bridge_deh_create(struct deh_mgr **ret_deh, - struct dev_object *hdev_obj) -{ - int status; - struct deh_mgr *deh; - struct bridge_dev_context *hbridge_context = NULL; - - /* Message manager will be created when a file is loaded, since - * size of message buffer in shared memory is configurable in - * the base image. */ - /* Get Bridge context info. */ - dev_get_bridge_context(hdev_obj, &hbridge_context); - /* Allocate IO manager object: */ - deh = kzalloc(sizeof(*deh), GFP_KERNEL); - if (!deh) { - status = -ENOMEM; - goto err; - } - - /* Create an NTFY object to manage notifications */ - deh->ntfy_obj = kmalloc(sizeof(struct ntfy_object), GFP_KERNEL); - if (!deh->ntfy_obj) { - status = -ENOMEM; - goto err; - } - ntfy_init(deh->ntfy_obj); - - /* Create a MMUfault DPC */ - tasklet_init(&deh->dpc_tasklet, mmu_fault_dpc, (u32) deh); - - /* Fill in context structure */ - deh->bridge_context = hbridge_context; - - /* Install ISR function for DSP MMU fault */ - status = request_irq(INT_DSP_MMU_IRQ, mmu_fault_isr, 0, - "DspBridge\tiommu fault", deh); - if (status < 0) - goto err; - - *ret_deh = deh; - return 0; - -err: - bridge_deh_destroy(deh); - *ret_deh = NULL; - return status; -} - -int bridge_deh_destroy(struct deh_mgr *deh) -{ - if (!deh) - return -EFAULT; - - /* If notification object exists, delete it */ - if (deh->ntfy_obj) { - ntfy_delete(deh->ntfy_obj); - kfree(deh->ntfy_obj); - } - /* Disable DSP MMU fault */ - free_irq(INT_DSP_MMU_IRQ, deh); - - /* Free DPC object */ - tasklet_kill(&deh->dpc_tasklet); - - /* Deallocate the DEH manager object */ - kfree(deh); - - return 0; -} - -int bridge_deh_register_notify(struct deh_mgr *deh, u32 event_mask, - u32 notify_type, - struct dsp_notification *hnotification) -{ - if (!deh) - return -EFAULT; - - if (event_mask) - return ntfy_register(deh->ntfy_obj, hnotification, - event_mask, notify_type); - else - return ntfy_unregister(deh->ntfy_obj, hnotification); -} - -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE -static void mmu_fault_print_stack(struct bridge_dev_context *dev_context) -{ - struct cfg_hostres *resources; - struct hw_mmu_map_attrs_t map_attrs = { - .endianism = HW_LITTLE_ENDIAN, - .element_size = HW_ELEM_SIZE16BIT, - .mixed_size = HW_MMU_CPUES, - }; - void *dummy_va_addr; - - resources = dev_context->resources; - dummy_va_addr = (void *)__get_free_page(GFP_ATOMIC); - - /* - * Before acking the MMU fault, let's make sure MMU can only - * access entry #0. Then add a new entry so that the DSP OS - * can continue in order to dump the stack. - */ - hw_mmu_twl_disable(resources->dmmu_base); - hw_mmu_tlb_flush_all(resources->dmmu_base); - - hw_mmu_tlb_add(resources->dmmu_base, - virt_to_phys(dummy_va_addr), fault_addr, - HW_PAGE_SIZE4KB, 1, - &map_attrs, HW_SET, HW_SET); - - dsp_clk_enable(DSP_CLK_GPT8); - - dsp_gpt_wait_overflow(DSP_CLK_GPT8, 0xfffffffe); - - /* Clear MMU interrupt */ - hw_mmu_event_ack(resources->dmmu_base, - HW_MMU_TRANSLATION_FAULT); - dump_dsp_stack(dev_context); - dsp_clk_disable(DSP_CLK_GPT8); - - hw_mmu_disable(resources->dmmu_base); - free_page((unsigned long)dummy_va_addr); -} -#endif - -static inline const char *event_to_string(int event) -{ - switch (event) { - case DSP_SYSERROR: return "DSP_SYSERROR"; break; - case DSP_MMUFAULT: return "DSP_MMUFAULT"; break; - case DSP_PWRERROR: return "DSP_PWRERROR"; break; - case DSP_WDTOVERFLOW: return "DSP_WDTOVERFLOW"; break; - default: return "unknown event"; break; - } -} - -void bridge_deh_notify(struct deh_mgr *deh, int event, int info) -{ - struct bridge_dev_context *dev_context; - const char *str = event_to_string(event); - - if (!deh) - return; - - dev_dbg(bridge, "%s: device exception", __func__); - dev_context = deh->bridge_context; - - switch (event) { - case DSP_SYSERROR: - dev_err(bridge, "%s: %s, info=0x%x", __func__, - str, info); -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE - dump_dl_modules(dev_context); - dump_dsp_stack(dev_context); -#endif - break; - case DSP_MMUFAULT: - dev_err(bridge, "%s: %s, addr=0x%x", __func__, - str, fault_addr); -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE - print_dsp_trace_buffer(dev_context); - dump_dl_modules(dev_context); - mmu_fault_print_stack(dev_context); -#endif - break; - default: - dev_err(bridge, "%s: %s", __func__, str); - break; - } - - /* Filter subsequent notifications when an error occurs */ - if (dev_context->brd_state != BRD_ERROR) { - ntfy_notify(deh->ntfy_obj, event); -#ifdef CONFIG_TIDSPBRIDGE_RECOVERY - bridge_recover_schedule(); -#endif - } - - /* Set the Board state as ERROR */ - dev_context->brd_state = BRD_ERROR; - /* Disable all the clocks that were enabled by DSP */ - dsp_clock_disable_all(dev_context->dsp_per_clks); - /* - * Avoid the subsequent WDT if it happens once, - * also if fatal error occurs. - */ - dsp_wdt_enable(false); -} diff --git a/drivers/staging/tidspbridge/core/wdt.c b/drivers/staging/tidspbridge/core/wdt.c deleted file mode 100644 index b19f887dfd88..000000000000 --- a/drivers/staging/tidspbridge/core/wdt.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - * wdt.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * IO dispatcher for a shared memory channel driver. - * - * Copyright (C) 2010 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include - -#include -#include -#include -#include -#include -#include - - -#define OMAP34XX_WDT3_BASE (0x49000000 + 0x30000) -#define INT_34XX_WDT3_IRQ (36 + NR_IRQS) - -static struct dsp_wdt_setting dsp_wdt; - -void dsp_wdt_dpc(unsigned long data) -{ - struct deh_mgr *deh_mgr; - - dev_get_deh_mgr(dev_get_first(), &deh_mgr); - if (deh_mgr) - bridge_deh_notify(deh_mgr, DSP_WDTOVERFLOW, 0); -} - -irqreturn_t dsp_wdt_isr(int irq, void *data) -{ - u32 value; - /* ack wdt3 interrupt */ - value = __raw_readl(dsp_wdt.reg_base + OMAP3_WDT3_ISR_OFFSET); - __raw_writel(value, dsp_wdt.reg_base + OMAP3_WDT3_ISR_OFFSET); - - tasklet_schedule(&dsp_wdt.wdt3_tasklet); - return IRQ_HANDLED; -} - -int dsp_wdt_init(void) -{ - int ret = 0; - - dsp_wdt.sm_wdt = NULL; - dsp_wdt.reg_base = ioremap(OMAP34XX_WDT3_BASE, SZ_4K); - if (!dsp_wdt.reg_base) - return -ENOMEM; - - tasklet_init(&dsp_wdt.wdt3_tasklet, dsp_wdt_dpc, 0); - - dsp_wdt.fclk = clk_get(NULL, "wdt3_fck"); - - if (!IS_ERR(dsp_wdt.fclk)) { - clk_prepare(dsp_wdt.fclk); - - dsp_wdt.iclk = clk_get(NULL, "wdt3_ick"); - if (IS_ERR(dsp_wdt.iclk)) { - clk_put(dsp_wdt.fclk); - dsp_wdt.fclk = NULL; - ret = -EFAULT; - } else { - clk_prepare(dsp_wdt.iclk); - } - } else - ret = -EFAULT; - - if (!ret) - ret = request_irq(INT_34XX_WDT3_IRQ, dsp_wdt_isr, 0, - "dsp_wdt", &dsp_wdt); - - /* Disable at this moment, it will be enabled when DSP starts */ - if (!ret) - disable_irq(INT_34XX_WDT3_IRQ); - - return ret; -} - -void dsp_wdt_sm_set(void *data) -{ - dsp_wdt.sm_wdt = data; - dsp_wdt.sm_wdt->wdt_overflow = 5; /* in seconds */ -} - - -void dsp_wdt_exit(void) -{ - free_irq(INT_34XX_WDT3_IRQ, &dsp_wdt); - tasklet_kill(&dsp_wdt.wdt3_tasklet); - - if (dsp_wdt.fclk) { - clk_unprepare(dsp_wdt.fclk); - clk_put(dsp_wdt.fclk); - } - if (dsp_wdt.iclk) { - clk_unprepare(dsp_wdt.iclk); - clk_put(dsp_wdt.iclk); - } - - dsp_wdt.fclk = NULL; - dsp_wdt.iclk = NULL; - dsp_wdt.sm_wdt = NULL; - - if (dsp_wdt.reg_base) - iounmap(dsp_wdt.reg_base); - dsp_wdt.reg_base = NULL; -} - -void dsp_wdt_enable(bool enable) -{ - u32 tmp; - static bool wdt_enable; - - if (wdt_enable == enable || !dsp_wdt.fclk || !dsp_wdt.iclk) - return; - - wdt_enable = enable; - - if (enable) { - clk_enable(dsp_wdt.fclk); - clk_enable(dsp_wdt.iclk); - dsp_wdt.sm_wdt->wdt_setclocks = 1; - tmp = __raw_readl(dsp_wdt.reg_base + OMAP3_WDT3_ISR_OFFSET); - __raw_writel(tmp, dsp_wdt.reg_base + OMAP3_WDT3_ISR_OFFSET); - enable_irq(INT_34XX_WDT3_IRQ); - } else { - disable_irq(INT_34XX_WDT3_IRQ); - dsp_wdt.sm_wdt->wdt_setclocks = 0; - clk_disable(dsp_wdt.iclk); - clk_disable(dsp_wdt.fclk); - } -} diff --git a/drivers/staging/tidspbridge/dynload/cload.c b/drivers/staging/tidspbridge/dynload/cload.c deleted file mode 100644 index 83f2106ff8a7..000000000000 --- a/drivers/staging/tidspbridge/dynload/cload.c +++ /dev/null @@ -1,1959 +0,0 @@ -/* - * cload.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include - -#include "header.h" - -#include "module_list.h" -#define LINKER_MODULES_HEADER ("_" MODULES_HEADER) - -/* - * forward references - */ -static void dload_symbols(struct dload_state *dlthis); -static void dload_data(struct dload_state *dlthis); -static void allocate_sections(struct dload_state *dlthis); -static void string_table_free(struct dload_state *dlthis); -static void symbol_table_free(struct dload_state *dlthis); -static void section_table_free(struct dload_state *dlthis); -static void init_module_handle(struct dload_state *dlthis); -#if BITS_PER_AU > BITS_PER_BYTE -static char *unpack_name(struct dload_state *dlthis, u32 soffset); -#endif - -static const char cinitname[] = { ".cinit" }; -static const char loader_dllview_root[] = { "?DLModules?" }; - -/* - * Error strings - */ -static const char readstrm[] = { "Error reading %s from input stream" }; -static const char err_alloc[] = { "Syms->dload_allocate( %d ) failed" }; -static const char tgtalloc[] = { - "Target memory allocate failed, section %s size " FMT_UI32 }; -static const char initfail[] = { "%s to target address " FMT_UI32 " failed" }; -static const char dlvwrite[] = { "Write to DLLview list failed" }; -static const char iconnect[] = { "Connect call to init interface failed" }; -static const char err_checksum[] = { "Checksum failed on %s" }; - -/************************************************************************* - * Procedure dload_error - * - * Parameters: - * errtxt description of the error, printf style - * ... additional information - * - * Effect: - * Reports or records the error as appropriate. - *********************************************************************** */ -void dload_error(struct dload_state *dlthis, const char *errtxt, ...) -{ - va_list args; - - va_start(args, errtxt); - dlthis->mysym->error_report(dlthis->mysym, errtxt, args); - va_end(args); - dlthis->dload_errcount += 1; - -} /* dload_error */ - -#define DL_ERROR(zza, zzb) dload_error(dlthis, zza, zzb) - -/************************************************************************* - * Procedure dload_syms_error - * - * Parameters: - * errtxt description of the error, printf style - * ... additional information - * - * Effect: - * Reports or records the error as appropriate. - *********************************************************************** */ -void dload_syms_error(struct dynamic_loader_sym *syms, const char *errtxt, ...) -{ - va_list args; - - va_start(args, errtxt); - syms->error_report(syms, errtxt, args); - va_end(args); -} - -/************************************************************************* - * Procedure dynamic_load_module - * - * Parameters: - * module The input stream that supplies the module image - * syms Host-side symbol table and malloc/free functions - * alloc Target-side memory allocation - * init Target-side memory initialization - * options Option flags DLOAD_* - * mhandle A module handle for use with Dynamic_Unload - * - * Effect: - * The module image is read using *module. Target storage for the new - * image is - * obtained from *alloc. Symbols defined and referenced by the module are - * managed using *syms. The image is then relocated and references - * resolved as necessary, and the resulting executable bits are placed - * into target memory using *init. - * - * Returns: - * On a successful load, a module handle is placed in *mhandle, - * and zero is returned. On error, the number of errors detected is - * returned. Individual errors are reported during the load process - * using syms->error_report(). - ********************************************************************** */ -int dynamic_load_module(struct dynamic_loader_stream *module, - struct dynamic_loader_sym *syms, - struct dynamic_loader_allocate *alloc, - struct dynamic_loader_initialize *init, - unsigned options, void **mhandle) -{ - register unsigned *dp, sz; - struct dload_state dl_state; /* internal state for this call */ - - /* blast our internal state */ - dp = (unsigned *)&dl_state; - for (sz = sizeof(dl_state) / sizeof(unsigned); sz > 0; sz -= 1) - *dp++ = 0; - - /* Enable _only_ BSS initialization if enabled by user */ - if ((options & DLOAD_INITBSS) == DLOAD_INITBSS) - dl_state.myoptions = DLOAD_INITBSS; - - /* Check that mandatory arguments are present */ - if (!module || !syms) { - dload_error(&dl_state, "Required parameter is NULL"); - } else { - dl_state.strm = module; - dl_state.mysym = syms; - dload_headers(&dl_state); - if (!dl_state.dload_errcount) - dload_strings(&dl_state, false); - if (!dl_state.dload_errcount) - dload_sections(&dl_state); - - if (init && !dl_state.dload_errcount) { - if (init->connect(init)) { - dl_state.myio = init; - dl_state.myalloc = alloc; - /* do now, before reducing symbols */ - allocate_sections(&dl_state); - } else - dload_error(&dl_state, iconnect); - } - - if (!dl_state.dload_errcount) { - /* fix up entry point address */ - unsigned sref = dl_state.dfile_hdr.df_entry_secn - 1; - - if (sref < dl_state.allocated_secn_count) - dl_state.dfile_hdr.df_entrypt += - dl_state.ldr_sections[sref].run_addr; - - dload_symbols(&dl_state); - } - - if (init && !dl_state.dload_errcount) - dload_data(&dl_state); - - init_module_handle(&dl_state); - - /* dl_state.myio is init or 0 at this point. */ - if (dl_state.myio) { - if ((!dl_state.dload_errcount) && - (dl_state.dfile_hdr.df_entry_secn != DN_UNDEF) && - (!init->execute(init, - dl_state.dfile_hdr.df_entrypt))) - dload_error(&dl_state, "Init->Execute Failed"); - init->release(init); - } - - symbol_table_free(&dl_state); - section_table_free(&dl_state); - string_table_free(&dl_state); - dload_tramp_cleanup(&dl_state); - - if (dl_state.dload_errcount) { - dynamic_unload_module(dl_state.myhandle, syms, alloc, - init); - dl_state.myhandle = NULL; - } - } - - if (mhandle) - *mhandle = dl_state.myhandle; /* give back the handle */ - - return dl_state.dload_errcount; -} /* DLOAD_File */ - -/************************************************************************* - * Procedure dynamic_open_module - * - * Parameters: - * module The input stream that supplies the module image - * syms Host-side symbol table and malloc/free functions - * alloc Target-side memory allocation - * init Target-side memory initialization - * options Option flags DLOAD_* - * mhandle A module handle for use with Dynamic_Unload - * - * Effect: - * The module image is read using *module. Target storage for the new - * image is - * obtained from *alloc. Symbols defined and referenced by the module are - * managed using *syms. The image is then relocated and references - * resolved as necessary, and the resulting executable bits are placed - * into target memory using *init. - * - * Returns: - * On a successful load, a module handle is placed in *mhandle, - * and zero is returned. On error, the number of errors detected is - * returned. Individual errors are reported during the load process - * using syms->error_report(). - ********************************************************************** */ -int -dynamic_open_module(struct dynamic_loader_stream *module, - struct dynamic_loader_sym *syms, - struct dynamic_loader_allocate *alloc, - struct dynamic_loader_initialize *init, - unsigned options, void **mhandle) -{ - register unsigned *dp, sz; - struct dload_state dl_state; /* internal state for this call */ - - /* blast our internal state */ - dp = (unsigned *)&dl_state; - for (sz = sizeof(dl_state) / sizeof(unsigned); sz > 0; sz -= 1) - *dp++ = 0; - - /* Enable _only_ BSS initialization if enabled by user */ - if ((options & DLOAD_INITBSS) == DLOAD_INITBSS) - dl_state.myoptions = DLOAD_INITBSS; - - /* Check that mandatory arguments are present */ - if (!module || !syms) { - dload_error(&dl_state, "Required parameter is NULL"); - } else { - dl_state.strm = module; - dl_state.mysym = syms; - dload_headers(&dl_state); - if (!dl_state.dload_errcount) - dload_strings(&dl_state, false); - if (!dl_state.dload_errcount) - dload_sections(&dl_state); - - if (init && !dl_state.dload_errcount) { - if (init->connect(init)) { - dl_state.myio = init; - dl_state.myalloc = alloc; - /* do now, before reducing symbols */ - allocate_sections(&dl_state); - } else - dload_error(&dl_state, iconnect); - } - - if (!dl_state.dload_errcount) { - /* fix up entry point address */ - unsigned sref = dl_state.dfile_hdr.df_entry_secn - 1; - - if (sref < dl_state.allocated_secn_count) - dl_state.dfile_hdr.df_entrypt += - dl_state.ldr_sections[sref].run_addr; - - dload_symbols(&dl_state); - } - - init_module_handle(&dl_state); - - /* dl_state.myio is either 0 or init at this point. */ - if (dl_state.myio) { - if ((!dl_state.dload_errcount) && - (dl_state.dfile_hdr.df_entry_secn != DN_UNDEF) && - (!init->execute(init, - dl_state.dfile_hdr.df_entrypt))) - dload_error(&dl_state, "Init->Execute Failed"); - init->release(init); - } - - symbol_table_free(&dl_state); - section_table_free(&dl_state); - string_table_free(&dl_state); - - if (dl_state.dload_errcount) { - dynamic_unload_module(dl_state.myhandle, syms, alloc, - init); - dl_state.myhandle = NULL; - } - } - - if (mhandle) - *mhandle = dl_state.myhandle; /* give back the handle */ - - return dl_state.dload_errcount; -} /* DLOAD_File */ - -/************************************************************************* - * Procedure dload_headers - * - * Parameters: - * none - * - * Effect: - * Loads the DOFF header and verify record. Deals with any byte-order - * issues and checks them for validity. - *********************************************************************** */ -#define COMBINED_HEADER_SIZE (sizeof(struct doff_filehdr_t)+ \ - sizeof(struct doff_verify_rec_t)) - -void dload_headers(struct dload_state *dlthis) -{ - u32 map; - - /* Read the header and the verify record as one. If we don't get it - all, we're done */ - if (dlthis->strm->read_buffer(dlthis->strm, &dlthis->dfile_hdr, - COMBINED_HEADER_SIZE) != - COMBINED_HEADER_SIZE) { - DL_ERROR(readstrm, "File Headers"); - return; - } - /* - * Verify that we have the byte order of the file correct. - * If not, must fix it before we can continue - */ - map = REORDER_MAP(dlthis->dfile_hdr.df_byte_reshuffle); - if (map != REORDER_MAP(BYTE_RESHUFFLE_VALUE)) { - /* input is either byte-shuffled or bad */ - if ((map & 0xFCFCFCFC) == 0) { /* no obviously bogus bits */ - dload_reorder(&dlthis->dfile_hdr, COMBINED_HEADER_SIZE, - map); - } - if (dlthis->dfile_hdr.df_byte_reshuffle != - BYTE_RESHUFFLE_VALUE) { - /* didn't fix the problem, the byte swap map is bad */ - dload_error(dlthis, - "Bad byte swap map " FMT_UI32 " in header", - dlthis->dfile_hdr.df_byte_reshuffle); - return; - } - dlthis->reorder_map = map; /* keep map for future use */ - } - - /* - * Verify checksum of header and verify record - */ - if (~dload_checksum(&dlthis->dfile_hdr, - sizeof(struct doff_filehdr_t)) || - ~dload_checksum(&dlthis->verify, - sizeof(struct doff_verify_rec_t))) { - DL_ERROR(err_checksum, "header or verify record"); - return; - } -#if HOST_ENDIANNESS - dlthis->dfile_hdr.df_byte_reshuffle = map; /* put back for later */ -#endif - - /* Check for valid target ID */ - if ((dlthis->dfile_hdr.df_target_id != TARGET_ID) && - -(dlthis->dfile_hdr.df_target_id != TMS470_ID)) { - dload_error(dlthis, "Bad target ID 0x%x and TARGET_ID 0x%x", - dlthis->dfile_hdr.df_target_id, TARGET_ID); - return; - } - /* Check for valid file format */ - if ((dlthis->dfile_hdr.df_doff_version != DOFF0)) { - dload_error(dlthis, "Bad DOFF version 0x%x", - dlthis->dfile_hdr.df_doff_version); - return; - } - - /* - * Apply reasonableness checks to count fields - */ - if (dlthis->dfile_hdr.df_strtab_size > MAX_REASONABLE_STRINGTAB) { - dload_error(dlthis, "Excessive string table size " FMT_UI32, - dlthis->dfile_hdr.df_strtab_size); - return; - } - if (dlthis->dfile_hdr.df_no_scns > MAX_REASONABLE_SECTIONS) { - dload_error(dlthis, "Excessive section count 0x%x", - dlthis->dfile_hdr.df_no_scns); - return; - } -#ifndef TARGET_ENDIANNESS - /* - * Check that endianness does not disagree with explicit specification - */ - if ((dlthis->dfile_hdr.df_flags >> ALIGN_COFF_ENDIANNESS) & - dlthis->myoptions & ENDIANNESS_MASK) { - dload_error(dlthis, - "Input endianness disagrees with specified option"); - return; - } - dlthis->big_e_target = dlthis->dfile_hdr.df_flags & DF_BIG; -#endif - -} /* dload_headers */ - -/* COFF Section Processing - * - * COFF sections are read in and retained intact. Each record is embedded - * in a new structure that records the updated load and - * run addresses of the section */ - -static const char secn_errid[] = { "section" }; - -/************************************************************************* - * Procedure dload_sections - * - * Parameters: - * none - * - * Effect: - * Loads the section records into an internal table. - *********************************************************************** */ -void dload_sections(struct dload_state *dlthis) -{ - s16 siz; - struct doff_scnhdr_t *shp; - unsigned nsecs = dlthis->dfile_hdr.df_no_scns; - - /* allocate space for the DOFF section records */ - siz = nsecs * sizeof(struct doff_scnhdr_t); - shp = - (struct doff_scnhdr_t *)dlthis->mysym->dload_allocate(dlthis->mysym, - siz); - if (!shp) { /* not enough storage */ - DL_ERROR(err_alloc, siz); - return; - } - dlthis->sect_hdrs = shp; - - /* read in the section records */ - if (dlthis->strm->read_buffer(dlthis->strm, shp, siz) != siz) { - DL_ERROR(readstrm, secn_errid); - return; - } - - /* if we need to fix up byte order, do it now */ - if (dlthis->reorder_map) - dload_reorder(shp, siz, dlthis->reorder_map); - - /* check for validity */ - if (~dload_checksum(dlthis->sect_hdrs, siz) != - dlthis->verify.dv_scn_rec_checksum) { - DL_ERROR(err_checksum, secn_errid); - return; - } - -} /* dload_sections */ - -/***************************************************************************** - * Procedure allocate_sections - * - * Parameters: - * alloc target memory allocator class - * - * Effect: - * Assigns new (target) addresses for sections - **************************************************************************** */ -static void allocate_sections(struct dload_state *dlthis) -{ - u16 curr_sect, nsecs, siz; - struct doff_scnhdr_t *shp; - struct ldr_section_info *asecs; - struct my_handle *hndl; - - nsecs = dlthis->dfile_hdr.df_no_scns; - if (!nsecs) - return; - if ((dlthis->myalloc == NULL) && - (dlthis->dfile_hdr.df_target_scns > 0)) { - DL_ERROR("Arg 3 (alloc) required but NULL", 0); - return; - } - /* - * allocate space for the module handle, which we will keep for unload - * purposes include an additional section store for an auto-generated - * trampoline section in case we need it. - */ - siz = (dlthis->dfile_hdr.df_target_scns + 1) * - sizeof(struct ldr_section_info) + MY_HANDLE_SIZE; - - hndl = - (struct my_handle *)dlthis->mysym->dload_allocate(dlthis->mysym, - siz); - if (!hndl) { /* not enough storage */ - DL_ERROR(err_alloc, siz); - return; - } - /* initialize the handle header */ - hndl->dm.next = hndl->dm.prev = hndl; /* circular list */ - hndl->dm.root = NULL; - hndl->dm.dbthis = 0; - dlthis->myhandle = hndl; /* save away for return */ - /* pointer to the section list of allocated sections */ - dlthis->ldr_sections = asecs = hndl->secns; - /* * Insert names into all sections, make copies of - the sections we allocate */ - shp = dlthis->sect_hdrs; - for (curr_sect = 0; curr_sect < nsecs; curr_sect++) { - u32 soffset = shp->ds_offset; -#if BITS_PER_AU <= BITS_PER_BYTE - /* attempt to insert the name of this section */ - if (soffset < dlthis->dfile_hdr.df_strtab_size) - ((struct ldr_section_info *)shp)->name = - dlthis->str_head + soffset; - else { - dload_error(dlthis, "Bad name offset in section %d", - curr_sect); - ((struct ldr_section_info *)shp)->name = NULL; - } -#endif - /* allocate target storage for sections that require it */ - if (ds_needs_allocation(shp)) { - *asecs = *(struct ldr_section_info *)shp; - asecs->context = 0; /* zero the context field */ -#if BITS_PER_AU > BITS_PER_BYTE - asecs->name = unpack_name(dlthis, soffset); - dlthis->debug_string_size = soffset + dlthis->temp_len; -#else - dlthis->debug_string_size = soffset; -#endif - if (dlthis->myalloc != NULL) { - if (!dlthis->myalloc-> - dload_allocate(dlthis->myalloc, asecs, - ds_alignment(asecs->type))) { - dload_error(dlthis, tgtalloc, - asecs->name, asecs->size); - return; - } - } - /* keep address deltas in original section table */ - shp->ds_vaddr = asecs->load_addr - shp->ds_vaddr; - shp->ds_paddr = asecs->run_addr - shp->ds_paddr; - dlthis->allocated_secn_count += 1; - } /* allocate target storage */ - shp += 1; - asecs += 1; - } -#if BITS_PER_AU <= BITS_PER_BYTE - dlthis->debug_string_size += - strlen(dlthis->str_head + dlthis->debug_string_size) + 1; -#endif -} /* allocate sections */ - -/************************************************************************* - * Procedure section_table_free - * - * Parameters: - * none - * - * Effect: - * Frees any state used by the symbol table. - * - * WARNING: - * This routine is not allowed to declare errors! - *********************************************************************** */ -static void section_table_free(struct dload_state *dlthis) -{ - struct doff_scnhdr_t *shp; - - shp = dlthis->sect_hdrs; - if (shp) - dlthis->mysym->dload_deallocate(dlthis->mysym, shp); - -} /* section_table_free */ - -/************************************************************************* - * Procedure dload_strings - * - * Parameters: - * sec_names_only If true only read in the "section names" - * portion of the string table - * - * Effect: - * Loads the DOFF string table into memory. DOFF keeps all strings in a - * big unsorted array. We just read that array into memory in bulk. - *********************************************************************** */ -static const char stringtbl[] = { "string table" }; - -void dload_strings(struct dload_state *dlthis, bool sec_names_only) -{ - u32 ssiz; - char *strbuf; - - if (sec_names_only) { - ssiz = BYTE_TO_HOST(DOFF_ALIGN - (dlthis->dfile_hdr.df_scn_name_size)); - } else { - ssiz = BYTE_TO_HOST(DOFF_ALIGN - (dlthis->dfile_hdr.df_strtab_size)); - } - if (ssiz == 0) - return; - - /* get some memory for the string table */ -#if BITS_PER_AU > BITS_PER_BYTE - strbuf = (char *)dlthis->mysym->dload_allocate(dlthis->mysym, ssiz + - dlthis->dfile_hdr. - df_max_str_len); -#else - strbuf = (char *)dlthis->mysym->dload_allocate(dlthis->mysym, ssiz); -#endif - if (strbuf == NULL) { - DL_ERROR(err_alloc, ssiz); - return; - } - dlthis->str_head = strbuf; -#if BITS_PER_AU > BITS_PER_BYTE - dlthis->str_temp = strbuf + ssiz; -#endif - /* read in the strings and verify them */ - if ((unsigned)(dlthis->strm->read_buffer(dlthis->strm, strbuf, - ssiz)) != ssiz) { - DL_ERROR(readstrm, stringtbl); - } - /* if we need to fix up byte order, do it now */ -#ifndef _BIG_ENDIAN - if (dlthis->reorder_map) - dload_reorder(strbuf, ssiz, dlthis->reorder_map); - - if ((!sec_names_only) && (~dload_checksum(strbuf, ssiz) != - dlthis->verify.dv_str_tab_checksum)) { - DL_ERROR(err_checksum, stringtbl); - } -#else - if (dlthis->dfile_hdr.df_byte_reshuffle != - HOST_BYTE_ORDER(REORDER_MAP(BYTE_RESHUFFLE_VALUE))) { - /* put strings in big-endian order, not in PC order */ - dload_reorder(strbuf, ssiz, - HOST_BYTE_ORDER(dlthis-> - dfile_hdr.df_byte_reshuffle)); - } - if ((!sec_names_only) && (~dload_reverse_checksum(strbuf, ssiz) != - dlthis->verify.dv_str_tab_checksum)) { - DL_ERROR(err_checksum, stringtbl); - } -#endif -} /* dload_strings */ - -/************************************************************************* - * Procedure string_table_free - * - * Parameters: - * none - * - * Effect: - * Frees any state used by the string table. - * - * WARNING: - * This routine is not allowed to declare errors! - ************************************************************************ */ -static void string_table_free(struct dload_state *dlthis) -{ - if (dlthis->str_head) - dlthis->mysym->dload_deallocate(dlthis->mysym, - dlthis->str_head); - -} /* string_table_free */ - -/* - * Symbol Table Maintenance Functions - * - * COFF symbols are read by dload_symbols(), which is called after - * sections have been allocated. Symbols which might be used in - * relocation (ie, not debug info) are retained in an internal temporary - * compressed table (type local_symbol). A particular symbol is recovered - * by index by calling dload_find_symbol(). dload_find_symbol - * reconstructs a more explicit representation (type SLOTVEC) which is - * used by reloc.c - */ -/* real size of debug header */ -#define DBG_HDR_SIZE (sizeof(struct dll_module) - sizeof(struct dll_sect)) - -static const char sym_errid[] = { "symbol" }; - -/************************************************************************** - * Procedure dload_symbols - * - * Parameters: - * none - * - * Effect: - * Reads in symbols and retains ones that might be needed for relocation - * purposes. - *********************************************************************** */ -/* size of symbol buffer no bigger than target data buffer, to limit stack - * usage */ -#define MY_SYM_BUF_SIZ (BYTE_TO_HOST(IMAGE_PACKET_SIZE)/\ - sizeof(struct doff_syment_t)) - -static void dload_symbols(struct dload_state *dlthis) -{ - u32 sym_count, siz, dsiz, symbols_left; - u32 checks; - struct local_symbol *sp; - struct dynload_symbol *symp; - struct dynload_symbol *newsym; - struct doff_syment_t *my_sym_buf; - - sym_count = dlthis->dfile_hdr.df_no_syms; - if (sym_count == 0) - return; - - /* - * We keep a local symbol table for all of the symbols in the input. - * This table contains only section & value info, as we do not have - * to do any name processing for locals. We reuse this storage - * as a temporary for .dllview record construction. - * Allocate storage for the whole table. Add 1 to the section count - * in case a trampoline section is auto-generated as well as the - * size of the trampoline section name so DLLView doesn't get lost. - */ - - siz = sym_count * sizeof(struct local_symbol); - dsiz = DBG_HDR_SIZE + - (sizeof(struct dll_sect) * dlthis->allocated_secn_count) + - BYTE_TO_HOST_ROUND(dlthis->debug_string_size + 1); - if (dsiz > siz) - siz = dsiz; /* larger of symbols and .dllview temp */ - sp = (struct local_symbol *)dlthis->mysym->dload_allocate(dlthis->mysym, - siz); - if (!sp) { - DL_ERROR(err_alloc, siz); - return; - } - dlthis->local_symtab = sp; - /* Read the symbols in the input, store them in the table, and post any - * globals to the global symbol table. In the process, externals - become defined from the global symbol table */ - checks = dlthis->verify.dv_sym_tab_checksum; - symbols_left = sym_count; - - my_sym_buf = kzalloc(sizeof(*my_sym_buf) * MY_SYM_BUF_SIZ, GFP_KERNEL); - if (!my_sym_buf) - return; - - do { /* read all symbols */ - char *sname; - u32 val; - s32 delta; - struct doff_syment_t *input_sym; - unsigned syms_in_buf; - - input_sym = my_sym_buf; - syms_in_buf = symbols_left > MY_SYM_BUF_SIZ ? - MY_SYM_BUF_SIZ : symbols_left; - siz = syms_in_buf * sizeof(struct doff_syment_t); - if (dlthis->strm->read_buffer(dlthis->strm, input_sym, siz) != - siz) { - DL_ERROR(readstrm, sym_errid); - goto free_sym_buf; - } - if (dlthis->reorder_map) - dload_reorder(input_sym, siz, dlthis->reorder_map); - - checks += dload_checksum(input_sym, siz); - do { /* process symbols in buffer */ - symbols_left -= 1; - /* attempt to derive the name of this symbol */ - sname = NULL; - if (input_sym->dn_offset > 0) { -#if BITS_PER_AU <= BITS_PER_BYTE - if ((u32) input_sym->dn_offset < - dlthis->dfile_hdr.df_strtab_size) - sname = dlthis->str_head + - BYTE_TO_HOST(input_sym->dn_offset); - else - dload_error(dlthis, - "Bad name offset in symbol " - " %d", symbols_left); -#else - sname = unpack_name(dlthis, - input_sym->dn_offset); -#endif - } - val = input_sym->dn_value; - delta = 0; - sp->sclass = input_sym->dn_sclass; - sp->secnn = input_sym->dn_scnum; - /* if this is an undefined symbol, - * define it (or fail) now */ - if (sp->secnn == DN_UNDEF) { - /* pointless for static undefined */ - if (input_sym->dn_sclass != DN_EXT) - goto loop_cont; - - /* try to define symbol from previously - * loaded images */ - symp = dlthis->mysym->find_matching_symbol - (dlthis->mysym, sname); - if (!symp) { - DL_ERROR - ("Undefined external symbol %s", - sname); - goto loop_cont; - } - val = delta = symp->value; -#ifdef ENABLE_TRAMP_DEBUG - dload_syms_error(dlthis->mysym, - "===> ext sym [%s] at %x", - sname, val); -#endif - - goto loop_cont; - } - /* symbol defined by this module */ - if (sp->secnn > 0) { - /* symbol references a section */ - if ((unsigned)sp->secnn <= - dlthis->allocated_secn_count) { - /* section was allocated */ - struct doff_scnhdr_t *srefp = - &dlthis->sect_hdrs[sp->secnn - 1]; - - if (input_sym->dn_sclass == - DN_STATLAB || - input_sym->dn_sclass == DN_EXTLAB) { - /* load */ - delta = srefp->ds_vaddr; - } else { - /* run */ - delta = srefp->ds_paddr; - } - val += delta; - } - goto loop_itr; - } - /* This symbol is an absolute symbol */ - if (sp->secnn == DN_ABS && ((sp->sclass == DN_EXT) || - (sp->sclass == - DN_EXTLAB))) { - symp = - dlthis->mysym->find_matching_symbol(dlthis-> - mysym, - sname); - if (!symp) - goto loop_itr; - /* This absolute symbol is already defined. */ - if (symp->value == input_sym->dn_value) { - /* If symbol values are equal, continue - * but don't add to the global symbol - * table */ - sp->value = val; - sp->delta = delta; - sp += 1; - input_sym += 1; - continue; - } else { - /* If symbol values are not equal, - * return with redefinition error */ - DL_ERROR("Absolute symbol %s is " - "defined multiple times with " - "different values", sname); - goto free_sym_buf; - } - } -loop_itr: - /* if this is a global symbol, post it to the - * global table */ - if (input_sym->dn_sclass == DN_EXT || - input_sym->dn_sclass == DN_EXTLAB) { - /* Keep this global symbol for subsequent - * modules. Don't complain on error, to allow - * symbol API to suppress global symbols */ - if (!sname) - goto loop_cont; - - newsym = dlthis->mysym->add_to_symbol_table - (dlthis->mysym, sname, - (unsigned)dlthis->myhandle); - if (newsym) - newsym->value = val; - - } /* global */ -loop_cont: - sp->value = val; - sp->delta = delta; - sp += 1; - input_sym += 1; - } while ((syms_in_buf -= 1) > 0); /* process sym in buf */ - } while (symbols_left > 0); /* read all symbols */ - if (~checks) - dload_error(dlthis, "Checksum of symbols failed"); - -free_sym_buf: - kfree(my_sym_buf); - return; -} /* dload_symbols */ - -/***************************************************************************** - * Procedure symbol_table_free - * - * Parameters: - * none - * - * Effect: - * Frees any state used by the symbol table. - * - * WARNING: - * This routine is not allowed to declare errors! - **************************************************************************** */ -static void symbol_table_free(struct dload_state *dlthis) -{ - if (dlthis->local_symtab) { - if (dlthis->dload_errcount) { /* blow off our symbols */ - dlthis->mysym->purge_symbol_table(dlthis->mysym, - (unsigned) - dlthis->myhandle); - } - dlthis->mysym->dload_deallocate(dlthis->mysym, - dlthis->local_symtab); - } -} /* symbol_table_free */ - -/* .cinit Processing - * - * The dynamic loader does .cinit interpretation. cload_cinit() - * acts as a special write-to-target function, in that it takes relocated - * data from the normal data flow, and interprets it as .cinit actions. - * Because the normal data flow does not necessarily process the whole - * .cinit section in one buffer, cload_cinit() must be prepared to - * interpret the data piecemeal. A state machine is used for this - * purpose. - */ - -/* The following are only for use by reloc.c and things it calls */ -static const struct ldr_section_info cinit_info_init = { cinitname, 0, 0, - (ldr_addr)-1, 0, DLOAD_BSS, 0 -}; - -/************************************************************************* - * Procedure cload_cinit - * - * Parameters: - * ipacket Pointer to data packet to be loaded - * - * Effect: - * Interprets the data in the buffer as .cinit data, and performs the - * appropriate initializations. - *********************************************************************** */ -static void cload_cinit(struct dload_state *dlthis, - struct image_packet_t *ipacket) -{ -#if TDATA_TO_HOST(CINIT_COUNT)*BITS_PER_AU > 16 - s32 init_count, left; -#else - s16 init_count, left; -#endif - unsigned char *pktp = ipacket->img_data; - unsigned char *pktend = pktp + BYTE_TO_HOST_ROUND(ipacket->packet_size); - int temp; - ldr_addr atmp; - struct ldr_section_info cinit_info; - - /* PROCESS ALL THE INITIALIZATION RECORDS THE BUFFER. */ - while (true) { - left = pktend - pktp; - switch (dlthis->cinit_state) { - case CI_COUNT: /* count field */ - if (left < TDATA_TO_HOST(CINIT_COUNT)) - goto loopexit; - temp = dload_unpack(dlthis, (tgt_au_t *) pktp, - CINIT_COUNT * TDATA_AU_BITS, 0, - ROP_SGN); - pktp += TDATA_TO_HOST(CINIT_COUNT); - /* negative signifies BSS table, zero means done */ - if (temp <= 0) { - dlthis->cinit_state = CI_DONE; - break; - } - dlthis->cinit_count = temp; - dlthis->cinit_state = CI_ADDRESS; - break; -#if CINIT_ALIGN < CINIT_ADDRESS - case CI_PARTADDRESS: - pktp -= TDATA_TO_HOST(CINIT_ALIGN); - /* back up pointer into space courtesy of caller */ - *(uint16_t *) pktp = dlthis->cinit_addr; - /* stuff in saved bits !! FALL THRU !! */ -#endif - case CI_ADDRESS: /* Address field for a copy packet */ - if (left < TDATA_TO_HOST(CINIT_ADDRESS)) { -#if CINIT_ALIGN < CINIT_ADDRESS - if (left == TDATA_TO_HOST(CINIT_ALIGN)) { - /* address broken into halves */ - dlthis->cinit_addr = *(uint16_t *) pktp; - /* remember 1st half */ - dlthis->cinit_state = CI_PARTADDRESS; - left = 0; - } -#endif - goto loopexit; - } - atmp = dload_unpack(dlthis, (tgt_au_t *) pktp, - CINIT_ADDRESS * TDATA_AU_BITS, 0, - ROP_UNS); - pktp += TDATA_TO_HOST(CINIT_ADDRESS); -#if CINIT_PAGE_BITS > 0 - dlthis->cinit_page = atmp & - ((1 << CINIT_PAGE_BITS) - 1); - atmp >>= CINIT_PAGE_BITS; -#else - dlthis->cinit_page = CINIT_DEFAULT_PAGE; -#endif - dlthis->cinit_addr = atmp; - dlthis->cinit_state = CI_COPY; - break; - case CI_COPY: /* copy bits to the target */ - init_count = HOST_TO_TDATA(left); - if (init_count > dlthis->cinit_count) - init_count = dlthis->cinit_count; - if (init_count == 0) - goto loopexit; /* get more bits */ - cinit_info = cinit_info_init; - cinit_info.page = dlthis->cinit_page; - if (!dlthis->myio->writemem(dlthis->myio, pktp, - TDATA_TO_TADDR - (dlthis->cinit_addr), - &cinit_info, - TDATA_TO_HOST(init_count))) { - dload_error(dlthis, initfail, "write", - dlthis->cinit_addr); - } - dlthis->cinit_count -= init_count; - if (dlthis->cinit_count <= 0) { - dlthis->cinit_state = CI_COUNT; - init_count = (init_count + CINIT_ALIGN - 1) & - -CINIT_ALIGN; - /* align to next init */ - } - pktp += TDATA_TO_HOST(init_count); - dlthis->cinit_addr += init_count; - break; - case CI_DONE: /* no more .cinit to do */ - return; - } /* switch (cinit_state) */ - } /* while */ - -loopexit: - if (left > 0) { - dload_error(dlthis, "%d bytes left over in cinit packet", left); - dlthis->cinit_state = CI_DONE; /* left over bytes are bad */ - } -} /* cload_cinit */ - -/* Functions to interface to reloc.c - * - * reloc.c is the relocation module borrowed from the linker, with - * minimal (we hope) changes for our purposes. cload_sect_data() invokes - * this module on a section to relocate and load the image data for that - * section. The actual read and write actions are supplied by the global - * routines below. - */ - -/************************************************************************ - * Procedure relocate_packet - * - * Parameters: - * ipacket Pointer to an image packet to relocate - * - * Effect: - * Performs the required relocations on the packet. Returns a checksum - * of the relocation operations. - *********************************************************************** */ -#define MY_RELOC_BUF_SIZ 8 -/* careful! exists at the same time as the image buffer */ -static int relocate_packet(struct dload_state *dlthis, - struct image_packet_t *ipacket, - u32 *checks, bool *tramps_generated) -{ - u32 rnum; - *tramps_generated = false; - - rnum = ipacket->num_relocs; - do { /* all relocs */ - unsigned rinbuf; - int siz; - struct reloc_record_t *rp, rrec[MY_RELOC_BUF_SIZ]; - - rp = rrec; - rinbuf = rnum > MY_RELOC_BUF_SIZ ? MY_RELOC_BUF_SIZ : rnum; - siz = rinbuf * sizeof(struct reloc_record_t); - if (dlthis->strm->read_buffer(dlthis->strm, rp, siz) != siz) { - DL_ERROR(readstrm, "relocation"); - return 0; - } - /* reorder the bytes if need be */ - if (dlthis->reorder_map) - dload_reorder(rp, siz, dlthis->reorder_map); - - *checks += dload_checksum(rp, siz); - do { - /* perform the relocation operation */ - dload_relocate(dlthis, (tgt_au_t *) ipacket->img_data, - rp, tramps_generated, false); - rp += 1; - rnum -= 1; - } while ((rinbuf -= 1) > 0); - } while (rnum > 0); /* all relocs */ - /* If trampoline(s) were generated, we need to do an update of the - * trampoline copy of the packet since a 2nd phase relo will be done - * later. */ - if (*tramps_generated == true) { - dload_tramp_pkt_udpate(dlthis, - (dlthis->image_secn - - dlthis->ldr_sections), - dlthis->image_offset, ipacket); - } - - return 1; -} /* dload_read_reloc */ - -#define IPH_SIZE (sizeof(struct image_packet_t) - sizeof(u32)) - -/* VERY dangerous */ -static const char imagepak[] = { "image packet" }; - -struct img_buffer { - struct image_packet_t ipacket; - u8 bufr[BYTE_TO_HOST(IMAGE_PACKET_SIZE)]; -}; - -/************************************************************************* - * Procedure dload_data - * - * Parameters: - * none - * - * Effect: - * Read image data from input file, relocate it, and download it to the - * target. - *********************************************************************** */ -static void dload_data(struct dload_state *dlthis) -{ - u16 curr_sect; - struct doff_scnhdr_t *sptr = dlthis->sect_hdrs; - struct ldr_section_info *lptr = dlthis->ldr_sections; - struct img_buffer *ibuf; - u8 *dest; - - /* Indicates whether CINIT processing has occurred */ - bool cinit_processed = false; - - ibuf = kzalloc(sizeof(*ibuf), GFP_KERNEL); - if (!ibuf) - return; - - /* Loop through the sections and load them one at a time. - */ - for (curr_sect = 0; curr_sect < dlthis->dfile_hdr.df_no_scns; - curr_sect += 1) { - if (ds_needs_download(sptr)) { - s32 nip; - ldr_addr image_offset = 0; - /* set relocation info for this section */ - if (curr_sect < dlthis->allocated_secn_count) - dlthis->delta_runaddr = sptr->ds_paddr; - else { - lptr = (struct ldr_section_info *)sptr; - dlthis->delta_runaddr = 0; - } - dlthis->image_secn = lptr; -#if BITS_PER_AU > BITS_PER_BYTE - lptr->name = unpack_name(dlthis, sptr->ds_offset); -#endif - nip = sptr->ds_nipacks; - while ((nip -= 1) >= 0) { /* process packets */ - - s32 ipsize; - u32 checks; - bool tramp_generated = false; - - /* get the fixed header bits */ - if (dlthis->strm->read_buffer(dlthis->strm, - &ibuf->ipacket, - IPH_SIZE) != - IPH_SIZE) { - DL_ERROR(readstrm, imagepak); - goto free_ibuf; - } - /* reorder the header if need be */ - if (dlthis->reorder_map) { - dload_reorder(&ibuf->ipacket, IPH_SIZE, - dlthis->reorder_map); - } - /* now read the rest of the packet */ - ipsize = - BYTE_TO_HOST(DOFF_ALIGN - (ibuf->ipacket.packet_size)); - if (ipsize > BYTE_TO_HOST(IMAGE_PACKET_SIZE)) { - DL_ERROR("Bad image packet size %d", - ipsize); - goto free_ibuf; - } - dest = ibuf->bufr; - /* End of determination */ - - if (dlthis->strm->read_buffer(dlthis->strm, - ibuf->bufr, - ipsize) != - ipsize) { - DL_ERROR(readstrm, imagepak); - goto free_ibuf; - } - ibuf->ipacket.img_data = dest; - - /* reorder the bytes if need be */ -#if !defined(_BIG_ENDIAN) || (TARGET_AU_BITS > 16) - if (dlthis->reorder_map) { - dload_reorder(dest, ipsize, - dlthis->reorder_map); - } - checks = dload_checksum(dest, ipsize); -#else - if (dlthis->dfile_hdr.df_byte_reshuffle != - TARGET_ORDER(REORDER_MAP - (BYTE_RESHUFFLE_VALUE))) { - /* put image bytes in big-endian order, - * not PC order */ - dload_reorder(dest, ipsize, - TARGET_ORDER - (dlthis->dfile_hdr. - df_byte_reshuffle)); - } -#if TARGET_AU_BITS > 8 - checks = dload_reverse_checksum16(dest, ipsize); -#else - checks = dload_reverse_checksum(dest, ipsize); -#endif -#endif - - checks += dload_checksum(&ibuf->ipacket, - IPH_SIZE); - /* relocate the image bits as needed */ - if (ibuf->ipacket.num_relocs) { - dlthis->image_offset = image_offset; - if (!relocate_packet(dlthis, - &ibuf->ipacket, - &checks, - &tramp_generated)) - goto free_ibuf; /* error */ - } - if (~checks) - DL_ERROR(err_checksum, imagepak); - /* Only write the result to the target if no - * trampoline was generated. Otherwise it - *will be done during trampoline finalize. */ - - if (tramp_generated == false) { - - /* stuff the result into target - * memory */ - if (dload_check_type(sptr, - DLOAD_CINIT)) { - cload_cinit(dlthis, - &ibuf->ipacket); - cinit_processed = true; - } else { - /* FIXME */ - if (!dlthis->myio-> - writemem(dlthis-> - myio, - ibuf->bufr, - lptr-> - load_addr + - image_offset, - lptr, - BYTE_TO_HOST - (ibuf-> - ipacket. - packet_size))) { - DL_ERROR - ("Write to " - FMT_UI32 - " failed", - lptr-> - load_addr + - image_offset); - } - } - } - image_offset += - BYTE_TO_TADDR(ibuf->ipacket.packet_size); - } /* process packets */ - /* if this is a BSS section, we may want to fill it */ - if (!dload_check_type(sptr, DLOAD_BSS)) - goto loop_cont; - - if (!(dlthis->myoptions & DLOAD_INITBSS)) - goto loop_cont; - - if (cinit_processed) { - /* Don't clear BSS after load-time - * initialization */ - DL_ERROR - ("Zero-initialization at " FMT_UI32 - " after " "load-time initialization!", - lptr->load_addr); - goto loop_cont; - } - /* fill the .bss area */ - dlthis->myio->fillmem(dlthis->myio, - TADDR_TO_HOST(lptr->load_addr), - lptr, TADDR_TO_HOST(lptr->size), - DLOAD_FILL_BSS); - goto loop_cont; - } - /* if DS_DOWNLOAD_MASK */ - /* If not loading, but BSS, zero initialize */ - if (!dload_check_type(sptr, DLOAD_BSS)) - goto loop_cont; - - if (!(dlthis->myoptions & DLOAD_INITBSS)) - goto loop_cont; - - if (curr_sect >= dlthis->allocated_secn_count) - lptr = (struct ldr_section_info *)sptr; - - if (cinit_processed) { - /*Don't clear BSS after load-time initialization */ - DL_ERROR("Zero-initialization at " FMT_UI32 - " attempted after " - "load-time initialization!", lptr->load_addr); - goto loop_cont; - } - /* fill the .bss area */ - dlthis->myio->fillmem(dlthis->myio, - TADDR_TO_HOST(lptr->load_addr), lptr, - TADDR_TO_HOST(lptr->size), - DLOAD_FILL_BSS); -loop_cont: - sptr += 1; - lptr += 1; - } /* load sections */ - - /* Finalize any trampolines that were created during the load */ - if (dload_tramp_finalize(dlthis) == 0) { - DL_ERROR("Finalization of auto-trampolines (size = " FMT_UI32 - ") failed", dlthis->tramp.tramp_sect_next_addr); - } -free_ibuf: - kfree(ibuf); - return; -} /* dload_data */ - -/************************************************************************* - * Procedure dload_reorder - * - * Parameters: - * data 32-bit aligned pointer to data to be byte-swapped - * dsiz size of the data to be reordered in sizeof() units. - * map 32-bit map defining how to reorder the data. Value - * must be REORDER_MAP() of some permutation - * of 0x00 01 02 03 - * - * Effect: - * Re-arranges the bytes in each word according to the map specified. - * - *********************************************************************** */ -/* mask for byte shift count */ -#define SHIFT_COUNT_MASK (3 << LOG_BITS_PER_BYTE) - -void dload_reorder(void *data, int dsiz, unsigned int map) -{ - register u32 tmp, tmap, datv; - u32 *dp = (u32 *) data; - - map <<= LOG_BITS_PER_BYTE; /* align map with SHIFT_COUNT_MASK */ - do { - tmp = 0; - datv = *dp; - tmap = map; - do { - tmp |= (datv & BYTE_MASK) << (tmap & SHIFT_COUNT_MASK); - tmap >>= BITS_PER_BYTE; - } while (datv >>= BITS_PER_BYTE); - *dp++ = tmp; - } while ((dsiz -= sizeof(u32)) > 0); -} /* dload_reorder */ - -/************************************************************************* - * Procedure dload_checksum - * - * Parameters: - * data 32-bit aligned pointer to data to be checksummed - * siz size of the data to be checksummed in sizeof() units. - * - * Effect: - * Returns a checksum of the specified block - * - *********************************************************************** */ -u32 dload_checksum(void *data, unsigned siz) -{ - u32 sum; - u32 *dp; - int left; - - sum = 0; - dp = (u32 *) data; - for (left = siz; left > 0; left -= sizeof(u32)) - sum += *dp++; - return sum; -} /* dload_checksum */ - -#if HOST_ENDIANNESS -/************************************************************************* - * Procedure dload_reverse_checksum - * - * Parameters: - * data 32-bit aligned pointer to data to be checksummed - * siz size of the data to be checksummed in sizeof() units. - * - * Effect: - * Returns a checksum of the specified block, which is assumed to be bytes - * in big-endian order. - * - * Notes: - * In a big-endian host, things like the string table are stored as bytes - * in host order. But dllcreate always checksums in little-endian order. - * It is most efficient to just handle the difference a word at a time. - * - ********************************************************************** */ -u32 dload_reverse_checksum(void *data, unsigned siz) -{ - u32 sum, temp; - u32 *dp; - int left; - - sum = 0; - dp = (u32 *) data; - - for (left = siz; left > 0; left -= sizeof(u32)) { - temp = *dp++; - sum += temp << BITS_PER_BYTE * 3; - sum += temp >> BITS_PER_BYTE * 3; - sum += (temp >> BITS_PER_BYTE) & (BYTE_MASK << BITS_PER_BYTE); - sum += (temp & (BYTE_MASK << BITS_PER_BYTE)) << BITS_PER_BYTE; - } - - return sum; -} /* dload_reverse_checksum */ - -#if (TARGET_AU_BITS > 8) && (TARGET_AU_BITS < 32) -u32 dload_reverse_checksum16(void *data, unsigned siz) -{ - uint_fast32_t sum, temp; - u32 *dp; - int left; - - sum = 0; - dp = (u32 *) data; - - for (left = siz; left > 0; left -= sizeof(u32)) { - temp = *dp++; - sum += temp << BITS_PER_BYTE * 2; - sum += temp >> BITS_PER_BYTE * 2; - } - - return sum; -} /* dload_reverse_checksum16 */ -#endif -#endif - -/************************************************************************* - * Procedure swap_words - * - * Parameters: - * data 32-bit aligned pointer to data to be swapped - * siz size of the data to be swapped. - * bitmap Bit map of how to swap each 32-bit word; 1 => 2 shorts, - * 0 => 1 long - * - * Effect: - * Swaps the specified data according to the specified map - * - *********************************************************************** */ -static void swap_words(void *data, unsigned siz, unsigned bitmap) -{ - register int i; -#if TARGET_AU_BITS < 16 - register u16 *sp; -#endif - register u32 *lp; - - siz /= sizeof(u16); - -#if TARGET_AU_BITS < 16 - /* pass 1: do all the bytes */ - i = siz; - sp = (u16 *) data; - do { - register u16 tmp; - - tmp = *sp; - *sp++ = SWAP16BY8(tmp); - } while ((i -= 1) > 0); -#endif - -#if TARGET_AU_BITS < 32 - /* pass 2: fixup the 32-bit words */ - i = siz >> 1; - lp = (u32 *) data; - do { - if ((bitmap & 1) == 0) { - register u32 tmp; - tmp = *lp; - *lp = SWAP32BY16(tmp); - } - lp += 1; - bitmap >>= 1; - } while ((i -= 1) > 0); -#endif -} /* swap_words */ - -/************************************************************************* - * Procedure copy_tgt_strings - * - * Parameters: - * dstp Destination address. Assumed to be 32-bit aligned - * srcp Source address. Assumed to be 32-bit aligned - * charcount Number of characters to copy. - * - * Effect: - * Copies strings from the source (which is in usual .dof file order on - * the loading processor) to the destination buffer (which should be in proper - * target addressable unit order). Makes sure the last string in the - * buffer is NULL terminated (for safety). - * Returns the first unused destination address. - *********************************************************************** */ -static char *copy_tgt_strings(void *dstp, void *srcp, unsigned charcount) -{ - register tgt_au_t *src = (tgt_au_t *) srcp; - register tgt_au_t *dst = (tgt_au_t *) dstp; - register int cnt = charcount; - - do { -#if TARGET_AU_BITS <= BITS_PER_AU - /* byte-swapping issues may exist for strings on target */ - *dst++ = *src++; -#else - *dst++ = *src++; -#endif - } while ((cnt -= (sizeof(tgt_au_t) * BITS_PER_AU / BITS_PER_BYTE)) > 0); - /*apply force to make sure that the string table has null terminator */ -#if (BITS_PER_AU == BITS_PER_BYTE) && (TARGET_AU_BITS == BITS_PER_BYTE) - dst[-1] = 0; -#else - /* little endian */ - dst[-1] &= (1 << (BITS_PER_AU - BITS_PER_BYTE)) - 1; -#endif - return (char *)dst; -} /* copy_tgt_strings */ - -/************************************************************************* - * Procedure init_module_handle - * - * Parameters: - * none - * - * Effect: - * Initializes the module handle we use to enable unloading, and installs - * the debug information required by the target. - * - * Notes: - * The handle returned from dynamic_load_module needs to encapsulate all the - * allocations done for the module, and enable them plus the modules symbols to - * be deallocated. - * - *********************************************************************** */ -#ifndef _BIG_ENDIAN -static const struct ldr_section_info dllview_info_init = { ".dllview", 0, 0, - (ldr_addr)-1, DBG_LIST_PAGE, DLOAD_DATA, 0 -}; -#else -static const struct ldr_section_info dllview_info_init = { ".dllview", 0, 0, - (ldr_addr)-1, DLOAD_DATA, DBG_LIST_PAGE, 0 -}; -#endif -static void init_module_handle(struct dload_state *dlthis) -{ - struct my_handle *hndl; - u16 curr_sect; - struct ldr_section_info *asecs; - struct dll_module *dbmod; - struct dll_sect *dbsec; - struct dbg_mirror_root *mlist; - register char *cp; - struct modules_header mhdr; - struct ldr_section_info dllview_info; - struct dynload_symbol *debug_mirror_sym; - - hndl = dlthis->myhandle; - if (!hndl) - return; /* must be errors detected, so forget it */ - - /* Store the section count */ - hndl->secn_count = dlthis->allocated_secn_count; - - /* If a trampoline section was created, add it in */ - if (dlthis->tramp.tramp_sect_next_addr != 0) - hndl->secn_count += 1; - - hndl->secn_count = hndl->secn_count << 1; - - hndl->secn_count = dlthis->allocated_secn_count << 1; -#ifndef TARGET_ENDIANNESS - if (dlthis->big_e_target) - hndl->secn_count += 1; /* flag for big-endian */ -#endif - if (dlthis->dload_errcount) - return; /* abandon if errors detected */ - /* Locate the symbol that names the header for the CCS debug list - of modules. If not found, we just don't generate the debug record. - If found, we create our modules list. We make sure to create the - loader_dllview_root even if there is no relocation info to record, - just to try to put both symbols in the same symbol table and - module. */ - debug_mirror_sym = dlthis->mysym->find_matching_symbol(dlthis->mysym, - loader_dllview_root); - if (!debug_mirror_sym) { - struct dynload_symbol *dlmodsym; - struct dbg_mirror_root *mlst; - - /* our root symbol is not yet present; - check if we have DLModules defined */ - dlmodsym = dlthis->mysym->find_matching_symbol(dlthis->mysym, - LINKER_MODULES_HEADER); - if (!dlmodsym) - return; /* no DLModules list so no debug info */ - /* if we have DLModules defined, construct our header */ - mlst = (struct dbg_mirror_root *) - dlthis->mysym->dload_allocate(dlthis->mysym, - sizeof(struct - dbg_mirror_root)); - if (!mlst) { - DL_ERROR(err_alloc, sizeof(struct dbg_mirror_root)); - return; - } - mlst->next = NULL; - mlst->changes = 0; - mlst->refcount = 0; - mlst->dbthis = TDATA_TO_TADDR(dlmodsym->value); - /* add our root symbol */ - debug_mirror_sym = dlthis->mysym->add_to_symbol_table - (dlthis->mysym, loader_dllview_root, - (unsigned)dlthis->myhandle); - if (!debug_mirror_sym) { - /* failed, recover memory */ - dlthis->mysym->dload_deallocate(dlthis->mysym, mlst); - return; - } - debug_mirror_sym->value = (u32) mlst; - } - /* First create the DLLview record and stuff it into the buffer. - Then write it to the DSP. Record pertinent locations in our hndl, - and add it to the per-processor list of handles with debug info. */ -#ifndef DEBUG_HEADER_IN_LOADER - mlist = (struct dbg_mirror_root *)debug_mirror_sym->value; - if (!mlist) - return; -#else - mlist = (struct dbg_mirror_root *)&debug_list_header; -#endif - hndl->dm.root = mlist; /* set pointer to root into our handle */ - if (!dlthis->allocated_secn_count) - return; /* no load addresses to be recorded */ - /* reuse temporary symbol storage */ - dbmod = (struct dll_module *)dlthis->local_symtab; - /* Create the DLLview record in the memory we retain for our handle */ - dbmod->num_sects = dlthis->allocated_secn_count; - dbmod->timestamp = dlthis->verify.dv_timdat; - dbmod->version = INIT_VERSION; - dbmod->verification = VERIFICATION; - asecs = dlthis->ldr_sections; - dbsec = dbmod->sects; - for (curr_sect = dlthis->allocated_secn_count; - curr_sect > 0; curr_sect -= 1) { - dbsec->sect_load_adr = asecs->load_addr; - dbsec->sect_run_adr = asecs->run_addr; - dbsec += 1; - asecs += 1; - } - - /* If a trampoline section was created go ahead and add its info */ - if (dlthis->tramp.tramp_sect_next_addr != 0) { - dbmod->num_sects++; - dbsec->sect_load_adr = asecs->load_addr; - dbsec->sect_run_adr = asecs->run_addr; - dbsec++; - asecs++; - } - - /* now cram in the names */ - cp = copy_tgt_strings(dbsec, dlthis->str_head, - dlthis->debug_string_size); - - /* If a trampoline section was created, add its name so DLLView - * can show the user the section info. */ - if (dlthis->tramp.tramp_sect_next_addr != 0) { - cp = copy_tgt_strings(cp, - dlthis->tramp.final_string_table, - strlen(dlthis->tramp.final_string_table) + - 1); - } - - /* round off the size of the debug record, and remember same */ - hndl->dm.dbsiz = HOST_TO_TDATA_ROUND(cp - (char *)dbmod); - *cp = 0; /* strictly to make our test harness happy */ - dllview_info = dllview_info_init; - dllview_info.size = TDATA_TO_TADDR(hndl->dm.dbsiz); - /* Initialize memory context to default heap */ - dllview_info.context = 0; - hndl->dm.context = 0; - /* fill in next pointer and size */ - if (mlist->next) { - dbmod->next_module = TADDR_TO_TDATA(mlist->next->dm.dbthis); - dbmod->next_module_size = mlist->next->dm.dbsiz; - } else { - dbmod->next_module_size = 0; - dbmod->next_module = 0; - } - /* allocate memory for on-DSP DLLview debug record */ - if (!dlthis->myalloc) - return; - if (!dlthis->myalloc->dload_allocate(dlthis->myalloc, &dllview_info, - HOST_TO_TADDR(sizeof(u32)))) { - return; - } - /* Store load address of .dllview section */ - hndl->dm.dbthis = dllview_info.load_addr; - /* Store memory context (segid) in which .dllview section - * was allocated */ - hndl->dm.context = dllview_info.context; - mlist->refcount += 1; - /* swap bytes in the entire debug record, but not the string table */ - if (TARGET_ENDIANNESS_DIFFERS(TARGET_BIG_ENDIAN)) { - swap_words(dbmod, (char *)dbsec - (char *)dbmod, - DLL_MODULE_BITMAP); - } - /* Update the DLLview list on the DSP write new record */ - if (!dlthis->myio->writemem(dlthis->myio, dbmod, - dllview_info.load_addr, &dllview_info, - TADDR_TO_HOST(dllview_info.size))) { - return; - } - /* write new header */ - mhdr.first_module_size = hndl->dm.dbsiz; - mhdr.first_module = TADDR_TO_TDATA(dllview_info.load_addr); - /* swap bytes in the module header, if needed */ - if (TARGET_ENDIANNESS_DIFFERS(TARGET_BIG_ENDIAN)) { - swap_words(&mhdr, sizeof(struct modules_header) - sizeof(u16), - MODULES_HEADER_BITMAP); - } - dllview_info = dllview_info_init; - if (!dlthis->myio->writemem(dlthis->myio, &mhdr, mlist->dbthis, - &dllview_info, - sizeof(struct modules_header) - - sizeof(u16))) { - return; - } - /* Add the module handle to this processor's list - of handles with debug info */ - hndl->dm.next = mlist->next; - if (hndl->dm.next) - hndl->dm.next->dm.prev = hndl; - hndl->dm.prev = (struct my_handle *)mlist; - mlist->next = hndl; /* insert after root */ -} /* init_module_handle */ - -/************************************************************************* - * Procedure dynamic_unload_module - * - * Parameters: - * mhandle A module handle from dynamic_load_module - * syms Host-side symbol table and malloc/free functions - * alloc Target-side memory allocation - * - * Effect: - * The module specified by mhandle is unloaded. Unloading causes all - * target memory to be deallocated, all symbols defined by the module to - * be purged, and any host-side storage used by the dynamic loader for - * this module to be released. - * - * Returns: - * Zero for success. On error, the number of errors detected is returned. - * Individual errors are reported using syms->error_report(). - *********************************************************************** */ -int dynamic_unload_module(void *mhandle, - struct dynamic_loader_sym *syms, - struct dynamic_loader_allocate *alloc, - struct dynamic_loader_initialize *init) -{ - s16 curr_sect; - struct ldr_section_info *asecs; - struct my_handle *hndl; - struct dbg_mirror_root *root; - unsigned errcount = 0; - struct ldr_section_info dllview_info = dllview_info_init; - struct modules_header mhdr; - - hndl = (struct my_handle *)mhandle; - if (!hndl) - return 0; /* if handle is null, nothing to do */ - /* Clear out the module symbols - * Note that if this is the module that defined MODULES_HEADER - (the head of the target debug list) - * then this operation will blow away that symbol. - It will therefore be impossible for subsequent - * operations to add entries to this un-referenceable list. */ - if (!syms) - return 1; - syms->purge_symbol_table(syms, (unsigned)hndl); - /* Deallocate target memory for sections - * NOTE: The trampoline section, if created, gets deleted here, too */ - - asecs = hndl->secns; - if (alloc) - for (curr_sect = (hndl->secn_count >> 1); curr_sect > 0; - curr_sect -= 1) { - asecs->name = NULL; - alloc->dload_deallocate(alloc, asecs++); - } - root = hndl->dm.root; - if (!root) { - /* there is a debug list containing this module */ - goto func_end; - } - if (!hndl->dm.dbthis) { /* target-side dllview record exists */ - goto loop_end; - } - /* Retrieve memory context in which .dllview was allocated */ - dllview_info.context = hndl->dm.context; - if (hndl->dm.prev == hndl) - goto exitunltgt; - - /* target-side dllview record is in list */ - /* dequeue this record from our GPP-side mirror list */ - hndl->dm.prev->dm.next = hndl->dm.next; - if (hndl->dm.next) - hndl->dm.next->dm.prev = hndl->dm.prev; - /* Update next_module of previous entry in target list - * We are using mhdr here as a surrogate for either a - struct modules_header or a dll_module */ - if (hndl->dm.next) { - mhdr.first_module = TADDR_TO_TDATA(hndl->dm.next->dm.dbthis); - mhdr.first_module_size = hndl->dm.next->dm.dbsiz; - } else { - mhdr.first_module = 0; - mhdr.first_module_size = 0; - } - if (!init) - goto exitunltgt; - - if (!init->connect(init)) { - dload_syms_error(syms, iconnect); - errcount += 1; - goto exitunltgt; - } - /* swap bytes in the module header, if needed */ - if (TARGET_ENDIANNESS_DIFFERS(hndl->secn_count & 0x1)) { - swap_words(&mhdr, sizeof(struct modules_header) - sizeof(u16), - MODULES_HEADER_BITMAP); - } - if (!init->writemem(init, &mhdr, hndl->dm.prev->dm.dbthis, - &dllview_info, sizeof(struct modules_header) - - sizeof(mhdr.update_flag))) { - dload_syms_error(syms, dlvwrite); - errcount += 1; - } - /* update change counter */ - root->changes += 1; - if (!init->writemem(init, &(root->changes), - root->dbthis + HOST_TO_TADDR - (sizeof(mhdr.first_module) + - sizeof(mhdr.first_module_size)), - &dllview_info, sizeof(mhdr.update_flag))) { - dload_syms_error(syms, dlvwrite); - errcount += 1; - } - init->release(init); -exitunltgt: - /* release target storage */ - dllview_info.size = TDATA_TO_TADDR(hndl->dm.dbsiz); - dllview_info.load_addr = hndl->dm.dbthis; - if (alloc) - alloc->dload_deallocate(alloc, &dllview_info); - root->refcount -= 1; - /* target-side dllview record exists */ -loop_end: -#ifndef DEBUG_HEADER_IN_LOADER - if (root->refcount <= 0) { - /* if all references gone, blow off the header */ - /* our root symbol may be gone due to the Purge above, - but if not, do not destroy the root */ - if (syms->find_matching_symbol - (syms, loader_dllview_root) == NULL) - syms->dload_deallocate(syms, root); - } -#endif -func_end: - /* there is a debug list containing this module */ - syms->dload_deallocate(syms, mhandle); /* release our storage */ - return errcount; -} /* dynamic_unload_module */ - -#if BITS_PER_AU > BITS_PER_BYTE -/************************************************************************* - * Procedure unpack_name - * - * Parameters: - * soffset Byte offset into the string table - * - * Effect: - * Returns a pointer to the string specified by the offset supplied, or - * NULL for error. - * - *********************************************************************** */ -static char *unpack_name(struct dload_state *dlthis, u32 soffset) -{ - u8 tmp, *src; - char *dst; - - if (soffset >= dlthis->dfile_hdr.df_strtab_size) { - dload_error(dlthis, "Bad string table offset " FMT_UI32, - soffset); - return NULL; - } - src = (uint_least8_t *) dlthis->str_head + - (soffset >> (LOG_BITS_PER_AU - LOG_BITS_PER_BYTE)); - dst = dlthis->str_temp; - if (soffset & 1) - *dst++ = *src++; /* only 1 character in first word */ - do { - tmp = *src++; - *dst = (tmp >> BITS_PER_BYTE); - if (!(*dst++)) - break; - } while ((*dst++ = tmp & BYTE_MASK)); - dlthis->temp_len = dst - dlthis->str_temp; - /* squirrel away length including terminating null */ - return dlthis->str_temp; -} /* unpack_name */ -#endif diff --git a/drivers/staging/tidspbridge/dynload/dload_internal.h b/drivers/staging/tidspbridge/dynload/dload_internal.h deleted file mode 100644 index b9d079b96190..000000000000 --- a/drivers/staging/tidspbridge/dynload/dload_internal.h +++ /dev/null @@ -1,344 +0,0 @@ -/* - * dload_internal.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _DLOAD_INTERNAL_ -#define _DLOAD_INTERNAL_ - -#include - -/* - * Internal state definitions for the dynamic loader - */ - -/* type used for relocation intermediate results */ -typedef s32 rvalue; - -/* unsigned version of same; must have at least as many bits */ -typedef u32 urvalue; - -/* - * Dynamic loader configuration constants - */ -/* error issued if input has more sections than this limit */ -#define REASONABLE_SECTION_LIMIT 100 - -/* (Addressable unit) value used to clear BSS section */ -#define DLOAD_FILL_BSS 0 - -/* - * Reorder maps explained (?) - * - * The doff file format defines a 32-bit pattern used to determine the - * byte order of an image being read. That value is - * BYTE_RESHUFFLE_VALUE == 0x00010203 - * For purposes of the reorder routine, we would rather have the all-is-OK - * for 32-bits pattern be 0x03020100. This first macro makes the - * translation from doff file header value to MAP value: */ -#define REORDER_MAP(rawmap) ((rawmap) ^ 0x3030303) -/* This translation is made in dload_headers. Thereafter, the all-is-OK - * value for the maps stored in dlthis is REORDER_MAP(BYTE_RESHUFFLE_VALUE). - * But sadly, not all bits of the doff file are 32-bit integers. - * The notable exceptions are strings and image bits. - * Strings obey host byte order: */ -#if defined(_BIG_ENDIAN) -#define HOST_BYTE_ORDER(cookedmap) ((cookedmap) ^ 0x3030303) -#else -#define HOST_BYTE_ORDER(cookedmap) (cookedmap) -#endif -/* Target bits consist of target AUs (could be bytes, or 16-bits, - * or 32-bits) stored as an array in host order. A target order - * map is defined by: */ -#if !defined(_BIG_ENDIAN) || TARGET_AU_BITS > 16 -#define TARGET_ORDER(cookedmap) (cookedmap) -#elif TARGET_AU_BITS > 8 -#define TARGET_ORDER(cookedmap) ((cookedmap) ^ 0x2020202) -#else -#define TARGET_ORDER(cookedmap) ((cookedmap) ^ 0x3030303) -#endif - -/* forward declaration for handle returned by dynamic loader */ -struct my_handle; - -/* - * a list of module handles, which mirrors the debug list on the target - */ -struct dbg_mirror_root { - /* must be same as dbg_mirror_list; __DLModules address on target */ - u32 dbthis; - struct my_handle *next; /* must be same as dbg_mirror_list */ - u16 changes; /* change counter */ - u16 refcount; /* number of modules referencing this root */ -}; - -struct dbg_mirror_list { - u32 dbthis; - struct my_handle *next, *prev; - struct dbg_mirror_root *root; - u16 dbsiz; - u32 context; /* Save context for .dllview memory allocation */ -}; - -#define VARIABLE_SIZE 1 -/* - * the structure we actually return as an opaque module handle - */ -struct my_handle { - struct dbg_mirror_list dm; /* !!! must be first !!! */ - /* sections following << 1, LSB is set for big-endian target */ - u16 secn_count; - struct ldr_section_info secns[VARIABLE_SIZE]; -}; -#define MY_HANDLE_SIZE (sizeof(struct my_handle) -\ - sizeof(struct ldr_section_info)) -/* real size of my_handle */ - -/* - * reduced symbol structure used for symbols during relocation - */ -struct local_symbol { - s32 value; /* Relocated symbol value */ - s32 delta; /* Original value in input file */ - s16 secnn; /* section number */ - s16 sclass; /* symbol class */ -}; - -/* - * Trampoline data structures - */ -#define TRAMP_NO_GEN_AVAIL 65535 -#define TRAMP_SYM_PREFIX "__$dbTR__" -#define TRAMP_SECT_NAME ".dbTR" -/* MUST MATCH THE LENGTH ABOVE!! */ -#define TRAMP_SYM_PREFIX_LEN 9 -/* Includes NULL termination */ -#define TRAMP_SYM_HEX_ASCII_LEN 9 - -#define GET_CONTAINER(ptr, type, field) ((type *)((unsigned long)ptr -\ - (unsigned long)(&((type *)0)->field))) -#ifndef FIELD_OFFSET -#define FIELD_OFFSET(type, field) ((unsigned long)(&((type *)0)->field)) -#endif - -/* - The trampoline code for the target is located in a table called - "tramp_gen_info" with is indexed by looking up the index in the table - "tramp_map". The tramp_map index is acquired using the target - HASH_FUNC on the relocation type that caused the trampoline. Each - trampoline code table entry MUST follow this format: - - |----------------------------------------------| - | tramp_gen_code_hdr | - |----------------------------------------------| - | Trampoline image code | - | (the raw instruction code for the target) | - |----------------------------------------------| - | Relocation entries for the image code | - |----------------------------------------------| - - This is very similar to how image data is laid out in the DOFF file - itself. - */ -struct tramp_gen_code_hdr { - u32 tramp_code_size; /* in BYTES */ - u32 num_relos; - u32 relo_offset; /* in BYTES */ -}; - -struct tramp_img_pkt { - struct tramp_img_pkt *next; /* MUST BE FIRST */ - u32 base; - struct tramp_gen_code_hdr hdr; - u8 payload[VARIABLE_SIZE]; -}; - -struct tramp_img_dup_relo { - struct tramp_img_dup_relo *next; - struct reloc_record_t relo; -}; - -struct tramp_img_dup_pkt { - struct tramp_img_dup_pkt *next; /* MUST BE FIRST */ - s16 secnn; - u32 offset; - struct image_packet_t img_pkt; - struct tramp_img_dup_relo *relo_chain; - - /* PAYLOAD OF IMG PKT FOLLOWS */ -}; - -struct tramp_sym { - struct tramp_sym *next; /* MUST BE FIRST */ - u32 index; - u32 str_index; - struct local_symbol sym_info; -}; - -struct tramp_string { - struct tramp_string *next; /* MUST BE FIRST */ - u32 index; - char str[VARIABLE_SIZE]; /* NULL terminated */ -}; - -struct tramp_info { - u32 tramp_sect_next_addr; - struct ldr_section_info sect_info; - - struct tramp_sym *symbol_head; - struct tramp_sym *symbol_tail; - u32 tramp_sym_next_index; - struct local_symbol *final_sym_table; - - struct tramp_string *string_head; - struct tramp_string *string_tail; - u32 tramp_string_next_index; - u32 tramp_string_size; - char *final_string_table; - - struct tramp_img_pkt *tramp_pkts; - struct tramp_img_dup_pkt *dup_pkts; -}; - -/* - * States of the .cinit state machine - */ -enum cinit_mode { - CI_COUNT = 0, /* expecting a count */ - CI_ADDRESS, /* expecting an address */ -#if CINIT_ALIGN < CINIT_ADDRESS /* handle case of partial address field */ - CI_PARTADDRESS, /* have only part of the address */ -#endif - CI_COPY, /* in the middle of copying data */ - CI_DONE /* end of .cinit table */ -}; - -/* - * The internal state of the dynamic loader, which is passed around as - * an object - */ -struct dload_state { - struct dynamic_loader_stream *strm; /* The module input stream */ - struct dynamic_loader_sym *mysym; /* Symbols for this session */ - /* target memory allocator */ - struct dynamic_loader_allocate *myalloc; - struct dynamic_loader_initialize *myio; /* target memory initializer */ - unsigned myoptions; /* Options parameter dynamic_load_module */ - - char *str_head; /* Pointer to string table */ -#if BITS_PER_AU > BITS_PER_BYTE - char *str_temp; /* Pointer to temporary buffer for strings */ - /* big enough to hold longest string */ - unsigned temp_len; /* length of last temporary string */ - char *xstrings; /* Pointer to buffer for expanded */ - /* strings for sec names */ -#endif - /* Total size of strings for DLLView section names */ - unsigned debug_string_size; - /* Pointer to parallel section info for allocated sections only */ - struct doff_scnhdr_t *sect_hdrs; /* Pointer to section table */ - struct ldr_section_info *ldr_sections; -#if TMS32060 - /* The address of the start of the .bss section */ - ldr_addr bss_run_base; -#endif - struct local_symbol *local_symtab; /* Relocation symbol table */ - - /* pointer to DL section info for the section being relocated */ - struct ldr_section_info *image_secn; - /* change in run address for current section during relocation */ - ldr_addr delta_runaddr; - ldr_addr image_offset; /* offset of current packet in section */ - enum cinit_mode cinit_state; /* current state of cload_cinit() */ - int cinit_count; /* the current count */ - ldr_addr cinit_addr; /* the current address */ - s16 cinit_page; /* the current page */ - /* Handle to be returned by dynamic_load_module */ - struct my_handle *myhandle; - unsigned dload_errcount; /* Total # of errors reported so far */ - /* Number of target sections that require allocation and relocation */ - unsigned allocated_secn_count; -#ifndef TARGET_ENDIANNESS - int big_e_target; /* Target data in big-endian format */ -#endif - /* map for reordering bytes, 0 if not needed */ - u32 reorder_map; - struct doff_filehdr_t dfile_hdr; /* DOFF file header structure */ - struct doff_verify_rec_t verify; /* Verify record */ - - struct tramp_info tramp; /* Trampoline data, if needed */ - - int relstkidx; /* index into relocation value stack */ - /* relocation value stack used in relexp.c */ - rvalue relstk[STATIC_EXPR_STK_SIZE]; - -}; - -#ifdef TARGET_ENDIANNESS -#define TARGET_BIG_ENDIAN TARGET_ENDIANNESS -#else -#define TARGET_BIG_ENDIAN (dlthis->big_e_target) -#endif - -/* - * Exports from cload.c to rest of the world - */ -extern void dload_error(struct dload_state *dlthis, const char *errtxt, ...); -extern void dload_syms_error(struct dynamic_loader_sym *syms, - const char *errtxt, ...); -extern void dload_headers(struct dload_state *dlthis); -extern void dload_strings(struct dload_state *dlthis, bool sec_names_only); -extern void dload_sections(struct dload_state *dlthis); -extern void dload_reorder(void *data, int dsiz, u32 map); -extern u32 dload_checksum(void *data, unsigned siz); - -#if HOST_ENDIANNESS -extern uint32_t dload_reverse_checksum(void *data, unsigned siz); -#if (TARGET_AU_BITS > 8) && (TARGET_AU_BITS < 32) -extern uint32_t dload_reverse_checksum16(void *data, unsigned siz); -#endif -#endif - -/* - * exported by reloc.c - */ -extern void dload_relocate(struct dload_state *dlthis, tgt_au_t *data, - struct reloc_record_t *rp, bool *tramps_generated, - bool second_pass); - -extern rvalue dload_unpack(struct dload_state *dlthis, tgt_au_t *data, - int fieldsz, int offset, unsigned sgn); - -extern int dload_repack(struct dload_state *dlthis, rvalue val, tgt_au_t *data, - int fieldsz, int offset, unsigned sgn); - -/* - * exported by tramp.c - */ -extern bool dload_tramp_avail(struct dload_state *dlthis, - struct reloc_record_t *rp); - -int dload_tramp_generate(struct dload_state *dlthis, s16 secnn, - u32 image_offset, struct image_packet_t *ipacket, - struct reloc_record_t *rp); - -extern int dload_tramp_pkt_udpate(struct dload_state *dlthis, - s16 secnn, u32 image_offset, - struct image_packet_t *ipacket); - -extern int dload_tramp_finalize(struct dload_state *dlthis); - -extern void dload_tramp_cleanup(struct dload_state *dlthis); - -#endif /* _DLOAD_INTERNAL_ */ diff --git a/drivers/staging/tidspbridge/dynload/doff.h b/drivers/staging/tidspbridge/dynload/doff.h deleted file mode 100644 index a7c3145746ee..000000000000 --- a/drivers/staging/tidspbridge/dynload/doff.h +++ /dev/null @@ -1,354 +0,0 @@ -/* - * doff.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Structures & definitions used for dynamically loaded modules file format. - * This format is a reformatted version of COFF. It optimizes the layout for - * the dynamic loader. - * - * .dof files, when viewed as a sequence of 32-bit integers, look the same - * on big-endian and little-endian machines. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _DOFF_H -#define _DOFF_H - - -#define BYTE_RESHUFFLE_VALUE 0x00010203 - -/* DOFF file header containing fields categorizing the remainder of the file */ -struct doff_filehdr_t { - - /* string table size, including filename, in bytes */ - u32 df_strtab_size; - - /* entry point if one exists */ - u32 df_entrypt; - - /* identifies byte ordering of file; - * always set to BYTE_RESHUFFLE_VALUE */ - u32 df_byte_reshuffle; - - /* Size of the string table up to and including the last section name */ - /* Size includes the name of the COFF file also */ - u32 df_scn_name_size; - -#ifndef _BIG_ENDIAN - /* number of symbols */ - u16 df_no_syms; - - /* length in bytes of the longest string, including terminating NULL */ - /* excludes the name of the file */ - u16 df_max_str_len; - - /* total number of sections including no-load ones */ - u16 df_no_scns; - - /* number of sections containing target code allocated or downloaded */ - u16 df_target_scns; - - /* unique id for dll file format & version */ - u16 df_doff_version; - - /* identifies ISA */ - u16 df_target_id; - - /* useful file flags */ - u16 df_flags; - - /* section reference for entry point, N_UNDEF for none, */ - /* N_ABS for absolute address */ - s16 df_entry_secn; -#else - /* length of the longest string, including terminating NULL */ - u16 df_max_str_len; - - /* number of symbols */ - u16 df_no_syms; - - /* number of sections containing target code allocated or downloaded */ - u16 df_target_scns; - - /* total number of sections including no-load ones */ - u16 df_no_scns; - - /* identifies ISA */ - u16 df_target_id; - - /* unique id for dll file format & version */ - u16 df_doff_version; - - /* section reference for entry point, N_UNDEF for none, */ - /* N_ABS for absolute address */ - s16 df_entry_secn; - - /* useful file flags */ - u16 df_flags; -#endif - /* checksum for file header record */ - u32 df_checksum; - -}; - -/* flags in the df_flags field */ -#define DF_LITTLE 0x100 -#define DF_BIG 0x200 -#define DF_BYTE_ORDER (DF_LITTLE | DF_BIG) - -/* Supported processors */ -#define TMS470_ID 0x97 -#define LEAD_ID 0x98 -#define TMS32060_ID 0x99 -#define LEAD3_ID 0x9c - -/* Primary processor for loading */ -#if TMS32060 -#define TARGET_ID TMS32060_ID -#endif - -/* Verification record containing values used to test integrity of the bits */ -struct doff_verify_rec_t { - - /* time and date stamp */ - u32 dv_timdat; - - /* checksum for all section records */ - u32 dv_scn_rec_checksum; - - /* checksum for string table */ - u32 dv_str_tab_checksum; - - /* checksum for symbol table */ - u32 dv_sym_tab_checksum; - - /* checksum for verification record */ - u32 dv_verify_rec_checksum; - -}; - -/* String table is an array of null-terminated strings. The first entry is - * the filename, which is added by DLLcreate. No new structure definitions - * are required. - */ - -/* Section Records including information on the corresponding image packets */ -/* - * !!WARNING!! - * - * This structure is expected to match in form ldr_section_info in - * dynamic_loader.h - */ - -struct doff_scnhdr_t { - - s32 ds_offset; /* offset into string table of name */ - s32 ds_paddr; /* RUN address, in target AU */ - s32 ds_vaddr; /* LOAD address, in target AU */ - s32 ds_size; /* section size, in target AU */ -#ifndef _BIG_ENDIAN - u16 ds_page; /* memory page id */ - u16 ds_flags; /* section flags */ -#else - u16 ds_flags; /* section flags */ - u16 ds_page; /* memory page id */ -#endif - u32 ds_first_pkt_offset; - /* Absolute byte offset into the file */ - /* where the first image record resides */ - - s32 ds_nipacks; /* number of image packets */ - -}; - -/* Symbol table entry */ -struct doff_syment_t { - - s32 dn_offset; /* offset into string table of name */ - s32 dn_value; /* value of symbol */ -#ifndef _BIG_ENDIAN - s16 dn_scnum; /* section number */ - s16 dn_sclass; /* storage class */ -#else - s16 dn_sclass; /* storage class */ - s16 dn_scnum; /* section number, 1-based */ -#endif - -}; - -/* special values for dn_scnum */ -#define DN_UNDEF 0 /* undefined symbol */ -#define DN_ABS (-1) /* value of symbol is absolute */ -/* special values for dn_sclass */ -#define DN_EXT 2 -#define DN_STATLAB 20 -#define DN_EXTLAB 21 - -/* Default value of image bits in packet */ -/* Configurable by user on the command line */ -#define IMAGE_PACKET_SIZE 1024 - -/* An image packet contains a chunk of data from a section along with */ -/* information necessary for its processing. */ -struct image_packet_t { - - s32 num_relocs; /* number of relocations for */ - /* this packet */ - - s32 packet_size; /* number of bytes in array */ - /* "bits" occupied by */ - /* valid data. Could be */ - /* < IMAGE_PACKET_SIZE to */ - /* prevent splitting a */ - /* relocation across packets. */ - /* Last packet of a section */ - /* will most likely contain */ - /* < IMAGE_PACKET_SIZE bytes */ - /* of valid data */ - - s32 img_chksum; /* Checksum for image packet */ - /* and the corresponding */ - /* relocation records */ - - u8 *img_data; /* Actual data in section */ - -}; - -/* The relocation structure definition matches the COFF version. Offsets */ -/* however are relative to the image packet base not the section base. */ -struct reloc_record_t { - - s32 vaddr; - - /* expressed in target AUs */ - - union { - struct { -#ifndef _BIG_ENDIAN - u8 _offset; /* bit offset of rel fld */ - u8 _fieldsz; /* size of rel fld */ - u8 _wordsz; /* # bytes containing rel fld */ - u8 _dum1; - u16 _dum2; - u16 _type; -#else - unsigned _dum1:8; - unsigned _wordsz:8; /* # bytes containing rel fld */ - unsigned _fieldsz:8; /* size of rel fld */ - unsigned _offset:8; /* bit offset of rel fld */ - u16 _type; - u16 _dum2; -#endif - } _r_field; - - struct { - u32 _spc; /* image packet relative PC */ -#ifndef _BIG_ENDIAN - u16 _dum; - u16 _type; /* relocation type */ -#else - u16 _type; /* relocation type */ - u16 _dum; -#endif - } _r_spc; - - struct { - u32 _uval; /* constant value */ -#ifndef _BIG_ENDIAN - u16 _dum; - u16 _type; /* relocation type */ -#else - u16 _type; /* relocation type */ - u16 _dum; -#endif - } _r_uval; - - struct { - s32 _symndx; /* 32-bit sym tbl index */ -#ifndef _BIG_ENDIAN - u16 _disp; /* extra addr encode data */ - u16 _type; /* relocation type */ -#else - u16 _type; /* relocation type */ - u16 _disp; /* extra addr encode data */ -#endif - } _r_sym; - } _u_reloc; - -}; - -/* abbreviations for convenience */ -#ifndef TYPE -#define TYPE _u_reloc._r_sym._type -#define UVAL _u_reloc._r_uval._uval -#define SYMNDX _u_reloc._r_sym._symndx -#define OFFSET _u_reloc._r_field._offset -#define FIELDSZ _u_reloc._r_field._fieldsz -#define WORDSZ _u_reloc._r_field._wordsz -#define R_DISP _u_reloc._r_sym._disp -#endif - -/**************************************************************************** */ -/* */ -/* Important DOFF macros used for file processing */ -/* */ -/**************************************************************************** */ - -/* DOFF Versions */ -#define DOFF0 0 - -/* Return the address/size >= to addr that is at a 32-bit boundary */ -/* This assumes that a byte is 8 bits */ -#define DOFF_ALIGN(addr) (((addr) + 3) & ~3UL) - -/**************************************************************************** */ -/* */ -/* The DOFF section header flags field is laid out as follows: */ -/* */ -/* Bits 0-3 : Section Type */ -/* Bit 4 : Set when section requires target memory to be allocated by DL */ -/* Bit 5 : Set when section requires downloading */ -/* Bits 8-11: Alignment, same as COFF */ -/* */ -/**************************************************************************** */ - -/* Enum for DOFF section types (bits 0-3 of flag): See dynamic_loader.h */ -#define DS_SECTION_TYPE_MASK 0xF -/* DS_ALLOCATE indicates whether a section needs space on the target */ -#define DS_ALLOCATE_MASK 0x10 -/* DS_DOWNLOAD indicates that the loader needs to copy bits */ -#define DS_DOWNLOAD_MASK 0x20 -/* Section alignment requirement in AUs */ -#define DS_ALIGNMENT_SHIFT 8 - -static inline bool dload_check_type(struct doff_scnhdr_t *sptr, u32 flag) -{ - return (sptr->ds_flags & DS_SECTION_TYPE_MASK) == flag; -} -static inline bool ds_needs_allocation(struct doff_scnhdr_t *sptr) -{ - return sptr->ds_flags & DS_ALLOCATE_MASK; -} - -static inline bool ds_needs_download(struct doff_scnhdr_t *sptr) -{ - return sptr->ds_flags & DS_DOWNLOAD_MASK; -} - -static inline int ds_alignment(u16 ds_flags) -{ - return 1 << ((ds_flags >> DS_ALIGNMENT_SHIFT) & DS_SECTION_TYPE_MASK); -} - - -#endif /* _DOFF_H */ diff --git a/drivers/staging/tidspbridge/dynload/getsection.c b/drivers/staging/tidspbridge/dynload/getsection.c deleted file mode 100644 index e0b37714dd65..000000000000 --- a/drivers/staging/tidspbridge/dynload/getsection.c +++ /dev/null @@ -1,407 +0,0 @@ -/* - * getsection.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -#include "header.h" - -/* - * Error strings - */ -static const char readstrm[] = { "Error reading %s from input stream" }; -static const char seek[] = { "Set file position to %d failed" }; -static const char isiz[] = { "Bad image packet size %d" }; -static const char err_checksum[] = { "Checksum failed on %s" }; - -static const char err_reloc[] = { "dload_get_section unable to read" - "sections containing relocation entries" -}; - -#if BITS_PER_AU > BITS_PER_BYTE -static const char err_alloc[] = { "Syms->dload_allocate( %d ) failed" }; -static const char stbl[] = { "Bad string table offset " FMT_UI32 }; -#endif - -/************************************************************** */ -/********************* SUPPORT FUNCTIONS ********************** */ -/************************************************************** */ - -#if BITS_PER_AU > BITS_PER_BYTE -/************************************************************************** - * Procedure unpack_sec_name - * - * Parameters: - * dlthis Handle from dload_module_open for this module - * soffset Byte offset into the string table - * dst Place to store the expanded string - * - * Effect: - * Stores a string from the string table into the destination, expanding - * it in the process. Returns a pointer just past the end of the stored - * string on success, or NULL on failure. - * - ************************************************************************ */ -static char *unpack_sec_name(struct dload_state *dlthis, u32 soffset, char *dst) -{ - u8 tmp, *src; - - if (soffset >= dlthis->dfile_hdr.df_scn_name_size) { - dload_error(dlthis, stbl, soffset); - return NULL; - } - src = (u8 *) dlthis->str_head + - (soffset >> (LOG_BITS_PER_AU - LOG_BITS_PER_BYTE)); - if (soffset & 1) - *dst++ = *src++; /* only 1 character in first word */ - do { - tmp = *src++; - *dst = (tmp >> BITS_PER_BYTE) - if (!(*dst++)) - break; - } while ((*dst++ = tmp & BYTE_MASK)); - - return dst; -} - -/************************************************************************** - * Procedure expand_sec_names - * - * Parameters: - * dlthis Handle from dload_module_open for this module - * - * Effect: - * Allocates a buffer, unpacks and copies strings from string table into it. - * Stores a pointer to the buffer into a state variable. - ************************************************************************* */ -static void expand_sec_names(struct dload_state *dlthis) -{ - char *xstrings, *curr, *next; - u32 xsize; - u16 sec; - struct ldr_section_info *shp; - /* assume worst-case size requirement */ - xsize = dlthis->dfile_hdr.df_max_str_len * dlthis->dfile_hdr.df_no_scns; - xstrings = (char *)dlthis->mysym->dload_allocate(dlthis->mysym, xsize); - if (xstrings == NULL) { - dload_error(dlthis, err_alloc, xsize); - return; - } - dlthis->xstrings = xstrings; - /* For each sec, copy and expand its name */ - curr = xstrings; - for (sec = 0; sec < dlthis->dfile_hdr.df_no_scns; sec++) { - shp = (struct ldr_section_info *)&dlthis->sect_hdrs[sec]; - next = unpack_sec_name(dlthis, *(u32 *) &shp->name, curr); - if (next == NULL) - break; /* error */ - shp->name = curr; - curr = next; - } -} - -#endif - -/************************************************************** */ -/********************* EXPORTED FUNCTIONS ********************* */ -/************************************************************** */ - -/************************************************************************** - * Procedure dload_module_open - * - * Parameters: - * module The input stream that supplies the module image - * syms Host-side malloc/free and error reporting functions. - * Other methods are unused. - * - * Effect: - * Reads header information from a dynamic loader module using the - specified - * stream object, and returns a handle for the module information. This - * handle may be used in subsequent query calls to obtain information - * contained in the module. - * - * Returns: - * NULL if an error is encountered, otherwise a module handle for use - * in subsequent operations. - ************************************************************************* */ -void *dload_module_open(struct dynamic_loader_stream *module, - struct dynamic_loader_sym *syms) -{ - struct dload_state *dlthis; /* internal state for this call */ - unsigned *dp, sz; - u32 sec_start; -#if BITS_PER_AU <= BITS_PER_BYTE - u16 sec; -#endif - - /* Check that mandatory arguments are present */ - if (!module || !syms) { - if (syms != NULL) - dload_syms_error(syms, "Required parameter is NULL"); - - return NULL; - } - - dlthis = (struct dload_state *) - syms->dload_allocate(syms, sizeof(struct dload_state)); - if (!dlthis) { - /* not enough storage */ - dload_syms_error(syms, "Can't allocate module info"); - return NULL; - } - - /* clear our internal state */ - dp = (unsigned *)dlthis; - for (sz = sizeof(struct dload_state) / sizeof(unsigned); - sz > 0; sz -= 1) - *dp++ = 0; - - dlthis->strm = module; - dlthis->mysym = syms; - - /* read in the doff image and store in our state variable */ - dload_headers(dlthis); - - if (!dlthis->dload_errcount) - dload_strings(dlthis, true); - - /* skip ahead past the unread portion of the string table */ - sec_start = sizeof(struct doff_filehdr_t) + - sizeof(struct doff_verify_rec_t) + - BYTE_TO_HOST(DOFF_ALIGN(dlthis->dfile_hdr.df_strtab_size)); - - if (dlthis->strm->set_file_posn(dlthis->strm, sec_start) != 0) { - dload_error(dlthis, seek, sec_start); - return NULL; - } - - if (!dlthis->dload_errcount) - dload_sections(dlthis); - - if (dlthis->dload_errcount) { - dload_module_close(dlthis); /* errors, blow off our state */ - dlthis = NULL; - return NULL; - } -#if BITS_PER_AU > BITS_PER_BYTE - /* Expand all section names from the string table into the */ - /* state variable, and convert section names from a relative */ - /* string table offset to a pointers to the expanded string. */ - expand_sec_names(dlthis); -#else - /* Convert section names from a relative string table offset */ - /* to a pointer into the string table. */ - for (sec = 0; sec < dlthis->dfile_hdr.df_no_scns; sec++) { - struct ldr_section_info *shp = - (struct ldr_section_info *)&dlthis->sect_hdrs[sec]; - shp->name = dlthis->str_head + *(u32 *) &shp->name; - } -#endif - - return dlthis; -} - -/*************************************************************************** - * Procedure dload_get_section_info - * - * Parameters: - * minfo Handle from dload_module_open for this module - * section_name Pointer to the string name of the section desired - * section_info Address of a section info structure pointer to be - * initialized - * - * Effect: - * Finds the specified section in the module information, and initializes - * the provided struct ldr_section_info pointer. - * - * Returns: - * true for success, false for section not found - ************************************************************************* */ -int dload_get_section_info(void *minfo, const char *section_name, - const struct ldr_section_info **const section_info) -{ - struct dload_state *dlthis; - struct ldr_section_info *shp; - u16 sec; - - dlthis = (struct dload_state *)minfo; - if (!dlthis) - return false; - - for (sec = 0; sec < dlthis->dfile_hdr.df_no_scns; sec++) { - shp = (struct ldr_section_info *)&dlthis->sect_hdrs[sec]; - if (strcmp(section_name, shp->name) == 0) { - *section_info = shp; - return true; - } - } - - return false; -} - -#define IPH_SIZE (sizeof(struct image_packet_t) - sizeof(u32)) - -/************************************************************************** - * Procedure dload_get_section - * - * Parameters: - * minfo Handle from dload_module_open for this module - * section_info Pointer to a section info structure for the desired - * section - * section_data Buffer to contain the section initialized data - * - * Effect: - * Copies the initialized data for the specified section into the - * supplied buffer. - * - * Returns: - * true for success, false for section not found - ************************************************************************* */ -int dload_get_section(void *minfo, - const struct ldr_section_info *section_info, - void *section_data) -{ - struct dload_state *dlthis; - u32 pos; - struct doff_scnhdr_t *sptr = NULL; - s32 nip; - struct image_packet_t ipacket; - s32 ipsize; - u32 checks; - s8 *dest = (s8 *) section_data; - - dlthis = (struct dload_state *)minfo; - if (!dlthis) - return false; - sptr = (struct doff_scnhdr_t *)section_info; - if (sptr == NULL) - return false; - - /* skip ahead to the start of the first packet */ - pos = BYTE_TO_HOST(DOFF_ALIGN((u32) sptr->ds_first_pkt_offset)); - if (dlthis->strm->set_file_posn(dlthis->strm, pos) != 0) { - dload_error(dlthis, seek, pos); - return false; - } - - nip = sptr->ds_nipacks; - while ((nip -= 1) >= 0) { /* for each packet */ - /* get the fixed header bits */ - if (dlthis->strm->read_buffer(dlthis->strm, &ipacket, - IPH_SIZE) != IPH_SIZE) { - dload_error(dlthis, readstrm, "image packet"); - return false; - } - /* reorder the header if need be */ - if (dlthis->reorder_map) - dload_reorder(&ipacket, IPH_SIZE, dlthis->reorder_map); - - /* Now read the packet image bits. Note: round the size up to - * the next multiple of 4 bytes; this is what checksum - * routines want. */ - ipsize = BYTE_TO_HOST(DOFF_ALIGN(ipacket.packet_size)); - if (ipsize > BYTE_TO_HOST(IMAGE_PACKET_SIZE)) { - dload_error(dlthis, isiz, ipsize); - return false; - } - if (dlthis->strm->read_buffer - (dlthis->strm, dest, ipsize) != ipsize) { - dload_error(dlthis, readstrm, "image packet"); - return false; - } - /* reorder the bytes if need be */ -#if !defined(_BIG_ENDIAN) || (TARGET_AU_BITS > 16) - if (dlthis->reorder_map) - dload_reorder(dest, ipsize, dlthis->reorder_map); - - checks = dload_checksum(dest, ipsize); -#else - if (dlthis->dfile_hdr.df_byte_reshuffle != - TARGET_ORDER(REORDER_MAP(BYTE_RESHUFFLE_VALUE))) { - /* put image bytes in big-endian order, not PC order */ - dload_reorder(dest, ipsize, - TARGET_ORDER(dlthis-> - dfile_hdr.df_byte_reshuffle)); - } -#if TARGET_AU_BITS > 8 - checks = dload_reverse_checksum16(dest, ipsize); -#else - checks = dload_reverse_checksum(dest, ipsize); -#endif -#endif - checks += dload_checksum(&ipacket, IPH_SIZE); - - /* NYI: unable to handle relocation entries here. Reloc - * entries referring to fields that span the packet boundaries - * may result in packets of sizes that are not multiple of - * 4 bytes. Our checksum implementation works on 32-bit words - * only. */ - if (ipacket.num_relocs != 0) { - dload_error(dlthis, err_reloc, ipsize); - return false; - } - - if (~checks) { - dload_error(dlthis, err_checksum, "image packet"); - return false; - } - - /*Advance destination ptr by the size of the just-read packet */ - dest += ipsize; - } - - return true; -} - -/*************************************************************************** - * Procedure dload_module_close - * - * Parameters: - * minfo Handle from dload_module_open for this module - * - * Effect: - * Releases any storage associated with the module handle. On return, - * the module handle is invalid. - * - * Returns: - * Zero for success. On error, the number of errors detected is returned. - * Individual errors are reported using syms->error_report(), where syms was - * an argument to dload_module_open - ************************************************************************* */ -void dload_module_close(void *minfo) -{ - struct dload_state *dlthis; - - dlthis = (struct dload_state *)minfo; - if (!dlthis) - return; - - if (dlthis->str_head) - dlthis->mysym->dload_deallocate(dlthis->mysym, - dlthis->str_head); - - if (dlthis->sect_hdrs) - dlthis->mysym->dload_deallocate(dlthis->mysym, - dlthis->sect_hdrs); - -#if BITS_PER_AU > BITS_PER_BYTE - if (dlthis->xstrings) - dlthis->mysym->dload_deallocate(dlthis->mysym, - dlthis->xstrings); - -#endif - - dlthis->mysym->dload_deallocate(dlthis->mysym, dlthis); -} diff --git a/drivers/staging/tidspbridge/dynload/header.h b/drivers/staging/tidspbridge/dynload/header.h deleted file mode 100644 index 5b50a15a343e..000000000000 --- a/drivers/staging/tidspbridge/dynload/header.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * header.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -#define DL_STRCMP strcmp - -/* maximum parenthesis nesting in relocation stack expressions */ -#define STATIC_EXPR_STK_SIZE 10 - -#include - -#include "doff.h" -#include -#include "params.h" -#include "dload_internal.h" -#include "reloc_table.h" - -/* - * Plausibility limits - * - * These limits are imposed upon the input DOFF file as a check for validity. - * They are hard limits, in that the load will fail if they are exceeded. - * The numbers selected are arbitrary, in that the loader implementation does - * not require these limits. - */ - -/* maximum number of bytes in string table */ -#define MAX_REASONABLE_STRINGTAB (0x100000) -/* maximum number of code,data,etc. sections */ -#define MAX_REASONABLE_SECTIONS (200) -/* maximum number of linker symbols */ -#define MAX_REASONABLE_SYMBOLS (100000) - -/* shift count to align F_BIG with DLOAD_LITTLE */ -#define ALIGN_COFF_ENDIANNESS 7 -#define ENDIANNESS_MASK (DF_BYTE_ORDER >> ALIGN_COFF_ENDIANNESS) diff --git a/drivers/staging/tidspbridge/dynload/module_list.h b/drivers/staging/tidspbridge/dynload/module_list.h deleted file mode 100644 index a216bb131a40..000000000000 --- a/drivers/staging/tidspbridge/dynload/module_list.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - * dspbridge/mpu_driver/src/dynload/module_list.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* - * This C header file gives the layout of the data structure created by the - * dynamic loader to describe the set of modules loaded into the DSP. - * - * Linked List Structure: - * ---------------------- - * The data structure defined here is a singly-linked list. The list - * represents the set of modules which are currently loaded in the DSP memory. - * The first entry in the list is a header record which contains a flag - * representing the state of the list. The rest of the entries in the list - * are module records. - * - * Global symbol _DLModules designates the first record in the list (i.e. the - * header record). This symbol must be defined in any program that wishes to - * use DLLview plug-in. - * - * String Representation: - * ---------------------- - * The string names of the module and its sections are stored in a block of - * memory which follows the module record itself. The strings are ordered: - * module name first, followed by section names in order from the first - * section to the last. String names are tightly packed arrays of 8-bit - * characters (two characters per 16-bit word on the C55x). Strings are - * zero-byte-terminated. - * - * Creating and updating the list: - * ------------------------------- - * Upon loading a new module into the DSP memory the dynamic loader inserts a - * new module record as the first module record in the list. The fields of - * this module record are initialized to reflect the properties of the module. - * The dynamic loader does NOT increment the flag/counter in the list's header - * record. - * - * Upon unloading a module from the DSP memory the dynamic loader removes the - * module's record from this list. The dynamic loader also increments the - * flag/counter in the list's header record to indicate that the list has been - * changed. - */ - -#ifndef _MODULE_LIST_H_ -#define _MODULE_LIST_H_ - -#include - -/* Global pointer to the modules_header structure */ -#define MODULES_HEADER "_DLModules" -#define MODULES_HEADER_NO_UNDERSCORE "DLModules" - -/* Initial version number */ -#define INIT_VERSION 1 - -/* Verification number -- to be recorded in each module record */ -#define VERIFICATION 0x79 - -/* forward declarations */ -struct dll_module; -struct dll_sect; - -/* the first entry in the list is the modules_header record; - * its address is contained in the global _DLModules pointer */ -struct modules_header { - - /* - * Address of the first dll_module record in the list or NULL. - * Note: for C55x this is a word address (C55x data is - * word-addressable) - */ - u32 first_module; - - /* Combined storage size (in target addressable units) of the - * dll_module record which follows this header record, or zero - * if the list is empty. This size includes the module's string table. - * Note: for C55x the unit is a 16-bit word */ - u16 first_module_size; - - /* Counter is incremented whenever a module record is removed from - * the list */ - u16 update_flag; - -}; - -/* for each 32-bits in above structure, a bitmap, LSB first, whose bits are: - * 0 => a 32-bit value, 1 => 2 16-bit values */ -/* swapping bitmap for type modules_header */ -#define MODULES_HEADER_BITMAP 0x2 - -/* information recorded about each section in a module */ -struct dll_sect { - - /* Load-time address of the section. - * Note: for C55x this is a byte address for program sections, and - * a word address for data sections. C55x program memory is - * byte-addressable, while data memory is word-addressable. */ - u32 sect_load_adr; - - /* Run-time address of the section. - * Note 1: for C55x this is a byte address for program sections, and - * a word address for data sections. - * Note 2: for C55x two most significant bits of this field indicate - * the section type: '00' for a code section, '11' for a data section - * (C55 addresses are really only 24-bits wide). */ - u32 sect_run_adr; - -}; - -/* the rest of the entries in the list are module records */ -struct dll_module { - - /* Address of the next dll_module record in the list, or 0 if this is - * the last record in the list. - * Note: for C55x this is a word address (C55x data is - * word-addressable) */ - u32 next_module; - - /* Combined storage size (in target addressable units) of the - * dll_module record which follows this one, or zero if this is the - * last record in the list. This size includes the module's string - * table. - * Note: for C55x the unit is a 16-bit word. */ - u16 next_module_size; - - /* version number of the tooling; set to INIT_VERSION for Phase 1 */ - u16 version; - - /* the verification word; set to VERIFICATION */ - u16 verification; - - /* Number of sections in the sects array */ - u16 num_sects; - - /* Module's "unique" id; copy of the timestamp from the host - * COFF file */ - u32 timestamp; - - /* Array of num_sects elements of the module's section records */ - struct dll_sect sects[1]; -}; - -/* for each 32 bits in above structure, a bitmap, LSB first, whose bits are: - * 0 => a 32-bit value, 1 => 2 16-bit values */ -#define DLL_MODULE_BITMAP 0x6 /* swapping bitmap for type dll_module */ - -#endif /* _MODULE_LIST_H_ */ diff --git a/drivers/staging/tidspbridge/dynload/params.h b/drivers/staging/tidspbridge/dynload/params.h deleted file mode 100644 index d797fcd3b662..000000000000 --- a/drivers/staging/tidspbridge/dynload/params.h +++ /dev/null @@ -1,226 +0,0 @@ -/* - * params.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * This file defines host and target properties for all machines - * supported by the dynamic loader. To be tedious... - * - * host: the machine on which the dynamic loader runs - * target: the machine that the dynamic loader is loading - * - * Host and target may or may not be the same, depending upon the particular - * use. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/****************************************************************************** - * - * Host Properties - * - **************************************************************************** */ - -#define BITS_PER_BYTE 8 /* bits in the standard PC/SUN byte */ -#define LOG_BITS_PER_BYTE 3 /* log base 2 of same */ -#define BYTE_MASK ((1U<> 16)) -#define SWAP16BY8(zz) (((zz) << 8) | ((zz) >> 8)) - -/* !! don't be tempted to insert type definitions here; use !! */ - -/****************************************************************************** - * - * Target Properties - * - **************************************************************************** */ - -/*-------------------------------------------------------------------------- */ -/* TMS320C6x Target Specific Parameters (byte-addressable) */ -/*-------------------------------------------------------------------------- */ -#if TMS32060 -#define MEMORG 0x0L /* Size of configured memory */ -#define MEMSIZE 0x0L /* (full address space) */ - -#define CINIT_ALIGN 8 /* alignment of cinit record in TDATA AUs */ -#define CINIT_COUNT 4 /* width of count field in TDATA AUs */ -#define CINIT_ADDRESS 4 /* width of address field in TDATA AUs */ -#define CINIT_PAGE_BITS 0 /* Number of LSBs of address that - * are page number */ - -#define LENIENT_SIGNED_RELEXPS 0 /* DOES SIGNED ALLOW MAX UNSIGNED */ - -#undef TARGET_ENDIANNESS /* may be big or little endian */ - -/* align a target address to a word boundary */ -#define TARGET_WORD_ALIGN(zz) (((zz) + 0x3) & -0x4) -#endif - -/*-------------------------------------------------------------------------- - * - * DEFAULT SETTINGS and DERIVED PROPERTIES - * - * This section establishes defaults for values not specified above - *-------------------------------------------------------------------------- */ -#ifndef TARGET_AU_BITS -#define TARGET_AU_BITS 8 /* width of the target addressable unit */ -#define LOG_TARGET_AU_BITS 3 /* log2 of same */ -#endif - -#ifndef CINIT_DEFAULT_PAGE -#define CINIT_DEFAULT_PAGE 0 /* default .cinit page number */ -#endif - -#ifndef DATA_RUN2LOAD -#define DATA_RUN2LOAD(zz) (zz) /* translate data run address to load address */ -#endif - -#ifndef DBG_LIST_PAGE -#define DBG_LIST_PAGE 0 /* page number for .dllview section */ -#endif - -#ifndef TARGET_WORD_ALIGN -/* align a target address to a word boundary */ -#define TARGET_WORD_ALIGN(zz) (zz) -#endif - -#ifndef TDATA_TO_TADDR -#define TDATA_TO_TADDR(zz) (zz) /* target data address to target AU address */ -#define TADDR_TO_TDATA(zz) (zz) /* target AU address to target data address */ -#define TDATA_AU_BITS TARGET_AU_BITS /* bits per data AU */ -#define LOG_TDATA_AU_BITS LOG_TARGET_AU_BITS -#endif - -/* - * - * Useful properties and conversions derived from the above - * - */ - -/* - * Conversions between host and target addresses - */ -#if LOG_BITS_PER_AU == LOG_TARGET_AU_BITS -/* translate target addressable unit to host address */ -#define TADDR_TO_HOST(x) (x) -/* translate host address to target addressable unit */ -#define HOST_TO_TADDR(x) (x) -#elif LOG_BITS_PER_AU > LOG_TARGET_AU_BITS -#define TADDR_TO_HOST(x) ((x) >> (LOG_BITS_PER_AU-LOG_TARGET_AU_BITS)) -#define HOST_TO_TADDR(x) ((x) << (LOG_BITS_PER_AU-LOG_TARGET_AU_BITS)) -#else -#define TADDR_TO_HOST(x) ((x) << (LOG_TARGET_AU_BITS-LOG_BITS_PER_AU)) -#define HOST_TO_TADDR(x) ((x) >> (LOG_TARGET_AU_BITS-LOG_BITS_PER_AU)) -#endif - -#if LOG_BITS_PER_AU == LOG_TDATA_AU_BITS -/* translate target addressable unit to host address */ -#define TDATA_TO_HOST(x) (x) -/* translate host address to target addressable unit */ -#define HOST_TO_TDATA(x) (x) -/* translate host address to target addressable unit, round up */ -#define HOST_TO_TDATA_ROUND(x) (x) -/* byte offset to host offset, rounded up for TDATA size */ -#define BYTE_TO_HOST_TDATA_ROUND(x) BYTE_TO_HOST_ROUND(x) -#elif LOG_BITS_PER_AU > LOG_TDATA_AU_BITS -#define TDATA_TO_HOST(x) ((x) >> (LOG_BITS_PER_AU-LOG_TDATA_AU_BITS)) -#define HOST_TO_TDATA(x) ((x) << (LOG_BITS_PER_AU-LOG_TDATA_AU_BITS)) -#define HOST_TO_TDATA_ROUND(x) ((x) << (LOG_BITS_PER_AU-LOG_TDATA_AU_BITS)) -#define BYTE_TO_HOST_TDATA_ROUND(x) BYTE_TO_HOST_ROUND(x) -#else -#define TDATA_TO_HOST(x) ((x) << (LOG_TDATA_AU_BITS-LOG_BITS_PER_AU)) -#define HOST_TO_TDATA(x) ((x) >> (LOG_TDATA_AU_BITS-LOG_BITS_PER_AU)) -#define HOST_TO_TDATA_ROUND(x) (((x) +\ - (1<<(LOG_TDATA_AU_BITS-LOG_BITS_PER_AU))-1) >>\ - (LOG_TDATA_AU_BITS-LOG_BITS_PER_AU)) -#define BYTE_TO_HOST_TDATA_ROUND(x) (BYTE_TO_HOST((x) +\ - (1<<(LOG_TDATA_AU_BITS-LOG_BITS_PER_BYTE))-1) &\ - -(TDATA_AU_BITS/BITS_PER_AU)) -#endif - -/* - * Input in DOFF format is always expresed in bytes, regardless of loading host - * so we wind up converting from bytes to target and host units even when the - * host is not a byte machine. - */ -#if LOG_BITS_PER_AU == LOG_BITS_PER_BYTE -#define BYTE_TO_HOST(x) (x) -#define BYTE_TO_HOST_ROUND(x) (x) -#define HOST_TO_BYTE(x) (x) -#elif LOG_BITS_PER_AU >= LOG_BITS_PER_BYTE -#define BYTE_TO_HOST(x) ((x) >> (LOG_BITS_PER_AU - LOG_BITS_PER_BYTE)) -#define BYTE_TO_HOST_ROUND(x) ((x + (BITS_PER_AU/BITS_PER_BYTE-1)) >>\ - (LOG_BITS_PER_AU - LOG_BITS_PER_BYTE)) -#define HOST_TO_BYTE(x) ((x) << (LOG_BITS_PER_AU - LOG_BITS_PER_BYTE)) -#else -/* lets not try to deal with sub-8-bit byte machines */ -#endif - -#if LOG_TARGET_AU_BITS == LOG_BITS_PER_BYTE -/* translate target addressable unit to byte address */ -#define TADDR_TO_BYTE(x) (x) -/* translate byte address to target addressable unit */ -#define BYTE_TO_TADDR(x) (x) -#elif LOG_TARGET_AU_BITS > LOG_BITS_PER_BYTE -#define TADDR_TO_BYTE(x) ((x) << (LOG_TARGET_AU_BITS-LOG_BITS_PER_BYTE)) -#define BYTE_TO_TADDR(x) ((x) >> (LOG_TARGET_AU_BITS-LOG_BITS_PER_BYTE)) -#else -/* lets not try to deal with sub-8-bit byte machines */ -#endif - -#ifdef _BIG_ENDIAN -#define HOST_ENDIANNESS 1 -#else -#define HOST_ENDIANNESS 0 -#endif - -#ifdef TARGET_ENDIANNESS -#define TARGET_ENDIANNESS_DIFFERS(rtend) (HOST_ENDIANNESS^TARGET_ENDIANNESS) -#elif HOST_ENDIANNESS -#define TARGET_ENDIANNESS_DIFFERS(rtend) (!(rtend)) -#else -#define TARGET_ENDIANNESS_DIFFERS(rtend) (rtend) -#endif - -/* the unit in which we process target image data */ -#if TARGET_AU_BITS <= 8 -typedef u8 tgt_au_t; -#elif TARGET_AU_BITS <= 16 -typedef u16 tgt_au_t; -#else -typedef u32 tgt_au_t; -#endif - -/* size of that unit */ -#if TARGET_AU_BITS < BITS_PER_AU -#define TGTAU_BITS BITS_PER_AU -#define LOG_TGTAU_BITS LOG_BITS_PER_AU -#else -#define TGTAU_BITS TARGET_AU_BITS -#define LOG_TGTAU_BITS LOG_TARGET_AU_BITS -#endif diff --git a/drivers/staging/tidspbridge/dynload/reloc.c b/drivers/staging/tidspbridge/dynload/reloc.c deleted file mode 100644 index bb422b693290..000000000000 --- a/drivers/staging/tidspbridge/dynload/reloc.c +++ /dev/null @@ -1,486 +0,0 @@ -/* - * reloc.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include "header.h" - -#if TMS32060 -/* the magic symbol for the start of BSS */ -static const char bsssymbol[] = { ".bss" }; -#endif - -#if TMS32060 -#include "reloc_table_c6000.c" -#endif - -#if TMS32060 -/* From coff.h - ignore these relocation operations */ -#define R_C60ALIGN 0x76 /* C60: Alignment info for compressor */ -#define R_C60FPHEAD 0x77 /* C60: Explicit assembly directive */ -#define R_C60NOCMP 0x100 /* C60: Don't compress this code scn */ -#endif - -/************************************************************************** - * Procedure dload_unpack - * - * Parameters: - * data pointer to storage unit containing lowest host address of - * image data - * fieldsz Size of bit field, 0 < fieldsz <= sizeof(rvalue)*BITS_PER_AU - * offset Offset from LSB, 0 <= offset < BITS_PER_AU - * sgn Signedness of the field (ROP_SGN, ROP_UNS, ROP_MAX, ROP_ANY) - * - * Effect: - * Extracts the specified field and returns it. - ************************************************************************* */ -rvalue dload_unpack(struct dload_state *dlthis, tgt_au_t *data, int fieldsz, - int offset, unsigned sgn) -{ - register rvalue objval; - register int shift, direction; - register tgt_au_t *dp = data; - - fieldsz -= 1; /* avoid nastiness with 32-bit shift of 32-bit value */ - /* * collect up enough bits to contain the desired field */ - if (TARGET_BIG_ENDIAN) { - dp += (fieldsz + offset) >> LOG_TGTAU_BITS; - direction = -1; - } else - direction = 1; - objval = *dp >> offset; - shift = TGTAU_BITS - offset; - while (shift <= fieldsz) { - dp += direction; - objval += (rvalue) *dp << shift; - shift += TGTAU_BITS; - } - - /* * sign or zero extend the value appropriately */ - if (sgn == ROP_UNS) - objval &= (2 << fieldsz) - 1; - else { - shift = sizeof(rvalue) * BITS_PER_AU - 1 - fieldsz; - objval = (objval << shift) >> shift; - } - - return objval; - -} /* dload_unpack */ - -/************************************************************************** - * Procedure dload_repack - * - * Parameters: - * val Value to insert - * data Pointer to storage unit containing lowest host address of - * image data - * fieldsz Size of bit field, 0 < fieldsz <= sizeof(rvalue)*BITS_PER_AU - * offset Offset from LSB, 0 <= offset < BITS_PER_AU - * sgn Signedness of the field (ROP_SGN, ROP_UNS, ROP_MAX, ROP_ANY) - * - * Effect: - * Stuffs the specified value in the specified field. Returns 0 for - * success - * or 1 if the value will not fit in the specified field according to the - * specified signedness rule. - ************************************************************************* */ -static const unsigned char ovf_limit[] = { 1, 2, 2 }; - -int dload_repack(struct dload_state *dlthis, rvalue val, tgt_au_t *data, - int fieldsz, int offset, unsigned sgn) -{ - register urvalue objval, mask; - register int shift, direction; - register tgt_au_t *dp = data; - - fieldsz -= 1; /* avoid nastiness with 32-bit shift of 32-bit value */ - /* clip the bits */ - mask = (2UL << fieldsz) - 1; - objval = (val & mask); - /* * store the bits through the specified mask */ - if (TARGET_BIG_ENDIAN) { - dp += (fieldsz + offset) >> LOG_TGTAU_BITS; - direction = -1; - } else - direction = 1; - - /* insert LSBs */ - *dp = (*dp & ~(mask << offset)) + (objval << offset); - shift = TGTAU_BITS - offset; - /* align mask and objval with AU boundary */ - objval >>= shift; - mask >>= shift; - - while (mask) { - dp += direction; - *dp = (*dp & ~mask) + objval; - objval >>= TGTAU_BITS; - mask >>= TGTAU_BITS; - } - - /* - * check for overflow - */ - if (sgn) { - unsigned tmp = (val >> fieldsz) + (sgn & 0x1); - - if (tmp > ovf_limit[sgn - 1]) - return 1; - } - return 0; - -} /* dload_repack */ - -/* lookup table for the scaling amount in a C6x instruction */ -#if TMS32060 -#define SCALE_BITS 4 /* there are 4 bits in the scale field */ -#define SCALE_MASK 0x7 /* we really only use the bottom 3 bits */ -static const u8 c60_scale[SCALE_MASK + 1] = { - 1, 0, 0, 0, 1, 1, 2, 2 -}; -#endif - -/************************************************************************** - * Procedure dload_relocate - * - * Parameters: - * data Pointer to base of image data - * rp Pointer to relocation operation - * - * Effect: - * Performs the specified relocation operation - ************************************************************************* */ -void dload_relocate(struct dload_state *dlthis, tgt_au_t *data, - struct reloc_record_t *rp, bool *tramps_generated, - bool second_pass) -{ - rvalue val, reloc_amt, orig_val = 0; - unsigned int fieldsz = 0; - unsigned int offset = 0; - unsigned int reloc_info = 0; - unsigned int reloc_action = 0; - register int rx = 0; - rvalue *stackp = NULL; - int top; - struct local_symbol *svp = NULL; -#ifdef RFV_SCALE - unsigned int scale = 0; -#endif - struct image_packet_t *img_pkt = NULL; - - /* The image packet data struct is only used during first pass - * relocation in the event that a trampoline is needed. 2nd pass - * relocation doesn't guarantee that data is coming from an - * image_packet_t structure. See cload.c, dload_data for how img_data is - * set. If that changes this needs to be updated!!! */ - if (second_pass == false) - img_pkt = (struct image_packet_t *)((u8 *) data - - sizeof(struct - image_packet_t)); - - rx = HASH_FUNC(rp->TYPE); - while (rop_map1[rx] != rp->TYPE) { - rx = HASH_L(rop_map2[rx]); - if (rx < 0) { -#if TMS32060 - switch (rp->TYPE) { - case R_C60ALIGN: - case R_C60NOCMP: - case R_C60FPHEAD: - /* Ignore these reloc types and return */ - break; - default: - /* Unknown reloc type, print error and return */ - dload_error(dlthis, "Bad coff operator 0x%x", - rp->TYPE); - } -#else - dload_error(dlthis, "Bad coff operator 0x%x", rp->TYPE); -#endif - return; - } - } - rx = HASH_I(rop_map2[rx]); - if ((rx < (sizeof(rop_action) / sizeof(u16))) - && (rx < (sizeof(rop_info) / sizeof(u16))) && (rx > 0)) { - reloc_action = rop_action[rx]; - reloc_info = rop_info[rx]; - } else { - dload_error(dlthis, "Buffer Overflow - Array Index Out " - "of Bounds"); - } - - /* Compute the relocation amount for the referenced symbol, if any */ - reloc_amt = rp->UVAL; - if (RFV_SYM(reloc_info)) { /* relocation uses a symbol reference */ - /* If this is first pass, use the module local symbol table, - * else use the trampoline symbol table. */ - if (second_pass == false) { - if ((u32) rp->SYMNDX < dlthis->dfile_hdr.df_no_syms) { - /* real symbol reference */ - svp = &dlthis->local_symtab[rp->SYMNDX]; - reloc_amt = (RFV_SYM(reloc_info) == ROP_SYMD) ? - svp->delta : svp->value; - } - /* reloc references current section */ - else if (rp->SYMNDX == -1) { - reloc_amt = (RFV_SYM(reloc_info) == ROP_SYMD) ? - dlthis->delta_runaddr : - dlthis->image_secn->run_addr; - } - } - } - /* relocation uses a symbol reference */ - /* Handle stack adjustment */ - val = 0; - top = RFV_STK(reloc_info); - if (top) { - top += dlthis->relstkidx - RSTK_UOP; - if (top >= STATIC_EXPR_STK_SIZE) { - dload_error(dlthis, - "Expression stack overflow in %s at offset " - FMT_UI32, dlthis->image_secn->name, - rp->vaddr + dlthis->image_offset); - return; - } - val = dlthis->relstk[dlthis->relstkidx]; - dlthis->relstkidx = top; - stackp = &dlthis->relstk[top]; - } - /* Derive field position and size, if we need them */ - if (reloc_info & ROP_RW) { /* read or write action in our future */ - fieldsz = RFV_WIDTH(reloc_action); - if (fieldsz) { /* field info from table */ - offset = RFV_POSN(reloc_action); - if (TARGET_BIG_ENDIAN) - /* make sure vaddr is the lowest target - * address containing bits */ - rp->vaddr += RFV_BIGOFF(reloc_info); - } else { /* field info from relocation op */ - fieldsz = rp->FIELDSZ; - offset = rp->OFFSET; - if (TARGET_BIG_ENDIAN) - /* make sure vaddr is the lowest target - address containing bits */ - rp->vaddr += (rp->WORDSZ - offset - fieldsz) - >> LOG_TARGET_AU_BITS; - } - data = (tgt_au_t *) ((char *)data + TADDR_TO_HOST(rp->vaddr)); - /* compute lowest host location of referenced data */ -#if BITS_PER_AU > TARGET_AU_BITS - /* conversion from target address to host address may lose - address bits; add loss to offset */ - if (TARGET_BIG_ENDIAN) { - offset += -((rp->vaddr << LOG_TARGET_AU_BITS) + - offset + fieldsz) & - (BITS_PER_AU - TARGET_AU_BITS); - } else { - offset += (rp->vaddr << LOG_TARGET_AU_BITS) & - (BITS_PER_AU - 1); - } -#endif -#ifdef RFV_SCALE - scale = RFV_SCALE(reloc_info); -#endif - } - /* read the object value from the current image, if so ordered */ - if (reloc_info & ROP_R) { - /* relocation reads current image value */ - val = dload_unpack(dlthis, data, fieldsz, offset, - RFV_SIGN(reloc_info)); - /* Save off the original value in case the relo overflows and - * we can trampoline it. */ - orig_val = val; - -#ifdef RFV_SCALE - val <<= scale; -#endif - } - /* perform the necessary arithmetic */ - switch (RFV_ACTION(reloc_action)) { /* relocation actions */ - case RACT_VAL: - break; - case RACT_ASGN: - val = reloc_amt; - break; - case RACT_ADD: - val += reloc_amt; - break; - case RACT_PCR: - /*----------------------------------------------------------- - * Handle special cases of jumping from absolute sections - * (special reloc type) or to absolute destination - * (symndx == -1). In either case, set the appropriate - * relocation amount to 0. - *----------------------------------------------------------- */ - if (rp->SYMNDX == -1) - reloc_amt = 0; - val += reloc_amt - dlthis->delta_runaddr; - break; - case RACT_ADDISP: - val += rp->R_DISP + reloc_amt; - break; - case RACT_ASGPC: - val = dlthis->image_secn->run_addr + reloc_amt; - break; - case RACT_PLUS: - if (stackp != NULL) - val += *stackp; - break; - case RACT_SUB: - if (stackp != NULL) - val = *stackp - val; - break; - case RACT_NEG: - val = -val; - break; - case RACT_MPY: - if (stackp != NULL) - val *= *stackp; - break; - case RACT_DIV: - if (stackp != NULL) - val = *stackp / val; - break; - case RACT_MOD: - if (stackp != NULL) - val = *stackp % val; - break; - case RACT_SR: - if (val >= sizeof(rvalue) * BITS_PER_AU) - val = 0; - else if (stackp != NULL) - val = (urvalue) *stackp >> val; - break; - case RACT_ASR: - if (val >= sizeof(rvalue) * BITS_PER_AU) - val = sizeof(rvalue) * BITS_PER_AU - 1; - else if (stackp != NULL) - val = *stackp >> val; - break; - case RACT_SL: - if (val >= sizeof(rvalue) * BITS_PER_AU) - val = 0; - else if (stackp != NULL) - val = *stackp << val; - break; - case RACT_AND: - if (stackp != NULL) - val &= *stackp; - break; - case RACT_OR: - if (stackp != NULL) - val |= *stackp; - break; - case RACT_XOR: - if (stackp != NULL) - val ^= *stackp; - break; - case RACT_NOT: - val = ~val; - break; -#if TMS32060 - case RACT_C6SECT: - /* actually needed address of secn containing symbol */ - if (svp != NULL) { - if (rp->SYMNDX >= 0) - if (svp->secnn > 0) - reloc_amt = dlthis->ldr_sections - [svp->secnn - 1].run_addr; - } - /* !!! FALL THRU !!! */ - case RACT_C6BASE: - if (dlthis->bss_run_base == 0) { - struct dynload_symbol *symp; - - symp = dlthis->mysym->find_matching_symbol - (dlthis->mysym, bsssymbol); - /* lookup value of global BSS base */ - if (symp) - dlthis->bss_run_base = symp->value; - else - dload_error(dlthis, - "Global BSS base referenced in %s " - "offset" FMT_UI32 " but not " - "defined", - dlthis->image_secn->name, - rp->vaddr + dlthis->image_offset); - } - reloc_amt -= dlthis->bss_run_base; - /* !!! FALL THRU !!! */ - case RACT_C6DSPL: - /* scale factor determined by 3 LSBs of field */ - scale = c60_scale[val & SCALE_MASK]; - offset += SCALE_BITS; - fieldsz -= SCALE_BITS; - val >>= SCALE_BITS; /* ignore the scale field hereafter */ - val <<= scale; - val += reloc_amt; /* do the usual relocation */ - if (((1 << scale) - 1) & val) - dload_error(dlthis, - "Unaligned reference in %s offset " - FMT_UI32, dlthis->image_secn->name, - rp->vaddr + dlthis->image_offset); - break; -#endif - } /* relocation actions */ - /* * Put back result as required */ - if (reloc_info & ROP_W) { /* relocation writes image value */ -#ifdef RFV_SCALE - val >>= scale; -#endif - if (dload_repack(dlthis, val, data, fieldsz, offset, - RFV_SIGN(reloc_info))) { - /* Check to see if this relo can be trampolined, - * but only in first phase relocation. 2nd phase - * relocation cannot trampoline. */ - if ((second_pass == false) && - (dload_tramp_avail(dlthis, rp) == true)) { - - /* Before generating the trampoline, restore - * the value to its original so the 2nd pass - * relo will work. */ - dload_repack(dlthis, orig_val, data, fieldsz, - offset, RFV_SIGN(reloc_info)); - if (!dload_tramp_generate(dlthis, - (dlthis->image_secn - - dlthis->ldr_sections), - dlthis->image_offset, - img_pkt, rp)) { - dload_error(dlthis, - "Failed to " - "generate trampoline for " - "bit overflow"); - dload_error(dlthis, - "Relocation val " FMT_UI32 - " overflows %d bits in %s " - "offset " FMT_UI32, val, - fieldsz, - dlthis->image_secn->name, - dlthis->image_offset + - rp->vaddr); - } else - *tramps_generated = true; - } else { - dload_error(dlthis, "Relocation value " - FMT_UI32 " overflows %d bits in %s" - " offset " FMT_UI32, val, fieldsz, - dlthis->image_secn->name, - dlthis->image_offset + rp->vaddr); - } - } - } else if (top) - *stackp = val; -} /* reloc_value */ diff --git a/drivers/staging/tidspbridge/dynload/reloc_table.h b/drivers/staging/tidspbridge/dynload/reloc_table.h deleted file mode 100644 index 6aab03d4668d..000000000000 --- a/drivers/staging/tidspbridge/dynload/reloc_table.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * reloc_table.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _RELOC_TABLE_H_ -#define _RELOC_TABLE_H_ -/* - * Table of relocation operator properties - */ -#include - -/* How does this relocation operation access the program image? */ -#define ROP_N 0 /* does not access image */ -#define ROP_R 1 /* read from image */ -#define ROP_W 2 /* write to image */ -#define ROP_RW 3 /* read from and write to image */ - -/* For program image access, what are the overflow rules for the bit field? */ -/* Beware! Procedure repack depends on this encoding */ -#define ROP_ANY 0 /* no overflow ever, just truncate the value */ -#define ROP_SGN 1 /* signed field */ -#define ROP_UNS 2 /* unsigned field */ -#define ROP_MAX 3 /* allow maximum range of either signed or unsigned */ - -/* How does the relocation operation use the symbol reference */ -#define ROP_IGN 0 /* no symbol is referenced */ -#define ROP_LIT 0 /* use rp->UVAL literal field */ -#define ROP_SYM 1 /* symbol value is used in relocation */ -#define ROP_SYMD 2 /* delta value vs last link is used */ - -/* How does the reloc op use the stack? */ -#define RSTK_N 0 /* Does not use */ -#define RSTK_POP 1 /* Does a POP */ -#define RSTK_UOP 2 /* Unary op, stack position unaffected */ -#define RSTK_PSH 3 /* Does a push */ - -/* - * Computational actions performed by the dynamic loader - */ -enum dload_actions { - /* don't alter the current val (from stack or mem fetch) */ - RACT_VAL, - /* set value to reference amount (from symbol reference) */ - RACT_ASGN, - RACT_ADD, /* add reference to value */ - RACT_PCR, /* add reference minus PC delta to value */ - RACT_ADDISP, /* add reference plus R_DISP */ - RACT_ASGPC, /* set value to section addr plus reference */ - - RACT_PLUS, /* stack + */ - RACT_SUB, /* stack - */ - RACT_NEG, /* stack unary - */ - - RACT_MPY, /* stack * */ - RACT_DIV, /* stack / */ - RACT_MOD, /* stack % */ - - RACT_SR, /* stack unsigned >> */ - RACT_ASR, /* stack signed >> */ - RACT_SL, /* stack << */ - RACT_AND, /* stack & */ - RACT_OR, /* stack | */ - RACT_XOR, /* stack ^ */ - RACT_NOT, /* stack ~ */ - RACT_C6SECT, /* for C60 R_SECT op */ - RACT_C6BASE, /* for C60 R_BASE op */ - RACT_C6DSPL, /* for C60 scaled 15-bit displacement */ - RACT_PCR23T /* for ARM Thumb long branch */ -}; - -/* - * macros used to extract values - */ -#define RFV_POSN(aaa) ((aaa) & 0xF) -#define RFV_WIDTH(aaa) (((aaa) >> 4) & 0x3F) -#define RFV_ACTION(aaa) ((aaa) >> 10) - -#define RFV_SIGN(iii) (((iii) >> 2) & 0x3) -#define RFV_SYM(iii) (((iii) >> 4) & 0x3) -#define RFV_STK(iii) (((iii) >> 6) & 0x3) -#define RFV_ACCS(iii) ((iii) & 0x3) - -#if (TMS32060) -#define RFV_SCALE(iii) ((iii) >> 11) -#define RFV_BIGOFF(iii) (((iii) >> 8) & 0x7) -#else -#define RFV_BIGOFF(iii) ((iii) >> 8) -#endif - -#endif /* _RELOC_TABLE_H_ */ diff --git a/drivers/staging/tidspbridge/dynload/reloc_table_c6000.c b/drivers/staging/tidspbridge/dynload/reloc_table_c6000.c deleted file mode 100644 index a28bc0442491..000000000000 --- a/drivers/staging/tidspbridge/dynload/reloc_table_c6000.c +++ /dev/null @@ -1,257 +0,0 @@ -/* - * reloc_table_c6000.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* Tables generated for c6000 */ - -#define HASH_FUNC(zz) (((((zz) + 1) * 1845UL) >> 11) & 63) -#define HASH_L(zz) ((zz) >> 8) -#define HASH_I(zz) ((zz) & 0xFF) - -static const u16 rop_map1[] = { - 0, - 1, - 2, - 20, - 4, - 5, - 6, - 15, - 80, - 81, - 82, - 83, - 84, - 85, - 86, - 87, - 17, - 18, - 19, - 21, - 16, - 16394, - 16404, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 32, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 40, - 112, - 113, - 65535, - 16384, - 16385, - 16386, - 16387, - 16388, - 16389, - 16390, - 16391, - 16392, - 16393, - 16395, - 16396, - 16397, - 16398, - 16399, - 16400, - 16401, - 16402, - 16403, - 16405, - 16406, - 65535, - 65535, - 65535 -}; - -static const s16 rop_map2[] = { - -256, - -255, - -254, - -245, - -253, - -252, - -251, - -250, - -241, - -240, - -239, - -238, - -237, - -236, - 1813, - 5142, - -248, - -247, - 778, - -244, - -249, - -221, - -211, - -1, - -1, - -1, - -1, - -1, - -1, - -243, - -1, - -1, - -1, - -1, - -1, - -1, - -242, - -233, - -232, - -1, - -231, - -230, - -229, - -228, - -227, - -226, - -225, - -224, - -223, - 5410, - -220, - -219, - -218, - -217, - -216, - -215, - -214, - -213, - 5676, - -210, - -209, - -1, - -1, - -1 -}; - -static const u16 rop_action[] = { - 2560, - 2304, - 2304, - 2432, - 2432, - 2560, - 2176, - 2304, - 2560, - 3200, - 3328, - 3584, - 3456, - 2304, - 4208, - 20788, - 21812, - 3415, - 3245, - 2311, - 4359, - 19764, - 2311, - 3191, - 3280, - 6656, - 7680, - 8704, - 9728, - 10752, - 11776, - 12800, - 13824, - 14848, - 15872, - 16896, - 17920, - 18944, - 0, - 0, - 0, - 0, - 1536, - 1536, - 1536, - 5632, - 512, - 0 -}; - -static const u16 rop_info[] = { - 0, - 35, - 35, - 35, - 35, - 35, - 35, - 35, - 35, - 39, - 39, - 39, - 39, - 35, - 34, - 283, - 299, - 4135, - 4391, - 291, - 33059, - 283, - 295, - 4647, - 4135, - 64, - 64, - 128, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 128, - 201, - 197, - 74, - 70, - 208, - 196, - 200, - 192, - 192, - 66 -}; diff --git a/drivers/staging/tidspbridge/dynload/tramp.c b/drivers/staging/tidspbridge/dynload/tramp.c deleted file mode 100644 index 5f0431305fbb..000000000000 --- a/drivers/staging/tidspbridge/dynload/tramp.c +++ /dev/null @@ -1,1143 +0,0 @@ -/* - * tramp.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2009 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include "header.h" - -#if TMS32060 -#include "tramp_table_c6000.c" -#endif - -#define MAX_RELOS_PER_PASS 4 - -/* - * Function: priv_tramp_sect_tgt_alloc - * Description: Allocate target memory for the trampoline section. The - * target mem size is easily obtained as the next available address. - */ -static int priv_tramp_sect_tgt_alloc(struct dload_state *dlthis) -{ - int ret_val = 0; - struct ldr_section_info *sect_info; - - /* Populate the trampoline loader section and allocate it on the - * target. The section name is ALWAYS the first string in the final - * string table for trampolines. The trampoline section is always - * 1 beyond the total number of allocated sections. */ - sect_info = &dlthis->ldr_sections[dlthis->allocated_secn_count]; - - sect_info->name = dlthis->tramp.final_string_table; - sect_info->size = dlthis->tramp.tramp_sect_next_addr; - sect_info->context = 0; - sect_info->type = - (4 << 8) | DLOAD_TEXT | DS_ALLOCATE_MASK | DS_DOWNLOAD_MASK; - sect_info->page = 0; - sect_info->run_addr = 0; - sect_info->load_addr = 0; - ret_val = dlthis->myalloc->dload_allocate(dlthis->myalloc, - sect_info, - ds_alignment - (sect_info->type)); - - if (ret_val == 0) - dload_error(dlthis, "Failed to allocate target memory for" - " trampoline"); - - return ret_val; -} - -/* - * Function: priv_h2a - * Description: Helper function to convert a hex value to its ASCII - * representation. Used for trampoline symbol name generation. - */ -static u8 priv_h2a(u8 value) -{ - if (value > 0xF) - return 0xFF; - - if (value <= 9) - value += 0x30; - else - value += 0x37; - - return value; -} - -/* - * Function: priv_tramp_sym_gen_name - * Description: Generate a trampoline symbol name (ASCII) using the value - * of the symbol. This places the new name into the user buffer. - * The name is fixed in length and of the form: __$dbTR__xxxxxxxx - * (where "xxxxxxxx" is the hex value). - */ -static void priv_tramp_sym_gen_name(u32 value, char *dst) -{ - u32 i; - char *prefix = TRAMP_SYM_PREFIX; - char *dst_local = dst; - u8 tmp; - - /* Clear out the destination, including the ending NULL */ - for (i = 0; i < (TRAMP_SYM_PREFIX_LEN + TRAMP_SYM_HEX_ASCII_LEN); i++) - *(dst_local + i) = 0; - - /* Copy the prefix to start */ - for (i = 0; i < strlen(TRAMP_SYM_PREFIX); i++) { - *dst_local = *(prefix + i); - dst_local++; - } - - /* Now convert the value passed in to a string equiv of the hex */ - for (i = 0; i < sizeof(value); i++) { -#ifndef _BIG_ENDIAN - tmp = *(((u8 *) &value) + (sizeof(value) - 1) - i); - *dst_local = priv_h2a((tmp & 0xF0) >> 4); - dst_local++; - *dst_local = priv_h2a(tmp & 0x0F); - dst_local++; -#else - tmp = *(((u8 *) &value) + i); - *dst_local = priv_h2a((tmp & 0xF0) >> 4); - dst_local++; - *dst_local = priv_h2a(tmp & 0x0F); - dst_local++; -#endif - } - - /* NULL terminate */ - *dst_local = 0; -} - -/* - * Function: priv_tramp_string_create - * Description: Create a new string specific to the trampoline loading and add - * it to the trampoline string list. This list contains the - * trampoline section name and trampoline point symbols. - */ -static struct tramp_string *priv_tramp_string_create(struct dload_state *dlthis, - u32 str_len, char *str) -{ - struct tramp_string *new_string = NULL; - u32 i; - - /* Create a new string object with the specified size. */ - new_string = - (struct tramp_string *)dlthis->mysym->dload_allocate(dlthis->mysym, - (sizeof - (struct - tramp_string) - + str_len + - 1)); - if (new_string != NULL) { - /* Clear the string first. This ensures the ending NULL is - * present and the optimizer won't touch it. */ - for (i = 0; i < (sizeof(struct tramp_string) + str_len + 1); - i++) - *((u8 *) new_string + i) = 0; - - /* Add this string to our virtual table by assigning it the - * next index and pushing it to the tail of the list. */ - new_string->index = dlthis->tramp.tramp_string_next_index; - dlthis->tramp.tramp_string_next_index++; - dlthis->tramp.tramp_string_size += str_len + 1; - - new_string->next = NULL; - if (dlthis->tramp.string_head == NULL) - dlthis->tramp.string_head = new_string; - else - dlthis->tramp.string_tail->next = new_string; - - dlthis->tramp.string_tail = new_string; - - /* Copy the string over to the new object */ - for (i = 0; i < str_len; i++) - new_string->str[i] = str[i]; - } - - return new_string; -} - -/* - * Function: priv_tramp_string_find - * Description: Walk the trampoline string list and find a match for the - * provided string. If not match is found, NULL is returned. - */ -static struct tramp_string *priv_tramp_string_find(struct dload_state *dlthis, - char *str) -{ - struct tramp_string *cur_str = NULL; - struct tramp_string *ret_val = NULL; - u32 i; - u32 str_len = strlen(str); - - for (cur_str = dlthis->tramp.string_head; - (ret_val == NULL) && (cur_str != NULL); cur_str = cur_str->next) { - /* If the string lengths aren't equal, don't bother - * comparing */ - if (str_len != strlen(cur_str->str)) - continue; - - /* Walk the strings until one of them ends */ - for (i = 0; i < str_len; i++) { - /* If they don't match in the current position then - * break out now, no sense in continuing to look at - * this string. */ - if (str[i] != cur_str->str[i]) - break; - } - - if (i == str_len) - ret_val = cur_str; - } - - return ret_val; -} - -/* - * Function: priv_string_tbl_finalize - * Description: Flatten the trampoline string list into a table of NULL - * terminated strings. This is the same format of string table - * as used by the COFF/DOFF file. - */ -static int priv_string_tbl_finalize(struct dload_state *dlthis) -{ - int ret_val = 0; - struct tramp_string *cur_string; - char *cur_loc; - char *tmp; - - /* Allocate enough space for all strings that have been created. The - * table is simply all strings concatenated together will NULL - * endings. */ - dlthis->tramp.final_string_table = - (char *)dlthis->mysym->dload_allocate(dlthis->mysym, - dlthis->tramp. - tramp_string_size); - if (dlthis->tramp.final_string_table != NULL) { - /* We got our buffer, walk the list and release the nodes as* - * we go */ - cur_loc = dlthis->tramp.final_string_table; - cur_string = dlthis->tramp.string_head; - while (cur_string != NULL) { - /* Move the head/tail pointers */ - dlthis->tramp.string_head = cur_string->next; - if (dlthis->tramp.string_tail == cur_string) - dlthis->tramp.string_tail = NULL; - - /* Copy the string contents */ - for (tmp = cur_string->str; - *tmp != '\0'; tmp++, cur_loc++) - *cur_loc = *tmp; - - /* Pick up the NULL termination since it was missed by - * breaking using it to end the above loop. */ - *cur_loc = '\0'; - cur_loc++; - - /* Free the string node, we don't need it any more. */ - dlthis->mysym->dload_deallocate(dlthis->mysym, - cur_string); - - /* Move our pointer to the next one */ - cur_string = dlthis->tramp.string_head; - } - - /* Update our return value to success */ - ret_val = 1; - } else - dload_error(dlthis, "Failed to allocate trampoline " - "string table"); - - return ret_val; -} - -/* - * Function: priv_tramp_sect_alloc - * Description: Virtually allocate space from the trampoline section. This - * function returns the next offset within the trampoline section - * that is available and moved the next available offset by the - * requested size. NO TARGET ALLOCATION IS DONE AT THIS TIME. - */ -static u32 priv_tramp_sect_alloc(struct dload_state *dlthis, u32 tramp_size) -{ - u32 ret_val; - - /* If the next available address is 0, this is our first allocation. - * Create a section name string to go into the string table . */ - if (dlthis->tramp.tramp_sect_next_addr == 0) { - dload_syms_error(dlthis->mysym, "*** WARNING *** created " - "dynamic TRAMPOLINE section for module %s", - dlthis->str_head); - } - - /* Reserve space for the new trampoline */ - ret_val = dlthis->tramp.tramp_sect_next_addr; - dlthis->tramp.tramp_sect_next_addr += tramp_size; - return ret_val; -} - -/* - * Function: priv_tramp_sym_create - * Description: Allocate and create a new trampoline specific symbol and add - * it to the trampoline symbol list. These symbols will include - * trampoline points as well as the external symbols they - * reference. - */ -static struct tramp_sym *priv_tramp_sym_create(struct dload_state *dlthis, - u32 str_index, - struct local_symbol *tmp_sym) -{ - struct tramp_sym *new_sym = NULL; - u32 i; - - /* Allocate new space for the symbol in the symbol table. */ - new_sym = - (struct tramp_sym *)dlthis->mysym->dload_allocate(dlthis->mysym, - sizeof(struct tramp_sym)); - if (new_sym != NULL) { - for (i = 0; i != sizeof(struct tramp_sym); i++) - *((char *)new_sym + i) = 0; - - /* Assign this symbol the next symbol index for easier - * reference later during relocation. */ - new_sym->index = dlthis->tramp.tramp_sym_next_index; - dlthis->tramp.tramp_sym_next_index++; - - /* Populate the symbol information. At this point any - * trampoline symbols will be the offset location, not the - * final. Copy over the symbol info to start, then be sure to - * get the string index from the trampoline string table. */ - new_sym->sym_info = *tmp_sym; - new_sym->str_index = str_index; - - /* Push the new symbol to the tail of the symbol table list */ - new_sym->next = NULL; - if (dlthis->tramp.symbol_head == NULL) - dlthis->tramp.symbol_head = new_sym; - else - dlthis->tramp.symbol_tail->next = new_sym; - - dlthis->tramp.symbol_tail = new_sym; - } - - return new_sym; -} - -/* - * Function: priv_tramp_sym_get - * Description: Search for the symbol with the matching string index (from - * the trampoline string table) and return the trampoline - * symbol object, if found. Otherwise return NULL. - */ -static struct tramp_sym *priv_tramp_sym_get(struct dload_state *dlthis, - u32 string_index) -{ - struct tramp_sym *sym_found = NULL; - - /* Walk the symbol table list and search vs. the string index */ - for (sym_found = dlthis->tramp.symbol_head; - sym_found != NULL; sym_found = sym_found->next) { - if (sym_found->str_index == string_index) - break; - } - - return sym_found; -} - -/* - * Function: priv_tramp_sym_find - * Description: Search for a trampoline symbol based on the string name of - * the symbol. Return the symbol object, if found, otherwise - * return NULL. - */ -static struct tramp_sym *priv_tramp_sym_find(struct dload_state *dlthis, - char *string) -{ - struct tramp_sym *sym_found = NULL; - struct tramp_string *str_found = NULL; - - /* First, search for the string, then search for the sym based on the - string index. */ - str_found = priv_tramp_string_find(dlthis, string); - if (str_found != NULL) - sym_found = priv_tramp_sym_get(dlthis, str_found->index); - - return sym_found; -} - -/* - * Function: priv_tramp_sym_finalize - * Description: Allocate a flat symbol table for the trampoline section, - * put each trampoline symbol into the table, adjust the - * symbol value based on the section address on the target and - * free the trampoline symbol list nodes. - */ -static int priv_tramp_sym_finalize(struct dload_state *dlthis) -{ - int ret_val = 0; - struct tramp_sym *cur_sym; - struct ldr_section_info *tramp_sect = - &dlthis->ldr_sections[dlthis->allocated_secn_count]; - struct local_symbol *new_sym; - - /* Allocate a table to hold a flattened version of all symbols - * created. */ - dlthis->tramp.final_sym_table = - (struct local_symbol *)dlthis->mysym->dload_allocate(dlthis->mysym, - (sizeof(struct local_symbol) * dlthis->tramp. - tramp_sym_next_index)); - if (dlthis->tramp.final_sym_table != NULL) { - /* Walk the list of all symbols, copy it over to the flattened - * table. After it has been copied, the node can be freed as - * it is no longer needed. */ - new_sym = dlthis->tramp.final_sym_table; - cur_sym = dlthis->tramp.symbol_head; - while (cur_sym != NULL) { - /* Pop it off the list */ - dlthis->tramp.symbol_head = cur_sym->next; - if (cur_sym == dlthis->tramp.symbol_tail) - dlthis->tramp.symbol_tail = NULL; - - /* Copy the symbol contents into the flat table */ - *new_sym = cur_sym->sym_info; - - /* Now finalize the symbol. If it is in the tramp - * section, we need to adjust for the section start. - * If it is external then we don't need to adjust at - * all. - * NOTE: THIS CODE ASSUMES THAT THE TRAMPOLINE IS - * REFERENCED LIKE A CALL TO AN EXTERNAL SO VALUE AND - * DELTA ARE THE SAME. SEE THE FUNCTION dload_symbols - * WHERE DN_UNDEF IS HANDLED FOR MORE REFERENCE. */ - if (new_sym->secnn < 0) { - new_sym->value += tramp_sect->load_addr; - new_sym->delta = new_sym->value; - } - - /* Let go of the symbol node */ - dlthis->mysym->dload_deallocate(dlthis->mysym, cur_sym); - - /* Move to the next node */ - cur_sym = dlthis->tramp.symbol_head; - new_sym++; - } - - ret_val = 1; - } else - dload_error(dlthis, "Failed to alloc trampoline sym table"); - - return ret_val; -} - -/* - * Function: priv_tgt_img_gen - * Description: Allocate storage for and copy the target specific image data - * and fix up its relocations for the new external symbol. If - * a trampoline image packet was successfully created it is added - * to the trampoline list. - */ -static int priv_tgt_img_gen(struct dload_state *dlthis, u32 base, - u32 gen_index, struct tramp_sym *new_ext_sym) -{ - struct tramp_img_pkt *new_img_pkt = NULL; - u32 i; - u32 pkt_size = tramp_img_pkt_size_get(); - u8 *gen_tbl_entry; - u8 *pkt_data; - struct reloc_record_t *cur_relo; - int ret_val = 0; - - /* Allocate a new image packet and set it up. */ - new_img_pkt = - (struct tramp_img_pkt *)dlthis->mysym->dload_allocate(dlthis->mysym, - pkt_size); - if (new_img_pkt != NULL) { - /* Save the base, this is where it goes in the section */ - new_img_pkt->base = base; - - /* Copy over the image data and relos from the target table */ - pkt_data = (u8 *) &new_img_pkt->hdr; - gen_tbl_entry = (u8 *) &tramp_gen_info[gen_index]; - for (i = 0; i < pkt_size; i++) { - *pkt_data = *gen_tbl_entry; - pkt_data++; - gen_tbl_entry++; - } - - /* Update the relocations to point to the external symbol */ - cur_relo = - (struct reloc_record_t *)((u8 *) &new_img_pkt->hdr + - new_img_pkt->hdr.relo_offset); - for (i = 0; i < new_img_pkt->hdr.num_relos; i++) - cur_relo[i].SYMNDX = new_ext_sym->index; - - /* Add it to the trampoline list. */ - new_img_pkt->next = dlthis->tramp.tramp_pkts; - dlthis->tramp.tramp_pkts = new_img_pkt; - - ret_val = 1; - } - - return ret_val; -} - -/* - * Function: priv_pkt_relo - * Description: Take the provided image data and the collection of relocations - * for it and perform the relocations. Note that all relocations - * at this stage are considered SECOND PASS since the original - * image has already been processed in the first pass. This means - * TRAMPOLINES ARE TREATED AS 2ND PASS even though this is really - * the first (and only) relocation that will be performed on them. - */ -static int priv_pkt_relo(struct dload_state *dlthis, tgt_au_t *data, - struct reloc_record_t *rp[], u32 relo_count) -{ - int ret_val = 1; - u32 i; - bool tmp; - - /* Walk through all of the relos and process them. This function is - * the equivalent of relocate_packet() from cload.c, but specialized - * for trampolines and 2nd phase relocations. */ - for (i = 0; i < relo_count; i++) - dload_relocate(dlthis, data, rp[i], &tmp, true); - - return ret_val; -} - -/* - * Function: priv_tramp_pkt_finalize - * Description: Walk the list of all trampoline packets and finalize them. - * Each trampoline image packet will be relocated now that the - * trampoline section has been allocated on the target. Once - * all of the relocations are done the trampoline image data - * is written into target memory and the trampoline packet - * is freed: it is no longer needed after this point. - */ -static int priv_tramp_pkt_finalize(struct dload_state *dlthis) -{ - int ret_val = 1; - struct tramp_img_pkt *cur_pkt = NULL; - struct reloc_record_t *relos[MAX_RELOS_PER_PASS]; - u32 relos_done; - u32 i; - struct reloc_record_t *cur_relo; - struct ldr_section_info *sect_info = - &dlthis->ldr_sections[dlthis->allocated_secn_count]; - - /* Walk the list of trampoline packets and relocate each packet. This - * function is the trampoline equivalent of dload_data() from - * cload.c. */ - cur_pkt = dlthis->tramp.tramp_pkts; - while ((ret_val != 0) && (cur_pkt != NULL)) { - /* Remove the pkt from the list */ - dlthis->tramp.tramp_pkts = cur_pkt->next; - - /* Setup section and image offset information for the relo */ - dlthis->image_secn = sect_info; - dlthis->image_offset = cur_pkt->base; - dlthis->delta_runaddr = sect_info->run_addr; - - /* Walk through all relos for the packet */ - relos_done = 0; - cur_relo = (struct reloc_record_t *)((u8 *) &cur_pkt->hdr + - cur_pkt->hdr.relo_offset); - while (relos_done < cur_pkt->hdr.num_relos) { -#ifdef ENABLE_TRAMP_DEBUG - dload_syms_error(dlthis->mysym, - "===> Trampoline %x branches to %x", - sect_info->run_addr + - dlthis->image_offset, - dlthis-> - tramp.final_sym_table[cur_relo-> - SYMNDX].value); -#endif - - for (i = 0; - ((i < MAX_RELOS_PER_PASS) && - ((i + relos_done) < cur_pkt->hdr.num_relos)); i++) - relos[i] = cur_relo + i; - - /* Do the actual relo */ - ret_val = priv_pkt_relo(dlthis, - (tgt_au_t *) &cur_pkt->payload, - relos, i); - if (ret_val == 0) { - dload_error(dlthis, - "Relocation of trampoline pkt at %x" - " failed", cur_pkt->base + - sect_info->run_addr); - break; - } - - relos_done += i; - cur_relo += i; - } - - /* Make sure we didn't hit a problem */ - if (ret_val != 0) { - /* Relos are done for the packet, write it to the - * target */ - ret_val = dlthis->myio->writemem(dlthis->myio, - &cur_pkt->payload, - sect_info->load_addr + - cur_pkt->base, - sect_info, - BYTE_TO_HOST - (cur_pkt->hdr. - tramp_code_size)); - if (ret_val == 0) { - dload_error(dlthis, - "Write to " FMT_UI32 " failed", - sect_info->load_addr + - cur_pkt->base); - } - - /* Done with the pkt, let it go */ - dlthis->mysym->dload_deallocate(dlthis->mysym, cur_pkt); - - /* Get the next packet to process */ - cur_pkt = dlthis->tramp.tramp_pkts; - } - } - - return ret_val; -} - -/* - * Function: priv_dup_pkt_finalize - * Description: Walk the list of duplicate image packets and finalize them. - * Each duplicate packet will be relocated again for the - * relocations that previously failed and have been adjusted - * to point at a trampoline. Once all relocations for a packet - * have been done, write the packet into target memory. The - * duplicate packet and its relocation chain are all freed - * after use here as they are no longer needed after this. - */ -static int priv_dup_pkt_finalize(struct dload_state *dlthis) -{ - int ret_val = 1; - struct tramp_img_dup_pkt *cur_pkt; - struct tramp_img_dup_relo *cur_relo; - struct reloc_record_t *relos[MAX_RELOS_PER_PASS]; - struct doff_scnhdr_t *sect_hdr = NULL; - s32 i; - - /* Similar to the trampoline pkt finalize, this function walks each dup - * pkt that was generated and performs all relocations that were - * deferred to a 2nd pass. This is the equivalent of dload_data() from - * cload.c, but does not need the additional reorder and checksum - * processing as it has already been done. */ - cur_pkt = dlthis->tramp.dup_pkts; - while ((ret_val != 0) && (cur_pkt != NULL)) { - /* Remove the node from the list, we'll be freeing it - * shortly */ - dlthis->tramp.dup_pkts = cur_pkt->next; - - /* Setup the section and image offset for relocation */ - dlthis->image_secn = &dlthis->ldr_sections[cur_pkt->secnn]; - dlthis->image_offset = cur_pkt->offset; - - /* In order to get the delta run address, we need to reference - * the original section header. It's a bit ugly, but needed - * for relo. */ - i = (s32) (dlthis->image_secn - dlthis->ldr_sections); - sect_hdr = dlthis->sect_hdrs + i; - dlthis->delta_runaddr = sect_hdr->ds_paddr; - - /* Walk all relos in the chain and process each. */ - cur_relo = cur_pkt->relo_chain; - while (cur_relo != NULL) { - /* Process them a chunk at a time to be efficient */ - for (i = 0; (i < MAX_RELOS_PER_PASS) - && (cur_relo != NULL); - i++, cur_relo = cur_relo->next) { - relos[i] = &cur_relo->relo; - cur_pkt->relo_chain = cur_relo->next; - } - - /* Do the actual relo */ - ret_val = priv_pkt_relo(dlthis, - cur_pkt->img_pkt.img_data, - relos, i); - if (ret_val == 0) { - dload_error(dlthis, - "Relocation of dup pkt at %x" - " failed", cur_pkt->offset + - dlthis->image_secn->run_addr); - break; - } - - /* Release all of these relos, we're done with them */ - while (i > 0) { - dlthis->mysym->dload_deallocate(dlthis->mysym, - GET_CONTAINER - (relos[i - 1], - struct tramp_img_dup_relo, - relo)); - i--; - } - - /* DO NOT ADVANCE cur_relo, IT IS ALREADY READY TO - * GO! */ - } - - /* Done with all relos. Make sure we didn't have a problem and - * write it out to the target */ - if (ret_val != 0) { - ret_val = dlthis->myio->writemem(dlthis->myio, - cur_pkt->img_pkt. - img_data, - dlthis->image_secn-> - load_addr + - cur_pkt->offset, - dlthis->image_secn, - BYTE_TO_HOST - (cur_pkt->img_pkt. - packet_size)); - if (ret_val == 0) { - dload_error(dlthis, - "Write to " FMT_UI32 " failed", - dlthis->image_secn->load_addr + - cur_pkt->offset); - } - - dlthis->mysym->dload_deallocate(dlthis->mysym, cur_pkt); - - /* Advance to the next packet */ - cur_pkt = dlthis->tramp.dup_pkts; - } - } - - return ret_val; -} - -/* - * Function: priv_dup_find - * Description: Walk the list of existing duplicate packets and find a - * match based on the section number and image offset. Return - * the duplicate packet if found, otherwise NULL. - */ -static struct tramp_img_dup_pkt *priv_dup_find(struct dload_state *dlthis, - s16 secnn, u32 image_offset) -{ - struct tramp_img_dup_pkt *cur_pkt = NULL; - - for (cur_pkt = dlthis->tramp.dup_pkts; - cur_pkt != NULL; cur_pkt = cur_pkt->next) { - if ((cur_pkt->secnn == secnn) && - (cur_pkt->offset == image_offset)) { - /* Found a match, break out */ - break; - } - } - - return cur_pkt; -} - -/* - * Function: priv_img_pkt_dup - * Description: Duplicate the original image packet. If this is the first - * time this image packet has been seen (based on section number - * and image offset), create a new duplicate packet and add it - * to the dup packet list. If not, just get the existing one and - * update it with the current packet contents (since relocation - * on the packet is still ongoing in first pass.) Create a - * duplicate of the provided relocation, but update it to point - * to the new trampoline symbol. Add the new relocation dup to - * the dup packet's relo chain for 2nd pass relocation later. - */ -static int priv_img_pkt_dup(struct dload_state *dlthis, - s16 secnn, u32 image_offset, - struct image_packet_t *ipacket, - struct reloc_record_t *rp, - struct tramp_sym *new_tramp_sym) -{ - struct tramp_img_dup_pkt *dup_pkt = NULL; - u32 new_dup_size; - s32 i; - int ret_val = 0; - struct tramp_img_dup_relo *dup_relo = NULL; - - /* Determine if this image packet is already being tracked in the - dup list for other trampolines. */ - dup_pkt = priv_dup_find(dlthis, secnn, image_offset); - - if (dup_pkt == NULL) { - /* This image packet does not exist in our tracking, so create - * a new one and add it to the head of the list. */ - new_dup_size = sizeof(struct tramp_img_dup_pkt) + - ipacket->packet_size; - - dup_pkt = (struct tramp_img_dup_pkt *) - dlthis->mysym->dload_allocate(dlthis->mysym, new_dup_size); - if (dup_pkt != NULL) { - /* Save off the section and offset information */ - dup_pkt->secnn = secnn; - dup_pkt->offset = image_offset; - dup_pkt->relo_chain = NULL; - - /* Copy the original packet content */ - dup_pkt->img_pkt = *ipacket; - dup_pkt->img_pkt.img_data = (u8 *) (dup_pkt + 1); - for (i = 0; i < ipacket->packet_size; i++) - *(dup_pkt->img_pkt.img_data + i) = - *(ipacket->img_data + i); - - /* Add the packet to the dup list */ - dup_pkt->next = dlthis->tramp.dup_pkts; - dlthis->tramp.dup_pkts = dup_pkt; - } else - dload_error(dlthis, "Failed to create dup packet!"); - } else { - /* The image packet contents could have changed since - * trampoline detection happens during relocation of the image - * packets. So, we need to update the image packet contents - * before adding relo information. */ - for (i = 0; i < dup_pkt->img_pkt.packet_size; i++) - *(dup_pkt->img_pkt.img_data + i) = - *(ipacket->img_data + i); - } - - /* Since the previous code may have allocated a new dup packet for us, - double check that we actually have one. */ - if (dup_pkt != NULL) { - /* Allocate a new node for the relo chain. Each image packet - * can potentially have multiple relocations that cause a - * trampoline to be generated. So, we keep them in a chain, - * order is not important. */ - dup_relo = dlthis->mysym->dload_allocate(dlthis->mysym, - sizeof(struct tramp_img_dup_relo)); - if (dup_relo != NULL) { - /* Copy the relo contents, adjust for the new - * trampoline and add it to the list. */ - dup_relo->relo = *rp; - dup_relo->relo.SYMNDX = new_tramp_sym->index; - - dup_relo->next = dup_pkt->relo_chain; - dup_pkt->relo_chain = dup_relo; - - /* That's it, we're done. Make sure we update our - * return value to be success since everything finished - * ok */ - ret_val = 1; - } else - dload_error(dlthis, "Unable to alloc dup relo"); - } - - return ret_val; -} - -/* - * Function: dload_tramp_avail - * Description: Check to see if the target supports a trampoline for this type - * of relocation. Return true if it does, otherwise false. - */ -bool dload_tramp_avail(struct dload_state *dlthis, struct reloc_record_t *rp) -{ - bool ret_val = false; - u16 map_index; - u16 gen_index; - - /* Check type hash vs. target tramp table */ - map_index = HASH_FUNC(rp->TYPE); - gen_index = tramp_map[map_index]; - if (gen_index != TRAMP_NO_GEN_AVAIL) - ret_val = true; - - return ret_val; -} - -/* - * Function: dload_tramp_generate - * Description: Create a new trampoline for the provided image packet and - * relocation causing problems. This will create the trampoline - * as well as duplicate/update the image packet and relocation - * causing the problem, which will be relo'd again during - * finalization. - */ -int dload_tramp_generate(struct dload_state *dlthis, s16 secnn, - u32 image_offset, struct image_packet_t *ipacket, - struct reloc_record_t *rp) -{ - u16 map_index; - u16 gen_index; - int ret_val = 1; - char tramp_sym_str[TRAMP_SYM_PREFIX_LEN + TRAMP_SYM_HEX_ASCII_LEN]; - struct local_symbol *ref_sym; - struct tramp_sym *new_tramp_sym; - struct tramp_sym *new_ext_sym; - struct tramp_string *new_tramp_str; - u32 new_tramp_base; - struct local_symbol tmp_sym; - struct local_symbol ext_tmp_sym; - - /* Hash the relo type to get our generator information */ - map_index = HASH_FUNC(rp->TYPE); - gen_index = tramp_map[map_index]; - if (gen_index != TRAMP_NO_GEN_AVAIL) { - /* If this is the first trampoline, create the section name in - * our string table for debug help later. */ - if (dlthis->tramp.string_head == NULL) { - priv_tramp_string_create(dlthis, - strlen(TRAMP_SECT_NAME), - TRAMP_SECT_NAME); - } -#ifdef ENABLE_TRAMP_DEBUG - dload_syms_error(dlthis->mysym, - "Trampoline at img loc %x, references %x", - dlthis->ldr_sections[secnn].run_addr + - image_offset + rp->vaddr, - dlthis->local_symtab[rp->SYMNDX].value); -#endif - - /* Generate the trampoline string, check if already defined. - * If the relo symbol index is -1, it means we need the section - * info for relo later. To do this we'll dummy up a symbol - * with the section delta and run addresses. */ - if (rp->SYMNDX == -1) { - ext_tmp_sym.value = - dlthis->ldr_sections[secnn].run_addr; - ext_tmp_sym.delta = dlthis->sect_hdrs[secnn].ds_paddr; - ref_sym = &ext_tmp_sym; - } else - ref_sym = &(dlthis->local_symtab[rp->SYMNDX]); - - priv_tramp_sym_gen_name(ref_sym->value, tramp_sym_str); - new_tramp_sym = priv_tramp_sym_find(dlthis, tramp_sym_str); - if (new_tramp_sym == NULL) { - /* If tramp string not defined, create it and a new - * string, and symbol for it as well as the original - * symbol which caused the trampoline. */ - new_tramp_str = priv_tramp_string_create(dlthis, - strlen - (tramp_sym_str), - tramp_sym_str); - if (new_tramp_str == NULL) { - dload_error(dlthis, "Failed to create new " - "trampoline string\n"); - ret_val = 0; - } else { - /* Allocate tramp section space for the new - * tramp from the target */ - new_tramp_base = priv_tramp_sect_alloc(dlthis, - tramp_size_get()); - - /* We have a string, create the new symbol and - * duplicate the external. */ - tmp_sym.value = new_tramp_base; - tmp_sym.delta = 0; - tmp_sym.secnn = -1; - tmp_sym.sclass = 0; - new_tramp_sym = priv_tramp_sym_create(dlthis, - new_tramp_str-> - index, - &tmp_sym); - - new_ext_sym = priv_tramp_sym_create(dlthis, -1, - ref_sym); - - if ((new_tramp_sym != NULL) && - (new_ext_sym != NULL)) { - /* Call the image generator to get the - * new image data and fix up its - * relocations for the external - * symbol. */ - ret_val = priv_tgt_img_gen(dlthis, - new_tramp_base, - gen_index, - new_ext_sym); - - /* Add generated image data to tramp - * image list */ - if (ret_val != 1) { - dload_error(dlthis, "Failed to " - "create img pkt for" - " trampoline\n"); - } - } else { - dload_error(dlthis, "Failed to create " - "new tramp syms " - "(%8.8X, %8.8X)\n", - new_tramp_sym, new_ext_sym); - ret_val = 0; - } - } - } - - /* Duplicate the image data and relo record that caused the - * tramp, including update the relo data to point to the tramp - * symbol. */ - if (ret_val == 1) { - ret_val = priv_img_pkt_dup(dlthis, secnn, image_offset, - ipacket, rp, new_tramp_sym); - if (ret_val != 1) { - dload_error(dlthis, "Failed to create dup of " - "original img pkt\n"); - } - } - } - - return ret_val; -} - -/* - * Function: dload_tramp_pkt_update - * Description: Update the duplicate copy of this image packet, which the - * trampoline layer is already tracking. This call is critical - * to make if trampolines were generated anywhere within the - * packet and first pass relo continued on the remainder. The - * trampoline layer needs the updates image data so when 2nd - * pass relo is done during finalize the image packet can be - * written to the target since all relo is done. - */ -int dload_tramp_pkt_udpate(struct dload_state *dlthis, s16 secnn, - u32 image_offset, struct image_packet_t *ipacket) -{ - struct tramp_img_dup_pkt *dup_pkt = NULL; - s32 i; - int ret_val = 0; - - /* Find the image packet in question, the caller needs us to update it - since a trampoline was previously generated. */ - dup_pkt = priv_dup_find(dlthis, secnn, image_offset); - if (dup_pkt != NULL) { - for (i = 0; i < dup_pkt->img_pkt.packet_size; i++) - *(dup_pkt->img_pkt.img_data + i) = - *(ipacket->img_data + i); - - ret_val = 1; - } else { - dload_error(dlthis, - "Unable to find existing DUP pkt for %x, offset %x", - secnn, image_offset); - - } - - return ret_val; -} - -/* - * Function: dload_tramp_finalize - * Description: If any trampolines were created, finalize everything on the - * target by allocating the trampoline section on the target, - * finalizing the trampoline symbols, finalizing the trampoline - * packets (write the new section to target memory) and finalize - * the duplicate packets by doing 2nd pass relo over them. - */ -int dload_tramp_finalize(struct dload_state *dlthis) -{ - int ret_val = 1; - - if (dlthis->tramp.tramp_sect_next_addr != 0) { - /* Finalize strings into a flat table. This is needed so it - * can be added to the debug string table later. */ - ret_val = priv_string_tbl_finalize(dlthis); - - /* Do target allocation for section BEFORE finalizing - * symbols. */ - if (ret_val != 0) - ret_val = priv_tramp_sect_tgt_alloc(dlthis); - - /* Finalize symbols with their correct target information and - * flatten */ - if (ret_val != 0) - ret_val = priv_tramp_sym_finalize(dlthis); - - /* Finalize all trampoline packets. This performs the - * relocation on the packets as well as writing them to target - * memory. */ - if (ret_val != 0) - ret_val = priv_tramp_pkt_finalize(dlthis); - - /* Perform a 2nd pass relocation on the dup list. */ - if (ret_val != 0) - ret_val = priv_dup_pkt_finalize(dlthis); - } - - return ret_val; -} - -/* - * Function: dload_tramp_cleanup - * Description: Release all temporary resources used in the trampoline layer. - * Note that the target memory which may have been allocated and - * written to store the trampolines is NOT RELEASED HERE since it - * is potentially still in use. It is automatically released - * when the module is unloaded. - */ -void dload_tramp_cleanup(struct dload_state *dlthis) -{ - struct tramp_info *tramp = &dlthis->tramp; - struct tramp_sym *cur_sym; - struct tramp_string *cur_string; - struct tramp_img_pkt *cur_tramp_pkt; - struct tramp_img_dup_pkt *cur_dup_pkt; - struct tramp_img_dup_relo *cur_dup_relo; - - /* If there were no tramps generated, just return */ - if (tramp->tramp_sect_next_addr == 0) - return; - - /* Destroy all tramp information */ - for (cur_sym = tramp->symbol_head; - cur_sym != NULL; cur_sym = tramp->symbol_head) { - tramp->symbol_head = cur_sym->next; - if (tramp->symbol_tail == cur_sym) - tramp->symbol_tail = NULL; - - dlthis->mysym->dload_deallocate(dlthis->mysym, cur_sym); - } - - if (tramp->final_sym_table != NULL) - dlthis->mysym->dload_deallocate(dlthis->mysym, - tramp->final_sym_table); - - for (cur_string = tramp->string_head; - cur_string != NULL; cur_string = tramp->string_head) { - tramp->string_head = cur_string->next; - if (tramp->string_tail == cur_string) - tramp->string_tail = NULL; - - dlthis->mysym->dload_deallocate(dlthis->mysym, cur_string); - } - - if (tramp->final_string_table != NULL) - dlthis->mysym->dload_deallocate(dlthis->mysym, - tramp->final_string_table); - - for (cur_tramp_pkt = tramp->tramp_pkts; - cur_tramp_pkt != NULL; cur_tramp_pkt = tramp->tramp_pkts) { - tramp->tramp_pkts = cur_tramp_pkt->next; - dlthis->mysym->dload_deallocate(dlthis->mysym, cur_tramp_pkt); - } - - for (cur_dup_pkt = tramp->dup_pkts; - cur_dup_pkt != NULL; cur_dup_pkt = tramp->dup_pkts) { - tramp->dup_pkts = cur_dup_pkt->next; - - for (cur_dup_relo = cur_dup_pkt->relo_chain; - cur_dup_relo != NULL; - cur_dup_relo = cur_dup_pkt->relo_chain) { - cur_dup_pkt->relo_chain = cur_dup_relo->next; - dlthis->mysym->dload_deallocate(dlthis->mysym, - cur_dup_relo); - } - - dlthis->mysym->dload_deallocate(dlthis->mysym, cur_dup_pkt); - } -} diff --git a/drivers/staging/tidspbridge/dynload/tramp_table_c6000.c b/drivers/staging/tidspbridge/dynload/tramp_table_c6000.c deleted file mode 100644 index 09cc64f213c0..000000000000 --- a/drivers/staging/tidspbridge/dynload/tramp_table_c6000.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - * tramp_table_c6000.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include "dload_internal.h" - -/* These are defined in coff.h, but may not be available on all platforms - so we'll go ahead and define them here. */ -#ifndef R_C60LO16 -#define R_C60LO16 0x54 /* C60: MVK Low Half Register */ -#define R_C60HI16 0x55 /* C60: MVKH/MVKLH High Half Register */ -#endif - -#define C6X_TRAMP_WORD_COUNT 8 -#define C6X_TRAMP_MAX_RELOS 8 - -/* THIS HASH FUNCTION MUST MATCH THE ONE reloc_table_c6000.c */ -#define HASH_FUNC(zz) (((((zz) + 1) * 1845UL) >> 11) & 63) - -/* THIS MUST MATCH reloc_record_t FOR A SYMBOL BASED RELO */ -struct c6000_relo_record { - s32 vaddr; - s32 symndx; -#ifndef _BIG_ENDIAN - u16 disp; - u16 type; -#else - u16 type; - u16 disp; -#endif -}; - -struct c6000_gen_code { - struct tramp_gen_code_hdr hdr; - u32 tramp_instrs[C6X_TRAMP_WORD_COUNT]; - struct c6000_relo_record relos[C6X_TRAMP_MAX_RELOS]; -}; - -/* Hash mapping for relos that can cause trampolines. */ -static const u16 tramp_map[] = { - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 0, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535, - 65535 -}; - -static const struct c6000_gen_code tramp_gen_info[] = { - /* Tramp caused by R_C60PCR21 */ - { - /* Header - 8 instructions, 2 relos */ - { - sizeof(u32) * C6X_TRAMP_WORD_COUNT, - 2, - FIELD_OFFSET(struct c6000_gen_code, relos) - }, - - /* Trampoline instructions */ - { - 0x053C54F7, /* STW.D2T2 B10, *sp--[2] */ - 0x0500002A, /* || MVK.S2 , B10 */ - 0x0500006A, /* MVKH.S2 , B10 */ - 0x00280362, /* B.S2 B10 */ - 0x053C52E6, /* LDW.D2T2 *++sp[2], B10 */ - 0x00006000, /* NOP 4 */ - 0x00000000, /* NOP */ - 0x00000000 /* NOP */ - }, - - /* Relocations */ - { - {4, 0, 0, R_C60LO16}, - {8, 0, 0, R_C60HI16}, - {0, 0, 0, 0x0000}, - {0, 0, 0, 0x0000}, - {0, 0, 0, 0x0000}, - {0, 0, 0, 0x0000}, - {0, 0, 0, 0x0000}, - {0, 0, 0, 0x0000} - } - } -}; - -/* TARGET SPECIFIC FUNCTIONS THAT MUST BE DEFINED */ -static u32 tramp_size_get(void) -{ - return sizeof(u32) * C6X_TRAMP_WORD_COUNT; -} - -static u32 tramp_img_pkt_size_get(void) -{ - return sizeof(struct c6000_gen_code); -} diff --git a/drivers/staging/tidspbridge/gen/gh.c b/drivers/staging/tidspbridge/gen/gh.c deleted file mode 100644 index 936470cb608e..000000000000 --- a/drivers/staging/tidspbridge/gen/gh.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - * gh.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -#include -#include - -struct gh_node { - struct hlist_node hl; - u8 data[0]; -}; - -#define GH_HASH_ORDER 8 - -struct gh_t_hash_tab { - u32 val_size; - DECLARE_HASHTABLE(hash_table, GH_HASH_ORDER); - u32 (*hash)(const void *key); - bool (*match)(const void *key, const void *value); - void (*delete)(void *key); -}; - -/* - * ======== gh_create ======== - */ - -struct gh_t_hash_tab *gh_create(u32 val_size, u32 (*hash)(const void *), - bool (*match)(const void *, const void *), - void (*delete)(void *)) -{ - struct gh_t_hash_tab *hash_tab; - - hash_tab = kzalloc(sizeof(struct gh_t_hash_tab), GFP_KERNEL); - if (!hash_tab) - return ERR_PTR(-ENOMEM); - - hash_init(hash_tab->hash_table); - - hash_tab->val_size = val_size; - hash_tab->hash = hash; - hash_tab->match = match; - hash_tab->delete = delete; - - return hash_tab; -} - -/* - * ======== gh_delete ======== - */ -void gh_delete(struct gh_t_hash_tab *hash_tab) -{ - struct gh_node *n; - struct hlist_node *tmp; - u32 i; - - if (hash_tab) { - hash_for_each_safe(hash_tab->hash_table, i, tmp, n, hl) { - hash_del(&n->hl); - if (hash_tab->delete) - hash_tab->delete(n->data); - kfree(n); - } - - kfree(hash_tab); - } -} - -/* - * ======== gh_find ======== - */ - -void *gh_find(struct gh_t_hash_tab *hash_tab, const void *key) -{ - struct gh_node *n; - u32 key_hash = hash_tab->hash(key); - - hash_for_each_possible(hash_tab->hash_table, n, hl, key_hash) { - if (hash_tab->match(key, n->data)) - return n->data; - } - - return ERR_PTR(-ENODATA); -} - -/* - * ======== gh_insert ======== - */ - -void *gh_insert(struct gh_t_hash_tab *hash_tab, const void *key, - const void *value) -{ - struct gh_node *n; - - n = kmalloc(sizeof(struct gh_node) + hash_tab->val_size, - GFP_KERNEL); - - if (!n) - return ERR_PTR(-ENOMEM); - - INIT_HLIST_NODE(&n->hl); - hash_add(hash_tab->hash_table, &n->hl, hash_tab->hash(key)); - memcpy(n->data, value, hash_tab->val_size); - - return n->data; -} - -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE -/** - * gh_iterate() - This function goes through all the elements in the hash table - * looking for the dsp symbols. - * @hash_tab: Hash table - * @callback: pointer to callback function - * @user_data: User data, contains the find_symbol_context pointer - * - */ -void gh_iterate(struct gh_t_hash_tab *hash_tab, - void (*callback)(void *, void *), void *user_data) -{ - struct gh_node *n; - u32 i; - - if (!hash_tab) - return; - - hash_for_each(hash_tab->hash_table, i, n, hl) - callback(&n->data, user_data); -} -#endif diff --git a/drivers/staging/tidspbridge/hw/EasiGlobal.h b/drivers/staging/tidspbridge/hw/EasiGlobal.h deleted file mode 100644 index e48d7f67c60a..000000000000 --- a/drivers/staging/tidspbridge/hw/EasiGlobal.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * EasiGlobal.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2007 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _EASIGLOBAL_H -#define _EASIGLOBAL_H -#include - -/* - * DEFINE: READ_ONLY, WRITE_ONLY & READ_WRITE - * - * DESCRIPTION: Defines used to describe register types for EASI-checker tests. - */ - -#define READ_ONLY 1 -#define WRITE_ONLY 2 -#define READ_WRITE 3 - -/* - * MACRO: _DEBUG_LEVEL1_EASI - * - * DESCRIPTION: A MACRO which can be used to indicate that a particular beach - * register access function was called. - * - * NOTE: We currently dont use this functionality. - */ -#define _DEBUG_LEVEL1_EASI(easi_num) ((void)0) - -#endif /* _EASIGLOBAL_H */ diff --git a/drivers/staging/tidspbridge/hw/MMUAccInt.h b/drivers/staging/tidspbridge/hw/MMUAccInt.h deleted file mode 100644 index 1cefca321d71..000000000000 --- a/drivers/staging/tidspbridge/hw/MMUAccInt.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * MMUAccInt.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2007 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _MMU_ACC_INT_H -#define _MMU_ACC_INT_H - -/* Mappings of level 1 EASI function numbers to function names */ - -#define EASIL1_MMUMMU_SYSCONFIG_READ_REGISTER32 (MMU_BASE_EASIL1 + 3) -#define EASIL1_MMUMMU_SYSCONFIG_IDLE_MODE_WRITE32 (MMU_BASE_EASIL1 + 17) -#define EASIL1_MMUMMU_SYSCONFIG_AUTO_IDLE_WRITE32 (MMU_BASE_EASIL1 + 39) -#define EASIL1_MMUMMU_IRQSTATUS_WRITE_REGISTER32 (MMU_BASE_EASIL1 + 51) -#define EASIL1_MMUMMU_IRQENABLE_READ_REGISTER32 (MMU_BASE_EASIL1 + 102) -#define EASIL1_MMUMMU_IRQENABLE_WRITE_REGISTER32 (MMU_BASE_EASIL1 + 103) -#define EASIL1_MMUMMU_WALKING_STTWL_RUNNING_READ32 (MMU_BASE_EASIL1 + 156) -#define EASIL1_MMUMMU_CNTLTWL_ENABLE_READ32 (MMU_BASE_EASIL1 + 174) -#define EASIL1_MMUMMU_CNTLTWL_ENABLE_WRITE32 (MMU_BASE_EASIL1 + 180) -#define EASIL1_MMUMMU_CNTLMMU_ENABLE_WRITE32 (MMU_BASE_EASIL1 + 190) -#define EASIL1_MMUMMU_FAULT_AD_READ_REGISTER32 (MMU_BASE_EASIL1 + 194) -#define EASIL1_MMUMMU_TTB_WRITE_REGISTER32 (MMU_BASE_EASIL1 + 198) -#define EASIL1_MMUMMU_LOCK_READ_REGISTER32 (MMU_BASE_EASIL1 + 203) -#define EASIL1_MMUMMU_LOCK_WRITE_REGISTER32 (MMU_BASE_EASIL1 + 204) -#define EASIL1_MMUMMU_LOCK_BASE_VALUE_READ32 (MMU_BASE_EASIL1 + 205) -#define EASIL1_MMUMMU_LOCK_CURRENT_VICTIM_READ32 (MMU_BASE_EASIL1 + 209) -#define EASIL1_MMUMMU_LOCK_CURRENT_VICTIM_WRITE32 (MMU_BASE_EASIL1 + 211) -#define EASIL1_MMUMMU_LOCK_CURRENT_VICTIM_SET32 (MMU_BASE_EASIL1 + 212) -#define EASIL1_MMUMMU_LD_TLB_READ_REGISTER32 (MMU_BASE_EASIL1 + 213) -#define EASIL1_MMUMMU_LD_TLB_WRITE_REGISTER32 (MMU_BASE_EASIL1 + 214) -#define EASIL1_MMUMMU_CAM_WRITE_REGISTER32 (MMU_BASE_EASIL1 + 226) -#define EASIL1_MMUMMU_RAM_WRITE_REGISTER32 (MMU_BASE_EASIL1 + 268) -#define EASIL1_MMUMMU_FLUSH_ENTRY_WRITE_REGISTER32 (MMU_BASE_EASIL1 + 322) - -/* Register offset address definitions */ -#define MMU_MMU_SYSCONFIG_OFFSET 0x10 -#define MMU_MMU_IRQSTATUS_OFFSET 0x18 -#define MMU_MMU_IRQENABLE_OFFSET 0x1c -#define MMU_MMU_WALKING_ST_OFFSET 0x40 -#define MMU_MMU_CNTL_OFFSET 0x44 -#define MMU_MMU_FAULT_AD_OFFSET 0x48 -#define MMU_MMU_TTB_OFFSET 0x4c -#define MMU_MMU_LOCK_OFFSET 0x50 -#define MMU_MMU_LD_TLB_OFFSET 0x54 -#define MMU_MMU_CAM_OFFSET 0x58 -#define MMU_MMU_RAM_OFFSET 0x5c -#define MMU_MMU_GFLUSH_OFFSET 0x60 -#define MMU_MMU_FLUSH_ENTRY_OFFSET 0x64 -/* Bitfield mask and offset declarations */ -#define MMU_MMU_SYSCONFIG_IDLE_MODE_MASK 0x18 -#define MMU_MMU_SYSCONFIG_IDLE_MODE_OFFSET 3 -#define MMU_MMU_SYSCONFIG_AUTO_IDLE_MASK 0x1 -#define MMU_MMU_SYSCONFIG_AUTO_IDLE_OFFSET 0 -#define MMU_MMU_WALKING_ST_TWL_RUNNING_MASK 0x1 -#define MMU_MMU_WALKING_ST_TWL_RUNNING_OFFSET 0 -#define MMU_MMU_CNTL_TWL_ENABLE_MASK 0x4 -#define MMU_MMU_CNTL_TWL_ENABLE_OFFSET 2 -#define MMU_MMU_CNTL_MMU_ENABLE_MASK 0x2 -#define MMU_MMU_CNTL_MMU_ENABLE_OFFSET 1 -#define MMU_MMU_LOCK_BASE_VALUE_MASK 0xfc00 -#define MMU_MMU_LOCK_BASE_VALUE_OFFSET 10 -#define MMU_MMU_LOCK_CURRENT_VICTIM_MASK 0x3f0 -#define MMU_MMU_LOCK_CURRENT_VICTIM_OFFSET 4 - -#endif /* _MMU_ACC_INT_H */ diff --git a/drivers/staging/tidspbridge/hw/MMURegAcM.h b/drivers/staging/tidspbridge/hw/MMURegAcM.h deleted file mode 100644 index ab1a16da731c..000000000000 --- a/drivers/staging/tidspbridge/hw/MMURegAcM.h +++ /dev/null @@ -1,225 +0,0 @@ -/* - * MMURegAcM.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2007 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _MMU_REG_ACM_H -#define _MMU_REG_ACM_H - -#include -#include - -#include "MMUAccInt.h" - -#if defined(USE_LEVEL_1_MACROS) - -#define MMUMMU_SYSCONFIG_READ_REGISTER32(base_address)\ - (_DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_SYSCONFIG_READ_REGISTER32),\ - __raw_readl((base_address)+MMU_MMU_SYSCONFIG_OFFSET)) - -#define MMUMMU_SYSCONFIG_IDLE_MODE_WRITE32(base_address, value)\ -{\ - const u32 offset = MMU_MMU_SYSCONFIG_OFFSET;\ - register u32 data = __raw_readl((base_address)+offset);\ - register u32 new_value = (value);\ - _DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_SYSCONFIG_IDLE_MODE_WRITE32);\ - data &= ~(MMU_MMU_SYSCONFIG_IDLE_MODE_MASK);\ - new_value <<= MMU_MMU_SYSCONFIG_IDLE_MODE_OFFSET;\ - new_value &= MMU_MMU_SYSCONFIG_IDLE_MODE_MASK;\ - new_value |= data;\ - __raw_writel(new_value, base_address+offset);\ -} - -#define MMUMMU_SYSCONFIG_AUTO_IDLE_WRITE32(base_address, value)\ -{\ - const u32 offset = MMU_MMU_SYSCONFIG_OFFSET;\ - register u32 data = __raw_readl((base_address)+offset);\ - register u32 new_value = (value);\ - _DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_SYSCONFIG_AUTO_IDLE_WRITE32);\ - data &= ~(MMU_MMU_SYSCONFIG_AUTO_IDLE_MASK);\ - new_value <<= MMU_MMU_SYSCONFIG_AUTO_IDLE_OFFSET;\ - new_value &= MMU_MMU_SYSCONFIG_AUTO_IDLE_MASK;\ - new_value |= data;\ - __raw_writel(new_value, base_address+offset);\ -} - -#define MMUMMU_IRQSTATUS_READ_REGISTER32(base_address)\ - (_DEBUG_LEVEL1_EASI(easil1_mmummu_irqstatus_read_register32),\ - __raw_readl((base_address)+MMU_MMU_IRQSTATUS_OFFSET)) - -#define MMUMMU_IRQSTATUS_WRITE_REGISTER32(base_address, value)\ -{\ - const u32 offset = MMU_MMU_IRQSTATUS_OFFSET;\ - register u32 new_value = (value);\ - _DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_IRQSTATUS_WRITE_REGISTER32);\ - __raw_writel(new_value, (base_address)+offset);\ -} - -#define MMUMMU_IRQENABLE_READ_REGISTER32(base_address)\ - (_DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_IRQENABLE_READ_REGISTER32),\ - __raw_readl((base_address)+MMU_MMU_IRQENABLE_OFFSET)) - -#define MMUMMU_IRQENABLE_WRITE_REGISTER32(base_address, value)\ -{\ - const u32 offset = MMU_MMU_IRQENABLE_OFFSET;\ - register u32 new_value = (value);\ - _DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_IRQENABLE_WRITE_REGISTER32);\ - __raw_writel(new_value, (base_address)+offset);\ -} - -#define MMUMMU_WALKING_STTWL_RUNNING_READ32(base_address)\ - (_DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_WALKING_STTWL_RUNNING_READ32),\ - (((__raw_readl(((base_address)+(MMU_MMU_WALKING_ST_OFFSET))))\ - & MMU_MMU_WALKING_ST_TWL_RUNNING_MASK) >>\ - MMU_MMU_WALKING_ST_TWL_RUNNING_OFFSET)) - -#define MMUMMU_CNTLTWL_ENABLE_READ32(base_address)\ - (_DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_CNTLTWL_ENABLE_READ32),\ - (((__raw_readl(((base_address)+(MMU_MMU_CNTL_OFFSET)))) &\ - MMU_MMU_CNTL_TWL_ENABLE_MASK) >>\ - MMU_MMU_CNTL_TWL_ENABLE_OFFSET)) - -#define MMUMMU_CNTLTWL_ENABLE_WRITE32(base_address, value)\ -{\ - const u32 offset = MMU_MMU_CNTL_OFFSET;\ - register u32 data = __raw_readl((base_address)+offset);\ - register u32 new_value = (value);\ - _DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_CNTLTWL_ENABLE_WRITE32);\ - data &= ~(MMU_MMU_CNTL_TWL_ENABLE_MASK);\ - new_value <<= MMU_MMU_CNTL_TWL_ENABLE_OFFSET;\ - new_value &= MMU_MMU_CNTL_TWL_ENABLE_MASK;\ - new_value |= data;\ - __raw_writel(new_value, base_address+offset);\ -} - -#define MMUMMU_CNTLMMU_ENABLE_WRITE32(base_address, value)\ -{\ - const u32 offset = MMU_MMU_CNTL_OFFSET;\ - register u32 data = __raw_readl((base_address)+offset);\ - register u32 new_value = (value);\ - _DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_CNTLMMU_ENABLE_WRITE32);\ - data &= ~(MMU_MMU_CNTL_MMU_ENABLE_MASK);\ - new_value <<= MMU_MMU_CNTL_MMU_ENABLE_OFFSET;\ - new_value &= MMU_MMU_CNTL_MMU_ENABLE_MASK;\ - new_value |= data;\ - __raw_writel(new_value, base_address+offset);\ -} - -#define MMUMMU_FAULT_AD_READ_REGISTER32(base_address)\ - (_DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_FAULT_AD_READ_REGISTER32),\ - __raw_readl((base_address)+MMU_MMU_FAULT_AD_OFFSET)) - -#define MMUMMU_TTB_WRITE_REGISTER32(base_address, value)\ -{\ - const u32 offset = MMU_MMU_TTB_OFFSET;\ - register u32 new_value = (value);\ - _DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_TTB_WRITE_REGISTER32);\ - __raw_writel(new_value, (base_address)+offset);\ -} - -#define MMUMMU_LOCK_READ_REGISTER32(base_address)\ - (_DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_LOCK_READ_REGISTER32),\ - __raw_readl((base_address)+MMU_MMU_LOCK_OFFSET)) - -#define MMUMMU_LOCK_WRITE_REGISTER32(base_address, value)\ -{\ - const u32 offset = MMU_MMU_LOCK_OFFSET;\ - register u32 new_value = (value);\ - _DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_LOCK_WRITE_REGISTER32);\ - __raw_writel(new_value, (base_address)+offset);\ -} - -#define MMUMMU_LOCK_BASE_VALUE_READ32(base_address)\ - (_DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_LOCK_BASE_VALUE_READ32),\ - (((__raw_readl(((base_address)+(MMU_MMU_LOCK_OFFSET)))) &\ - MMU_MMU_LOCK_BASE_VALUE_MASK) >>\ - MMU_MMU_LOCK_BASE_VALUE_OFFSET)) - -#define MMUMMU_LOCK_BASE_VALUE_WRITE32(base_address, value)\ -{\ - const u32 offset = MMU_MMU_LOCK_OFFSET;\ - register u32 data = __raw_readl((base_address)+offset);\ - register u32 new_value = (value);\ - _DEBUG_LEVEL1_EASI(easil1_mmummu_lock_base_value_write32);\ - data &= ~(MMU_MMU_LOCK_BASE_VALUE_MASK);\ - new_value <<= MMU_MMU_LOCK_BASE_VALUE_OFFSET;\ - new_value &= MMU_MMU_LOCK_BASE_VALUE_MASK;\ - new_value |= data;\ - __raw_writel(new_value, base_address+offset);\ -} - -#define MMUMMU_LOCK_CURRENT_VICTIM_READ32(base_address)\ - (_DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_LOCK_CURRENT_VICTIM_READ32),\ - (((__raw_readl(((base_address)+(MMU_MMU_LOCK_OFFSET)))) &\ - MMU_MMU_LOCK_CURRENT_VICTIM_MASK) >>\ - MMU_MMU_LOCK_CURRENT_VICTIM_OFFSET)) - -#define MMUMMU_LOCK_CURRENT_VICTIM_WRITE32(base_address, value)\ -{\ - const u32 offset = MMU_MMU_LOCK_OFFSET;\ - register u32 data = __raw_readl((base_address)+offset);\ - register u32 new_value = (value);\ - _DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_LOCK_CURRENT_VICTIM_WRITE32);\ - data &= ~(MMU_MMU_LOCK_CURRENT_VICTIM_MASK);\ - new_value <<= MMU_MMU_LOCK_CURRENT_VICTIM_OFFSET;\ - new_value &= MMU_MMU_LOCK_CURRENT_VICTIM_MASK;\ - new_value |= data;\ - __raw_writel(new_value, base_address+offset);\ -} - -#define MMUMMU_LOCK_CURRENT_VICTIM_SET32(var, value)\ - (_DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_LOCK_CURRENT_VICTIM_SET32),\ - (((var) & ~(MMU_MMU_LOCK_CURRENT_VICTIM_MASK)) |\ - (((value) << MMU_MMU_LOCK_CURRENT_VICTIM_OFFSET) &\ - MMU_MMU_LOCK_CURRENT_VICTIM_MASK))) - -#define MMUMMU_LD_TLB_READ_REGISTER32(base_address)\ - (_DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_LD_TLB_READ_REGISTER32),\ - __raw_readl((base_address)+MMU_MMU_LD_TLB_OFFSET)) - -#define MMUMMU_LD_TLB_WRITE_REGISTER32(base_address, value)\ -{\ - const u32 offset = MMU_MMU_LD_TLB_OFFSET;\ - register u32 new_value = (value);\ - _DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_LD_TLB_WRITE_REGISTER32);\ - __raw_writel(new_value, (base_address)+offset);\ -} - -#define MMUMMU_CAM_WRITE_REGISTER32(base_address, value)\ -{\ - const u32 offset = MMU_MMU_CAM_OFFSET;\ - register u32 new_value = (value);\ - _DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_CAM_WRITE_REGISTER32);\ - __raw_writel(new_value, (base_address)+offset);\ -} - -#define MMUMMU_RAM_WRITE_REGISTER32(base_address, value)\ -{\ - const u32 offset = MMU_MMU_RAM_OFFSET;\ - register u32 new_value = (value);\ - _DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_RAM_WRITE_REGISTER32);\ - __raw_writel(new_value, (base_address)+offset);\ -} - -#define MMUMMU_FLUSH_ENTRY_WRITE_REGISTER32(base_address, value)\ -{\ - const u32 offset = MMU_MMU_FLUSH_ENTRY_OFFSET;\ - register u32 new_value = (value);\ - _DEBUG_LEVEL1_EASI(EASIL1_MMUMMU_FLUSH_ENTRY_WRITE_REGISTER32);\ - __raw_writel(new_value, (base_address)+offset);\ -} - -#endif /* USE_LEVEL_1_MACROS */ - -#endif /* _MMU_REG_ACM_H */ diff --git a/drivers/staging/tidspbridge/hw/hw_defs.h b/drivers/staging/tidspbridge/hw/hw_defs.h deleted file mode 100644 index d5266d4c163f..000000000000 --- a/drivers/staging/tidspbridge/hw/hw_defs.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * hw_defs.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Global HW definitions - * - * Copyright (C) 2007 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _HW_DEFS_H -#define _HW_DEFS_H - -/* Page size */ -#define HW_PAGE_SIZE4KB 0x1000 -#define HW_PAGE_SIZE64KB 0x10000 -#define HW_PAGE_SIZE1MB 0x100000 -#define HW_PAGE_SIZE16MB 0x1000000 - -/* hw_status: return type for HW API */ -typedef long hw_status; - -/* Macro used to set and clear any bit */ -#define HW_CLEAR 0 -#define HW_SET 1 - -/* hw_endianism_t: Enumerated Type used to specify the endianism - * Do NOT change these values. They are used as bit fields. */ -enum hw_endianism_t { - HW_LITTLE_ENDIAN, - HW_BIG_ENDIAN -}; - -/* hw_element_size_t: Enumerated Type used to specify the element size - * Do NOT change these values. They are used as bit fields. */ -enum hw_element_size_t { - HW_ELEM_SIZE8BIT, - HW_ELEM_SIZE16BIT, - HW_ELEM_SIZE32BIT, - HW_ELEM_SIZE64BIT -}; - -/* hw_idle_mode_t: Enumerated Type used to specify Idle modes */ -enum hw_idle_mode_t { - HW_FORCE_IDLE, - HW_NO_IDLE, - HW_SMART_IDLE -}; - -#endif /* _HW_DEFS_H */ diff --git a/drivers/staging/tidspbridge/hw/hw_mmu.c b/drivers/staging/tidspbridge/hw/hw_mmu.c deleted file mode 100644 index 50244a474178..000000000000 --- a/drivers/staging/tidspbridge/hw/hw_mmu.c +++ /dev/null @@ -1,487 +0,0 @@ -/* - * hw_mmu.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * API definitions to setup MMU TLB and PTE - * - * Copyright (C) 2007 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -#include "MMURegAcM.h" -#include -#include -#include -#include - -#define MMU_BASE_VAL_MASK 0xFC00 -#define MMU_PAGE_MAX 3 -#define MMU_ELEMENTSIZE_MAX 3 -#define MMU_ADDR_MASK 0xFFFFF000 -#define MMU_TTB_MASK 0xFFFFC000 -#define MMU_SECTION_ADDR_MASK 0xFFF00000 -#define MMU_SSECTION_ADDR_MASK 0xFF000000 -#define MMU_PAGE_TABLE_MASK 0xFFFFFC00 -#define MMU_LARGE_PAGE_MASK 0xFFFF0000 -#define MMU_SMALL_PAGE_MASK 0xFFFFF000 - -#define MMU_LOAD_TLB 0x00000001 -#define MMU_GFLUSH 0x60 - -/* - * hw_mmu_page_size_t: Enumerated Type used to specify the MMU Page Size(SLSS) - */ -enum hw_mmu_page_size_t { - HW_MMU_SECTION, - HW_MMU_LARGE_PAGE, - HW_MMU_SMALL_PAGE, - HW_MMU_SUPERSECTION -}; - -/* - * FUNCTION : mmu_set_cam_entry - * - * INPUTS: - * - * Identifier : base_address - * Type : void __iomem * - * Description : Base Address of instance of MMU module - * - * Identifier : page_sz - * TypE : const u32 - * Description : It indicates the page size - * - * Identifier : preserved_bit - * Type : const u32 - * Description : It indicates the TLB entry is preserved entry - * or not - * - * Identifier : valid_bit - * Type : const u32 - * Description : It indicates the TLB entry is valid entry or not - * - * - * Identifier : virtual_addr_tag - * Type : const u32 - * Description : virtual Address - * - * RETURNS: - * - * Type : hw_status - * Description : 0 -- No errors occurred - * RET_BAD_NULL_PARAM -- A Pointer Parameter - * was set to NULL - * RET_PARAM_OUT_OF_RANGE -- Input Parameter out - * of Range - * - * PURPOSE: : Set MMU_CAM reg - * - * METHOD: : Check the Input parameters and set the CAM entry. - */ -static hw_status mmu_set_cam_entry(void __iomem *base_address, - const u32 page_sz, - const u32 preserved_bit, - const u32 valid_bit, - const u32 virtual_addr_tag); - -/* - * FUNCTION : mmu_set_ram_entry - * - * INPUTS: - * - * Identifier : base_address - * Type : void __iomem * - * Description : Base Address of instance of MMU module - * - * Identifier : physical_addr - * Type : const u32 - * Description : Physical Address to which the corresponding - * virtual Address shouldpoint - * - * Identifier : endianism - * Type : hw_endianism_t - * Description : endianism for the given page - * - * Identifier : element_size - * Type : hw_element_size_t - * Description : The element size ( 8,16, 32 or 64 bit) - * - * Identifier : mixed_size - * Type : hw_mmu_mixed_size_t - * Description : Element Size to follow CPU or TLB - * - * RETURNS: - * - * Type : hw_status - * Description : 0 -- No errors occurred - * RET_BAD_NULL_PARAM -- A Pointer Parameter - * was set to NULL - * RET_PARAM_OUT_OF_RANGE -- Input Parameter - * out of Range - * - * PURPOSE: : Set MMU_CAM reg - * - * METHOD: : Check the Input parameters and set the RAM entry. - */ -static hw_status mmu_set_ram_entry(void __iomem *base_address, - const u32 physical_addr, - enum hw_endianism_t endianism, - enum hw_element_size_t element_size, - enum hw_mmu_mixed_size_t mixed_size); - -/* HW FUNCTIONS */ - -hw_status hw_mmu_enable(void __iomem *base_address) -{ - hw_status status = 0; - - MMUMMU_CNTLMMU_ENABLE_WRITE32(base_address, HW_SET); - - return status; -} - -hw_status hw_mmu_disable(void __iomem *base_address) -{ - hw_status status = 0; - - MMUMMU_CNTLMMU_ENABLE_WRITE32(base_address, HW_CLEAR); - - return status; -} - -hw_status hw_mmu_num_locked_set(void __iomem *base_address, - u32 num_locked_entries) -{ - hw_status status = 0; - - MMUMMU_LOCK_BASE_VALUE_WRITE32(base_address, num_locked_entries); - - return status; -} - -hw_status hw_mmu_victim_num_set(void __iomem *base_address, - u32 victim_entry_num) -{ - hw_status status = 0; - - MMUMMU_LOCK_CURRENT_VICTIM_WRITE32(base_address, victim_entry_num); - - return status; -} - -hw_status hw_mmu_event_ack(void __iomem *base_address, u32 irq_mask) -{ - hw_status status = 0; - - MMUMMU_IRQSTATUS_WRITE_REGISTER32(base_address, irq_mask); - - return status; -} - -hw_status hw_mmu_event_disable(void __iomem *base_address, u32 irq_mask) -{ - hw_status status = 0; - u32 irq_reg; - - irq_reg = MMUMMU_IRQENABLE_READ_REGISTER32(base_address); - - MMUMMU_IRQENABLE_WRITE_REGISTER32(base_address, irq_reg & ~irq_mask); - - return status; -} - -hw_status hw_mmu_event_enable(void __iomem *base_address, u32 irq_mask) -{ - hw_status status = 0; - u32 irq_reg; - - irq_reg = MMUMMU_IRQENABLE_READ_REGISTER32(base_address); - - MMUMMU_IRQENABLE_WRITE_REGISTER32(base_address, irq_reg | irq_mask); - - return status; -} - -hw_status hw_mmu_event_status(void __iomem *base_address, u32 *irq_mask) -{ - hw_status status = 0; - - *irq_mask = MMUMMU_IRQSTATUS_READ_REGISTER32(base_address); - - return status; -} - -hw_status hw_mmu_fault_addr_read(void __iomem *base_address, u32 *addr) -{ - hw_status status = 0; - - /* read values from register */ - *addr = MMUMMU_FAULT_AD_READ_REGISTER32(base_address); - - return status; -} - -hw_status hw_mmu_ttb_set(void __iomem *base_address, u32 ttb_phys_addr) -{ - hw_status status = 0; - u32 load_ttb; - - load_ttb = ttb_phys_addr & ~0x7FUL; - /* write values to register */ - MMUMMU_TTB_WRITE_REGISTER32(base_address, load_ttb); - - return status; -} - -hw_status hw_mmu_twl_enable(void __iomem *base_address) -{ - hw_status status = 0; - - MMUMMU_CNTLTWL_ENABLE_WRITE32(base_address, HW_SET); - - return status; -} - -hw_status hw_mmu_twl_disable(void __iomem *base_address) -{ - hw_status status = 0; - - MMUMMU_CNTLTWL_ENABLE_WRITE32(base_address, HW_CLEAR); - - return status; -} - -hw_status hw_mmu_tlb_add(void __iomem *base_address, - u32 physical_addr, - u32 virtual_addr, - u32 page_sz, - u32 entry_num, - struct hw_mmu_map_attrs_t *map_attrs, - s8 preserved_bit, s8 valid_bit) -{ - hw_status status = 0; - u32 lock_reg; - u32 virtual_addr_tag; - enum hw_mmu_page_size_t mmu_pg_size; - - /*Check the input Parameters */ - switch (page_sz) { - case HW_PAGE_SIZE4KB: - mmu_pg_size = HW_MMU_SMALL_PAGE; - break; - - case HW_PAGE_SIZE64KB: - mmu_pg_size = HW_MMU_LARGE_PAGE; - break; - - case HW_PAGE_SIZE1MB: - mmu_pg_size = HW_MMU_SECTION; - break; - - case HW_PAGE_SIZE16MB: - mmu_pg_size = HW_MMU_SUPERSECTION; - break; - - default: - return -EINVAL; - } - - lock_reg = MMUMMU_LOCK_READ_REGISTER32(base_address); - - /* Generate the 20-bit tag from virtual address */ - virtual_addr_tag = ((virtual_addr & MMU_ADDR_MASK) >> 12); - - /* Write the fields in the CAM Entry Register */ - mmu_set_cam_entry(base_address, mmu_pg_size, preserved_bit, valid_bit, - virtual_addr_tag); - - /* Write the different fields of the RAM Entry Register */ - /* endianism of the page,Element Size of the page (8, 16, 32, 64 bit) */ - mmu_set_ram_entry(base_address, physical_addr, map_attrs->endianism, - map_attrs->element_size, map_attrs->mixed_size); - - /* Update the MMU Lock Register */ - /* currentVictim between lockedBaseValue and (MMU_Entries_Number - 1) */ - MMUMMU_LOCK_CURRENT_VICTIM_WRITE32(base_address, entry_num); - - /* Enable loading of an entry in TLB by writing 1 - into LD_TLB_REG register */ - MMUMMU_LD_TLB_WRITE_REGISTER32(base_address, MMU_LOAD_TLB); - - MMUMMU_LOCK_WRITE_REGISTER32(base_address, lock_reg); - - return status; -} - -hw_status hw_mmu_pte_set(const u32 pg_tbl_va, - u32 physical_addr, - u32 virtual_addr, - u32 page_sz, struct hw_mmu_map_attrs_t *map_attrs) -{ - hw_status status = 0; - u32 pte_addr, pte_val; - s32 num_entries = 1; - - switch (page_sz) { - case HW_PAGE_SIZE4KB: - pte_addr = hw_mmu_pte_addr_l2(pg_tbl_va, - virtual_addr & - MMU_SMALL_PAGE_MASK); - pte_val = - ((physical_addr & MMU_SMALL_PAGE_MASK) | - (map_attrs->endianism << 9) | (map_attrs-> - element_size << 4) | - (map_attrs->mixed_size << 11) | 2); - break; - - case HW_PAGE_SIZE64KB: - num_entries = 16; - pte_addr = hw_mmu_pte_addr_l2(pg_tbl_va, - virtual_addr & - MMU_LARGE_PAGE_MASK); - pte_val = - ((physical_addr & MMU_LARGE_PAGE_MASK) | - (map_attrs->endianism << 9) | (map_attrs-> - element_size << 4) | - (map_attrs->mixed_size << 11) | 1); - break; - - case HW_PAGE_SIZE1MB: - pte_addr = hw_mmu_pte_addr_l1(pg_tbl_va, - virtual_addr & - MMU_SECTION_ADDR_MASK); - pte_val = - ((((physical_addr & MMU_SECTION_ADDR_MASK) | - (map_attrs->endianism << 15) | (map_attrs-> - element_size << 10) | - (map_attrs->mixed_size << 17)) & ~0x40000) | 0x2); - break; - - case HW_PAGE_SIZE16MB: - num_entries = 16; - pte_addr = hw_mmu_pte_addr_l1(pg_tbl_va, - virtual_addr & - MMU_SSECTION_ADDR_MASK); - pte_val = - (((physical_addr & MMU_SSECTION_ADDR_MASK) | - (map_attrs->endianism << 15) | (map_attrs-> - element_size << 10) | - (map_attrs->mixed_size << 17) - ) | 0x40000 | 0x2); - break; - - case HW_MMU_COARSE_PAGE_SIZE: - pte_addr = hw_mmu_pte_addr_l1(pg_tbl_va, - virtual_addr & - MMU_SECTION_ADDR_MASK); - pte_val = (physical_addr & MMU_PAGE_TABLE_MASK) | 1; - break; - - default: - return -EINVAL; - } - - while (--num_entries >= 0) - ((u32 *) pte_addr)[num_entries] = pte_val; - - return status; -} - -hw_status hw_mmu_pte_clear(const u32 pg_tbl_va, u32 virtual_addr, u32 page_size) -{ - hw_status status = 0; - u32 pte_addr; - s32 num_entries = 1; - - switch (page_size) { - case HW_PAGE_SIZE4KB: - pte_addr = hw_mmu_pte_addr_l2(pg_tbl_va, - virtual_addr & - MMU_SMALL_PAGE_MASK); - break; - - case HW_PAGE_SIZE64KB: - num_entries = 16; - pte_addr = hw_mmu_pte_addr_l2(pg_tbl_va, - virtual_addr & - MMU_LARGE_PAGE_MASK); - break; - - case HW_PAGE_SIZE1MB: - case HW_MMU_COARSE_PAGE_SIZE: - pte_addr = hw_mmu_pte_addr_l1(pg_tbl_va, - virtual_addr & - MMU_SECTION_ADDR_MASK); - break; - - case HW_PAGE_SIZE16MB: - num_entries = 16; - pte_addr = hw_mmu_pte_addr_l1(pg_tbl_va, - virtual_addr & - MMU_SSECTION_ADDR_MASK); - break; - - default: - return -EINVAL; - } - - while (--num_entries >= 0) - ((u32 *) pte_addr)[num_entries] = 0; - - return status; -} - -/* mmu_set_cam_entry */ -static hw_status mmu_set_cam_entry(void __iomem *base_address, - const u32 page_sz, - const u32 preserved_bit, - const u32 valid_bit, - const u32 virtual_addr_tag) -{ - hw_status status = 0; - u32 mmu_cam_reg; - - mmu_cam_reg = (virtual_addr_tag << 12); - mmu_cam_reg = (mmu_cam_reg) | (page_sz) | (valid_bit << 2) | - (preserved_bit << 3); - - /* write values to register */ - MMUMMU_CAM_WRITE_REGISTER32(base_address, mmu_cam_reg); - - return status; -} - -/* mmu_set_ram_entry */ -static hw_status mmu_set_ram_entry(void __iomem *base_address, - const u32 physical_addr, - enum hw_endianism_t endianism, - enum hw_element_size_t element_size, - enum hw_mmu_mixed_size_t mixed_size) -{ - hw_status status = 0; - u32 mmu_ram_reg; - - mmu_ram_reg = (physical_addr & MMU_ADDR_MASK); - mmu_ram_reg = (mmu_ram_reg) | ((endianism << 9) | (element_size << 7) | - (mixed_size << 6)); - - /* write values to register */ - MMUMMU_RAM_WRITE_REGISTER32(base_address, mmu_ram_reg); - - return status; - -} - -void hw_mmu_tlb_flush_all(void __iomem *base) -{ - __raw_writel(1, base + MMU_GFLUSH); -} diff --git a/drivers/staging/tidspbridge/hw/hw_mmu.h b/drivers/staging/tidspbridge/hw/hw_mmu.h deleted file mode 100644 index 1c50bb36edfe..000000000000 --- a/drivers/staging/tidspbridge/hw/hw_mmu.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * hw_mmu.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * MMU types and API declarations - * - * Copyright (C) 2007 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _HW_MMU_H -#define _HW_MMU_H - -#include - -/* Bitmasks for interrupt sources */ -#define HW_MMU_TRANSLATION_FAULT 0x2 -#define HW_MMU_ALL_INTERRUPTS 0x1F - -#define HW_MMU_COARSE_PAGE_SIZE 0x400 - -/* hw_mmu_mixed_size_t: Enumerated Type used to specify whether to follow - CPU/TLB Element size */ -enum hw_mmu_mixed_size_t { - HW_MMU_TLBES, - HW_MMU_CPUES -}; - -/* hw_mmu_map_attrs_t: Struct containing MMU mapping attributes */ -struct hw_mmu_map_attrs_t { - enum hw_endianism_t endianism; - enum hw_element_size_t element_size; - enum hw_mmu_mixed_size_t mixed_size; - bool donotlockmpupage; -}; - -extern hw_status hw_mmu_enable(void __iomem *base_address); - -extern hw_status hw_mmu_disable(void __iomem *base_address); - -extern hw_status hw_mmu_num_locked_set(void __iomem *base_address, - u32 num_locked_entries); - -extern hw_status hw_mmu_victim_num_set(void __iomem *base_address, - u32 victim_entry_num); - -/* For MMU faults */ -extern hw_status hw_mmu_event_ack(void __iomem *base_address, - u32 irq_mask); - -extern hw_status hw_mmu_event_disable(void __iomem *base_address, - u32 irq_mask); - -extern hw_status hw_mmu_event_enable(void __iomem *base_address, - u32 irq_mask); - -extern hw_status hw_mmu_event_status(void __iomem *base_address, - u32 *irq_mask); - -extern hw_status hw_mmu_fault_addr_read(void __iomem *base_address, - u32 *addr); - -/* Set the TT base address */ -extern hw_status hw_mmu_ttb_set(void __iomem *base_address, - u32 ttb_phys_addr); - -extern hw_status hw_mmu_twl_enable(void __iomem *base_address); - -extern hw_status hw_mmu_twl_disable(void __iomem *base_address); - -extern hw_status hw_mmu_tlb_add(void __iomem *base_address, - u32 physical_addr, - u32 virtual_addr, - u32 page_sz, - u32 entry_num, - struct hw_mmu_map_attrs_t *map_attrs, - s8 preserved_bit, s8 valid_bit); - -/* For PTEs */ -extern hw_status hw_mmu_pte_set(const u32 pg_tbl_va, - u32 physical_addr, - u32 virtual_addr, - u32 page_sz, - struct hw_mmu_map_attrs_t *map_attrs); - -extern hw_status hw_mmu_pte_clear(const u32 pg_tbl_va, - u32 virtual_addr, u32 page_size); - -void hw_mmu_tlb_flush_all(void __iomem *base); - -static inline u32 hw_mmu_pte_addr_l1(u32 l1_base, u32 va) -{ - u32 pte_addr; - u32 va31_to20; - - va31_to20 = va >> (20 - 2); /* Left-shift by 2 here itself */ - va31_to20 &= 0xFFFFFFFCUL; - pte_addr = l1_base + va31_to20; - - return pte_addr; -} - -static inline u32 hw_mmu_pte_addr_l2(u32 l2_base, u32 va) -{ - u32 pte_addr; - - pte_addr = (l2_base & 0xFFFFFC00) | ((va >> 10) & 0x3FC); - - return pte_addr; -} - -static inline u32 hw_mmu_pte_coarse_l1(u32 pte_val) -{ - u32 pte_coarse; - - pte_coarse = pte_val & 0xFFFFFC00; - - return pte_coarse; -} - -static inline u32 hw_mmu_pte_size_l1(u32 pte_val) -{ - u32 pte_size = 0; - - if ((pte_val & 0x3) == 0x1) { - /* Points to L2 PT */ - pte_size = HW_MMU_COARSE_PAGE_SIZE; - } - - if ((pte_val & 0x3) == 0x2) { - if (pte_val & (1 << 18)) - pte_size = HW_PAGE_SIZE16MB; - else - pte_size = HW_PAGE_SIZE1MB; - } - - return pte_size; -} - -static inline u32 hw_mmu_pte_size_l2(u32 pte_val) -{ - u32 pte_size = 0; - - if (pte_val & 0x2) - pte_size = HW_PAGE_SIZE4KB; - else if (pte_val & 0x1) - pte_size = HW_PAGE_SIZE64KB; - - return pte_size; -} - -#endif /* _HW_MMU_H */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/_chnl_sm.h b/drivers/staging/tidspbridge/include/dspbridge/_chnl_sm.h deleted file mode 100644 index cc95a18f1db9..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/_chnl_sm.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - * _chnl_sm.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Private header file defining channel manager and channel objects for - * a shared memory channel driver. - * - * Shared between the modules implementing the shared memory channel class - * library. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _CHNL_SM_ -#define _CHNL_SM_ - -#include -#include - -#include -#include - -/* - * These target side symbols define the beginning and ending addresses - * of shared memory buffer. They are defined in the *cfg.cmd file by - * cdb code. - */ -#define CHNL_SHARED_BUFFER_BASE_SYM "_SHM_BEG" -#define CHNL_SHARED_BUFFER_LIMIT_SYM "_SHM_END" -#define BRIDGEINIT_BIOSGPTIMER "_BRIDGEINIT_BIOSGPTIMER" -#define BRIDGEINIT_LOADMON_GPTIMER "_BRIDGEINIT_LOADMON_GPTIMER" - -#ifndef _CHNL_WORDSIZE -#define _CHNL_WORDSIZE 4 /* default _CHNL_WORDSIZE is 2 bytes/word */ -#endif - -#define MAXOPPS 16 - -/* Shared memory config options */ -#define SHM_CURROPP 0 /* Set current OPP in shm */ -#define SHM_OPPINFO 1 /* Set dsp voltage and freq table values */ -#define SHM_GETOPP 2 /* Get opp requested by DSP */ - -struct opp_table_entry { - u32 voltage; - u32 frequency; - u32 min_freq; - u32 max_freq; -}; - -struct opp_struct { - u32 curr_opp_pt; - u32 num_opp_pts; - struct opp_table_entry opp_point[MAXOPPS]; -}; - -/* Request to MPU */ -struct opp_rqst_struct { - u32 rqst_dsp_freq; - u32 rqst_opp_pt; -}; - -/* Info to MPU */ -struct load_mon_struct { - u32 curr_dsp_load; - u32 curr_dsp_freq; - u32 pred_dsp_load; - u32 pred_dsp_freq; -}; - -/* Structure in shared between DSP and PC for communication. */ -struct shm { - u32 dsp_free_mask; /* Written by DSP, read by PC. */ - u32 host_free_mask; /* Written by PC, read by DSP */ - - u32 input_full; /* Input channel has unread data. */ - u32 input_id; /* Channel for which input is available. */ - u32 input_size; /* Size of data block (in DSP words). */ - - u32 output_full; /* Output channel has unread data. */ - u32 output_id; /* Channel for which output is available. */ - u32 output_size; /* Size of data block (in DSP words). */ - - u32 arg; /* Arg for Issue/Reclaim (23 bits for 55x). */ - u32 resvd; /* Keep structure size even for 32-bit DSPs */ - - /* Operating Point structure */ - struct opp_struct opp_table_struct; - /* Operating Point Request structure */ - struct opp_rqst_struct opp_request; - /* load monitor information structure */ - struct load_mon_struct load_mon_info; - /* Flag for WDT enable/disable F/I clocks */ - u32 wdt_setclocks; - u32 wdt_overflow; /* WDT overflow time */ - char dummy[176]; /* padding to 256 byte boundary */ - u32 shm_dbg_var[64]; /* shared memory debug variables */ -}; - - /* Channel Manager: only one created per board: */ -struct chnl_mgr { - /* Function interface to Bridge driver */ - struct bridge_drv_interface *intf_fxns; - struct io_mgr *iomgr; /* IO manager */ - /* Device this board represents */ - struct dev_object *dev_obj; - - /* These fields initialized in bridge_chnl_create(): */ - u32 output_mask; /* Host output channels w/ full buffers */ - u32 last_output; /* Last output channel fired from DPC */ - /* Critical section object handle */ - spinlock_t chnl_mgr_lock; - u32 word_size; /* Size in bytes of DSP word */ - u8 max_channels; /* Total number of channels */ - u8 open_channels; /* Total number of open channels */ - struct chnl_object **channels; /* Array of channels */ - u8 type; /* Type of channel class library */ - /* If no shm syms, return for CHNL_Open */ - int chnl_open_status; -}; - -/* - * Channel: up to CHNL_MAXCHANNELS per board or if DSP-DMA supported then - * up to CHNL_MAXCHANNELS + CHNL_MAXDDMACHNLS per board. - */ -struct chnl_object { - /* Pointer back to channel manager */ - struct chnl_mgr *chnl_mgr_obj; - u32 chnl_id; /* Channel id */ - u8 state; /* Current channel state */ - s8 chnl_mode; /* Chnl mode and attributes */ - /* Chnl I/O completion event (user mode) */ - void *user_event; - /* Abstract synchronization object */ - struct sync_object *sync_event; - u32 process; /* Process which created this channel */ - u32 cb_arg; /* Argument to use with callback */ - struct list_head io_requests; /* List of IOR's to driver */ - s32 cio_cs; /* Number of IOC's in queue */ - s32 cio_reqs; /* Number of IORequests in queue */ - s32 chnl_packets; /* Initial number of free Irps */ - /* List of IOC's from driver */ - struct list_head io_completions; - struct list_head free_packets_list; /* List of free Irps */ - struct ntfy_object *ntfy_obj; - u32 bytes_moved; /* Total number of bytes transferred */ - - /* For DSP-DMA */ - - /* Type of chnl transport:CHNL_[PCPY][DDMA] */ - u32 chnl_type; -}; - -/* I/O Request/completion packet: */ -struct chnl_irp { - struct list_head link; /* Link to next CHIRP in queue. */ - /* Buffer to be filled/emptied. (User) */ - u8 *host_user_buf; - /* Buffer to be filled/emptied. (System) */ - u8 *host_sys_buf; - u32 arg; /* Issue/Reclaim argument. */ - u32 dsp_tx_addr; /* Transfer address on DSP side. */ - u32 byte_size; /* Bytes transferred. */ - u32 buf_size; /* Actual buffer size when allocated. */ - u32 status; /* Status of IO completion. */ -}; - -#endif /* _CHNL_SM_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/brddefs.h b/drivers/staging/tidspbridge/include/dspbridge/brddefs.h deleted file mode 100644 index 725d7b37414c..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/brddefs.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * brddefs.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Global BRD constants and types, shared between DSP API and Bridge driver. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef BRDDEFS_ -#define BRDDEFS_ - -/* platform status values */ -#define BRD_STOPPED 0x0 /* No Monitor Loaded, Not running. */ -#define BRD_IDLE 0x1 /* Monitor Loaded, but suspended. */ -#define BRD_RUNNING 0x2 /* Monitor loaded, and executing. */ -#define BRD_UNKNOWN 0x3 /* Board state is indeterminate. */ -#define BRD_LOADED 0x5 -#define BRD_SLEEP_TRANSITION 0x6 /* Sleep transition in progress */ -#define BRD_HIBERNATION 0x7 /* MPU initiated hibernation */ -#define BRD_RETENTION 0x8 /* Retention mode */ -#define BRD_DSP_HIBERNATION 0x9 /* DSP initiated hibernation */ -#define BRD_ERROR 0xA /* Board state is Error */ - -/* BRD Object */ -struct brd_object; - -#endif /* BRDDEFS_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/cfgdefs.h b/drivers/staging/tidspbridge/include/dspbridge/cfgdefs.h deleted file mode 100644 index b32c75673ab4..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/cfgdefs.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * cfgdefs.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Global CFG constants and types, shared between DSP API and Bridge driver. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef CFGDEFS_ -#define CFGDEFS_ - -/* Host Resources: */ -#define CFG_MAXMEMREGISTERS 9 - -/* IRQ flag */ -#define CFG_IRQSHARED 0x01 /* IRQ can be shared */ - -/* A platform-related device handle: */ -struct cfg_devnode; - -/* - * Host resource structure. - */ -struct cfg_hostres { - u32 num_mem_windows; /* Set to default */ - /* This is the base.memory */ - u32 mem_base[CFG_MAXMEMREGISTERS]; /* shm virtual address */ - u32 mem_length[CFG_MAXMEMREGISTERS]; /* Length of the Base */ - u32 mem_phys[CFG_MAXMEMREGISTERS]; /* shm Physical address */ - u8 birq_registers; /* IRQ Number */ - u8 birq_attrib; /* IRQ Attribute */ - u32 offset_for_monitor; /* The Shared memory starts from - * mem_base + this offset */ - /* - * Info needed by NODE for allocating channels to communicate with RMS: - * chnl_offset: Offset of RMS channels. Lower channels are - * reserved. - * chnl_buf_size: Size of channel buffer to send to RMS - * num_chnls: Total number of channels - * (including reserved). - */ - u32 chnl_offset; - u32 chnl_buf_size; - u32 num_chnls; - void __iomem *per_base; - void __iomem *per_pm_base; - void __iomem *core_pm_base; - void __iomem *dmmu_base; -}; - -#endif /* CFGDEFS_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/chnl.h b/drivers/staging/tidspbridge/include/dspbridge/chnl.h deleted file mode 100644 index 9b018b1f9bf3..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/chnl.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * chnl.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP API channel interface: multiplexes data streams through the single - * physical link managed by a Bridge driver. - * - * See DSP API chnl.h for more details. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef CHNL_ -#define CHNL_ - -#include - -/* - * ======== chnl_create ======== - * Purpose: - * Create a channel manager object, responsible for opening new channels - * and closing old ones for a given board. - * Parameters: - * channel_mgr: Location to store a channel manager object on output. - * hdev_obj: Handle to a device object. - * mgr_attrts: Channel manager attributes. - * mgr_attrts->max_channels: Max channels - * mgr_attrts->birq: Channel's I/O IRQ number. - * mgr_attrts->irq_shared: TRUE if the IRQ is shareable. - * mgr_attrts->word_size: DSP Word size in equivalent PC bytes.. - * Returns: - * 0: Success; - * -EFAULT: hdev_obj is invalid. - * -EINVAL: max_channels is 0. - * Invalid DSP word size (must be > 0). - * Invalid base address for DSP communications. - * -ENOMEM: Insufficient memory for requested resources. - * -EIO: Unable to plug channel ISR for configured IRQ. - * -ECHRNG: This manager cannot handle this many channels. - * -EEXIST: Channel manager already exists for this device. - * Requires: - * channel_mgr != NULL. - * mgr_attrts != NULL. - * Ensures: - * 0: Subsequent calls to chnl_create() for the same - * board without an intervening call to - * chnl_destroy() will fail. - */ -extern int chnl_create(struct chnl_mgr **channel_mgr, - struct dev_object *hdev_obj, - const struct chnl_mgrattrs *mgr_attrts); - -/* - * ======== chnl_destroy ======== - * Purpose: - * Close all open channels, and destroy the channel manager. - * Parameters: - * hchnl_mgr: Channel manager object. - * Returns: - * 0: Success. - * -EFAULT: hchnl_mgr was invalid. - * Requires: - * Ensures: - * 0: Cancels I/O on each open channel. - * Closes each open channel. - * chnl_create may subsequently be called for the - * same board. - */ -extern int chnl_destroy(struct chnl_mgr *hchnl_mgr); - -#endif /* CHNL_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/chnldefs.h b/drivers/staging/tidspbridge/include/dspbridge/chnldefs.h deleted file mode 100644 index cb67c309b6ca..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/chnldefs.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * chnldefs.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * System-wide channel objects and constants. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef CHNLDEFS_ -#define CHNLDEFS_ - -/* Channel id option. */ -#define CHNL_PICKFREE (~0UL) /* Let manager pick a free channel. */ - -/* Channel modes */ -#define CHNL_MODETODSP 0 /* Data streaming to the DSP. */ -#define CHNL_MODEFROMDSP 1 /* Data streaming from the DSP. */ - -/* GetIOCompletion flags */ -#define CHNL_IOCINFINITE 0xffffffff /* Wait forever for IO completion. */ -#define CHNL_IOCNOWAIT 0x0 /* Dequeue an IOC, if available. */ - -/* IO Completion Record status: */ -#define CHNL_IOCSTATCOMPLETE 0x0000 /* IO Completed. */ -#define CHNL_IOCSTATCANCEL 0x0002 /* IO was cancelled */ -#define CHNL_IOCSTATTIMEOUT 0x0008 /* Wait for IOC timed out. */ -#define CHNL_IOCSTATEOS 0x8000 /* End Of Stream reached. */ - -/* Macros for checking I/O Completion status: */ -#define CHNL_IS_IO_COMPLETE(ioc) (!(ioc.status & ~CHNL_IOCSTATEOS)) -#define CHNL_IS_IO_CANCELLED(ioc) (ioc.status & CHNL_IOCSTATCANCEL) -#define CHNL_IS_TIMED_OUT(ioc) (ioc.status & CHNL_IOCSTATTIMEOUT) - -/* Channel attributes: */ -struct chnl_attr { - u32 uio_reqs; /* Max # of preallocated I/O requests. */ - void *event_obj; /* User supplied auto-reset event object. */ - char *str_event_name; /* Ptr to name of user event object. */ - void *reserved1; /* Reserved for future use. */ - u32 reserved2; /* Reserved for future use. */ - -}; - -/* I/O completion record: */ -struct chnl_ioc { - void *buf; /* Buffer to be filled/emptied. */ - u32 byte_size; /* Bytes transferred. */ - u32 buf_size; /* Actual buffer size in bytes */ - u32 status; /* Status of IO completion. */ - u32 arg; /* User argument associated with buf. */ -}; - -#endif /* CHNLDEFS_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/chnlpriv.h b/drivers/staging/tidspbridge/include/dspbridge/chnlpriv.h deleted file mode 100644 index 4114c79e2466..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/chnlpriv.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * chnlpriv.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Private channel header shared between DSPSYS, DSPAPI and - * Bridge driver modules. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef CHNLPRIV_ -#define CHNLPRIV_ - -#include -#include -#include - -/* Channel manager limits: */ -#define CHNL_MAXCHANNELS 32 /* Max channels available per transport */ - -/* - * Trans port channel Id definitions:(must match dsp-side). - * - * For CHNL_MAXCHANNELS = 16: - * - * ChnlIds: - * 0-15 (PCPY) - transport 0) - * 16-31 (DDMA) - transport 1) - * 32-47 (ZCPY) - transport 2) - */ -#define CHNL_PCPY 0 /* Proc-copy transport 0 */ - -/* Higher level channel states: */ -#define CHNL_STATEREADY 0 /* Channel ready for I/O. */ -#define CHNL_STATECANCEL 1 /* I/O was cancelled. */ -#define CHNL_STATEEOS 2 /* End Of Stream reached. */ - -/* Macros for checking mode: */ -#define CHNL_IS_INPUT(mode) (mode & CHNL_MODEFROMDSP) -#define CHNL_IS_OUTPUT(mode) (!CHNL_IS_INPUT(mode)) - -/* Types of channel class libraries: */ -#define CHNL_TYPESM 1 /* Shared memory driver. */ - -/* Channel info. */ -struct chnl_info { - struct chnl_mgr *chnl_mgr; /* Owning channel manager. */ - u32 cnhl_id; /* Channel ID. */ - void *event_obj; /* Channel I/O completion event. */ - /*Abstraction of I/O completion event. */ - struct sync_object *sync_event; - s8 mode; /* Channel mode. */ - u8 state; /* Current channel state. */ - u32 bytes_tx; /* Total bytes transferred. */ - u32 cio_cs; /* Number of IOCs in queue. */ - u32 cio_reqs; /* Number of IO Requests in queue. */ - u32 process; /* Process owning this channel. */ -}; - -/* Channel manager info: */ -struct chnl_mgrinfo { - u8 type; /* Type of channel class library. */ - /* Channel handle, given the channel id. */ - struct chnl_object *chnl_obj; - u8 open_channels; /* Number of open channels. */ - u8 max_channels; /* total # of chnls supported */ -}; - -/* Channel Manager Attrs: */ -struct chnl_mgrattrs { - /* Max number of channels this manager can use. */ - u8 max_channels; - u32 word_size; /* DSP Word size. */ -}; - -#endif /* CHNLPRIV_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/clk.h b/drivers/staging/tidspbridge/include/dspbridge/clk.h deleted file mode 100644 index 685341c50693..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/clk.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * clk.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Provides Clock functions. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _CLK_H -#define _CLK_H - -enum dsp_clk_id { - DSP_CLK_IVA2 = 0, - DSP_CLK_GPT5, - DSP_CLK_GPT6, - DSP_CLK_GPT7, - DSP_CLK_GPT8, - DSP_CLK_WDT3, - DSP_CLK_MCBSP1, - DSP_CLK_MCBSP2, - DSP_CLK_MCBSP3, - DSP_CLK_MCBSP4, - DSP_CLK_MCBSP5, - DSP_CLK_SSI, - DSP_CLK_NOT_DEFINED -}; - -/* - * ======== dsp_clk_exit ======== - * Purpose: - * Discontinue usage of module; free resources when reference count - * reaches 0. - * Parameters: - * Returns: - * Requires: - * CLK initialized. - * Ensures: - * Resources used by module are freed when cRef reaches zero. - */ -extern void dsp_clk_exit(void); - -/* - * ======== dsp_clk_init ======== - * Purpose: - * Initializes private state of CLK module. - * Parameters: - * Returns: - * TRUE if initialized; FALSE if error occurred. - * Requires: - * Ensures: - * CLK initialized. - */ -extern void dsp_clk_init(void); - -void dsp_gpt_wait_overflow(short int clk_id, unsigned int load); - -/* - * ======== dsp_clk_enable ======== - * Purpose: - * Enables the clock requested. - * Parameters: - * Returns: - * 0: Success. - * -EPERM: Error occurred while enabling the clock. - * Requires: - * Ensures: - */ -extern int dsp_clk_enable(enum dsp_clk_id clk_id); - -u32 dsp_clock_enable_all(u32 dsp_per_clocks); - -/* - * ======== dsp_clk_disable ======== - * Purpose: - * Disables the clock requested. - * Parameters: - * Returns: - * 0: Success. - * -EPERM: Error occurred while disabling the clock. - * Requires: - * Ensures: - */ -extern int dsp_clk_disable(enum dsp_clk_id clk_id); - -extern u32 dsp_clk_get_iva2_rate(void); - -u32 dsp_clock_disable_all(u32 dsp_per_clocks); - -extern void ssi_clk_prepare(bool FLAG); - -#endif /* _SYNC_H */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/cmm.h b/drivers/staging/tidspbridge/include/dspbridge/cmm.h deleted file mode 100644 index 2adf9ecdf07f..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/cmm.h +++ /dev/null @@ -1,337 +0,0 @@ -/* - * cmm.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * The Communication Memory Management(CMM) module provides shared memory - * management services for DSP/BIOS Bridge data streaming and messaging. - * Multiple shared memory segments can be registered with CMM. Memory is - * coelesced back to the appropriate pool when a buffer is freed. - * - * The CMM_Xlator[xxx] functions are used for node messaging and data - * streaming address translation to perform zero-copy inter-processor - * data transfer(GPP<->DSP). A "translator" object is created for a node or - * stream object that contains per thread virtual address information. This - * translator info is used at runtime to perform SM address translation - * to/from the DSP address space. - * - * Notes: - * cmm_xlator_alloc_buf - Used by Node and Stream modules for SM address - * translation. - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef CMM_ -#define CMM_ - -#include - -#include -#include - -/* - * ======== cmm_calloc_buf ======== - * Purpose: - * Allocate memory buffers that can be used for data streaming or - * messaging. - * Parameters: - * hcmm_mgr: Cmm Mgr handle. - * usize: Number of bytes to allocate. - * pattr: Attributes of memory to allocate. - * pp_buf_va: Address of where to place VA. - * Returns: - * Pointer to a zero'd block of SM memory; - * NULL if memory couldn't be allocated, - * or if byte_size == 0, - * Requires: - * Valid hcmm_mgr. - * CMM initialized. - * Ensures: - * The returned pointer, if not NULL, points to a valid memory block of - * the size requested. - * - */ -extern void *cmm_calloc_buf(struct cmm_object *hcmm_mgr, - u32 usize, struct cmm_attrs *pattrs, - void **pp_buf_va); - -/* - * ======== cmm_create ======== - * Purpose: - * Create a communication memory manager object. - * Parameters: - * ph_cmm_mgr: Location to store a communication manager handle on - * output. - * hdev_obj: Handle to a device object. - * mgr_attrts: Comm mem manager attributes. - * Returns: - * 0: Success; - * -ENOMEM: Insufficient memory for requested resources. - * -EPERM: Failed to initialize critical sect sync object. - * - * Requires: - * ph_cmm_mgr != NULL. - * mgr_attrts->min_block_size >= 4 bytes. - * Ensures: - * - */ -extern int cmm_create(struct cmm_object **ph_cmm_mgr, - struct dev_object *hdev_obj, - const struct cmm_mgrattrs *mgr_attrts); - -/* - * ======== cmm_destroy ======== - * Purpose: - * Destroy the communication memory manager object. - * Parameters: - * hcmm_mgr: Cmm Mgr handle. - * force: Force deallocation of all cmm memory immediately if set TRUE. - * If FALSE, and outstanding allocations will return -EPERM - * status. - * Returns: - * 0: CMM object & resources deleted. - * -EPERM: Unable to free CMM object due to outstanding allocation. - * -EFAULT: Unable to free CMM due to bad handle. - * Requires: - * CMM is initialized. - * hcmm_mgr != NULL. - * Ensures: - * Memory resources used by Cmm Mgr are freed. - */ -extern int cmm_destroy(struct cmm_object *hcmm_mgr, bool force); - -/* - * ======== cmm_free_buf ======== - * Purpose: - * Free the given buffer. - * Parameters: - * hcmm_mgr: Cmm Mgr handle. - * pbuf: Pointer to memory allocated by cmm_calloc_buf(). - * ul_seg_id: SM segment Id used in CMM_Calloc() attrs. - * Set to 0 to use default segment. - * Returns: - * 0 - * -EPERM - * Requires: - * CMM initialized. - * buf_pa != NULL - * Ensures: - * - */ -extern int cmm_free_buf(struct cmm_object *hcmm_mgr, - void *buf_pa, u32 ul_seg_id); - -/* - * ======== cmm_get_handle ======== - * Purpose: - * Return the handle to the cmm mgr for the given device obj. - * Parameters: - * hprocessor: Handle to a Processor. - * ph_cmm_mgr: Location to store the shared memory mgr handle on - * output. - * - * Returns: - * 0: Cmm Mgr opaque handle returned. - * -EFAULT: Invalid handle. - * Requires: - * ph_cmm_mgr != NULL - * hdev_obj != NULL - * Ensures: - */ -extern int cmm_get_handle(void *hprocessor, - struct cmm_object **ph_cmm_mgr); - -/* - * ======== cmm_get_info ======== - * Purpose: - * Return the current SM and VM utilization information. - * Parameters: - * hcmm_mgr: Handle to a Cmm Mgr. - * cmm_info_obj: Location to store the Cmm information on output. - * - * Returns: - * 0: Success. - * -EFAULT: Invalid handle. - * -EINVAL Invalid input argument. - * Requires: - * Ensures: - * - */ -extern int cmm_get_info(struct cmm_object *hcmm_mgr, - struct cmm_info *cmm_info_obj); - -/* - * ======== cmm_register_gppsm_seg ======== - * Purpose: - * Register a block of SM with the CMM. - * Parameters: - * hcmm_mgr: Handle to a Cmm Mgr. - * lpGPPBasePA: GPP Base Physical address. - * ul_size: Size in GPP bytes. - * dsp_addr_offset GPP PA to DSP PA Offset. - * c_factor: Add offset if CMM_ADDTODSPPA, sub if CMM_SUBFROMDSPPA. - * dw_dsp_base: DSP virtual base byte address. - * ul_dsp_size: Size of DSP segment in bytes. - * sgmt_id: Address to store segment Id. - * - * Returns: - * 0: Success. - * -EFAULT: Invalid hcmm_mgr handle. - * -EINVAL: Invalid input argument. - * -EPERM: Unable to register. - * - On success *sgmt_id is a valid SM segment ID. - * Requires: - * ul_size > 0 - * sgmt_id != NULL - * dw_gpp_base_pa != 0 - * c_factor = CMM_ADDTODSPPA || c_factor = CMM_SUBFROMDSPPA - * Ensures: - * - */ -extern int cmm_register_gppsm_seg(struct cmm_object *hcmm_mgr, - unsigned int dw_gpp_base_pa, - u32 ul_size, - u32 dsp_addr_offset, - s8 c_factor, - unsigned int dw_dsp_base, - u32 ul_dsp_size, - u32 *sgmt_id, u32 gpp_base_va); - -/* - * ======== cmm_un_register_gppsm_seg ======== - * Purpose: - * Unregister the given memory segment that was previously registered - * by cmm_register_gppsm_seg. - * Parameters: - * hcmm_mgr: Handle to a Cmm Mgr. - * ul_seg_id Segment identifier returned by cmm_register_gppsm_seg. - * Returns: - * 0: Success. - * -EFAULT: Invalid handle. - * -EINVAL: Invalid ul_seg_id. - * -EPERM: Unable to unregister for unknown reason. - * Requires: - * Ensures: - * - */ -extern int cmm_un_register_gppsm_seg(struct cmm_object *hcmm_mgr, - u32 ul_seg_id); - -/* - * ======== cmm_xlator_alloc_buf ======== - * Purpose: - * Allocate the specified SM buffer and create a local memory descriptor. - * Place on the descriptor on the translator's HaQ (Host Alloc'd Queue). - * Parameters: - * xlator: Handle to a Xlator object. - * va_buf: Virtual address ptr(client context) - * pa_size: Size of SM memory to allocate. - * Returns: - * Ptr to valid physical address(Pa) of pa_size bytes, NULL if failed. - * Requires: - * va_buf != 0. - * pa_size != 0. - * Ensures: - * - */ -extern void *cmm_xlator_alloc_buf(struct cmm_xlatorobject *xlator, - void *va_buf, u32 pa_size); - -/* - * ======== cmm_xlator_create ======== - * Purpose: - * Create a translator(xlator) object used for process specific Va<->Pa - * address translation. Node messaging and streams use this to perform - * inter-processor(GPP<->DSP) zero-copy data transfer. - * Parameters: - * xlator: Address to place handle to a new Xlator handle. - * hcmm_mgr: Handle to Cmm Mgr associated with this translator. - * xlator_attrs: Translator attributes used for the client NODE or STREAM. - * Returns: - * 0: Success. - * -EINVAL: Bad input Attrs. - * -ENOMEM: Insufficient memory(local) for requested resources. - * Requires: - * xlator != NULL - * hcmm_mgr != NULL - * xlator_attrs != NULL - * Ensures: - * - */ -extern int cmm_xlator_create(struct cmm_xlatorobject **xlator, - struct cmm_object *hcmm_mgr, - struct cmm_xlatorattrs *xlator_attrs); - -/* - * ======== cmm_xlator_free_buf ======== - * Purpose: - * Free SM buffer and descriptor. - * Does not free client process VM. - * Parameters: - * xlator: handle to translator. - * buf_va Virtual address of PA to free. - * Returns: - * 0: Success. - * -EFAULT: Bad translator handle. - * Requires: - * Ensures: - * - */ -extern int cmm_xlator_free_buf(struct cmm_xlatorobject *xlator, - void *buf_va); - -/* - * ======== cmm_xlator_info ======== - * Purpose: - * Set/Get process specific "translator" address info. - * This is used to perform fast virtual address translation - * for shared memory buffers between the GPP and DSP. - * Parameters: - * xlator: handle to translator. - * paddr: Virtual base address of segment. - * ul_size: Size in bytes. - * segm_id: Segment identifier of SM segment(s) - * set_info Set xlator fields if TRUE, else return base addr - * Returns: - * 0: Success. - * -EFAULT: Bad translator handle. - * Requires: - * (paddr != NULL) - * (ul_size > 0) - * Ensures: - * - */ -extern int cmm_xlator_info(struct cmm_xlatorobject *xlator, - u8 **paddr, - u32 ul_size, u32 segm_id, bool set_info); - -/* - * ======== cmm_xlator_translate ======== - * Purpose: - * Perform address translation VA<->PA for the specified stream or - * message shared memory buffer. - * Parameters: - * xlator: handle to translator. - * paddr address of buffer to translate. - * xtype Type of address xlation. CMM_PA2VA or CMM_VA2PA. - * Returns: - * Valid address on success, else NULL. - * Requires: - * paddr != NULL - * xtype >= CMM_VA2PA) && (xtype <= CMM_DSPPA2PA) - * Ensures: - * - */ -extern void *cmm_xlator_translate(struct cmm_xlatorobject *xlator, - void *paddr, enum cmm_xlatetype xtype); - -#endif /* CMM_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/cmmdefs.h b/drivers/staging/tidspbridge/include/dspbridge/cmmdefs.h deleted file mode 100644 index a264fa69a4fc..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/cmmdefs.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * cmmdefs.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Global MEM constants and types. - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef CMMDEFS_ -#define CMMDEFS_ - - -/* Cmm attributes used in cmm_create() */ -struct cmm_mgrattrs { - /* Minimum SM allocation; default 32 bytes. */ - u32 min_block_size; -}; - -/* Attributes for CMM_AllocBuf() & CMM_AllocDesc() */ -struct cmm_attrs { - u32 seg_id; /* 1,2... are SM segments. 0 is not. */ - u32 alignment; /* 0,1,2,4....min_block_size */ -}; - -/* - * DSPPa to GPPPa Conversion Factor. - * - * For typical platforms: - * converted Address = PaDSP + ( c_factor * addressToConvert). - */ -#define CMM_SUBFROMDSPPA -1 -#define CMM_ADDTODSPPA 1 - -#define CMM_ALLSEGMENTS 0xFFFFFF /* All SegIds */ -#define CMM_MAXGPPSEGS 1 /* Maximum # of SM segs */ - -/* - * SMSEGs are SM segments the DSP allocates from. - * - * This info is used by the GPP to xlate DSP allocated PAs. - */ - -struct cmm_seginfo { - u32 seg_base_pa; /* Start Phys address of SM segment */ - /* Total size in bytes of segment: DSP+GPP */ - u32 total_seg_size; - u32 gpp_base_pa; /* Start Phys addr of Gpp SM seg */ - u32 gpp_size; /* Size of Gpp SM seg in bytes */ - u32 dsp_base_va; /* DSP virt base byte address */ - u32 dsp_size; /* DSP seg size in bytes */ - /* # of current GPP allocations from this segment */ - u32 in_use_cnt; - u32 seg_base_va; /* Start Virt address of SM seg */ - -}; - -/* CMM useful information */ -struct cmm_info { - /* # of SM segments registered with this Cmm. */ - u32 num_gppsm_segs; - /* Total # of allocations outstanding for CMM */ - u32 total_in_use_cnt; - /* Min SM block size allocation from cmm_create() */ - u32 min_block_size; - /* Info per registered SM segment. */ - struct cmm_seginfo seg_info[CMM_MAXGPPSEGS]; -}; - -/* XlatorCreate attributes */ -struct cmm_xlatorattrs { - u32 seg_id; /* segment Id used for SM allocations */ - u32 dsp_bufs; /* # of DSP-side bufs */ - u32 dsp_buf_size; /* size of DSP-side bufs in GPP bytes */ - /* Vm base address alloc'd in client process context */ - void *vm_base; - /* vm_size must be >= (dwMaxNumBufs * dwMaxSize) */ - u32 vm_size; -}; - -/* - * Cmm translation types. Use to map SM addresses to process context. - */ -enum cmm_xlatetype { - CMM_VA2PA = 0, /* Virtual to GPP physical address xlation */ - CMM_PA2VA = 1, /* GPP Physical to virtual */ - CMM_VA2DSPPA = 2, /* Va to DSP Pa */ - CMM_PA2DSPPA = 3, /* GPP Pa to DSP Pa */ - CMM_DSPPA2PA = 4, /* DSP Pa to GPP Pa */ -}; - -struct cmm_object; -struct cmm_xlatorobject; - -#endif /* CMMDEFS_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/cod.h b/drivers/staging/tidspbridge/include/dspbridge/cod.h deleted file mode 100644 index ba2005d02422..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/cod.h +++ /dev/null @@ -1,329 +0,0 @@ -/* - * cod.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Code management module for DSPs. This module provides an interface - * interface for loading both static and dynamic code objects onto DSP - * systems. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef COD_ -#define COD_ - -#include - -#define COD_MAXPATHLENGTH 255 -#define COD_TRACEBEG "SYS_PUTCBEG" -#define COD_TRACEEND "SYS_PUTCEND" -#define COD_TRACECURPOS "BRIDGE_SYS_PUTC_current" - -#define COD_NOLOAD DBLL_NOLOAD -#define COD_SYMB DBLL_SYMB - -/* COD code manager handle */ -struct cod_manager; - -/* COD library handle */ -struct cod_libraryobj; - -/* - * Function prototypes for writing memory to a DSP system, allocating - * and freeing DSP memory. - */ -typedef u32(*cod_writefxn) (void *priv_ref, u32 dsp_add, - void *pbuf, u32 ul_num_bytes, u32 mem_space); - -/* - * ======== cod_close ======== - * Purpose: - * Close a library opened with cod_open(). - * Parameters: - * lib - Library handle returned by cod_open(). - * Returns: - * None. - * Requires: - * COD module initialized. - * valid lib. - * Ensures: - * - */ -extern void cod_close(struct cod_libraryobj *lib); - -/* - * ======== cod_create ======== - * Purpose: - * Create an object to manage code on a DSP system. This object can be - * used to load an initial program image with arguments that can later - * be expanded with dynamically loaded object files. - * Symbol table information is managed by this object and can be retrieved - * using the cod_get_sym_value() function. - * Parameters: - * manager: created manager object - * str_zl_file: ZL DLL filename, of length < COD_MAXPATHLENGTH. - * Returns: - * 0: Success. - * -ESPIPE: ZL_Create failed. - * -ENOSYS: attrs was not NULL. We don't yet support - * non default values of attrs. - * Requires: - * COD module initialized. - * str_zl_file != NULL - * Ensures: - */ -extern int cod_create(struct cod_manager **mgr, - char *str_zl_file); - -/* - * ======== cod_delete ======== - * Purpose: - * Delete a code manager object. - * Parameters: - * cod_mgr_obj: handle of manager to be deleted - * Returns: - * None. - * Requires: - * COD module initialized. - * valid cod_mgr_obj. - * Ensures: - */ -extern void cod_delete(struct cod_manager *cod_mgr_obj); - -/* - * ======== cod_get_base_lib ======== - * Purpose: - * Get handle to the base image DBL library. - * Parameters: - * cod_mgr_obj: handle of manager to be deleted - * plib: location to store library handle on output. - * Returns: - * 0: Success. - * Requires: - * COD module initialized. - * valid cod_mgr_obj. - * plib != NULL. - * Ensures: - */ -extern int cod_get_base_lib(struct cod_manager *cod_mgr_obj, - struct dbll_library_obj **plib); - -/* - * ======== cod_get_base_name ======== - * Purpose: - * Get the name of the base image DBL library. - * Parameters: - * cod_mgr_obj: handle of manager to be deleted - * sz_name: location to store library name on output. - * usize: size of name buffer. - * Returns: - * 0: Success. - * -EPERM: Buffer too small. - * Requires: - * COD module initialized. - * valid cod_mgr_obj. - * sz_name != NULL. - * Ensures: - */ -extern int cod_get_base_name(struct cod_manager *cod_mgr_obj, - char *sz_name, u32 usize); - -/* - * ======== cod_get_entry ======== - * Purpose: - * Retrieve the entry point of a loaded DSP program image - * Parameters: - * cod_mgr_obj: handle of manager to be deleted - * entry_pt: pointer to location for entry point - * Returns: - * 0: Success. - * Requires: - * COD module initialized. - * valid cod_mgr_obj. - * entry_pt != NULL. - * Ensures: - */ -extern int cod_get_entry(struct cod_manager *cod_mgr_obj, - u32 *entry_pt); - -/* - * ======== cod_get_loader ======== - * Purpose: - * Get handle to the DBL loader. - * Parameters: - * cod_mgr_obj: handle of manager to be deleted - * loader: location to store loader handle on output. - * Returns: - * 0: Success. - * Requires: - * COD module initialized. - * valid cod_mgr_obj. - * loader != NULL. - * Ensures: - */ -extern int cod_get_loader(struct cod_manager *cod_mgr_obj, - struct dbll_tar_obj **loader); - -/* - * ======== cod_get_section ======== - * Purpose: - * Retrieve the starting address and length of a section in the COFF file - * given the section name. - * Parameters: - * lib Library handle returned from cod_open(). - * str_sect: name of the section, with or without leading "." - * addr: Location to store address. - * len: Location to store length. - * Returns: - * 0: Success - * -ESPIPE: Symbols could not be found or have not been loaded onto - * the board. - * Requires: - * COD module initialized. - * valid cod_mgr_obj. - * str_sect != NULL; - * addr != NULL; - * len != NULL; - * Ensures: - * 0: *addr and *len contain the address and length of the - * section. - * else: *addr == 0 and *len == 0; - * - */ -extern int cod_get_section(struct cod_libraryobj *lib, - char *str_sect, - u32 *addr, u32 *len); - -/* - * ======== cod_get_sym_value ======== - * Purpose: - * Retrieve the value for the specified symbol. The symbol is first - * searched for literally and then, if not found, searched for as a - * C symbol. - * Parameters: - * lib: library handle returned from cod_open(). - * pstrSymbol: name of the symbol - * value: value of the symbol - * Returns: - * 0: Success. - * -ESPIPE: Symbols could not be found or have not been loaded onto - * the board. - * Requires: - * COD module initialized. - * Valid cod_mgr_obj. - * str_sym != NULL. - * pul_value != NULL. - * Ensures: - */ -extern int cod_get_sym_value(struct cod_manager *cod_mgr_obj, - char *str_sym, u32 * pul_value); - -/* - * ======== cod_load_base ======== - * Purpose: - * Load the initial program image, optionally with command-line arguments, - * on the DSP system managed by the supplied handle. The program to be - * loaded must be the first element of the args array and must be a fully - * qualified pathname. - * Parameters: - * hmgr: manager to load the code with - * num_argc: number of arguments in the args array - * args: array of strings for arguments to DSP program - * write_fxn: board-specific function to write data to DSP system - * arb: arbitrary pointer to be passed as first arg to write_fxn - * envp: array of environment strings for DSP exec. - * Returns: - * 0: Success. - * -EBADF: Failed to open target code. - * Requires: - * COD module initialized. - * hmgr is valid. - * num_argc > 0. - * args != NULL. - * args[0] != NULL. - * pfn_write != NULL. - * Ensures: - */ -extern int cod_load_base(struct cod_manager *cod_mgr_obj, - u32 num_argc, char *args[], - cod_writefxn pfn_write, void *arb, - char *envp[]); - -/* - * ======== cod_open ======== - * Purpose: - * Open a library for reading sections. Does not load or set the base. - * Parameters: - * hmgr: manager to load the code with - * sz_coff_path: Coff file to open. - * flags: COD_NOLOAD (don't load symbols) or COD_SYMB (load - * symbols). - * lib_obj: Handle returned that can be used in calls to cod_close - * and cod_get_section. - * Returns: - * S_OK: Success. - * -EBADF: Failed to open target code. - * Requires: - * COD module initialized. - * hmgr is valid. - * flags == COD_NOLOAD || flags == COD_SYMB. - * sz_coff_path != NULL. - * Ensures: - */ -extern int cod_open(struct cod_manager *hmgr, - char *sz_coff_path, - u32 flags, struct cod_libraryobj **lib_obj); - -/* - * ======== cod_open_base ======== - * Purpose: - * Open base image for reading sections. Does not load the base. - * Parameters: - * hmgr: manager to load the code with - * sz_coff_path: Coff file to open. - * flags: Specifies whether to load symbols. - * Returns: - * 0: Success. - * -EBADF: Failed to open target code. - * Requires: - * COD module initialized. - * hmgr is valid. - * sz_coff_path != NULL. - * Ensures: - */ -extern int cod_open_base(struct cod_manager *hmgr, char *sz_coff_path, - dbll_flags flags); - -/* - * ======== cod_read_section ======== - * Purpose: - * Retrieve the content of a code section given the section name. - * Parameters: - * cod_mgr_obj - manager in which to search for the symbol - * str_sect - name of the section, with or without leading "." - * str_content - buffer to store content of the section. - * Returns: - * 0: on success, error code on failure - * -ESPIPE: Symbols have not been loaded onto the board. - * Requires: - * COD module initialized. - * valid cod_mgr_obj. - * str_sect != NULL; - * str_content != NULL; - * Ensures: - * 0: *str_content stores the content of the named section. - */ -extern int cod_read_section(struct cod_libraryobj *lib, - char *str_sect, - char *str_content, u32 content_size); - -#endif /* COD_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dbdcd.h b/drivers/staging/tidspbridge/include/dspbridge/dbdcd.h deleted file mode 100644 index 7cc3e12686e8..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dbdcd.h +++ /dev/null @@ -1,358 +0,0 @@ -/* - * dbdcd.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Defines the DSP/BIOS Bridge Configuration Database (DCD) API. - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DBDCD_ -#define DBDCD_ - -#include -#include -#include - -/* - * ======== dcd_auto_register ======== - * Purpose: - * This function automatically registers DCD objects specified in a - * special COFF section called ".dcd_register" - * Parameters: - * hdcd_mgr: A DCD manager handle. - * sz_coff_path: Pointer to name of COFF file containing DCD - * objects to be registered. - * Returns: - * 0: Success. - * -EACCES: Unable to find auto-registration/read/load section. - * -EFAULT: Invalid DCD_HMANAGER handle.. - * Requires: - * DCD initialized. - * Ensures: - * Note: - * Due to the DCD database construction, it is essential for a DCD-enabled - * COFF file to contain the right COFF sections, especially - * ".dcd_register", which is used for auto registration. - */ -extern int dcd_auto_register(struct dcd_manager *hdcd_mgr, - char *sz_coff_path); - -/* - * ======== dcd_auto_unregister ======== - * Purpose: - * This function automatically unregisters DCD objects specified in a - * special COFF section called ".dcd_register" - * Parameters: - * hdcd_mgr: A DCD manager handle. - * sz_coff_path: Pointer to name of COFF file containing - * DCD objects to be unregistered. - * Returns: - * 0: Success. - * -EACCES: Unable to find auto-registration/read/load section. - * -EFAULT: Invalid DCD_HMANAGER handle.. - * Requires: - * DCD initialized. - * Ensures: - * Note: - * Due to the DCD database construction, it is essential for a DCD-enabled - * COFF file to contain the right COFF sections, especially - * ".dcd_register", which is used for auto unregistration. - */ -extern int dcd_auto_unregister(struct dcd_manager *hdcd_mgr, - char *sz_coff_path); - -/* - * ======== dcd_create_manager ======== - * Purpose: - * This function creates a DCD module manager. - * Parameters: - * sz_zl_dll_name: Pointer to a DLL name string. - * dcd_mgr: A pointer to a DCD manager handle. - * Returns: - * 0: Success. - * -ENOMEM: Unable to allocate memory for DCD manager handle. - * -EPERM: General failure. - * Requires: - * DCD initialized. - * sz_zl_dll_name is non-NULL. - * dcd_mgr is non-NULL. - * Ensures: - * A DCD manager handle is created. - */ -extern int dcd_create_manager(char *sz_zl_dll_name, - struct dcd_manager **dcd_mgr); - -/* - * ======== dcd_destroy_manager ======== - * Purpose: - * This function destroys a DCD module manager. - * Parameters: - * hdcd_mgr: A DCD manager handle. - * Returns: - * 0: Success. - * -EFAULT: Invalid DCD manager handle. - * Requires: - * DCD initialized. - * Ensures: - */ -extern int dcd_destroy_manager(struct dcd_manager *hdcd_mgr); - -/* - * ======== dcd_enumerate_object ======== - * Purpose: - * This function enumerates currently visible DSP/BIOS Bridge objects - * and returns the UUID and type of each enumerated object. - * Parameters: - * index: The object enumeration index. - * obj_type: Type of object to enumerate. - * uuid_obj: Pointer to a dsp_uuid object. - * Returns: - * 0: Success. - * -EPERM: Unable to enumerate through the DCD database. - * ENODATA: Enumeration completed. This is not an error code. - * Requires: - * DCD initialized. - * uuid_obj is a valid pointer. - * Ensures: - * Details: - * This function can be used in conjunction with dcd_get_object_def to - * retrieve object properties. - */ -extern int dcd_enumerate_object(s32 index, - enum dsp_dcdobjtype obj_type, - struct dsp_uuid *uuid_obj); - -/* - * ======== dcd_exit ======== - * Purpose: - * This function cleans up the DCD module. - * Parameters: - * Returns: - * Requires: - * DCD initialized. - * Ensures: - */ -extern void dcd_exit(void); - -/* - * ======== dcd_get_dep_libs ======== - * Purpose: - * Given the uuid of a library and size of array of uuids, this function - * fills the array with the uuids of all dependent libraries of the input - * library. - * Parameters: - * hdcd_mgr: A DCD manager handle. - * uuid_obj: Pointer to a dsp_uuid for a library. - * num_libs: Size of uuid array (number of library uuids). - * dep_lib_uuids: Array of dependent library uuids to be filled in. - * prstnt_dep_libs: Array indicating if corresponding lib is persistent. - * phase: phase to obtain correct input library - * Returns: - * 0: Success. - * -ENOMEM: Memory allocation failure. - * -EACCES: Failure to read section containing library info. - * -EPERM: General failure. - * Requires: - * DCD initialized. - * Valid hdcd_mgr. - * uuid_obj != NULL - * dep_lib_uuids != NULL. - * Ensures: - */ -extern int dcd_get_dep_libs(struct dcd_manager *hdcd_mgr, - struct dsp_uuid *uuid_obj, - u16 num_libs, - struct dsp_uuid *dep_lib_uuids, - bool *prstnt_dep_libs, - enum nldr_phase phase); - -/* - * ======== dcd_get_num_dep_libs ======== - * Purpose: - * Given the uuid of a library, determine its number of dependent - * libraries. - * Parameters: - * hdcd_mgr: A DCD manager handle. - * uuid_obj: Pointer to a dsp_uuid for a library. - * num_libs: Size of uuid array (number of library uuids). - * num_pers_libs: number of persistent dependent library. - * phase: Phase to obtain correct input library - * Returns: - * 0: Success. - * -ENOMEM: Memory allocation failure. - * -EACCES: Failure to read section containing library info. - * -EPERM: General failure. - * Requires: - * DCD initialized. - * Valid hdcd_mgr. - * uuid_obj != NULL - * num_libs != NULL. - * Ensures: - */ -extern int dcd_get_num_dep_libs(struct dcd_manager *hdcd_mgr, - struct dsp_uuid *uuid_obj, - u16 *num_libs, - u16 *num_pers_libs, - enum nldr_phase phase); - -/* - * ======== dcd_get_library_name ======== - * Purpose: - * This function returns the name of a (dynamic) library for a given - * UUID. - * Parameters: - * hdcd_mgr: A DCD manager handle. - * uuid_obj: Pointer to a dsp_uuid that represents a unique DSP/BIOS - * Bridge object. - * str_lib_name: Buffer to hold library name. - * buff_size: Contains buffer size. Set to string size on output. - * phase: Which phase to load - * phase_split: Are phases in multiple libraries - * Returns: - * 0: Success. - * -EPERM: General failure. - * Requires: - * DCD initialized. - * Valid hdcd_mgr. - * str_lib_name != NULL. - * uuid_obj != NULL - * buff_size != NULL. - * Ensures: - */ -extern int dcd_get_library_name(struct dcd_manager *hdcd_mgr, - struct dsp_uuid *uuid_obj, - char *str_lib_name, - u32 *buff_size, - enum nldr_phase phase, - bool *phase_split); - -/* - * ======== dcd_get_object_def ======== - * Purpose: - * This function returns the properties/attributes of a DSP/BIOS Bridge - * object. - * Parameters: - * hdcd_mgr: A DCD manager handle. - * uuid_obj: Pointer to a dsp_uuid that represents a unique - * DSP/BIOS Bridge object. - * obj_type: The type of DSP/BIOS Bridge object to be - * referenced (node, processor, etc). - * obj_def: Pointer to an object definition structure. A - * union of various possible DCD object types. - * Returns: - * 0: Success. - * -EACCES: Unable to access/read/parse/load content of object code - * section. - * -EPERM: General failure. - * -EFAULT: Invalid DCD_HMANAGER handle. - * Requires: - * DCD initialized. - * obj_uuid is non-NULL. - * obj_def is non-NULL. - * Ensures: - */ -extern int dcd_get_object_def(struct dcd_manager *hdcd_mgr, - struct dsp_uuid *obj_uuid, - enum dsp_dcdobjtype obj_type, - struct dcd_genericobj *obj_def); - -/* - * ======== dcd_get_objects ======== - * Purpose: - * This function finds all DCD objects specified in a special - * COFF section called ".dcd_register", and for each object, - * call a "register" function. The "register" function may perform - * various actions, such as 1) register nodes in the node database, 2) - * unregister nodes from the node database, and 3) add overlay nodes. - * Parameters: - * hdcd_mgr: A DCD manager handle. - * sz_coff_path: Pointer to name of COFF file containing DCD - * objects. - * register_fxn: Callback fxn to be applied on each located - * DCD object. - * handle: Handle to pass to callback. - * Returns: - * 0: Success. - * -EACCES: Unable to access/read/parse/load content of object code - * section. - * -EFAULT: Invalid DCD_HMANAGER handle.. - * Requires: - * DCD initialized. - * Ensures: - * Note: - * Due to the DCD database construction, it is essential for a DCD-enabled - * COFF file to contain the right COFF sections, especially - * ".dcd_register", which is used for auto registration. - */ -extern int dcd_get_objects(struct dcd_manager *hdcd_mgr, - char *sz_coff_path, - dcd_registerfxn register_fxn, void *handle); - -/* - * ======== dcd_init ======== - * Purpose: - * This function initializes DCD. - * Parameters: - * Returns: - * FALSE: Initialization failed. - * TRUE: Initialization succeeded. - * Requires: - * Ensures: - * DCD initialized. - */ -extern bool dcd_init(void); - -/* - * ======== dcd_register_object ======== - * Purpose: - * This function registers a DSP/BIOS Bridge object in the DCD database. - * Parameters: - * uuid_obj: Pointer to a dsp_uuid that identifies a DSP/BIOS - * Bridge object. - * obj_type: Type of object. - * psz_path_name: Path to the object's COFF file. - * Returns: - * 0: Success. - * -EPERM: Failed to register object. - * Requires: - * DCD initialized. - * uuid_obj and szPathName are non-NULL values. - * obj_type is a valid type value. - * Ensures: - */ -extern int dcd_register_object(struct dsp_uuid *uuid_obj, - enum dsp_dcdobjtype obj_type, - char *psz_path_name); - -/* - * ======== dcd_unregister_object ======== - * Purpose: - * This function de-registers a valid DSP/BIOS Bridge object from the DCD - * database. - * Parameters: - * uuid_obj: Pointer to a dsp_uuid that identifies a DSP/BIOS Bridge - * object. - * obj_type: Type of object. - * Returns: - * 0: Success. - * -EPERM: Unable to de-register the specified object. - * Requires: - * DCD initialized. - * uuid_obj is a non-NULL value. - * obj_type is a valid type value. - * Ensures: - */ -extern int dcd_unregister_object(struct dsp_uuid *uuid_obj, - enum dsp_dcdobjtype obj_type); - -#endif /* _DBDCD_H */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dbdcddef.h b/drivers/staging/tidspbridge/include/dspbridge/dbdcddef.h deleted file mode 100644 index bc201b329033..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dbdcddef.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * dbdcddef.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DCD (DSP/BIOS Bridge Configuration Database) constants and types. - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DBDCDDEF_ -#define DBDCDDEF_ - -#include -#include /* for mgr_processorextinfo */ - -/* - * The following defines are critical elements for the DCD module: - * - * - DCD_REGKEY enables DCD functions to locate registered DCD objects. - * - DCD_REGISTER_SECTION identifies the COFF section where the UUID of - * registered DCD objects are stored. - */ -#define DCD_REGKEY "Software\\TexasInstruments\\DspBridge\\DCD" -#define DCD_REGISTER_SECTION ".dcd_register" - -#define DCD_MAXPATHLENGTH 255 - -/* DCD Manager Object */ -struct dcd_manager; - -struct dcd_key_elem { - struct list_head link; /* Make it linked to a list */ - char name[DCD_MAXPATHLENGTH]; /* Name of a given value entry */ - char *path; /* Pointer to the actual data */ -}; - -/* DCD Node Properties */ -struct dcd_nodeprops { - struct dsp_ndbprops ndb_props; - u32 msg_segid; - u32 msg_notify_type; - char *str_create_phase_fxn; - char *str_delete_phase_fxn; - char *str_execute_phase_fxn; - char *str_i_alg_name; - - /* Dynamic load properties */ - u16 load_type; /* Static, dynamic, overlay */ - u32 data_mem_seg_mask; /* Data memory requirements */ - u32 code_mem_seg_mask; /* Code memory requirements */ -}; - -/* DCD Generic Object Type */ -struct dcd_genericobj { - union dcd_obj { - struct dcd_nodeprops node_obj; /* node object. */ - /* processor object. */ - struct dsp_processorinfo proc_info; - /* extended proc object (private) */ - struct mgr_processorextinfo ext_proc_obj; - } obj_data; -}; - -/* DCD Internal Callback Type */ -typedef int(*dcd_registerfxn) (struct dsp_uuid *uuid_obj, - enum dsp_dcdobjtype obj_type, - void *handle); - -#endif /* DBDCDDEF_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dbdefs.h b/drivers/staging/tidspbridge/include/dspbridge/dbdefs.h deleted file mode 100644 index c8f464505efc..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dbdefs.h +++ /dev/null @@ -1,488 +0,0 @@ -/* - * dbdefs.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Global definitions and constants for DSP/BIOS Bridge. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DBDEFS_ -#define DBDEFS_ - -#include - -#include /* Types shared between GPP and DSP */ - -#define PG_SIZE4K 4096 -#define PG_MASK(pg_size) (~((pg_size)-1)) -#define PG_ALIGN_LOW(addr, pg_size) ((addr) & PG_MASK(pg_size)) -#define PG_ALIGN_HIGH(addr, pg_size) (((addr)+(pg_size)-1) & PG_MASK(pg_size)) - -/* API return value and calling convention */ -#define DBAPI int - -/* Maximum length of node name, used in dsp_ndbprops */ -#define DSP_MAXNAMELEN 32 - -/* notify_type values for the RegisterNotify() functions. */ -#define DSP_SIGNALEVENT 0x00000001 - -/* Types of events for processors */ -#define DSP_PROCESSORSTATECHANGE 0x00000001 -#define DSP_PROCESSORATTACH 0x00000002 -#define DSP_PROCESSORDETACH 0x00000004 -#define DSP_PROCESSORRESTART 0x00000008 - -/* DSP exception events (DSP/BIOS and DSP MMU fault) */ -#define DSP_MMUFAULT 0x00000010 -#define DSP_SYSERROR 0x00000020 -#define DSP_EXCEPTIONABORT 0x00000300 -#define DSP_PWRERROR 0x00000080 -#define DSP_WDTOVERFLOW 0x00000040 - -/* IVA exception events (IVA MMU fault) */ -#define IVA_MMUFAULT 0x00000040 -/* Types of events for nodes */ -#define DSP_NODESTATECHANGE 0x00000100 -#define DSP_NODEMESSAGEREADY 0x00000200 - -/* Types of events for streams */ -#define DSP_STREAMDONE 0x00001000 -#define DSP_STREAMIOCOMPLETION 0x00002000 - -/* Handle definition representing the GPP node in DSPNode_Connect() calls */ -#define DSP_HGPPNODE 0xFFFFFFFF - -/* Node directions used in DSPNode_Connect() */ -#define DSP_TONODE 1 -#define DSP_FROMNODE 2 - -/* Define Node Minimum and Maximum Priorities */ -#define DSP_NODE_MIN_PRIORITY 1 -#define DSP_NODE_MAX_PRIORITY 15 - -/* msg_ctrl contains SM buffer description */ -#define DSP_RMSBUFDESC RMS_BUFDESC - -/* Processor ID numbers */ -#define DSP_UNIT 0 -#define IVA_UNIT 1 - -#define DSPWORD unsigned char -#define DSPWORDSIZE sizeof(DSPWORD) - -#define MAX_PROFILES 16 - -/* DSP chip type */ -#define DSPTYPE64 0x99 - -/* Handy Macros */ -#define VALID_PROC_EVENT (DSP_PROCESSORSTATECHANGE | DSP_PROCESSORATTACH | \ - DSP_PROCESSORDETACH | DSP_PROCESSORRESTART | DSP_NODESTATECHANGE | \ - DSP_STREAMDONE | DSP_STREAMIOCOMPLETION | DSP_MMUFAULT | \ - DSP_SYSERROR | DSP_WDTOVERFLOW | DSP_PWRERROR) - -static inline bool is_valid_proc_event(u32 x) -{ - return (x == 0 || (x & VALID_PROC_EVENT && !(x & ~VALID_PROC_EVENT))); -} - -/* The Node UUID structure */ -struct dsp_uuid { - u32 data1; - u16 data2; - u16 data3; - u8 data4; - u8 data5; - u8 data6[6]; -}; - -/* DCD types */ -enum dsp_dcdobjtype { - DSP_DCDNODETYPE, - DSP_DCDPROCESSORTYPE, - DSP_DCDLIBRARYTYPE, - DSP_DCDCREATELIBTYPE, - DSP_DCDEXECUTELIBTYPE, - DSP_DCDDELETELIBTYPE, - /* DSP_DCDMAXOBJTYPE is meant to be the last DCD object type */ - DSP_DCDMAXOBJTYPE -}; - -/* Processor states */ -enum dsp_procstate { - PROC_STOPPED, - PROC_LOADED, - PROC_RUNNING, - PROC_ERROR -}; - -/* - * Node types: Message node, task node, xDAIS socket node, and - * device node. _NODE_GPP is used when defining a stream connection - * between a task or socket node and the GPP. - * - */ -enum node_type { - NODE_DEVICE, - NODE_TASK, - NODE_DAISSOCKET, - NODE_MESSAGE, - NODE_GPP -}; - -/* - * ======== node_state ======== - * Internal node states. - */ -enum node_state { - NODE_ALLOCATED, - NODE_CREATED, - NODE_RUNNING, - NODE_PAUSED, - NODE_DONE, - NODE_CREATING, - NODE_STARTING, - NODE_PAUSING, - NODE_TERMINATING, - NODE_DELETING, -}; - -/* Stream states */ -enum dsp_streamstate { - STREAM_IDLE, - STREAM_READY, - STREAM_PENDING, - STREAM_DONE -}; - -/* Stream connect types */ -enum dsp_connecttype { - CONNECTTYPE_NODEOUTPUT, - CONNECTTYPE_GPPOUTPUT, - CONNECTTYPE_NODEINPUT, - CONNECTTYPE_GPPINPUT -}; - -/* Stream mode types */ -enum dsp_strmmode { - STRMMODE_PROCCOPY, /* Processor(s) copy stream data payloads */ - STRMMODE_ZEROCOPY, /* Strm buffer ptrs swapped no data copied */ - STRMMODE_LDMA, /* Local DMA : OMAP's System-DMA device */ - STRMMODE_RDMA /* Remote DMA: OMAP's DSP-DMA device */ -}; - -/* Resource Types */ -enum dsp_resourceinfotype { - DSP_RESOURCE_DYNDARAM = 0, - DSP_RESOURCE_DYNSARAM, - DSP_RESOURCE_DYNEXTERNAL, - DSP_RESOURCE_DYNSRAM, - DSP_RESOURCE_PROCLOAD -}; - -/* Memory Segment Types */ -enum dsp_memtype { - DSP_DYNDARAM = 0, - DSP_DYNSARAM, - DSP_DYNEXTERNAL, - DSP_DYNSRAM -}; - -/* Memory Flush Types */ -enum dsp_flushtype { - PROC_INVALIDATE_MEM = 0, - PROC_WRITEBACK_MEM, - PROC_WRITEBACK_INVALIDATE_MEM, -}; - -/* Memory Segment Status Values */ -struct dsp_memstat { - u32 size; - u32 total_free_size; - u32 len_max_free_block; - u32 num_free_blocks; - u32 num_alloc_blocks; -}; - -/* Processor Load information Values */ -struct dsp_procloadstat { - u32 curr_load; - u32 predicted_load; - u32 curr_dsp_freq; - u32 predicted_freq; -}; - -/* Attributes for STRM connections between nodes */ -struct dsp_strmattr { - u32 seg_id; /* Memory segment on DSP to allocate buffers */ - u32 buf_size; /* Buffer size (DSP words) */ - u32 num_bufs; /* Number of buffers */ - u32 buf_alignment; /* Buffer alignment */ - u32 timeout; /* Timeout for blocking STRM calls */ - enum dsp_strmmode strm_mode; /* mode of stream when opened */ - /* DMA chnl id if dsp_strmmode is LDMA or RDMA */ - u32 dma_chnl_id; - u32 dma_priority; /* DMA channel priority 0=lowest, >0=high */ -}; - -/* The dsp_cbdata structure */ -struct dsp_cbdata { - u32 cb_data; - u8 node_data[1]; -}; - -/* The dsp_msg structure */ -struct dsp_msg { - u32 cmd; - u32 arg1; - u32 arg2; -}; - -/* The dsp_resourcereqmts structure for node's resource requirements */ -struct dsp_resourcereqmts { - u32 cb_struct; - u32 static_data_size; - u32 global_data_size; - u32 program_mem_size; - u32 wc_execution_time; - u32 wc_period; - u32 wc_deadline; - u32 avg_exection_time; - u32 minimum_period; -}; - -/* - * The dsp_streamconnect structure describes a stream connection - * between two nodes, or between a node and the GPP - */ -struct dsp_streamconnect { - u32 cb_struct; - enum dsp_connecttype connect_type; - u32 this_node_stream_index; - void *connected_node; - struct dsp_uuid ui_connected_node_id; - u32 connected_node_stream_index; -}; - -struct dsp_nodeprofs { - u32 heap_size; -}; - -/* The dsp_ndbprops structure reports the attributes of a node */ -struct dsp_ndbprops { - u32 cb_struct; - struct dsp_uuid ui_node_id; - char ac_name[DSP_MAXNAMELEN]; - enum node_type ntype; - u32 cache_on_gpp; - struct dsp_resourcereqmts dsp_resource_reqmts; - s32 prio; - u32 stack_size; - u32 sys_stack_size; - u32 stack_seg; - u32 message_depth; - u32 num_input_streams; - u32 num_output_streams; - u32 timeout; - u32 count_profiles; /* Number of supported profiles */ - /* Array of profiles */ - struct dsp_nodeprofs node_profiles[MAX_PROFILES]; - u32 stack_seg_name; /* Stack Segment Name */ -}; - - /* The dsp_nodeattrin structure describes the attributes of a - * node client */ -struct dsp_nodeattrin { - u32 cb_struct; - s32 prio; - u32 timeout; - u32 profile_id; - /* Reserved, for Bridge Internal use only */ - u32 heap_size; - void *pgpp_virt_addr; /* Reserved, for Bridge Internal use only */ -}; - - /* The dsp_nodeinfo structure is used to retrieve information - * about a node */ -struct dsp_nodeinfo { - u32 cb_struct; - struct dsp_ndbprops nb_node_database_props; - u32 execution_priority; - enum node_state ns_execution_state; - void *device_owner; - u32 number_streams; - struct dsp_streamconnect sc_stream_connection[16]; - u32 node_env; -}; - - /* The dsp_nodeattr structure describes the attributes of a node */ -struct dsp_nodeattr { - u32 cb_struct; - struct dsp_nodeattrin in_node_attr_in; - u32 node_attr_inputs; - u32 node_attr_outputs; - struct dsp_nodeinfo node_info; -}; - -/* - * Notification type: either the name of an opened event, or an event or - * window handle. - */ -struct dsp_notification { - char *name; - void *handle; -}; - -/* The dsp_processorattrin structure describes the attributes of a processor */ -struct dsp_processorattrin { - u32 cb_struct; - u32 timeout; -}; -/* - * The dsp_processorinfo structure describes basic capabilities of a - * DSP processor - */ -struct dsp_processorinfo { - u32 cb_struct; - int processor_family; - int processor_type; - u32 clock_rate; - u32 internal_mem_size; - u32 external_mem_size; - u32 processor_id; - int ty_running_rtos; - s32 node_min_priority; - s32 node_max_priority; -}; - -/* Error information of last DSP exception signalled to the GPP */ -struct dsp_errorinfo { - u32 err_mask; - u32 val1; - u32 val2; - u32 val3; -}; - -/* The dsp_processorstate structure describes the state of a DSP processor */ -struct dsp_processorstate { - u32 cb_struct; - enum dsp_procstate proc_state; -}; - -/* - * The dsp_resourceinfo structure is used to retrieve information about a - * processor's resources - */ -struct dsp_resourceinfo { - u32 cb_struct; - enum dsp_resourceinfotype resource_type; - union { - u32 resource; - struct dsp_memstat mem_stat; - struct dsp_procloadstat proc_load_stat; - } result; -}; - -/* - * The dsp_streamattrin structure describes the attributes of a stream, - * including segment and alignment of data buffers allocated with - * DSPStream_AllocateBuffers(), if applicable - */ -struct dsp_streamattrin { - u32 cb_struct; - u32 timeout; - u32 segment_id; - u32 buf_alignment; - u32 num_bufs; - enum dsp_strmmode strm_mode; - u32 dma_chnl_id; - u32 dma_priority; -}; - -/* The dsp_bufferattr structure describes the attributes of a data buffer */ -struct dsp_bufferattr { - u32 cb_struct; - u32 segment_id; - u32 buf_alignment; -}; - -/* - * The dsp_streaminfo structure is used to retrieve information - * about a stream. - */ -struct dsp_streaminfo { - u32 cb_struct; - u32 number_bufs_allowed; - u32 number_bufs_in_stream; - u32 number_bytes; - void *sync_object_handle; - enum dsp_streamstate ss_stream_state; -}; - -/* DMM MAP attributes -It is a bit mask with each bit value indicating a specific attribute -bit 0 - GPP address type (user virtual=0, physical=1) -bit 1 - MMU Endianism (Big Endian=1, Little Endian=0) -bit 2 - MMU mixed page attribute (Mixed/ CPUES=1, TLBES =0) -bit 3 - MMU element size = 8bit (valid only for non mixed page entries) -bit 4 - MMU element size = 16bit (valid only for non mixed page entries) -bit 5 - MMU element size = 32bit (valid only for non mixed page entries) -bit 6 - MMU element size = 64bit (valid only for non mixed page entries) - -bit 14 - Input (read only) buffer -bit 15 - Output (writeable) buffer -*/ - -/* Types of mapping attributes */ - -/* MPU address is virtual and needs to be translated to physical addr */ -#define DSP_MAPVIRTUALADDR 0x00000000 -#define DSP_MAPPHYSICALADDR 0x00000001 - -/* Mapped data is big endian */ -#define DSP_MAPBIGENDIAN 0x00000002 -#define DSP_MAPLITTLEENDIAN 0x00000000 - -/* Element size is based on DSP r/w access size */ -#define DSP_MAPMIXEDELEMSIZE 0x00000004 - -/* - * Element size for MMU mapping (8, 16, 32, or 64 bit) - * Ignored if DSP_MAPMIXEDELEMSIZE enabled - */ -#define DSP_MAPELEMSIZE8 0x00000008 -#define DSP_MAPELEMSIZE16 0x00000010 -#define DSP_MAPELEMSIZE32 0x00000020 -#define DSP_MAPELEMSIZE64 0x00000040 - -#define DSP_MAPVMALLOCADDR 0x00000080 - -#define DSP_MAPDONOTLOCK 0x00000100 - -#define DSP_MAP_DIR_MASK 0x3FFF - -#define GEM_CACHE_LINE_SIZE 128 -#define GEM_L1P_PREFETCH_SIZE 128 - -/* - * Definitions from dbreg.h - */ - -#define DSPPROCTYPE_C64 6410 -#define IVAPROCTYPE_ARM7 470 - -/* Max registry path length. Also the max registry value length. */ -#define MAXREGPATHLENGTH 255 - -#endif /* DBDEFS_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dbll.h b/drivers/staging/tidspbridge/include/dspbridge/dbll.h deleted file mode 100644 index 46a9e0027ea5..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dbll.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * dbll.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP/BIOS Bridge Dynamic load library module interface. Function header - * comments are in the file dblldefs.h. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DBLL_ -#define DBLL_ - -#include -#include - -extern bool symbols_reloaded; - -extern void dbll_close(struct dbll_library_obj *zl_lib); -extern int dbll_create(struct dbll_tar_obj **target_obj, - struct dbll_attrs *pattrs); -extern void dbll_delete(struct dbll_tar_obj *target); -extern void dbll_exit(void); -extern bool dbll_get_addr(struct dbll_library_obj *zl_lib, char *name, - struct dbll_sym_val **sym_val); -extern void dbll_get_attrs(struct dbll_tar_obj *target, - struct dbll_attrs *pattrs); -extern bool dbll_get_c_addr(struct dbll_library_obj *zl_lib, char *name, - struct dbll_sym_val **sym_val); -extern int dbll_get_sect(struct dbll_library_obj *lib, char *name, - u32 *paddr, u32 *psize); -extern bool dbll_init(void); -extern int dbll_load(struct dbll_library_obj *lib, - dbll_flags flags, - struct dbll_attrs *attrs, u32 * entry); -extern int dbll_open(struct dbll_tar_obj *target, char *file, - dbll_flags flags, - struct dbll_library_obj **lib_obj); -extern int dbll_read_sect(struct dbll_library_obj *lib, - char *name, char *buf, u32 size); -extern void dbll_unload(struct dbll_library_obj *lib, struct dbll_attrs *attrs); -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE -bool dbll_find_dsp_symbol(struct dbll_library_obj *zl_lib, u32 address, - u32 offset_range, u32 *sym_addr_output, char *name_output); -#endif - -#endif /* DBLL_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dblldefs.h b/drivers/staging/tidspbridge/include/dspbridge/dblldefs.h deleted file mode 100644 index a19e07809ff6..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dblldefs.h +++ /dev/null @@ -1,431 +0,0 @@ -/* - * dblldefs.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DBLLDEFS_ -#define DBLLDEFS_ - -/* - * Bit masks for dbl_flags. - */ -#define DBLL_NOLOAD 0x0 /* Don't load symbols, code, or data */ -#define DBLL_SYMB 0x1 /* load symbols */ -#define DBLL_CODE 0x2 /* load code */ -#define DBLL_DATA 0x4 /* load data */ -#define DBLL_DYNAMIC 0x8 /* dynamic load */ -#define DBLL_BSS 0x20 /* Unitialized section */ - -#define DBLL_MAXPATHLENGTH 255 - -/* - * ======== DBLL_Target ======== - * - */ -struct dbll_tar_obj; - -/* - * ======== dbll_flags ======== - * Specifies whether to load code, data, or symbols - */ -typedef s32 dbll_flags; - -/* - * ======== DBLL_Library ======== - * - */ -struct dbll_library_obj; - -/* - * ======== dbll_sect_info ======== - * For collecting info on overlay sections - */ -struct dbll_sect_info { - const char *name; /* name of section */ - u32 sect_run_addr; /* run address of section */ - u32 sect_load_addr; /* load address of section */ - u32 size; /* size of section (target MAUs) */ - dbll_flags type; /* Code, data, or BSS */ -}; - -/* - * ======== dbll_sym_val ======== - * (Needed for dynamic load library) - */ -struct dbll_sym_val { - u32 value; -}; - -/* - * ======== dbll_alloc_fxn ======== - * Allocate memory function. Allocate or reserve (if reserved == TRUE) - * "size" bytes of memory from segment "space" and return the address in - * *dsp_address (or starting at *dsp_address if reserve == TRUE). Returns 0 on - * success, or an error code on failure. - */ -typedef s32(*dbll_alloc_fxn) (void *hdl, s32 space, u32 size, u32 align, - u32 *dsp_address, s32 seg_id, s32 req, - bool reserved); - -/* - * ======== dbll_close_fxn ======== - */ -typedef s32(*dbll_f_close_fxn) (void *); - -/* - * ======== dbll_free_fxn ======== - * Free memory function. Free, or unreserve (if reserved == TRUE) "size" - * bytes of memory from segment "space" - */ -typedef bool(*dbll_free_fxn) (void *hdl, u32 addr, s32 space, u32 size, - bool reserved); - -/* - * ======== dbll_f_open_fxn ======== - */ -typedef void *(*dbll_f_open_fxn) (const char *, const char *); - -/* - * ======== dbll_log_write_fxn ======== - * Function to call when writing data from a section, to log the info. - * Can be NULL if no logging is required. - */ -typedef int(*dbll_log_write_fxn) (void *handle, - struct dbll_sect_info *sect, u32 addr, - u32 bytes); - -/* - * ======== dbll_read_fxn ======== - */ -typedef s32(*dbll_read_fxn) (void *, size_t, size_t, void *); - -/* - * ======== dbll_seek_fxn ======== - */ -typedef s32(*dbll_seek_fxn) (void *, long, int); - -/* - * ======== dbll_sym_lookup ======== - * Symbol lookup function - Find the symbol name and return its value. - * - * Parameters: - * handle - Opaque handle - * parg - Opaque argument. - * name - Name of symbol to lookup. - * sym - Location to store address of symbol structure. - * - * Returns: - * TRUE: Success (symbol was found). - * FALSE: Failed to find symbol. - */ -typedef bool(*dbll_sym_lookup) (void *handle, void *parg, void *rmm_handle, - const char *name, struct dbll_sym_val **sym); - -/* - * ======== dbll_tell_fxn ======== - */ -typedef s32(*dbll_tell_fxn) (void *); - -/* - * ======== dbll_write_fxn ======== - * Write memory function. Write "n" HOST bytes of memory to segment "mtype" - * starting at address "dsp_address" from the buffer "buf". The buffer is - * formatted as an array of words appropriate for the DSP. - */ -typedef s32(*dbll_write_fxn) (void *hdl, u32 dsp_address, void *buf, - u32 n, s32 mtype); - -/* - * ======== dbll_attrs ======== - */ -struct dbll_attrs { - dbll_alloc_fxn alloc; - dbll_free_fxn free; - void *rmm_handle; /* Handle to pass to alloc, free functions */ - dbll_write_fxn write; - void *input_params; /* Handle to pass to write, cinit function */ - bool base_image; - dbll_log_write_fxn log_write; - void *log_write_handle; - - /* Symbol matching function and handle to pass to it */ - dbll_sym_lookup sym_lookup; - void *sym_handle; - void *sym_arg; - - /* - * These file manipulation functions should be compatible with the - * "C" run time library functions of the same name. - */ - s32 (*fread)(void *ptr, size_t size, size_t count, void *filp); - s32 (*fseek)(void *filp, long offset, int origin); - s32 (*ftell)(void *filp); - s32 (*fclose)(void *filp); - void *(*fopen)(const char *path, const char *mode); -}; - -/* - * ======== dbll_close ======== - * Close library opened with dbll_open. - * Parameters: - * lib - Handle returned from dbll_open(). - * Returns: - * Requires: - * DBL initialized. - * Valid lib. - * Ensures: - */ -typedef void (*dbll_close_fxn) (struct dbll_library_obj *library); - -/* - * ======== dbll_create ======== - * Create a target object, specifying the alloc, free, and write functions. - * Parameters: - * target_obj - Location to store target handle on output. - * pattrs - Attributes. - * Returns: - * 0: Success. - * -ENOMEM: Memory allocation failed. - * Requires: - * DBL initialized. - * pattrs != NULL. - * target_obj != NULL; - * Ensures: - * Success: *target_obj != NULL. - * Failure: *target_obj == NULL. - */ -typedef int(*dbll_create_fxn) (struct dbll_tar_obj **target_obj, - struct dbll_attrs *attrs); - -/* - * ======== dbll_delete ======== - * Delete target object and free resources for any loaded libraries. - * Parameters: - * target - Handle returned from DBLL_Create(). - * Returns: - * Requires: - * DBL initialized. - * Valid target. - * Ensures: - */ -typedef void (*dbll_delete_fxn) (struct dbll_tar_obj *target); - -/* - * ======== dbll_exit ======== - * Discontinue use of DBL module. - * Parameters: - * Returns: - * Requires: - * refs > 0. - * Ensures: - * refs >= 0. - */ -typedef void (*dbll_exit_fxn) (void); - -/* - * ======== dbll_get_addr ======== - * Get address of name in the specified library. - * Parameters: - * lib - Handle returned from dbll_open(). - * name - Name of symbol - * sym_val - Location to store symbol address on output. - * Returns: - * TRUE: Success. - * FALSE: Symbol not found. - * Requires: - * DBL initialized. - * Valid library. - * name != NULL. - * sym_val != NULL. - * Ensures: - */ -typedef bool(*dbll_get_addr_fxn) (struct dbll_library_obj *lib, char *name, - struct dbll_sym_val **sym_val); - -/* - * ======== dbll_get_attrs ======== - * Retrieve the attributes of the target. - * Parameters: - * target - Handle returned from DBLL_Create(). - * pattrs - Location to store attributes on output. - * Returns: - * Requires: - * DBL initialized. - * Valid target. - * pattrs != NULL. - * Ensures: - */ -typedef void (*dbll_get_attrs_fxn) (struct dbll_tar_obj *target, - struct dbll_attrs *attrs); - -/* - * ======== dbll_get_c_addr ======== - * Get address of "C" name on the specified library. - * Parameters: - * lib - Handle returned from dbll_open(). - * name - Name of symbol - * sym_val - Location to store symbol address on output. - * Returns: - * TRUE: Success. - * FALSE: Symbol not found. - * Requires: - * DBL initialized. - * Valid target. - * name != NULL. - * sym_val != NULL. - * Ensures: - */ -typedef bool(*dbll_get_c_addr_fxn) (struct dbll_library_obj *lib, char *name, - struct dbll_sym_val **sym_val); - -/* - * ======== dbll_get_sect ======== - * Get address and size of a named section. - * Parameters: - * lib - Library handle returned from dbll_open(). - * name - Name of section. - * paddr - Location to store section address on output. - * psize - Location to store section size on output. - * Returns: - * 0: Success. - * -ENXIO: Section not found. - * Requires: - * DBL initialized. - * Valid lib. - * name != NULL. - * paddr != NULL; - * psize != NULL. - * Ensures: - */ -typedef int(*dbll_get_sect_fxn) (struct dbll_library_obj *lib, - char *name, u32 *addr, u32 *size); - -/* - * ======== dbll_init ======== - * Initialize DBL module. - * Parameters: - * Returns: - * TRUE: Success. - * FALSE: Failure. - * Requires: - * refs >= 0. - * Ensures: - * Success: refs > 0. - * Failure: refs >= 0. - */ -typedef bool(*dbll_init_fxn) (void); - -/* - * ======== dbll_load ======== - * Load library onto the target. - * - * Parameters: - * lib - Library handle returned from dbll_open(). - * flags - Load code, data and/or symbols. - * attrs - May contain alloc, free, and write function. - * entry_pt - Location to store program entry on output. - * Returns: - * 0: Success. - * -EBADF: File read failed. - * -EILSEQ: Failure in dynamic loader library. - * Requires: - * DBL initialized. - * Valid lib. - * entry != NULL. - * Ensures: - */ -typedef int(*dbll_load_fxn) (struct dbll_library_obj *lib, - dbll_flags flags, - struct dbll_attrs *attrs, u32 *entry); -/* - * ======== dbll_open ======== - * dbll_open() returns a library handle that can be used to load/unload - * the symbols/code/data via dbll_load()/dbll_unload(). - * Parameters: - * target - Handle returned from dbll_create(). - * file - Name of file to open. - * flags - If flags & DBLL_SYMB, load symbols. - * lib_obj - Location to store library handle on output. - * Returns: - * 0: Success. - * -ENOMEM: Memory allocation failure. - * -EBADF: File open/read failure. - * Unable to determine target type. - * Requires: - * DBL initialized. - * Valid target. - * file != NULL. - * lib_obj != NULL. - * dbll_attrs fopen function non-NULL. - * Ensures: - * Success: Valid *lib_obj. - * Failure: *lib_obj == NULL. - */ -typedef int(*dbll_open_fxn) (struct dbll_tar_obj *target, char *file, - dbll_flags flags, - struct dbll_library_obj **lib_obj); - -/* - * ======== dbll_read_sect ======== - * Read COFF section into a character buffer. - * Parameters: - * lib - Library handle returned from dbll_open(). - * name - Name of section. - * pbuf - Buffer to write section contents into. - * size - Buffer size - * Returns: - * 0: Success. - * -ENXIO: Named section does not exists. - * Requires: - * DBL initialized. - * Valid lib. - * name != NULL. - * pbuf != NULL. - * size != 0. - * Ensures: - */ -typedef int(*dbll_read_sect_fxn) (struct dbll_library_obj *lib, - char *name, char *content, - u32 cont_size); -/* - * ======== dbll_unload ======== - * Unload library loaded with dbll_load(). - * Parameters: - * lib - Handle returned from dbll_open(). - * attrs - Contains free() function and handle to pass to it. - * Returns: - * Requires: - * DBL initialized. - * Valid lib. - * Ensures: - */ -typedef void (*dbll_unload_fxn) (struct dbll_library_obj *library, - struct dbll_attrs *attrs); -struct dbll_fxns { - dbll_close_fxn close_fxn; - dbll_create_fxn create_fxn; - dbll_delete_fxn delete_fxn; - dbll_exit_fxn exit_fxn; - dbll_get_attrs_fxn get_attrs_fxn; - dbll_get_addr_fxn get_addr_fxn; - dbll_get_c_addr_fxn get_c_addr_fxn; - dbll_get_sect_fxn get_sect_fxn; - dbll_init_fxn init_fxn; - dbll_load_fxn load_fxn; - dbll_open_fxn open_fxn; - dbll_read_sect_fxn read_sect_fxn; - dbll_unload_fxn unload_fxn; -}; - -#endif /* DBLDEFS_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dev.h b/drivers/staging/tidspbridge/include/dspbridge/dev.h deleted file mode 100644 index fa2d79ef6cc8..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dev.h +++ /dev/null @@ -1,620 +0,0 @@ -/* - * dev.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Bridge Bridge driver device operations. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DEV_ -#define DEV_ - -/* ----------------------------------- Module Dependent Headers */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* ----------------------------------- This */ -#include - -/* - * ======== dev_brd_write_fxn ======== - * Purpose: - * Exported function to be used as the COD write function. This function - * is passed a handle to a DEV_hObject by ZL in arb, then calls the - * device's bridge_brd_write() function. - * Parameters: - * arb: Handle to a Device Object. - * dev_ctxt: Handle to Bridge driver defined device info. - * dsp_addr: Address on DSP board (Destination). - * host_buf: Pointer to host buffer (Source). - * ul_num_bytes: Number of bytes to transfer. - * mem_type: Memory space on DSP to which to transfer. - * Returns: - * Number of bytes written. Returns 0 if the DEV_hObject passed in via - * arb is invalid. - * Requires: - * DEV Initialized. - * host_buf != NULL - * Ensures: - */ -extern u32 dev_brd_write_fxn(void *arb, - u32 dsp_add, - void *host_buf, u32 ul_num_bytes, u32 mem_space); - -/* - * ======== dev_create_device ======== - * Purpose: - * Called by the operating system to load the Bridge Driver for a - * 'Bridge device. - * Parameters: - * device_obj: Ptr to location to receive the device object handle. - * driver_file_name: Name of Bridge driver PE DLL file to load. If the - * absolute path is not provided, the file is loaded - * through 'Bridge's module search path. - * host_config: Host configuration information, to be passed down - * to the Bridge driver when bridge_dev_create() is called. - * pDspConfig: DSP resources, to be passed down to the Bridge driver - * when bridge_dev_create() is called. - * dev_node_obj: Platform specific device node. - * Returns: - * 0: Module is loaded, device object has been created - * -ENOMEM: Insufficient memory to create needed resources. - * -EPERM: Unable to find Bridge driver entry point function. - * -ESPIPE: Unable to load ZL DLL. - * Requires: - * DEV Initialized. - * device_obj != NULL. - * driver_file_name != NULL. - * host_config != NULL. - * pDspConfig != NULL. - * Ensures: - * 0: *device_obj will contain handle to the new device object. - * Otherwise, does not create the device object, ensures the Bridge driver - * module is unloaded, and sets *device_obj to NULL. - */ -extern int dev_create_device(struct dev_object - **device_obj, - const char *driver_file_name, - struct cfg_devnode *dev_node_obj); - -/* - * ======== dev_create2 ======== - * Purpose: - * After successful loading of the image from api_init_complete2 - * (PROC Auto_Start) or proc_load this fxn is called. This creates - * the Node Manager and updates the DEV Object. - * Parameters: - * hdev_obj: Handle to device object created with dev_create_device(). - * Returns: - * 0: Successful Creation of Node Manager - * -EPERM: Some Error Occurred. - * Requires: - * DEV Initialized - * Valid hdev_obj - * Ensures: - * 0 and hdev_obj->node_mgr != NULL - * else hdev_obj->node_mgr == NULL - */ -extern int dev_create2(struct dev_object *hdev_obj); - -/* - * ======== dev_destroy2 ======== - * Purpose: - * Destroys the Node manager for this device. - * Parameters: - * hdev_obj: Handle to device object created with dev_create_device(). - * Returns: - * 0: Successful Creation of Node Manager - * -EPERM: Some Error Occurred. - * Requires: - * DEV Initialized - * Valid hdev_obj - * Ensures: - * 0 and hdev_obj->node_mgr == NULL - * else -EPERM. - */ -extern int dev_destroy2(struct dev_object *hdev_obj); - -/* - * ======== dev_destroy_device ======== - * Purpose: - * Destroys the channel manager for this device, if any, calls - * bridge_dev_destroy(), and then attempts to unload the Bridge module. - * Parameters: - * hdev_obj: Handle to device object created with - * dev_create_device(). - * Returns: - * 0: Success. - * -EFAULT: Invalid hdev_obj. - * -EPERM: The Bridge driver failed it's bridge_dev_destroy() function. - * Requires: - * DEV Initialized. - * Ensures: - */ -extern int dev_destroy_device(struct dev_object - *hdev_obj); - -/* - * ======== dev_get_chnl_mgr ======== - * Purpose: - * Retrieve the handle to the channel manager created for this device. - * Parameters: - * hdev_obj: Handle to device object created with - * dev_create_device(). - * *mgr: Ptr to location to store handle. - * Returns: - * 0: Success. - * -EFAULT: Invalid hdev_obj. - * Requires: - * mgr != NULL. - * DEV Initialized. - * Ensures: - * 0: *mgr contains a handle to a channel manager object, - * or NULL. - * else: *mgr is NULL. - */ -extern int dev_get_chnl_mgr(struct dev_object *hdev_obj, - struct chnl_mgr **mgr); - -/* - * ======== dev_get_cmm_mgr ======== - * Purpose: - * Retrieve the handle to the shared memory manager created for this - * device. - * Parameters: - * hdev_obj: Handle to device object created with - * dev_create_device(). - * *mgr: Ptr to location to store handle. - * Returns: - * 0: Success. - * -EFAULT: Invalid hdev_obj. - * Requires: - * mgr != NULL. - * DEV Initialized. - * Ensures: - * 0: *mgr contains a handle to a channel manager object, - * or NULL. - * else: *mgr is NULL. - */ -extern int dev_get_cmm_mgr(struct dev_object *hdev_obj, - struct cmm_object **mgr); - -/* - * ======== dev_get_dmm_mgr ======== - * Purpose: - * Retrieve the handle to the dynamic memory manager created for this - * device. - * Parameters: - * hdev_obj: Handle to device object created with - * dev_create_device(). - * *mgr: Ptr to location to store handle. - * Returns: - * 0: Success. - * -EFAULT: Invalid hdev_obj. - * Requires: - * mgr != NULL. - * DEV Initialized. - * Ensures: - * 0: *mgr contains a handle to a channel manager object, - * or NULL. - * else: *mgr is NULL. - */ -extern int dev_get_dmm_mgr(struct dev_object *hdev_obj, - struct dmm_object **mgr); - -/* - * ======== dev_get_cod_mgr ======== - * Purpose: - * Retrieve the COD manager create for this device. - * Parameters: - * hdev_obj: Handle to device object created with - * dev_create_device(). - * *cod_mgr: Ptr to location to store handle. - * Returns: - * 0: Success. - * -EFAULT: Invalid hdev_obj. - * Requires: - * cod_mgr != NULL. - * DEV Initialized. - * Ensures: - * 0: *cod_mgr contains a handle to a COD manager object. - * else: *cod_mgr is NULL. - */ -extern int dev_get_cod_mgr(struct dev_object *hdev_obj, - struct cod_manager **cod_mgr); - -/* - * ======== dev_get_deh_mgr ======== - * Purpose: - * Retrieve the DEH manager created for this device. - * Parameters: - * hdev_obj: Handle to device object created with dev_create_device(). - * *deh_manager: Ptr to location to store handle. - * Returns: - * 0: Success. - * -EFAULT: Invalid hdev_obj. - * Requires: - * deh_manager != NULL. - * DEH Initialized. - * Ensures: - * 0: *deh_manager contains a handle to a DEH manager object. - * else: *deh_manager is NULL. - */ -extern int dev_get_deh_mgr(struct dev_object *hdev_obj, - struct deh_mgr **deh_manager); - -/* - * ======== dev_get_dev_node ======== - * Purpose: - * Retrieve the platform specific device ID for this device. - * Parameters: - * hdev_obj: Handle to device object created with - * dev_create_device(). - * dev_nde: Ptr to location to get the device node handle. - * Returns: - * 0: Returns a DEVNODE in *dev_node_obj. - * -EFAULT: Invalid hdev_obj. - * Requires: - * dev_nde != NULL. - * DEV Initialized. - * Ensures: - * 0: *dev_nde contains a platform specific device ID; - * else: *dev_nde is NULL. - */ -extern int dev_get_dev_node(struct dev_object *hdev_obj, - struct cfg_devnode **dev_nde); - -/* - * ======== dev_get_dev_type ======== - * Purpose: - * Retrieve the platform specific device ID for this device. - * Parameters: - * hdev_obj: Handle to device object created with - * dev_create_device(). - * dev_nde: Ptr to location to get the device node handle. - * Returns: - * 0: Success - * -EFAULT: Invalid hdev_obj. - * Requires: - * dev_nde != NULL. - * DEV Initialized. - * Ensures: - * 0: *dev_nde contains a platform specific device ID; - * else: *dev_nde is NULL. - */ -extern int dev_get_dev_type(struct dev_object *device_obj, - u8 *dev_type); - -/* - * ======== dev_get_first ======== - * Purpose: - * Retrieve the first Device Object handle from an internal linked list of - * of DEV_OBJECTs maintained by DEV. - * Parameters: - * Returns: - * NULL if there are no device objects stored; else - * a valid DEV_HOBJECT. - * Requires: - * No calls to dev_create_device or dev_destroy_device (which my modify the - * internal device object list) may occur between calls to dev_get_first - * and dev_get_next. - * Ensures: - * The DEV_HOBJECT returned is valid. - * A subsequent call to dev_get_next will return the next device object in - * the list. - */ -extern struct dev_object *dev_get_first(void); - -/* - * ======== dev_get_intf_fxns ======== - * Purpose: - * Retrieve the Bridge driver interface function structure for the - * loaded Bridge driver. - * Parameters: - * hdev_obj: Handle to device object created with - * dev_create_device(). - * *if_fxns: Ptr to location to store fxn interface. - * Returns: - * 0: Success. - * -EFAULT: Invalid hdev_obj. - * Requires: - * if_fxns != NULL. - * DEV Initialized. - * Ensures: - * 0: *if_fxns contains a pointer to the Bridge - * driver interface; - * else: *if_fxns is NULL. - */ -extern int dev_get_intf_fxns(struct dev_object *hdev_obj, - struct bridge_drv_interface **if_fxns); - -/* - * ======== dev_get_io_mgr ======== - * Purpose: - * Retrieve the handle to the IO manager created for this device. - * Parameters: - * hdev_obj: Handle to device object created with - * dev_create_device(). - * *mgr: Ptr to location to store handle. - * Returns: - * 0: Success. - * -EFAULT: Invalid hdev_obj. - * Requires: - * mgr != NULL. - * DEV Initialized. - * Ensures: - * 0: *mgr contains a handle to an IO manager object. - * else: *mgr is NULL. - */ -extern int dev_get_io_mgr(struct dev_object *hdev_obj, - struct io_mgr **mgr); - -/* - * ======== dev_get_next ======== - * Purpose: - * Retrieve the next Device Object handle from an internal linked list of - * of DEV_OBJECTs maintained by DEV, after having previously called - * dev_get_first() and zero or more dev_get_next - * Parameters: - * hdev_obj: Handle to the device object returned from a previous - * call to dev_get_first() or dev_get_next(). - * Returns: - * NULL if there are no further device objects on the list or hdev_obj - * was invalid; - * else the next valid DEV_HOBJECT in the list. - * Requires: - * No calls to dev_create_device or dev_destroy_device (which my modify the - * internal device object list) may occur between calls to dev_get_first - * and dev_get_next. - * Ensures: - * The DEV_HOBJECT returned is valid. - * A subsequent call to dev_get_next will return the next device object in - * the list. - */ -extern struct dev_object *dev_get_next(struct dev_object - *hdev_obj); - -/* - * ========= dev_get_msg_mgr ======== - * Purpose: - * Retrieve the msg_ctrl Manager Handle from the DevObject. - * Parameters: - * hdev_obj: Handle to the Dev Object - * msg_man: Location where msg_ctrl Manager handle will be returned. - * Returns: - * Requires: - * DEV Initialized. - * Valid hdev_obj. - * node_man != NULL. - * Ensures: - */ -extern void dev_get_msg_mgr(struct dev_object *hdev_obj, - struct msg_mgr **msg_man); - -/* - * ========= dev_get_node_manager ======== - * Purpose: - * Retrieve the Node Manager Handle from the DevObject. It is an - * accessor function - * Parameters: - * hdev_obj: Handle to the Dev Object - * node_man: Location where Handle to the Node Manager will be - * returned.. - * Returns: - * 0: Success - * -EFAULT: Invalid Dev Object handle. - * Requires: - * DEV Initialized. - * node_man is not null - * Ensures: - * 0: *node_man contains a handle to a Node manager object. - * else: *node_man is NULL. - */ -extern int dev_get_node_manager(struct dev_object - *hdev_obj, - struct node_mgr **node_man); - -/* - * ======== dev_get_symbol ======== - * Purpose: - * Get the value of a symbol in the currently loaded program. - * Parameters: - * hdev_obj: Handle to device object created with - * dev_create_device(). - * str_sym: Name of symbol to look up. - * pul_value: Ptr to symbol value. - * Returns: - * 0: Success. - * -EFAULT: Invalid hdev_obj. - * -ESPIPE: Symbols couldn not be found or have not been loaded onto - * the board. - * Requires: - * str_sym != NULL. - * pul_value != NULL. - * DEV Initialized. - * Ensures: - * 0: *pul_value contains the symbol value; - */ -extern int dev_get_symbol(struct dev_object *hdev_obj, - const char *str_sym, u32 * pul_value); - -/* - * ======== dev_get_bridge_context ======== - * Purpose: - * Retrieve the Bridge Context handle, as returned by the - * bridge_dev_create fxn. - * Parameters: - * hdev_obj: Handle to device object created with dev_create_device() - * *phbridge_context: Ptr to location to store context handle. - * Returns: - * 0: Success. - * -EFAULT: Invalid hdev_obj. - * Requires: - * phbridge_context != NULL. - * DEV Initialized. - * Ensures: - * 0: *phbridge_context contains context handle; - * else: *phbridge_context is NULL; - */ -extern int dev_get_bridge_context(struct dev_object *hdev_obj, - struct bridge_dev_context - **phbridge_context); - -/* - * ======== dev_insert_proc_object ======== - * Purpose: - * Inserts the Processor Object into the List of PROC Objects - * kept in the DEV Object - * Parameters: - * proc_obj: Handle to the Proc Object - * hdev_obj Handle to the Dev Object - * bAttachedNew Specifies if there are already processors attached - * Returns: - * 0: Successfully inserted into the list - * Requires: - * proc_obj is not NULL - * hdev_obj is a valid handle to the DEV. - * DEV Initialized. - * List(of Proc object in Dev) Exists. - * Ensures: - * 0 & the PROC Object is inserted and the list is not empty - * Details: - * If the List of Proc Object is empty bAttachedNew is TRUE, it indicated - * this is the first Processor attaching. - * If it is False, there are already processors attached. - */ -extern int dev_insert_proc_object(struct dev_object - *hdev_obj, - u32 proc_obj, - bool *already_attached); - -/* - * ======== dev_remove_proc_object ======== - * Purpose: - * Search for and remove a Proc object from the given list maintained - * by the DEV - * Parameters: - * p_proc_object: Ptr to ProcObject to insert. - * dev_obj: Ptr to Dev Object where the list is. - * already_attached: Ptr to return the bool - * Returns: - * 0: If successful. - * -EPERM Failure to Remove the PROC Object from the list - * Requires: - * DevObject is Valid - * proc_obj != 0 - * dev_obj->proc_list != NULL - * !LST_IS_EMPTY(dev_obj->proc_list) - * already_attached !=NULL - * Ensures: - * Details: - * List will be deleted when the DEV is destroyed. - * - */ -extern int dev_remove_proc_object(struct dev_object - *hdev_obj, u32 proc_obj); - -/* - * ======== dev_notify_clients ======== - * Purpose: - * Notify all clients of this device of a change in device status. - * Clients may include multiple users of BRD, as well as CHNL. - * This function is asychronous, and may be called by a timer event - * set up by a watchdog timer. - * Parameters: - * hdev_obj: Handle to device object created with dev_create_device(). - * ret: A status word, most likely a BRD_STATUS. - * Returns: - * 0: All registered clients were asynchronously notified. - * -EINVAL: Invalid hdev_obj. - * Requires: - * DEV Initialized. - * Ensures: - * 0: Notifications are queued by the operating system to be - * delivered to clients. This function does not ensure that - * the notifications will ever be delivered. - */ -extern int dev_notify_clients(struct dev_object *hdev_obj, u32 ret); - -/* - * ======== dev_remove_device ======== - * Purpose: - * Destroys the Device Object created by dev_start_device. - * Parameters: - * dev_node_obj: Device node as it is know to OS. - * Returns: - * 0: If success; - * Otherwise. - * Requires: - * Ensures: - */ -extern int dev_remove_device(struct cfg_devnode *dev_node_obj); - -/* - * ======== dev_set_chnl_mgr ======== - * Purpose: - * Set the channel manager for this device. - * Parameters: - * hdev_obj: Handle to device object created with - * dev_create_device(). - * hmgr: Handle to a channel manager, or NULL. - * Returns: - * 0: Success. - * -EFAULT: Invalid hdev_obj. - * Requires: - * DEV Initialized. - * Ensures: - */ -extern int dev_set_chnl_mgr(struct dev_object *hdev_obj, - struct chnl_mgr *hmgr); - -/* - * ======== dev_set_msg_mgr ======== - * Purpose: - * Set the Message manager for this device. - * Parameters: - * hdev_obj: Handle to device object created with dev_create_device(). - * hmgr: Handle to a message manager, or NULL. - * Returns: - * Requires: - * DEV Initialized. - * Ensures: - */ -extern void dev_set_msg_mgr(struct dev_object *hdev_obj, struct msg_mgr *hmgr); - -/* - * ======== dev_start_device ======== - * Purpose: - * Initializes the new device with bridge environment. This involves - * querying CM for allocated resources, querying the registry for - * necessary dsp resources (requested in the INF file), and using this - * information to create a bridge device object. - * Parameters: - * dev_node_obj: Device node as it is know to OS. - * Returns: - * 0: If success; - * Otherwise. - * Requires: - * DEV initialized. - * Ensures: - */ -extern int dev_start_device(struct cfg_devnode *dev_node_obj); - -#endif /* DEV_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/devdefs.h b/drivers/staging/tidspbridge/include/dspbridge/devdefs.h deleted file mode 100644 index a2f9241ff139..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/devdefs.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * devdefs.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Definition of common include typedef between dspdefs.h and dev.h. Required - * to break circular dependency between Bridge driver and DEV include files. - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DEVDEFS_ -#define DEVDEFS_ - -/* Bridge Device Object */ -struct dev_object; - -#endif /* DEVDEFS_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/disp.h b/drivers/staging/tidspbridge/include/dspbridge/disp.h deleted file mode 100644 index 39d3cea9ca8b..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/disp.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - * disp.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP/BIOS Bridge Node Dispatcher. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DISP_ -#define DISP_ - -#include -#include -#include - -struct disp_object; - -/* Node Dispatcher attributes */ -struct disp_attr { - u32 chnl_offset; /* Offset of channel ids reserved for RMS */ - /* Size of buffer for sending data to RMS */ - u32 chnl_buf_size; - int proc_family; /* eg, 5000 */ - int proc_type; /* eg, 5510 */ - void *reserved1; /* Reserved for future use. */ - u32 reserved2; /* Reserved for future use. */ -}; - - -/* - * ======== disp_create ======== - * Create a NODE Dispatcher object. This object handles the creation, - * deletion, and execution of nodes on the DSP target, through communication - * with the Resource Manager Server running on the target. Each NODE - * Manager object should have exactly one NODE Dispatcher. - * - * Parameters: - * dispatch_obj: Location to store node dispatcher object on output. - * hdev_obj: Device for this processor. - * disp_attrs: Node dispatcher attributes. - * Returns: - * 0: Success; - * -ENOMEM: Insufficient memory for requested resources. - * -EPERM: Unable to create dispatcher. - * Requires: - * disp_attrs != NULL. - * hdev_obj != NULL. - * dispatch_obj != NULL. - * Ensures: - * 0: IS_VALID(*dispatch_obj). - * error: *dispatch_obj == NULL. - */ -extern int disp_create(struct disp_object **dispatch_obj, - struct dev_object *hdev_obj, - const struct disp_attr *disp_attrs); - -/* - * ======== disp_delete ======== - * Delete the NODE Dispatcher. - * - * Parameters: - * disp_obj: Node Dispatcher object. - * Returns: - * Requires: - * Valid disp_obj. - * Ensures: - * disp_obj is invalid. - */ -extern void disp_delete(struct disp_object *disp_obj); - -/* - * ======== disp_node_change_priority ======== - * Change the priority of a node currently running on the target. - * - * Parameters: - * disp_obj: Node Dispatcher object. - * hnode: Node object representing a node currently - * allocated or running on the DSP. - * ulFxnAddress: Address of RMS function for changing priority. - * node_env: Address of node's environment structure. - * prio: New priority level to set node's priority to. - * Returns: - * 0: Success. - * -ETIME: A timeout occurred before the DSP responded. - * Requires: - * Valid disp_obj. - * hnode != NULL. - * Ensures: - */ -extern int disp_node_change_priority(struct disp_object - *disp_obj, - struct node_object *hnode, - u32 rms_fxn, - nodeenv node_env, s32 prio); - -/* - * ======== disp_node_create ======== - * Create a node on the DSP by remotely calling the node's create function. - * - * Parameters: - * disp_obj: Node Dispatcher object. - * hnode: Node handle obtained from node_allocate(). - * ul_fxn_addr: Address or RMS create node function. - * ul_create_fxn: Address of node's create function. - * pargs: Arguments to pass to RMS node create function. - * node_env: Location to store node environment pointer on - * output. - * Returns: - * 0: Success. - * -ETIME: A timeout occurred before the DSP responded. - * -EPERM: A failure occurred, unable to create node. - * Requires: - * Valid disp_obj. - * pargs != NULL. - * hnode != NULL. - * node_env != NULL. - * node_get_type(hnode) != NODE_DEVICE. - * Ensures: - */ -extern int disp_node_create(struct disp_object *disp_obj, - struct node_object *hnode, - u32 rms_fxn, - u32 ul_create_fxn, - const struct node_createargs - *pargs, nodeenv *node_env); - -/* - * ======== disp_node_delete ======== - * Delete a node on the DSP by remotely calling the node's delete function. - * - * Parameters: - * disp_obj: Node Dispatcher object. - * hnode: Node object representing a node currently - * loaded on the DSP. - * ul_fxn_addr: Address or RMS delete node function. - * ul_delete_fxn: Address of node's delete function. - * node_env: Address of node's environment structure. - * Returns: - * 0: Success. - * -ETIME: A timeout occurred before the DSP responded. - * Requires: - * Valid disp_obj. - * hnode != NULL. - * Ensures: - */ -extern int disp_node_delete(struct disp_object *disp_obj, - struct node_object *hnode, - u32 rms_fxn, - u32 ul_delete_fxn, nodeenv node_env); - -/* - * ======== disp_node_run ======== - * Start execution of a node's execute phase, or resume execution of a node - * that has been suspended (via DISP_NodePause()) on the DSP. - * - * Parameters: - * disp_obj: Node Dispatcher object. - * hnode: Node object representing a node to be executed - * on the DSP. - * ul_fxn_addr: Address or RMS node execute function. - * ul_execute_fxn: Address of node's execute function. - * node_env: Address of node's environment structure. - * Returns: - * 0: Success. - * -ETIME: A timeout occurred before the DSP responded. - * Requires: - * Valid disp_obj. - * hnode != NULL. - * Ensures: - */ -extern int disp_node_run(struct disp_object *disp_obj, - struct node_object *hnode, - u32 rms_fxn, - u32 ul_execute_fxn, nodeenv node_env); - -#endif /* DISP_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dmm.h b/drivers/staging/tidspbridge/include/dspbridge/dmm.h deleted file mode 100644 index c3487be8fcf5..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dmm.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * dmm.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * The Dynamic Memory Mapping(DMM) module manages the DSP Virtual address - * space that can be directly mapped to any MPU buffer or memory region. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DMM_ -#define DMM_ - -#include - -struct dmm_object; - -/* DMM attributes used in dmm_create() */ -struct dmm_mgrattrs { - u32 reserved; -}; - -#define DMMPOOLSIZE 0x4000000 - -/* - * ======== dmm_get_handle ======== - * Purpose: - * Return the dynamic memory manager object for this device. - * This is typically called from the client process. - */ - -extern int dmm_get_handle(void *hprocessor, - struct dmm_object **dmm_manager); - -extern int dmm_reserve_memory(struct dmm_object *dmm_mgr, - u32 size, u32 *prsv_addr); - -extern int dmm_un_reserve_memory(struct dmm_object *dmm_mgr, - u32 rsv_addr); - -extern int dmm_map_memory(struct dmm_object *dmm_mgr, u32 addr, - u32 size); - -extern int dmm_un_map_memory(struct dmm_object *dmm_mgr, - u32 addr, u32 *psize); - -extern int dmm_destroy(struct dmm_object *dmm_mgr); - -extern int dmm_delete_tables(struct dmm_object *dmm_mgr); - -extern int dmm_create(struct dmm_object **dmm_manager, - struct dev_object *hdev_obj, - const struct dmm_mgrattrs *mgr_attrts); - -extern int dmm_create_tables(struct dmm_object *dmm_mgr, - u32 addr, u32 size); - -#ifdef DSP_DMM_DEBUG -u32 dmm_mem_map_dump(struct dmm_object *dmm_mgr); -#endif - -#endif /* DMM_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/drv.h b/drivers/staging/tidspbridge/include/dspbridge/drv.h deleted file mode 100644 index b0c7708321b2..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/drv.h +++ /dev/null @@ -1,468 +0,0 @@ -/* - * drv.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DRV Resource allocation module. Driver Object gets Created - * at the time of Loading. It holds the List of Device Objects - * in the system. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DRV_ -#define DRV_ - -#include - -#include - -/* Bridge Driver Object */ -struct drv_object; - -/* Provide the DSP Internal memory windows that can be accessed from L3 address - * space */ - -#define OMAP_GEM_BASE 0x107F8000 -#define OMAP_DSP_SIZE 0x00720000 - -/* MEM1 is L2 RAM + L2 Cache space */ -#define OMAP_DSP_MEM1_BASE 0x5C7F8000 -#define OMAP_DSP_MEM1_SIZE 0x18000 - -/* MEM2 is L1P RAM/CACHE space */ -#define OMAP_DSP_MEM2_BASE 0x5CE00000 -#define OMAP_DSP_MEM2_SIZE 0x8000 - -/* MEM3 is L1D RAM/CACHE space */ -#define OMAP_DSP_MEM3_BASE 0x5CF04000 -#define OMAP_DSP_MEM3_SIZE 0x14000 - -#define OMAP_PER_CM_BASE 0x48005000 -#define OMAP_PER_CM_SIZE 0x1000 - -#define OMAP_PER_PRM_BASE 0x48307000 -#define OMAP_PER_PRM_SIZE 0x1000 - -#define OMAP_CORE_PRM_BASE 0x48306A00 -#define OMAP_CORE_PRM_SIZE 0x1000 - -#define OMAP_DMMU_BASE 0x5D000000 -#define OMAP_DMMU_SIZE 0x1000 - -/* GPP PROCESS CLEANUP Data structures */ - -/* New structure (member of process context) abstracts NODE resource info */ -struct node_res_object { - void *node; - s32 node_allocated; /* Node status */ - s32 heap_allocated; /* Heap status */ - s32 streams_allocated; /* Streams status */ - int id; -}; - -/* used to cache dma mapping information */ -struct bridge_dma_map_info { - /* direction of DMA in action, or DMA_NONE */ - enum dma_data_direction dir; - /* number of elements requested by us */ - int num_pages; - /* number of elements returned from dma_map_sg */ - int sg_num; - /* list of buffers used in this DMA action */ - struct scatterlist *sg; -}; - -/* Used for DMM mapped memory accounting */ -struct dmm_map_object { - struct list_head link; - u32 dsp_addr; - u32 mpu_addr; - u32 size; - u32 num_usr_pgs; - struct page **pages; - struct bridge_dma_map_info dma_info; -}; - -/* Used for DMM reserved memory accounting */ -struct dmm_rsv_object { - struct list_head link; - u32 dsp_reserved_addr; -}; - -/* New structure (member of process context) abstracts stream resource info */ -struct strm_res_object { - s32 stream_allocated; /* Stream status */ - void *stream; - u32 num_bufs; - u32 dir; - int id; -}; - -/* Overall Bridge process resource usage state */ -enum gpp_proc_res_state { - PROC_RES_ALLOCATED, - PROC_RES_FREED -}; - -/* Bridge Data */ -struct drv_data { - char *base_img; - s32 shm_size; - int tc_wordswapon; - void *drv_object; - void *dev_object; - void *mgr_object; -}; - -/* Process Context */ -struct process_context { - /* Process State */ - enum gpp_proc_res_state res_state; - - /* Handle to Processor */ - void *processor; - - /* DSP Node resources */ - struct idr *node_id; - - /* DMM mapped memory resources */ - struct list_head dmm_map_list; - spinlock_t dmm_map_lock; - - /* DMM reserved memory resources */ - struct list_head dmm_rsv_list; - spinlock_t dmm_rsv_lock; - - /* Stream resources */ - struct idr *stream_id; -}; - -/* - * ======== drv_create ======== - * Purpose: - * Creates the Driver Object. This is done during the driver loading. - * There is only one Driver Object in the DSP/BIOS Bridge. - * Parameters: - * drv_obj: Location to store created DRV Object handle. - * Returns: - * 0: Success - * -ENOMEM: Failed in Memory allocation - * -EPERM: General Failure - * Requires: - * DRV Initialized (refs > 0 ) - * drv_obj != NULL. - * Ensures: - * 0: - *drv_obj is a valid DRV interface to the device. - * - List of DevObject Created and Initialized. - * - List of dev_node String created and initialized. - * - Registry is updated with the DRV Object. - * !0: DRV Object not created - * Details: - * There is one Driver Object for the Driver representing - * the driver itself. It contains the list of device - * Objects and the list of Device Extensions in the system. - * Also it can hold other necessary - * information in its storage area. - */ -extern int drv_create(struct drv_object **drv_obj); - -/* - * ======== drv_destroy ======== - * Purpose: - * destroys the Dev Object list, DrvExt list - * and destroy the DRV object - * Called upon driver unLoading.or unsuccessful loading of the driver. - * Parameters: - * driver_obj: Handle to Driver object . - * Returns: - * 0: Success. - * -EPERM: Failed to destroy DRV Object - * Requires: - * DRV Initialized (cRegs > 0 ) - * hdrv_obj is not NULL and a valid DRV handle . - * List of DevObject is Empty. - * List of DrvExt is Empty - * Ensures: - * 0: - DRV Object destroyed and hdrv_obj is not a valid - * DRV handle. - * - Registry is updated with "0" as the DRV Object. - */ -extern int drv_destroy(struct drv_object *driver_obj); - -/* - * ======== drv_get_first_dev_object ======== - * Purpose: - * Returns the Ptr to the FirstDev Object in the List - * Parameters: - * Requires: - * DRV Initialized - * Returns: - * dw_dev_object: Ptr to the First Dev Object as a u32 - * 0 if it fails to retrieve the First Dev Object - * Ensures: - */ -extern u32 drv_get_first_dev_object(void); - -/* - * ======== drv_get_first_dev_extension ======== - * Purpose: - * Returns the Ptr to the First Device Extension in the List - * Parameters: - * Requires: - * DRV Initialized - * Returns: - * dw_dev_extension: Ptr to the First Device Extension as a u32 - * 0: Failed to Get the Device Extension - * Ensures: - */ -extern u32 drv_get_first_dev_extension(void); - -/* - * ======== drv_get_dev_object ======== - * Purpose: - * Given a index, returns a handle to DevObject from the list - * Parameters: - * hdrv_obj: Handle to the Manager - * device_obj: Location to store the Dev Handle - * Requires: - * DRV Initialized - * index >= 0 - * hdrv_obj is not NULL and Valid DRV Object - * device_obj is not NULL - * Device Object List not Empty - * Returns: - * 0: Success - * -EPERM: Failed to Get the Dev Object - * Ensures: - * 0: *device_obj != NULL - * -EPERM: *device_obj = NULL - */ -extern int drv_get_dev_object(u32 index, - struct drv_object *hdrv_obj, - struct dev_object **device_obj); - -/* - * ======== drv_get_next_dev_object ======== - * Purpose: - * Returns the Ptr to the Next Device Object from the the List - * Parameters: - * hdev_obj: Handle to the Device Object - * Requires: - * DRV Initialized - * hdev_obj != 0 - * Returns: - * dw_dev_object: Ptr to the Next Dev Object as a u32 - * 0: If it fail to get the next Dev Object. - * Ensures: - */ -extern u32 drv_get_next_dev_object(u32 hdev_obj); - -/* - * ======== drv_get_next_dev_extension ======== - * Purpose: - * Returns the Ptr to the Next Device Extension from the the List - * Parameters: - * dev_extension: Handle to the Device Extension - * Requires: - * DRV Initialized - * dev_extension != 0. - * Returns: - * dw_dev_extension: Ptr to the Next Dev Extension - * 0: If it fail to Get the next Dev Extension - * Ensures: - */ -extern u32 drv_get_next_dev_extension(u32 dev_extension); - -/* - * ======== drv_insert_dev_object ======== - * Purpose: - * Insert a DeviceObject into the list of Driver object. - * Parameters: - * driver_obj: Handle to DrvObject - * hdev_obj: Handle to DeviceObject to insert. - * Returns: - * 0: If successful. - * -EPERM: General Failure: - * Requires: - * hdrv_obj != NULL and Valid DRV Handle. - * hdev_obj != NULL. - * Ensures: - * 0: Device Object is inserted and the List is not empty. - */ -extern int drv_insert_dev_object(struct drv_object *driver_obj, - struct dev_object *hdev_obj); - -/* - * ======== drv_remove_dev_object ======== - * Purpose: - * Search for and remove a Device object from the given list of Device Obj - * objects. - * Parameters: - * driver_obj: Handle to DrvObject - * hdev_obj: Handle to DevObject to Remove - * Returns: - * 0: Success. - * -EPERM: Unable to find dev_obj. - * Requires: - * hdrv_obj != NULL and a Valid DRV Handle. - * hdev_obj != NULL. - * List exists and is not empty. - * Ensures: - * List either does not exist (NULL), or is not empty if it does exist. - */ -extern int drv_remove_dev_object(struct drv_object *driver_obj, - struct dev_object *hdev_obj); - -/* - * ======== drv_request_resources ======== - * Purpose: - * Assigns the Resources or Releases them. - * Parameters: - * dw_context: Path to the driver Registry Key. - * dev_node_strg: Ptr to dev_node String stored in the Device Ext. - * Returns: - * TRUE if success; FALSE otherwise. - * Requires: - * Ensures: - * The Resources are assigned based on Bus type. - * The hardware is initialized. Resource information is - * gathered from the Registry(ISA, PCMCIA)or scanned(PCI) - * Resource structure is stored in the registry which will be - * later used by the CFG module. - */ -extern int drv_request_resources(u32 dw_context, - u32 *dev_node_strg); - -/* - * ======== drv_release_resources ======== - * Purpose: - * Assigns the Resources or Releases them. - * Parameters: - * dw_context: Path to the driver Registry Key. - * hdrv_obj: Handle to the Driver Object. - * Returns: - * TRUE if success; FALSE otherwise. - * Requires: - * Ensures: - * The Resources are released based on Bus type. - * Resource structure is deleted from the registry - */ -extern int drv_release_resources(u32 dw_context, - struct drv_object *hdrv_obj); - -/** - * drv_request_bridge_res_dsp() - Reserves shared memory for bridge. - * @phost_resources: pointer to host resources. - */ -int drv_request_bridge_res_dsp(void **phost_resources); - -#ifdef CONFIG_TIDSPBRIDGE_RECOVERY -void bridge_recover_schedule(void); -#endif - -/* - * ======== mem_ext_phys_pool_init ======== - * Purpose: - * Uses the physical memory chunk passed for internal consistent memory - * allocations. - * physical address based on the page frame address. - * Parameters: - * pool_phys_base starting address of the physical memory pool. - * pool_size size of the physical memory pool. - * Returns: - * none. - * Requires: - * - MEM initialized. - * - valid physical address for the base and size > 0 - */ -extern void mem_ext_phys_pool_init(u32 pool_phys_base, u32 pool_size); - -/* - * ======== mem_ext_phys_pool_release ======== - */ -extern void mem_ext_phys_pool_release(void); - -/* ======== mem_alloc_phys_mem ======== - * Purpose: - * Allocate physically contiguous, uncached memory - * Parameters: - * byte_size: Number of bytes to allocate. - * align_mask: Alignment Mask. - * physical_address: Physical address of allocated memory. - * Returns: - * Pointer to a block of memory; - * NULL if memory couldn't be allocated, or if byte_size == 0. - * Requires: - * MEM initialized. - * Ensures: - * The returned pointer, if not NULL, points to a valid memory block of - * the size requested. Returned physical address refers to physical - * location of memory. - */ -extern void *mem_alloc_phys_mem(u32 byte_size, - u32 align_mask, u32 *physical_address); - -/* - * ======== mem_free_phys_mem ======== - * Purpose: - * Free the given block of physically contiguous memory. - * Parameters: - * virtual_address: Pointer to virtual memory region allocated - * by mem_alloc_phys_mem(). - * physical_address: Pointer to physical memory region allocated - * by mem_alloc_phys_mem(). - * byte_size: Size of the memory region allocated by mem_alloc_phys_mem(). - * Returns: - * Requires: - * MEM initialized. - * virtual_address is a valid memory address returned by - * mem_alloc_phys_mem() - * Ensures: - * virtual_address is no longer a valid pointer to memory. - */ -extern void mem_free_phys_mem(void *virtual_address, - u32 physical_address, u32 byte_size); - -/* - * ======== MEM_LINEAR_ADDRESS ======== - * Purpose: - * Get the linear address corresponding to the given physical address. - * Parameters: - * phys_addr: Physical address to be mapped. - * byte_size: Number of bytes in physical range to map. - * Returns: - * The corresponding linear address, or NULL if unsuccessful. - * Requires: - * MEM initialized. - * Ensures: - * Notes: - * If valid linear address is returned, be sure to call - * MEM_UNMAP_LINEAR_ADDRESS(). - */ -#define MEM_LINEAR_ADDRESS(phy_addr, byte_size) phy_addr - -/* - * ======== MEM_UNMAP_LINEAR_ADDRESS ======== - * Purpose: - * Unmap the linear address mapped in MEM_LINEAR_ADDRESS. - * Parameters: - * base_addr: Ptr to mapped memory (as returned by MEM_LINEAR_ADDRESS()). - * Returns: - * Requires: - * - MEM initialized. - * - base_addr is a valid linear address mapped in MEM_LINEAR_ADDRESS. - * Ensures: - * - base_addr no longer points to a valid linear address. - */ -#define MEM_UNMAP_LINEAR_ADDRESS(base_addr) {} - -#endif /* DRV_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dspapi-ioctl.h b/drivers/staging/tidspbridge/include/dspbridge/dspapi-ioctl.h deleted file mode 100644 index 6ff808297c10..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dspapi-ioctl.h +++ /dev/null @@ -1,467 +0,0 @@ -/* - * dspapi-ioctl.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Contains structures and commands that are used for interaction - * between the DDSP API and Bridge driver. - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DSPAPIIOCTL_ -#define DSPAPIIOCTL_ - -#include -#include -#include - -union trapped_args { - - /* MGR Module */ - struct { - u32 node_id; - struct dsp_ndbprops __user *ndb_props; - u32 ndb_props_size; - u32 __user *num_nodes; - } args_mgr_enumnode_info; - - struct { - u32 processor_id; - struct dsp_processorinfo __user *processor_info; - u32 processor_info_size; - u32 __user *num_procs; - } args_mgr_enumproc_info; - - struct { - struct dsp_uuid *uuid_obj; - enum dsp_dcdobjtype obj_type; - char *sz_path_name; - } args_mgr_registerobject; - - struct { - struct dsp_uuid *uuid_obj; - enum dsp_dcdobjtype obj_type; - } args_mgr_unregisterobject; - - struct { - struct dsp_notification __user *__user *anotifications; - u32 count; - u32 __user *index; - u32 timeout; - } args_mgr_wait; - - /* PROC Module */ - struct { - u32 processor_id; - struct dsp_processorattrin __user *attr_in; - void *__user *ph_processor; - } args_proc_attach; - - struct { - void *processor; - u32 cmd; - struct dsp_cbdata __user *args; - } args_proc_ctrl; - - struct { - void *processor; - } args_proc_detach; - - struct { - void *processor; - void *__user *node_tab; - u32 node_tab_size; - u32 __user *num_nodes; - u32 __user *allocated; - } args_proc_enumnode_info; - - struct { - void *processor; - u32 resource_type; - struct dsp_resourceinfo *resource_info; - u32 resource_info_size; - } args_proc_enumresources; - - struct { - void *processor; - struct dsp_processorstate __user *proc_state_obj; - u32 state_info_size; - } args_proc_getstate; - - struct { - void *processor; - u8 __user *buf; - u8 __user *size; - u32 max_size; - } args_proc_gettrace; - - struct { - void *processor; - s32 argc_index; - char __user *__user *user_args; - char *__user *user_envp; - } args_proc_load; - - struct { - void *processor; - u32 event_mask; - u32 notify_type; - struct dsp_notification __user *notification; - } args_proc_register_notify; - - struct { - void *processor; - u32 size; - void *__user *rsv_addr; - } args_proc_rsvmem; - - struct { - void *processor; - u32 size; - void *rsv_addr; - } args_proc_unrsvmem; - - struct { - void *processor; - void *mpu_addr; - u32 size; - void *req_addr; - void *__user *map_addr; - u32 map_attr; - } args_proc_mapmem; - - struct { - void *processor; - u32 size; - void *map_addr; - } args_proc_unmapmem; - - struct { - void *processor; - void *mpu_addr; - u32 size; - u32 dir; - } args_proc_dma; - - struct { - void *processor; - void *mpu_addr; - u32 size; - u32 flags; - } args_proc_flushmemory; - - struct { - void *processor; - void *mpu_addr; - u32 size; - } args_proc_invalidatememory; - - /* NODE Module */ - struct { - void *processor; - struct dsp_uuid __user *node_id_ptr; - struct dsp_cbdata __user *args; - struct dsp_nodeattrin __user *attr_in; - void *__user *node; - } args_node_allocate; - - struct { - void *node; - u32 size; - struct dsp_bufferattr __user *attr; - u8 *__user *buffer; - } args_node_allocmsgbuf; - - struct { - void *node; - s32 prio; - } args_node_changepriority; - - struct { - void *node; - u32 stream_id; - void *other_node; - u32 other_stream; - struct dsp_strmattr __user *attrs; - struct dsp_cbdata __user *conn_param; - } args_node_connect; - - struct { - void *node; - } args_node_create; - - struct { - void *node; - } args_node_delete; - - struct { - void *node; - struct dsp_bufferattr __user *attr; - u8 *buffer; - } args_node_freemsgbuf; - - struct { - void *node; - struct dsp_nodeattr __user *attr; - u32 attr_size; - } args_node_getattr; - - struct { - void *node; - struct dsp_msg __user *message; - u32 timeout; - } args_node_getmessage; - - struct { - void *node; - } args_node_pause; - - struct { - void *node; - struct dsp_msg __user *message; - u32 timeout; - } args_node_putmessage; - - struct { - void *node; - u32 event_mask; - u32 notify_type; - struct dsp_notification __user *notification; - } args_node_registernotify; - - struct { - void *node; - } args_node_run; - - struct { - void *node; - int __user *status; - } args_node_terminate; - - struct { - void *processor; - struct dsp_uuid __user *node_id_ptr; - struct dsp_ndbprops __user *node_props; - } args_node_getuuidprops; - - /* STRM module */ - - struct { - void *stream; - u32 size; - u8 *__user *ap_buffer; - u32 num_bufs; - } args_strm_allocatebuffer; - - struct { - void *stream; - } args_strm_close; - - struct { - void *stream; - u8 *__user *ap_buffer; - u32 num_bufs; - } args_strm_freebuffer; - - struct { - void *stream; - void **event; - } args_strm_geteventhandle; - - struct { - void *stream; - struct stream_info __user *stream_info; - u32 stream_info_size; - } args_strm_getinfo; - - struct { - void *stream; - bool flush_flag; - } args_strm_idle; - - struct { - void *stream; - u8 *buffer; - u32 bytes; - u32 buf_size; - u32 arg; - } args_strm_issue; - - struct { - void *node; - u32 direction; - u32 index; - struct strm_attr __user *attr_in; - void *__user *stream; - } args_strm_open; - - struct { - void *stream; - u8 *__user *buf_ptr; - u32 __user *bytes; - u32 __user *buf_size_ptr; - u32 __user *arg; - } args_strm_reclaim; - - struct { - void *stream; - u32 event_mask; - u32 notify_type; - struct dsp_notification __user *notification; - } args_strm_registernotify; - - struct { - void *__user *stream_tab; - u32 strm_num; - u32 __user *mask; - u32 timeout; - } args_strm_select; - - /* CMM Module */ - struct { - struct cmm_object *cmm_mgr; - u32 size; - struct cmm_attrs *attrs; - void **buf_va; - } args_cmm_allocbuf; - - struct { - struct cmm_object *cmm_mgr; - void *buf_pa; - u32 seg_id; - } args_cmm_freebuf; - - struct { - void *processor; - struct cmm_object *__user *cmm_mgr; - } args_cmm_gethandle; - - struct { - struct cmm_object *cmm_mgr; - struct cmm_info __user *cmm_info_obj; - } args_cmm_getinfo; - - /* UTIL module */ - struct { - s32 util_argc; - char **argv; - } args_util_testdll; -}; - -/* - * Dspbridge Ioctl numbering scheme - * - * 7 0 - * --------------------------------- - * | Module | Ioctl Number | - * --------------------------------- - * | x | x | x | 0 | 0 | 0 | 0 | 0 | - * --------------------------------- - */ - -/* Ioctl driver identifier */ -#define DB 0xDB - -/* - * Following are used to distinguish between module ioctls, this is needed - * in case new ioctls are introduced. - */ -#define DB_MODULE_MASK 0xE0 -#define DB_IOC_MASK 0x1F - -/* Ioctl module masks */ -#define DB_MGR 0x0 -#define DB_PROC 0x20 -#define DB_NODE 0x40 -#define DB_STRM 0x60 -#define DB_CMM 0x80 - -#define DB_MODULE_SHIFT 5 - -/* Used to calculate the ioctl per dspbridge module */ -#define DB_IOC(module, num) \ - (((module) & DB_MODULE_MASK) | ((num) & DB_IOC_MASK)) -/* Used to get dspbridge ioctl module */ -#define DB_GET_MODULE(cmd) ((cmd) & DB_MODULE_MASK) -/* Used to get dspbridge ioctl number */ -#define DB_GET_IOC(cmd) ((cmd) & DB_IOC_MASK) - -/* TODO: Remove deprecated and not implemented */ - -/* MGR Module */ -#define MGR_ENUMNODE_INFO _IOWR(DB, DB_IOC(DB_MGR, 0), unsigned long) -#define MGR_ENUMPROC_INFO _IOWR(DB, DB_IOC(DB_MGR, 1), unsigned long) -#define MGR_REGISTEROBJECT _IOWR(DB, DB_IOC(DB_MGR, 2), unsigned long) -#define MGR_UNREGISTEROBJECT _IOWR(DB, DB_IOC(DB_MGR, 3), unsigned long) -#define MGR_WAIT _IOWR(DB, DB_IOC(DB_MGR, 4), unsigned long) -/* MGR_GET_PROC_RES Deprecated */ -#define MGR_GET_PROC_RES _IOR(DB, DB_IOC(DB_MGR, 5), unsigned long) - -/* PROC Module */ -#define PROC_ATTACH _IOWR(DB, DB_IOC(DB_PROC, 0), unsigned long) -#define PROC_CTRL _IOR(DB, DB_IOC(DB_PROC, 1), unsigned long) -/* PROC_DETACH Deprecated */ -#define PROC_DETACH _IOR(DB, DB_IOC(DB_PROC, 2), unsigned long) -#define PROC_ENUMNODE _IOWR(DB, DB_IOC(DB_PROC, 3), unsigned long) -#define PROC_ENUMRESOURCES _IOWR(DB, DB_IOC(DB_PROC, 4), unsigned long) -#define PROC_GET_STATE _IOWR(DB, DB_IOC(DB_PROC, 5), unsigned long) -#define PROC_GET_TRACE _IOWR(DB, DB_IOC(DB_PROC, 6), unsigned long) -#define PROC_LOAD _IOW(DB, DB_IOC(DB_PROC, 7), unsigned long) -#define PROC_REGISTERNOTIFY _IOWR(DB, DB_IOC(DB_PROC, 8), unsigned long) -#define PROC_START _IOW(DB, DB_IOC(DB_PROC, 9), unsigned long) -#define PROC_RSVMEM _IOWR(DB, DB_IOC(DB_PROC, 10), unsigned long) -#define PROC_UNRSVMEM _IOW(DB, DB_IOC(DB_PROC, 11), unsigned long) -#define PROC_MAPMEM _IOWR(DB, DB_IOC(DB_PROC, 12), unsigned long) -#define PROC_UNMAPMEM _IOR(DB, DB_IOC(DB_PROC, 13), unsigned long) -#define PROC_FLUSHMEMORY _IOW(DB, DB_IOC(DB_PROC, 14), unsigned long) -#define PROC_STOP _IOWR(DB, DB_IOC(DB_PROC, 15), unsigned long) -#define PROC_INVALIDATEMEMORY _IOW(DB, DB_IOC(DB_PROC, 16), unsigned long) -#define PROC_BEGINDMA _IOW(DB, DB_IOC(DB_PROC, 17), unsigned long) -#define PROC_ENDDMA _IOW(DB, DB_IOC(DB_PROC, 18), unsigned long) - -/* NODE Module */ -#define NODE_ALLOCATE _IOWR(DB, DB_IOC(DB_NODE, 0), unsigned long) -#define NODE_ALLOCMSGBUF _IOWR(DB, DB_IOC(DB_NODE, 1), unsigned long) -#define NODE_CHANGEPRIORITY _IOW(DB, DB_IOC(DB_NODE, 2), unsigned long) -#define NODE_CONNECT _IOW(DB, DB_IOC(DB_NODE, 3), unsigned long) -#define NODE_CREATE _IOW(DB, DB_IOC(DB_NODE, 4), unsigned long) -#define NODE_DELETE _IOW(DB, DB_IOC(DB_NODE, 5), unsigned long) -#define NODE_FREEMSGBUF _IOW(DB, DB_IOC(DB_NODE, 6), unsigned long) -#define NODE_GETATTR _IOWR(DB, DB_IOC(DB_NODE, 7), unsigned long) -#define NODE_GETMESSAGE _IOWR(DB, DB_IOC(DB_NODE, 8), unsigned long) -#define NODE_PAUSE _IOW(DB, DB_IOC(DB_NODE, 9), unsigned long) -#define NODE_PUTMESSAGE _IOW(DB, DB_IOC(DB_NODE, 10), unsigned long) -#define NODE_REGISTERNOTIFY _IOWR(DB, DB_IOC(DB_NODE, 11), unsigned long) -#define NODE_RUN _IOW(DB, DB_IOC(DB_NODE, 12), unsigned long) -#define NODE_TERMINATE _IOWR(DB, DB_IOC(DB_NODE, 13), unsigned long) -#define NODE_GETUUIDPROPS _IOWR(DB, DB_IOC(DB_NODE, 14), unsigned long) - -/* STRM Module */ -#define STRM_ALLOCATEBUFFER _IOWR(DB, DB_IOC(DB_STRM, 0), unsigned long) -#define STRM_CLOSE _IOW(DB, DB_IOC(DB_STRM, 1), unsigned long) -#define STRM_FREEBUFFER _IOWR(DB, DB_IOC(DB_STRM, 2), unsigned long) -#define STRM_GETEVENTHANDLE _IO(DB, DB_IOC(DB_STRM, 3)) /* Not Impl'd */ -#define STRM_GETINFO _IOWR(DB, DB_IOC(DB_STRM, 4), unsigned long) -#define STRM_IDLE _IOW(DB, DB_IOC(DB_STRM, 5), unsigned long) -#define STRM_ISSUE _IOW(DB, DB_IOC(DB_STRM, 6), unsigned long) -#define STRM_OPEN _IOWR(DB, DB_IOC(DB_STRM, 7), unsigned long) -#define STRM_RECLAIM _IOWR(DB, DB_IOC(DB_STRM, 8), unsigned long) -#define STRM_REGISTERNOTIFY _IOWR(DB, DB_IOC(DB_STRM, 9), unsigned long) -#define STRM_SELECT _IOWR(DB, DB_IOC(DB_STRM, 10), unsigned long) - -/* CMM Module */ -#define CMM_ALLOCBUF _IO(DB, DB_IOC(DB_CMM, 0)) /* Not Impl'd */ -#define CMM_FREEBUF _IO(DB, DB_IOC(DB_CMM, 1)) /* Not Impl'd */ -#define CMM_GETHANDLE _IOR(DB, DB_IOC(DB_CMM, 2), unsigned long) -#define CMM_GETINFO _IOR(DB, DB_IOC(DB_CMM, 3), unsigned long) - -#endif /* DSPAPIIOCTL_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dspapi.h b/drivers/staging/tidspbridge/include/dspbridge/dspapi.h deleted file mode 100644 index c99c68738b0f..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dspapi.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * dspapi.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Includes the wrapper functions called directly by the - * DeviceIOControl interface. - * - * Notes: - * Bridge services exported to Bridge driver are initialized by the DSPAPI on - * behalf of the Bridge driver. Bridge driver must not call module Init/Exit - * functions. - * - * To ensure Bridge driver binary compatibility across different platforms, - * for the same processor, a Bridge driver must restrict its usage of system - * services to those exported by the DSPAPI library. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DSPAPI_ -#define DSPAPI_ - -#include - -/* This BRD API Library Version: */ -#define BRD_API_MAJOR_VERSION (u32)8 /* .8x - Alpha, .9x - Beta, 1.x FCS */ -#define BRD_API_MINOR_VERSION (u32)0 - -/* - * ======== api_call_dev_ioctl ======== - * Purpose: - * Call the (wrapper) function for the corresponding API IOCTL. - * Parameters: - * cmd: IOCTL id, base 0. - * args: Argument structure. - * result: - * Returns: - * 0 if command called; -EINVAL if command not in IOCTL - * table. - * Requires: - * Ensures: - */ -extern int api_call_dev_ioctl(unsigned int cmd, - union trapped_args *args, - u32 *result, void *pr_ctxt); - -/* - * ======== api_init ======== - * Purpose: - * Initialize modules used by Bridge API. - * This procedure is called when the driver is loaded. - * Parameters: - * Returns: - * TRUE if success; FALSE otherwise. - * Requires: - * Ensures: - */ -extern bool api_init(void); - -/* - * ======== api_init_complete2 ======== - * Purpose: - * Perform any required bridge initialization which cannot - * be performed in api_init() or dev_start_device() due - * to the fact that some services are not yet - * completely initialized. - * Parameters: - * Returns: - * 0: Allow this device to load - * -EPERM: Failure. - * Requires: - * Bridge API initialized. - * Ensures: - */ -extern int api_init_complete2(void); - -/* - * ======== api_exit ======== - * Purpose: - * Exit all modules initialized in api_init(void). - * This procedure is called when the driver is unloaded. - * Parameters: - * Returns: - * Requires: - * api_init(void) was previously called. - * Ensures: - * Resources acquired in api_init(void) are freed. - */ -extern void api_exit(void); - -/* MGR wrapper functions */ -extern u32 mgrwrap_enum_node_info(union trapped_args *args, void *pr_ctxt); -extern u32 mgrwrap_enum_proc_info(union trapped_args *args, void *pr_ctxt); -extern u32 mgrwrap_register_object(union trapped_args *args, void *pr_ctxt); -extern u32 mgrwrap_unregister_object(union trapped_args *args, void *pr_ctxt); -extern u32 mgrwrap_wait_for_bridge_events(union trapped_args *args, - void *pr_ctxt); - -extern u32 mgrwrap_get_process_resources_info(union trapped_args *args, - void *pr_ctxt); - -/* CPRC (Processor) wrapper Functions */ -extern u32 procwrap_attach(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_ctrl(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_detach(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_enum_node_info(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_enum_resources(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_get_state(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_get_trace(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_load(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_register_notify(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_start(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_reserve_memory(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_un_reserve_memory(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_map(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_un_map(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_flush_memory(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_stop(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_invalidate_memory(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_begin_dma(union trapped_args *args, void *pr_ctxt); -extern u32 procwrap_end_dma(union trapped_args *args, void *pr_ctxt); - -/* NODE wrapper functions */ -extern u32 nodewrap_allocate(union trapped_args *args, void *pr_ctxt); -extern u32 nodewrap_alloc_msg_buf(union trapped_args *args, void *pr_ctxt); -extern u32 nodewrap_change_priority(union trapped_args *args, void *pr_ctxt); -extern u32 nodewrap_connect(union trapped_args *args, void *pr_ctxt); -extern u32 nodewrap_create(union trapped_args *args, void *pr_ctxt); -extern u32 nodewrap_delete(union trapped_args *args, void *pr_ctxt); -extern u32 nodewrap_free_msg_buf(union trapped_args *args, void *pr_ctxt); -extern u32 nodewrap_get_attr(union trapped_args *args, void *pr_ctxt); -extern u32 nodewrap_get_message(union trapped_args *args, void *pr_ctxt); -extern u32 nodewrap_pause(union trapped_args *args, void *pr_ctxt); -extern u32 nodewrap_put_message(union trapped_args *args, void *pr_ctxt); -extern u32 nodewrap_register_notify(union trapped_args *args, void *pr_ctxt); -extern u32 nodewrap_run(union trapped_args *args, void *pr_ctxt); -extern u32 nodewrap_terminate(union trapped_args *args, void *pr_ctxt); -extern u32 nodewrap_get_uuid_props(union trapped_args *args, void *pr_ctxt); - -/* STRM wrapper functions */ -extern u32 strmwrap_allocate_buffer(union trapped_args *args, void *pr_ctxt); -extern u32 strmwrap_close(union trapped_args *args, void *pr_ctxt); -extern u32 strmwrap_free_buffer(union trapped_args *args, void *pr_ctxt); -extern u32 strmwrap_get_event_handle(union trapped_args *args, void *pr_ctxt); -extern u32 strmwrap_get_info(union trapped_args *args, void *pr_ctxt); -extern u32 strmwrap_idle(union trapped_args *args, void *pr_ctxt); -extern u32 strmwrap_issue(union trapped_args *args, void *pr_ctxt); -extern u32 strmwrap_open(union trapped_args *args, void *pr_ctxt); -extern u32 strmwrap_reclaim(union trapped_args *args, void *pr_ctxt); -extern u32 strmwrap_register_notify(union trapped_args *args, void *pr_ctxt); -extern u32 strmwrap_select(union trapped_args *args, void *pr_ctxt); - -extern u32 cmmwrap_calloc_buf(union trapped_args *args, void *pr_ctxt); -extern u32 cmmwrap_free_buf(union trapped_args *args, void *pr_ctxt); -extern u32 cmmwrap_get_handle(union trapped_args *args, void *pr_ctxt); -extern u32 cmmwrap_get_info(union trapped_args *args, void *pr_ctxt); - -#endif /* DSPAPI_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dspchnl.h b/drivers/staging/tidspbridge/include/dspbridge/dspchnl.h deleted file mode 100644 index 7146a5057e29..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dspchnl.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * dspchnl.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Declares the upper edge channel class library functions required by - * all Bridge driver / DSP API driver interface tables. These functions are - * implemented by every class of Bridge channel library. - * - * Notes: - * The function comment headers reside in dspdefs.h. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DSPCHNL_ -#define DSPCHNL_ - -extern int bridge_chnl_create(struct chnl_mgr **channel_mgr, - struct dev_object *hdev_obj, - const struct chnl_mgrattrs - *mgr_attrts); - -extern int bridge_chnl_destroy(struct chnl_mgr *hchnl_mgr); - -extern int bridge_chnl_open(struct chnl_object **chnl, - struct chnl_mgr *hchnl_mgr, - s8 chnl_mode, - u32 ch_id, - const struct chnl_attr - *pattrs); - -extern int bridge_chnl_close(struct chnl_object *chnl_obj); - -extern int bridge_chnl_add_io_req(struct chnl_object *chnl_obj, - void *host_buf, - u32 byte_size, u32 buf_size, - u32 dw_dsp_addr, u32 dw_arg); - -extern int bridge_chnl_get_ioc(struct chnl_object *chnl_obj, - u32 timeout, struct chnl_ioc *chan_ioc); - -extern int bridge_chnl_cancel_io(struct chnl_object *chnl_obj); - -extern int bridge_chnl_flush_io(struct chnl_object *chnl_obj, - u32 timeout); - -extern int bridge_chnl_get_info(struct chnl_object *chnl_obj, - struct chnl_info *channel_info); - -extern int bridge_chnl_get_mgr_info(struct chnl_mgr *hchnl_mgr, - u32 ch_id, struct chnl_mgrinfo - *mgr_info); - -extern int bridge_chnl_idle(struct chnl_object *chnl_obj, - u32 timeout, bool flush_data); - -extern int bridge_chnl_register_notify(struct chnl_object *chnl_obj, - u32 event_mask, - u32 notify_type, - struct dsp_notification - *hnotification); - -#endif /* DSPCHNL_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dspdefs.h b/drivers/staging/tidspbridge/include/dspbridge/dspdefs.h deleted file mode 100644 index ed32bf383132..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dspdefs.h +++ /dev/null @@ -1,1048 +0,0 @@ -/* - * dspdefs.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Bridge driver entry point and interface function declarations. - * - * Notes: - * The DSP API obtains it's function interface to - * the Bridge driver via a call to bridge_drv_entry(). - * - * Bridge services exported to Bridge drivers are initialized by the - * DSP API on behalf of the Bridge driver. - * - * Bridge function DBC Requires and Ensures are also made by the DSP API on - * behalf of the Bridge driver, to simplify the Bridge driver code. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DSPDEFS_ -#define DSPDEFS_ - -#include -#include -#include -#include -#include -#include -#include - -/* Handle to Bridge driver's private device context. */ -struct bridge_dev_context; - -/*--------------------------------------------------------------------------- */ -/* BRIDGE DRIVER FUNCTION TYPES */ -/*--------------------------------------------------------------------------- */ - -/* - * ======== bridge_brd_monitor ======== - * Purpose: - * Bring the board to the BRD_IDLE (monitor) state. - * Parameters: - * dev_ctxt: Handle to Bridge driver defined device context. - * Returns: - * 0: Success. - * -ETIMEDOUT: Timeout occurred waiting for a response from hardware. - * -EPERM: Other, unspecified error. - * Requires: - * dev_ctxt != NULL - * Ensures: - * 0: Board is in BRD_IDLE state; - * else: Board state is indeterminate. - */ -typedef int(*fxn_brd_monitor) (struct bridge_dev_context *dev_ctxt); - -/* - * ======== fxn_brd_setstate ======== - * Purpose: - * Sets the Bridge driver state - * Parameters: - * dev_ctxt: Handle to Bridge driver defined device info. - * brd_state: Board state - * Returns: - * 0: Success. - * -EPERM: Other, unspecified error. - * Requires: - * dev_ctxt != NULL; - * brd_state <= BRD_LASTSTATE. - * Ensures: - * brd_state <= BRD_LASTSTATE. - * Update the Board state to the specified state. - */ -typedef int(*fxn_brd_setstate) (struct bridge_dev_context - * dev_ctxt, u32 brd_state); - -/* - * ======== bridge_brd_start ======== - * Purpose: - * Bring board to the BRD_RUNNING (start) state. - * Parameters: - * dev_ctxt: Handle to Bridge driver defined device context. - * dsp_addr: DSP address at which to start execution. - * Returns: - * 0: Success. - * -ETIMEDOUT: Timeout occurred waiting for a response from hardware. - * -EPERM: Other, unspecified error. - * Requires: - * dev_ctxt != NULL - * Board is in monitor (BRD_IDLE) state. - * Ensures: - * 0: Board is in BRD_RUNNING state. - * Interrupts to the PC are enabled. - * else: Board state is indeterminate. - */ -typedef int(*fxn_brd_start) (struct bridge_dev_context - * dev_ctxt, u32 dsp_addr); - -/* - * ======== bridge_brd_mem_copy ======== - * Purpose: - * Copy memory from one DSP address to another - * Parameters: - * dev_context: Pointer to context handle - * dsp_dest_addr: DSP address to copy to - * dsp_src_addr: DSP address to copy from - * ul_num_bytes: Number of bytes to copy - * mem_type: What section of memory to copy to - * Returns: - * 0: Success. - * -EPERM: Other, unspecified error. - * Requires: - * dev_context != NULL - * Ensures: - * 0: Board is in BRD_RUNNING state. - * Interrupts to the PC are enabled. - * else: Board state is indeterminate. - */ -typedef int(*fxn_brd_memcopy) (struct bridge_dev_context - * dev_ctxt, - u32 dsp_dest_addr, - u32 dsp_src_addr, - u32 ul_num_bytes, u32 mem_type); -/* - * ======== bridge_brd_mem_write ======== - * Purpose: - * Write a block of host memory into a DSP address, into a given memory - * space. Unlike bridge_brd_write, this API does reset the DSP - * Parameters: - * dev_ctxt: Handle to Bridge driver defined device info. - * dsp_addr: Address on DSP board (Destination). - * host_buf: Pointer to host buffer (Source). - * ul_num_bytes: Number of bytes to transfer. - * mem_type: Memory space on DSP to which to transfer. - * Returns: - * 0: Success. - * -ETIMEDOUT: Timeout occurred waiting for a response from hardware. - * -EPERM: Other, unspecified error. - * Requires: - * dev_ctxt != NULL; - * host_buf != NULL. - * Ensures: - */ -typedef int(*fxn_brd_memwrite) (struct bridge_dev_context - * dev_ctxt, - u8 *host_buf, - u32 dsp_addr, u32 ul_num_bytes, - u32 mem_type); - -/* - * ======== bridge_brd_mem_map ======== - * Purpose: - * Map a MPU memory region to a DSP/IVA memory space - * Parameters: - * dev_ctxt: Handle to Bridge driver defined device info. - * ul_mpu_addr: MPU memory region start address. - * virt_addr: DSP/IVA memory region u8 address. - * ul_num_bytes: Number of bytes to map. - * map_attrs: Mapping attributes (e.g. endianness). - * Returns: - * 0: Success. - * -EPERM: Other, unspecified error. - * Requires: - * dev_ctxt != NULL; - * Ensures: - */ -typedef int(*fxn_brd_memmap) (struct bridge_dev_context - * dev_ctxt, u32 ul_mpu_addr, - u32 virt_addr, u32 ul_num_bytes, - u32 map_attr, - struct page **mapped_pages); - -/* - * ======== bridge_brd_mem_un_map ======== - * Purpose: - * UnMap an MPU memory region from DSP/IVA memory space - * Parameters: - * dev_ctxt: Handle to Bridge driver defined device info. - * virt_addr: DSP/IVA memory region u8 address. - * ul_num_bytes: Number of bytes to unmap. - * Returns: - * 0: Success. - * -EPERM: Other, unspecified error. - * Requires: - * dev_ctxt != NULL; - * Ensures: - */ -typedef int(*fxn_brd_memunmap) (struct bridge_dev_context - * dev_ctxt, - u32 virt_addr, u32 ul_num_bytes); - -/* - * ======== bridge_brd_stop ======== - * Purpose: - * Bring board to the BRD_STOPPED state. - * Parameters: - * dev_ctxt: Handle to Bridge driver defined device context. - * Returns: - * 0: Success. - * -ETIMEDOUT: Timeout occurred waiting for a response from hardware. - * -EPERM: Other, unspecified error. - * Requires: - * dev_ctxt != NULL - * Ensures: - * 0: Board is in BRD_STOPPED (stop) state; - * Interrupts to the PC are disabled. - * else: Board state is indeterminate. - */ -typedef int(*fxn_brd_stop) (struct bridge_dev_context *dev_ctxt); - -/* - * ======== bridge_brd_status ======== - * Purpose: - * Report the current state of the board. - * Parameters: - * dev_ctxt: Handle to Bridge driver defined device context. - * board_state: Ptr to BRD status variable. - * Returns: - * 0: - * Requires: - * board_state != NULL; - * dev_ctxt != NULL - * Ensures: - * *board_state is one of - * {BRD_STOPPED, BRD_IDLE, BRD_RUNNING, BRD_UNKNOWN}; - */ -typedef int(*fxn_brd_status) (struct bridge_dev_context *dev_ctxt, - int *board_state); - -/* - * ======== bridge_brd_read ======== - * Purpose: - * Read a block of DSP memory, from a given memory space, into a host - * buffer. - * Parameters: - * dev_ctxt: Handle to Bridge driver defined device info. - * host_buf: Pointer to host buffer (Destination). - * dsp_addr: Address on DSP board (Source). - * ul_num_bytes: Number of bytes to transfer. - * mem_type: Memory space on DSP from which to transfer. - * Returns: - * 0: Success. - * -ETIMEDOUT: Timeout occurred waiting for a response from hardware. - * -EPERM: Other, unspecified error. - * Requires: - * dev_ctxt != NULL; - * host_buf != NULL. - * Ensures: - * Will not write more than ul_num_bytes bytes into host_buf. - */ -typedef int(*fxn_brd_read) (struct bridge_dev_context *dev_ctxt, - u8 *host_buf, - u32 dsp_addr, - u32 ul_num_bytes, u32 mem_type); - -/* - * ======== bridge_brd_write ======== - * Purpose: - * Write a block of host memory into a DSP address, into a given memory - * space. - * Parameters: - * dev_ctxt: Handle to Bridge driver defined device info. - * dsp_addr: Address on DSP board (Destination). - * host_buf: Pointer to host buffer (Source). - * ul_num_bytes: Number of bytes to transfer. - * mem_type: Memory space on DSP to which to transfer. - * Returns: - * 0: Success. - * -ETIMEDOUT: Timeout occurred waiting for a response from hardware. - * -EPERM: Other, unspecified error. - * Requires: - * dev_ctxt != NULL; - * host_buf != NULL. - * Ensures: - */ -typedef int(*fxn_brd_write) (struct bridge_dev_context *dev_ctxt, - u8 *host_buf, - u32 dsp_addr, - u32 ul_num_bytes, u32 mem_type); - -/* - * ======== bridge_chnl_create ======== - * Purpose: - * Create a channel manager object, responsible for opening new channels - * and closing old ones for a given 'Bridge board. - * Parameters: - * channel_mgr: Location to store a channel manager object on output. - * hdev_obj: Handle to a device object. - * mgr_attrts: Channel manager attributes. - * mgr_attrts->max_channels: Max channels - * mgr_attrts->birq: Channel's I/O IRQ number. - * mgr_attrts->irq_shared: TRUE if the IRQ is shareable. - * mgr_attrts->word_size: DSP Word size in equivalent PC bytes.. - * mgr_attrts->shm_base: Base physical address of shared memory, if any. - * mgr_attrts->sm_length: Bytes of shared memory block. - * Returns: - * 0: Success; - * -ENOMEM: Insufficient memory for requested resources. - * -EIO: Unable to plug ISR for given IRQ. - * -EFAULT: Couldn't map physical address to a virtual one. - * Requires: - * channel_mgr != NULL. - * mgr_attrts != NULL - * mgr_attrts field are all valid: - * 0 < max_channels <= CHNL_MAXCHANNELS. - * birq <= 15. - * word_size > 0. - * hdev_obj != NULL - * No channel manager exists for this board. - * Ensures: - */ -typedef int(*fxn_chnl_create) (struct chnl_mgr - **channel_mgr, - struct dev_object - * hdev_obj, - const struct - chnl_mgrattrs * mgr_attrts); - -/* - * ======== bridge_chnl_destroy ======== - * Purpose: - * Close all open channels, and destroy the channel manager. - * Parameters: - * hchnl_mgr: Channel manager object. - * Returns: - * 0: Success. - * -EFAULT: hchnl_mgr was invalid. - * Requires: - * Ensures: - * 0: Cancels I/O on each open channel. Closes each open channel. - * chnl_create may subsequently be called for the same device. - */ -typedef int(*fxn_chnl_destroy) (struct chnl_mgr *hchnl_mgr); -/* - * ======== bridge_deh_notify ======== - * Purpose: - * When notified of DSP error, take appropriate action. - * Parameters: - * hdeh_mgr: Handle to DEH manager object. - * evnt_mask: Indicate the type of exception - * error_info: Error information - * Returns: - * - * Requires: - * hdeh_mgr != NULL; - * evnt_mask with a valid exception - * Ensures: - */ -typedef void (*fxn_deh_notify) (struct deh_mgr *hdeh_mgr, - u32 evnt_mask, u32 error_info); - -/* - * ======== bridge_chnl_open ======== - * Purpose: - * Open a new half-duplex channel to the DSP board. - * Parameters: - * chnl: Location to store a channel object handle. - * hchnl_mgr: Handle to channel manager, as returned by - * CHNL_GetMgr(). - * chnl_mode: One of {CHNL_MODETODSP, CHNL_MODEFROMDSP} specifies - * direction of data transfer. - * ch_id: If CHNL_PICKFREE is specified, the channel manager will - * select a free channel id (default); - * otherwise this field specifies the id of the channel. - * pattrs: Channel attributes. Attribute fields are as follows: - * pattrs->uio_reqs: Specifies the maximum number of I/O requests which can - * be pending at any given time. All request packets are - * preallocated when the channel is opened. - * pattrs->event_obj: This field allows the user to supply an auto reset - * event object for channel I/O completion notifications. - * It is the responsibility of the user to destroy this - * object AFTER closing the channel. - * This channel event object can be retrieved using - * CHNL_GetEventHandle(). - * pattrs->hReserved: The kernel mode handle of this event object. - * - * Returns: - * 0: Success. - * -EFAULT: hchnl_mgr is invalid. - * -ENOMEM: Insufficient memory for requested resources. - * -EINVAL: Invalid number of IOReqs. - * -ENOSR: No free channels available. - * -ECHRNG: Channel ID is out of range. - * -EALREADY: Channel is in use. - * -EIO: No free IO request packets available for - * queuing. - * Requires: - * chnl != NULL. - * pattrs != NULL. - * pattrs->event_obj is a valid event handle. - * pattrs->hReserved is the kernel mode handle for pattrs->event_obj. - * Ensures: - * 0: *chnl is a valid channel. - * else: *chnl is set to NULL if (chnl != NULL); - */ -typedef int(*fxn_chnl_open) (struct chnl_object - **chnl, - struct chnl_mgr *hchnl_mgr, - s8 chnl_mode, - u32 ch_id, - const struct - chnl_attr * pattrs); - -/* - * ======== bridge_chnl_close ======== - * Purpose: - * Ensures all pending I/O on this channel is cancelled, discards all - * queued I/O completion notifications, then frees the resources allocated - * for this channel, and makes the corresponding logical channel id - * available for subsequent use. - * Parameters: - * chnl_obj: Handle to a channel object. - * Returns: - * 0: Success; - * -EFAULT: Invalid chnl_obj. - * Requires: - * No thread must be blocked on this channel's I/O completion event. - * Ensures: - * 0: chnl_obj is no longer valid. - */ -typedef int(*fxn_chnl_close) (struct chnl_object *chnl_obj); - -/* - * ======== bridge_chnl_add_io_req ======== - * Purpose: - * Enqueue an I/O request for data transfer on a channel to the DSP. - * The direction (mode) is specified in the channel object. Note the DSP - * address is specified for channels opened in direct I/O mode. - * Parameters: - * chnl_obj: Channel object handle. - * host_buf: Host buffer address source. - * byte_size: Number of PC bytes to transfer. A zero value indicates - * that this buffer is the last in the output channel. - * A zero value is invalid for an input channel. - *! buf_size: Actual buffer size in host bytes. - * dw_dsp_addr: DSP address for transfer. (Currently ignored). - * dw_arg: A user argument that travels with the buffer. - * Returns: - * 0: Success; - * -EFAULT: Invalid chnl_obj or host_buf. - * -EPERM: User cannot mark EOS on an input channel. - * -ECANCELED: I/O has been cancelled on this channel. No further - * I/O is allowed. - * -EPIPE: End of stream was already marked on a previous - * IORequest on this channel. No further I/O is expected. - * -EINVAL: Buffer submitted to this output channel is larger than - * the size of the physical shared memory output window. - * Requires: - * Ensures: - * 0: The buffer will be transferred if the channel is ready; - * otherwise, will be queued for transfer when the channel becomes - * ready. In any case, notifications of I/O completion are - * asynchronous. - * If byte_size is 0 for an output channel, subsequent CHNL_AddIOReq's - * on this channel will fail with error code -EPIPE. The - * corresponding IOC for this I/O request will have its status flag - * set to CHNL_IOCSTATEOS. - */ -typedef int(*fxn_chnl_addioreq) (struct chnl_object - * chnl_obj, - void *host_buf, - u32 byte_size, - u32 buf_size, - u32 dw_dsp_addr, u32 dw_arg); - -/* - * ======== bridge_chnl_get_ioc ======== - * Purpose: - * Dequeue an I/O completion record, which contains information about the - * completed I/O request. - * Parameters: - * chnl_obj: Channel object handle. - * timeout: A value of CHNL_IOCNOWAIT will simply dequeue the - * first available IOC. - * chan_ioc: On output, contains host buffer address, bytes - * transferred, and status of I/O completion. - * chan_ioc->status: See chnldefs.h. - * Returns: - * 0: Success. - * -EFAULT: Invalid chnl_obj or chan_ioc. - * -EREMOTEIO: CHNL_IOCNOWAIT was specified as the timeout parameter - * yet no I/O completions were queued. - * Requires: - * timeout == CHNL_IOCNOWAIT. - * Ensures: - * 0: if there are any remaining IOC's queued before this call - * returns, the channel event object will be left in a signalled - * state. - */ -typedef int(*fxn_chnl_getioc) (struct chnl_object *chnl_obj, - u32 timeout, - struct chnl_ioc *chan_ioc); - -/* - * ======== bridge_chnl_cancel_io ======== - * Purpose: - * Return all I/O requests to the client which have not yet been - * transferred. The channel's I/O completion object is - * signalled, and all the I/O requests are queued as IOC's, with the - * status field set to CHNL_IOCSTATCANCEL. - * This call is typically used in abort situations, and is a prelude to - * chnl_close(); - * Parameters: - * chnl_obj: Channel object handle. - * Returns: - * 0: Success; - * -EFAULT: Invalid chnl_obj. - * Requires: - * Ensures: - * Subsequent I/O requests to this channel will not be accepted. - */ -typedef int(*fxn_chnl_cancelio) (struct chnl_object *chnl_obj); - -/* - * ======== bridge_chnl_flush_io ======== - * Purpose: - * For an output stream (to the DSP), indicates if any IO requests are in - * the output request queue. For input streams (from the DSP), will - * cancel all pending IO requests. - * Parameters: - * chnl_obj: Channel object handle. - * timeout: Timeout value for flush operation. - * Returns: - * 0: Success; - * S_CHNLIOREQUEST: Returned if any IORequests are in the output queue. - * -EFAULT: Invalid chnl_obj. - * Requires: - * Ensures: - * 0: No I/O requests will be pending on this channel. - */ -typedef int(*fxn_chnl_flushio) (struct chnl_object *chnl_obj, - u32 timeout); - -/* - * ======== bridge_chnl_get_info ======== - * Purpose: - * Retrieve information related to a channel. - * Parameters: - * chnl_obj: Handle to a valid channel object, or NULL. - * channel_info: Location to store channel info. - * Returns: - * 0: Success; - * -EFAULT: Invalid chnl_obj or channel_info. - * Requires: - * Ensures: - * 0: channel_info points to a filled in chnl_info struct, - * if (channel_info != NULL). - */ -typedef int(*fxn_chnl_getinfo) (struct chnl_object *chnl_obj, - struct chnl_info *channel_info); - -/* - * ======== bridge_chnl_get_mgr_info ======== - * Purpose: - * Retrieve information related to the channel manager. - * Parameters: - * hchnl_mgr: Handle to a valid channel manager, or NULL. - * ch_id: Channel ID. - * mgr_info: Location to store channel manager info. - * Returns: - * 0: Success; - * -EFAULT: Invalid hchnl_mgr or mgr_info. - * -ECHRNG: Invalid channel ID. - * Requires: - * Ensures: - * 0: mgr_info points to a filled in chnl_mgrinfo - * struct, if (mgr_info != NULL). - */ -typedef int(*fxn_chnl_getmgrinfo) (struct chnl_mgr - * hchnl_mgr, - u32 ch_id, - struct chnl_mgrinfo *mgr_info); - -/* - * ======== bridge_chnl_idle ======== - * Purpose: - * Idle a channel. If this is an input channel, or if this is an output - * channel and flush_data is TRUE, all currently enqueued buffers will be - * dequeued (data discarded for output channel). - * If this is an output channel and flush_data is FALSE, this function - * will block until all currently buffered data is output, or the timeout - * specified has been reached. - * - * Parameters: - * chnl_obj: Channel object handle. - * timeout: If output channel and flush_data is FALSE, timeout value - * to wait for buffers to be output. (Not used for - * input channel). - * flush_data: If output channel and flush_data is TRUE, discard any - * currently buffered data. If FALSE, wait for currently - * buffered data to be output, or timeout, whichever - * occurs first. flush_data is ignored for input channel. - * Returns: - * 0: Success; - * -EFAULT: Invalid chnl_obj. - * -ETIMEDOUT: Timeout occurred before channel could be idled. - * Requires: - * Ensures: - */ -typedef int(*fxn_chnl_idle) (struct chnl_object *chnl_obj, - u32 timeout, bool flush_data); - -/* - * ======== bridge_chnl_register_notify ======== - * Purpose: - * Register for notification of events on a channel. - * Parameters: - * chnl_obj: Channel object handle. - * event_mask: Type of events to be notified about: IO completion - * (DSP_STREAMIOCOMPLETION) or end of stream - * (DSP_STREAMDONE). - * notify_type: DSP_SIGNALEVENT. - * hnotification: Handle of a dsp_notification object. - * Returns: - * 0: Success. - * -ENOMEM: Insufficient memory. - * -EINVAL: event_mask is 0 and hnotification was not - * previously registered. - * -EFAULT: NULL hnotification, hnotification event name - * too long, or hnotification event name NULL. - * Requires: - * Valid chnl_obj. - * hnotification != NULL. - * (event_mask & ~(DSP_STREAMIOCOMPLETION | DSP_STREAMDONE)) == 0. - * notify_type == DSP_SIGNALEVENT. - * Ensures: - */ -typedef int(*fxn_chnl_registernotify) - (struct chnl_object *chnl_obj, - u32 event_mask, u32 notify_type, struct dsp_notification *hnotification); - -/* - * ======== bridge_dev_create ======== - * Purpose: - * Complete creation of the device object for this board. - * Parameters: - * device_ctx: Ptr to location to store a Bridge device context. - * hdev_obj: Handle to a Device Object, created and managed by DSP API. - * config_param: Ptr to configuration parameters provided by the - * Configuration Manager during device loading. - * pDspConfig: DSP resources, as specified in the registry key for this - * device. - * Returns: - * 0: Success. - * -ENOMEM: Unable to allocate memory for device context. - * Requires: - * device_ctx != NULL; - * hdev_obj != NULL; - * config_param != NULL; - * pDspConfig != NULL; - * Fields in config_param and pDspConfig contain valid values. - * Ensures: - * 0: All Bridge driver specific DSP resource and other - * board context has been allocated. - * -ENOMEM: Bridge failed to allocate resources. - * Any acquired resources have been freed. The DSP API - * will not call bridge_dev_destroy() if - * bridge_dev_create() fails. - * Details: - * Called during the CONFIGMG's Device_Init phase. Based on host and - * DSP configuration information, create a board context, a handle to - * which is passed into other Bridge BRD and CHNL functions. The - * board context contains state information for the device. Since the - * addresses of all pointer parameters may be invalid when this - * function returns, they must not be stored into the device context - * structure. - */ -typedef int(*fxn_dev_create) (struct bridge_dev_context - **device_ctx, - struct dev_object - * hdev_obj, - struct cfg_hostres - * config_param); - -/* - * ======== bridge_dev_ctrl ======== - * Purpose: - * Bridge driver specific interface. - * Parameters: - * dev_ctxt: Handle to Bridge driver defined device info. - * dw_cmd: Bridge driver defined command code. - * pargs: Pointer to an arbitrary argument structure. - * Returns: - * 0 or -EPERM. Actual command error codes should be passed back in - * the pargs structure, and are defined by the Bridge driver implementor. - * Requires: - * All calls are currently assumed to be synchronous. There are no - * IOCTL completion routines provided. - * Ensures: - */ -typedef int(*fxn_dev_ctrl) (struct bridge_dev_context *dev_ctxt, - u32 dw_cmd, void *pargs); - -/* - * ======== bridge_dev_destroy ======== - * Purpose: - * Deallocate Bridge device extension structures and all other resources - * acquired by the Bridge driver. - * No calls to other Bridge driver functions may subsequently - * occur, except for bridge_dev_create(). - * Parameters: - * dev_ctxt: Handle to Bridge driver defined device information. - * Returns: - * 0: Success. - * -EPERM: Failed to release a resource previously acquired. - * Requires: - * dev_ctxt != NULL; - * Ensures: - * 0: Device context is freed. - */ -typedef int(*fxn_dev_destroy) (struct bridge_dev_context *dev_ctxt); - -/* - * ======== bridge_io_create ======== - * Purpose: - * Create an object that manages I/O between CHNL and msg_ctrl. - * Parameters: - * io_man: Location to store IO manager on output. - * hchnl_mgr: Handle to channel manager. - * hmsg_mgr: Handle to message manager. - * Returns: - * 0: Success. - * -ENOMEM: Memory allocation failure. - * -EPERM: Creation failed. - * Requires: - * hdev_obj != NULL; - * Channel manager already created; - * Message manager already created; - * mgr_attrts != NULL; - * io_man != NULL; - * Ensures: - */ -typedef int(*fxn_io_create) (struct io_mgr **io_man, - struct dev_object *hdev_obj, - const struct io_attrs *mgr_attrts); - -/* - * ======== bridge_io_destroy ======== - * Purpose: - * Destroy object created in bridge_io_create. - * Parameters: - * hio_mgr: IO Manager. - * Returns: - * 0: Success. - * -ENOMEM: Memory allocation failure. - * -EPERM: Creation failed. - * Requires: - * Valid hio_mgr; - * Ensures: - */ -typedef int(*fxn_io_destroy) (struct io_mgr *hio_mgr); - -/* - * ======== bridge_io_on_loaded ======== - * Purpose: - * Called whenever a program is loaded to update internal data. For - * example, if shared memory is used, this function would update the - * shared memory location and address. - * Parameters: - * hio_mgr: IO Manager. - * Returns: - * 0: Success. - * -EPERM: Internal failure occurred. - * Requires: - * Valid hio_mgr; - * Ensures: - */ -typedef int(*fxn_io_onloaded) (struct io_mgr *hio_mgr); - -/* - * ======== fxn_io_getprocload ======== - * Purpose: - * Called to get the Processor's current and predicted load - * Parameters: - * hio_mgr: IO Manager. - * proc_load_stat Processor Load statistics - * Returns: - * 0: Success. - * -EPERM: Internal failure occurred. - * Requires: - * Valid hio_mgr; - * Ensures: - */ -typedef int(*fxn_io_getprocload) (struct io_mgr *hio_mgr, - struct dsp_procloadstat * - proc_load_stat); - -/* - * ======== bridge_msg_create ======== - * Purpose: - * Create an object to manage message queues. Only one of these objects - * can exist per device object. - * Parameters: - * msg_man: Location to store msg_ctrl manager on output. - * hdev_obj: Handle to a device object. - * msg_callback: Called whenever an RMS_EXIT message is received. - * Returns: - * 0: Success. - * -ENOMEM: Insufficient memory. - * Requires: - * msg_man != NULL. - * msg_callback != NULL. - * hdev_obj != NULL. - * Ensures: - */ -typedef int(*fxn_msg_create) - (struct msg_mgr **msg_man, - struct dev_object *hdev_obj, msg_onexit msg_callback); - -/* - * ======== bridge_msg_create_queue ======== - * Purpose: - * Create a msg_ctrl queue for sending or receiving messages from a Message - * node on the DSP. - * Parameters: - * hmsg_mgr: msg_ctrl queue manager handle returned from - * bridge_msg_create. - * msgq: Location to store msg_ctrl queue on output. - * msgq_id: Identifier for messages (node environment pointer). - * max_msgs: Max number of simultaneous messages for the node. - * h: Handle passed to hmsg_mgr->msg_callback(). - * Returns: - * 0: Success. - * -ENOMEM: Insufficient memory. - * Requires: - * msgq != NULL. - * h != NULL. - * max_msgs > 0. - * Ensures: - * msgq !=NULL <==> 0. - */ -typedef int(*fxn_msg_createqueue) - (struct msg_mgr *hmsg_mgr, - struct msg_queue **msgq, u32 msgq_id, u32 max_msgs, void *h); - -/* - * ======== bridge_msg_delete ======== - * Purpose: - * Delete a msg_ctrl manager allocated in bridge_msg_create(). - * Parameters: - * hmsg_mgr: Handle returned from bridge_msg_create(). - * Returns: - * Requires: - * Valid hmsg_mgr. - * Ensures: - */ -typedef void (*fxn_msg_delete) (struct msg_mgr *hmsg_mgr); - -/* - * ======== bridge_msg_delete_queue ======== - * Purpose: - * Delete a msg_ctrl queue allocated in bridge_msg_create_queue. - * Parameters: - * msg_queue_obj: Handle to msg_ctrl queue returned from - * bridge_msg_create_queue. - * Returns: - * Requires: - * Valid msg_queue_obj. - * Ensures: - */ -typedef void (*fxn_msg_deletequeue) (struct msg_queue *msg_queue_obj); - -/* - * ======== bridge_msg_get ======== - * Purpose: - * Get a message from a msg_ctrl queue. - * Parameters: - * msg_queue_obj: Handle to msg_ctrl queue returned from - * bridge_msg_create_queue. - * pmsg: Location to copy message into. - * utimeout: Timeout to wait for a message. - * Returns: - * 0: Success. - * -ETIME: Timeout occurred. - * -EPERM: No frames available for message (max_msgs too - * small). - * Requires: - * Valid msg_queue_obj. - * pmsg != NULL. - * Ensures: - */ -typedef int(*fxn_msg_get) (struct msg_queue *msg_queue_obj, - struct dsp_msg *pmsg, u32 utimeout); - -/* - * ======== bridge_msg_put ======== - * Purpose: - * Put a message onto a msg_ctrl queue. - * Parameters: - * msg_queue_obj: Handle to msg_ctrl queue returned from - * bridge_msg_create_queue. - * pmsg: Pointer to message. - * utimeout: Timeout to wait for a message. - * Returns: - * 0: Success. - * -ETIME: Timeout occurred. - * -EPERM: No frames available for message (max_msgs too - * small). - * Requires: - * Valid msg_queue_obj. - * pmsg != NULL. - * Ensures: - */ -typedef int(*fxn_msg_put) (struct msg_queue *msg_queue_obj, - const struct dsp_msg *pmsg, u32 utimeout); - -/* - * ======== bridge_msg_register_notify ======== - * Purpose: - * Register notification for when a message is ready. - * Parameters: - * msg_queue_obj: Handle to msg_ctrl queue returned from - * bridge_msg_create_queue. - * event_mask: Type of events to be notified about: Must be - * DSP_NODEMESSAGEREADY, or 0 to unregister. - * notify_type: DSP_SIGNALEVENT. - * hnotification: Handle of notification object. - * Returns: - * 0: Success. - * -ENOMEM: Insufficient memory. - * Requires: - * Valid msg_queue_obj. - * hnotification != NULL. - * notify_type == DSP_SIGNALEVENT. - * event_mask == DSP_NODEMESSAGEREADY || event_mask == 0. - * Ensures: - */ -typedef int(*fxn_msg_registernotify) - (struct msg_queue *msg_queue_obj, - u32 event_mask, u32 notify_type, struct dsp_notification *hnotification); - -/* - * ======== bridge_msg_set_queue_id ======== - * Purpose: - * Set message queue id to node environment. Allows bridge_msg_create_queue - * to be called in node_allocate, before the node environment is known. - * Parameters: - * msg_queue_obj: Handle to msg_ctrl queue returned from - * bridge_msg_create_queue. - * msgq_id: Node environment pointer. - * Returns: - * Requires: - * Valid msg_queue_obj. - * msgq_id != 0. - * Ensures: - */ -typedef void (*fxn_msg_setqueueid) (struct msg_queue *msg_queue_obj, - u32 msgq_id); - -/* - * Bridge Driver interface function table. - * - * The information in this table is filled in by the specific Bridge driver, - * and copied into the DSP API's own space. If any interface - * function field is set to a value of NULL, then the DSP API will - * consider that function not implemented, and return the error code - * -ENOSYS when a Bridge driver client attempts to call that function. - * - * This function table contains DSP API version numbers, which are used by the - * Bridge driver loader to help ensure backwards compatility between older - * Bridge drivers and newer DSP API. These must be set to - * BRD_API_MAJOR_VERSION and BRD_API_MINOR_VERSION, respectively. - * - * A Bridge driver need not export a CHNL interface. In this case, *all* of - * the bridge_chnl_* entries must be set to NULL. - */ -struct bridge_drv_interface { - u32 brd_api_major_version; /* Set to BRD_API_MAJOR_VERSION. */ - u32 brd_api_minor_version; /* Set to BRD_API_MINOR_VERSION. */ - fxn_dev_create dev_create; /* Create device context */ - fxn_dev_destroy dev_destroy; /* Destroy device context */ - fxn_dev_ctrl dev_cntrl; /* Optional vendor interface */ - fxn_brd_monitor brd_monitor; /* Load and/or start monitor */ - fxn_brd_start brd_start; /* Start DSP program. */ - fxn_brd_stop brd_stop; /* Stop/reset board. */ - fxn_brd_status brd_status; /* Get current board status. */ - fxn_brd_read brd_read; /* Read board memory */ - fxn_brd_write brd_write; /* Write board memory. */ - fxn_brd_setstate brd_set_state; /* Sets the Board State */ - fxn_brd_memcopy brd_mem_copy; /* Copies DSP Memory */ - fxn_brd_memwrite brd_mem_write; /* Write DSP Memory w/o halt */ - fxn_brd_memmap brd_mem_map; /* Maps MPU mem to DSP mem */ - fxn_brd_memunmap brd_mem_un_map; /* Unmaps MPU mem to DSP mem */ - fxn_chnl_create chnl_create; /* Create channel manager. */ - fxn_chnl_destroy chnl_destroy; /* Destroy channel manager. */ - fxn_chnl_open chnl_open; /* Create a new channel. */ - fxn_chnl_close chnl_close; /* Close a channel. */ - fxn_chnl_addioreq chnl_add_io_req; /* Req I/O on a channel. */ - fxn_chnl_getioc chnl_get_ioc; /* Wait for I/O completion. */ - fxn_chnl_cancelio chnl_cancel_io; /* Cancl I/O on a channel. */ - fxn_chnl_flushio chnl_flush_io; /* Flush I/O. */ - fxn_chnl_getinfo chnl_get_info; /* Get channel specific info */ - /* Get channel manager info. */ - fxn_chnl_getmgrinfo chnl_get_mgr_info; - fxn_chnl_idle chnl_idle; /* Idle the channel */ - /* Register for notif. */ - fxn_chnl_registernotify chnl_register_notify; - fxn_io_create io_create; /* Create IO manager */ - fxn_io_destroy io_destroy; /* Destroy IO manager */ - fxn_io_onloaded io_on_loaded; /* Notify of program loaded */ - /* Get Processor's current and predicted load */ - fxn_io_getprocload io_get_proc_load; - fxn_msg_create msg_create; /* Create message manager */ - /* Create message queue */ - fxn_msg_createqueue msg_create_queue; - fxn_msg_delete msg_delete; /* Delete message manager */ - /* Delete message queue */ - fxn_msg_deletequeue msg_delete_queue; - fxn_msg_get msg_get; /* Get a message */ - fxn_msg_put msg_put; /* Send a message */ - /* Register for notif. */ - fxn_msg_registernotify msg_register_notify; - /* Set message queue id */ - fxn_msg_setqueueid msg_set_queue_id; -}; - -/* - * ======== bridge_drv_entry ======== - * Purpose: - * Registers Bridge driver functions with the DSP API. Called only once - * by the DSP API. The caller will first check DSP API version - * compatibility, and then copy the interface functions into its own - * memory space. - * Parameters: - * drv_intf Pointer to a location to receive a pointer to the - * Bridge driver interface. - * Returns: - * Requires: - * The code segment this function resides in must expect to be discarded - * after completion. - * Ensures: - * drv_intf pointer initialized to Bridge driver's function - * interface. No system resources are acquired by this function. - * Details: - * Called during the Device_Init phase. - */ -void bridge_drv_entry(struct bridge_drv_interface **drv_intf, - const char *driver_file_name); - -#endif /* DSPDEFS_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dspdeh.h b/drivers/staging/tidspbridge/include/dspbridge/dspdeh.h deleted file mode 100644 index d258ab6a41d1..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dspdeh.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * dspdeh.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Defines upper edge DEH functions required by all Bridge driver/DSP API - * interface tables. - * - * Notes: - * Function comment headers reside with the function typedefs in dspdefs.h. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * Copyright (C) 2010 Felipe Contreras - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DSPDEH_ -#define DSPDEH_ - -struct deh_mgr; -struct dev_object; -struct dsp_notification; - -int bridge_deh_create(struct deh_mgr **ret_deh, - struct dev_object *hdev_obj); - -int bridge_deh_destroy(struct deh_mgr *deh); - -int bridge_deh_register_notify(struct deh_mgr *deh, - u32 event_mask, - u32 notify_type, - struct dsp_notification *hnotification); - -void bridge_deh_notify(struct deh_mgr *deh, int event, int info); - -#endif /* DSPDEH_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dspdrv.h b/drivers/staging/tidspbridge/include/dspbridge/dspdrv.h deleted file mode 100644 index 7adf1e705314..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dspdrv.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * dspdrv.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * This is the Stream Interface for the DSp API. - * All Device operations are performed via DeviceIOControl. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#if !defined _DSPDRV_H_ -#define _DSPDRV_H_ - -/* - * ======== dsp_deinit ======== - * Purpose: - * This function is called by Device Manager to de-initialize a device. - * This function is not called by applications. - * Parameters: - * device_context:Handle to the device context. The XXX_Init function - * creates and returns this identifier. - * Returns: - * TRUE indicates the device successfully de-initialized. Otherwise it - * returns FALSE. - * Requires: - * device_context!= NULL. For a built in device this should never - * get called. - * Ensures: - */ -extern bool dsp_deinit(u32 device_context); - -/* - * ======== dsp_init ======== - * Purpose: - * This function is called by Device Manager to initialize a device. - * This function is not called by applications - * Parameters: - * dw_context: Specifies a pointer to a string containing the registry - * path to the active key for the stream interface driver. - * HKEY_LOCAL_MACHINE\Drivers\Active - * Returns: - * Returns a handle to the device context created. This is the our actual - * Device Object representing the DSP Device instance. - * Requires: - * Ensures: - * Succeeded: device context > 0 - * Failed: device Context = 0 - */ -extern u32 dsp_init(u32 *init_status); - -#endif diff --git a/drivers/staging/tidspbridge/include/dspbridge/dspio.h b/drivers/staging/tidspbridge/include/dspbridge/dspio.h deleted file mode 100644 index 66b64fadf197..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dspio.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * dspio.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Declares the upper edge IO functions required by all Bridge driver /DSP API - * interface tables. - * - * Notes: - * Function comment headers reside in dspdefs.h. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DSPIO_ -#define DSPIO_ - -#include -#include - - -extern int bridge_io_create(struct io_mgr **io_man, - struct dev_object *hdev_obj, - const struct io_attrs *mgr_attrts); - -extern int bridge_io_destroy(struct io_mgr *hio_mgr); - -extern int bridge_io_on_loaded(struct io_mgr *hio_mgr); - -extern int bridge_io_get_proc_load(struct io_mgr *hio_mgr, - struct dsp_procloadstat *proc_lstat); - -#endif /* DSPIO_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dspioctl.h b/drivers/staging/tidspbridge/include/dspbridge/dspioctl.h deleted file mode 100644 index 0fcda1978921..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dspioctl.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * dspioctl.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Bridge driver BRD_IOCtl reserved command definitions. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DSPIOCTL_ -#define DSPIOCTL_ - -/* ------------------------------------ Hardware Abstraction Layer */ -#include -#include - -/* - * Any IOCTLS at or above this value are reserved for standard Bridge driver - * interfaces. - */ -#define BRDIOCTL_RESERVEDBASE 0x8000 - -#define BRDIOCTL_CHNLREAD (BRDIOCTL_RESERVEDBASE + 0x10) -#define BRDIOCTL_CHNLWRITE (BRDIOCTL_RESERVEDBASE + 0x20) -/* DMMU */ -#define BRDIOCTL_SETMMUCONFIG (BRDIOCTL_RESERVEDBASE + 0x60) -/* PWR */ -#define BRDIOCTL_PWRCONTROL (BRDIOCTL_RESERVEDBASE + 0x70) - -/* attention, modifiers: - * Some of these control enumerations are made visible to user for power - * control, so any changes to this list, should also be updated in the user - * header file 'dbdefs.h' ***/ -/* These ioctls are reserved for PWR power commands for the DSP */ -#define BRDIOCTL_DEEPSLEEP (BRDIOCTL_PWRCONTROL + 0x0) -#define BRDIOCTL_EMERGENCYSLEEP (BRDIOCTL_PWRCONTROL + 0x1) -#define BRDIOCTL_WAKEUP (BRDIOCTL_PWRCONTROL + 0x2) -#define BRDIOCTL_CLK_CTRL (BRDIOCTL_PWRCONTROL + 0x7) -/* DSP Initiated Hibernate */ -#define BRDIOCTL_PWR_HIBERNATE (BRDIOCTL_PWRCONTROL + 0x8) -#define BRDIOCTL_PRESCALE_NOTIFY (BRDIOCTL_PWRCONTROL + 0x9) -#define BRDIOCTL_POSTSCALE_NOTIFY (BRDIOCTL_PWRCONTROL + 0xA) -#define BRDIOCTL_CONSTRAINT_REQUEST (BRDIOCTL_PWRCONTROL + 0xB) - -/* Number of actual DSP-MMU TLB entries */ -#define BRDIOCTL_NUMOFMMUTLB 32 - -struct bridge_ioctl_extproc { - u32 dsp_va; /* DSP virtual address */ - u32 gpp_pa; /* GPP physical address */ - /* GPP virtual address. __va does not work for ioremapped addresses */ - u32 gpp_va; - u32 size; /* Size of the mapped memory in bytes */ - enum hw_endianism_t endianism; - enum hw_mmu_mixed_size_t mixed_mode; - enum hw_element_size_t elem_size; -}; - -#endif /* DSPIOCTL_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dspmsg.h b/drivers/staging/tidspbridge/include/dspbridge/dspmsg.h deleted file mode 100644 index d4bd458bc8be..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dspmsg.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * dspmsg.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Declares the upper edge message class library functions required by - * all Bridge driver / DSP API interface tables. These functions are - * implemented by every class of Bridge driver channel library. - * - * Notes: - * Function comment headers reside in dspdefs.h. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef DSPMSG_ -#define DSPMSG_ - -#include - -extern int bridge_msg_create(struct msg_mgr **msg_man, - struct dev_object *hdev_obj, - msg_onexit msg_callback); - -extern int bridge_msg_create_queue(struct msg_mgr *hmsg_mgr, - struct msg_queue **msgq, - u32 msgq_id, u32 max_msgs, void *arg); - -extern void bridge_msg_delete(struct msg_mgr *hmsg_mgr); - -extern void bridge_msg_delete_queue(struct msg_queue *msg_queue_obj); - -extern int bridge_msg_get(struct msg_queue *msg_queue_obj, - struct dsp_msg *pmsg, u32 utimeout); - -extern int bridge_msg_put(struct msg_queue *msg_queue_obj, - const struct dsp_msg *pmsg, u32 utimeout); - -extern int bridge_msg_register_notify(struct msg_queue *msg_queue_obj, - u32 event_mask, - u32 notify_type, - struct dsp_notification - *hnotification); - -extern void bridge_msg_set_queue_id(struct msg_queue *msg_queue_obj, - u32 msgq_id); - -#endif /* DSPMSG_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/dynamic_loader.h b/drivers/staging/tidspbridge/include/dspbridge/dynamic_loader.h deleted file mode 100644 index 052d27ee8b1a..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/dynamic_loader.h +++ /dev/null @@ -1,490 +0,0 @@ -/* - * dynamic_loader.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _DYNAMIC_LOADER_H_ -#define _DYNAMIC_LOADER_H_ -#include -#include - -/* - * Dynamic Loader - * - * The function of the dynamic loader is to load a "module" containing - * instructions for a "target" processor into that processor. In the process - * it assigns memory for the module, resolves symbol references made by the - * module, and remembers symbols defined by the module. - * - * The dynamic loader is parameterized for a particular system by 4 classes - * that supply the module and system specific functions it requires - */ - /* The read functions for the module image to be loaded */ -struct dynamic_loader_stream; - - /* This class defines "host" symbol and support functions */ -struct dynamic_loader_sym; - - /* This class defines the allocator for "target" memory */ -struct dynamic_loader_allocate; - - /* This class defines the copy-into-target-memory functions */ -struct dynamic_loader_initialize; - -/* - * Option flags to modify the behavior of module loading - */ -#define DLOAD_INITBSS 0x1 /* initialize BSS sections to zero */ - -/***************************************************************************** - * Procedure dynamic_load_module - * - * Parameters: - * module The input stream that supplies the module image - * syms Host-side symbol table and malloc/free functions - * alloc Target-side memory allocation - * init Target-side memory initialization, or NULL for symbol read only - * options Option flags DLOAD_* - * mhandle A module handle for use with Dynamic_Unload - * - * Effect: - * The module image is read using *module. Target storage for the new image is - * obtained from *alloc. Symbols defined and referenced by the module are - * managed using *syms. The image is then relocated and references resolved - * as necessary, and the resulting executable bits are placed into target memory - * using *init. - * - * Returns: - * On a successful load, a module handle is placed in *mhandle, and zero is - * returned. On error, the number of errors detected is returned. Individual - * errors are reported during the load process using syms->error_report(). - **************************************************************************** */ -extern int dynamic_load_module( - /* the source for the module image */ - struct dynamic_loader_stream *module, - /* host support for symbols and storage */ - struct dynamic_loader_sym *syms, - /* the target memory allocator */ - struct dynamic_loader_allocate *alloc, - /* the target memory initializer */ - struct dynamic_loader_initialize *init, - unsigned options, /* option flags */ - /* the returned module handle */ - void **mhandle); - -/***************************************************************************** - * Procedure dynamic_open_module - * - * Parameters: - * module The input stream that supplies the module image - * syms Host-side symbol table and malloc/free functions - * alloc Target-side memory allocation - * init Target-side memory initialization, or NULL for symbol read only - * options Option flags DLOAD_* - * mhandle A module handle for use with Dynamic_Unload - * - * Effect: - * The module image is read using *module. Target storage for the new image is - * obtained from *alloc. Symbols defined and referenced by the module are - * managed using *syms. The image is then relocated and references resolved - * as necessary, and the resulting executable bits are placed into target memory - * using *init. - * - * Returns: - * On a successful load, a module handle is placed in *mhandle, and zero is - * returned. On error, the number of errors detected is returned. Individual - * errors are reported during the load process using syms->error_report(). - **************************************************************************** */ -extern int dynamic_open_module( - /* the source for the module image */ - struct dynamic_loader_stream *module, - /* host support for symbols and storage */ - struct dynamic_loader_sym *syms, - /* the target memory allocator */ - struct dynamic_loader_allocate *alloc, - /* the target memory initializer */ - struct dynamic_loader_initialize *init, - unsigned options, /* option flags */ - /* the returned module handle */ - void **mhandle); - -/***************************************************************************** - * Procedure dynamic_unload_module - * - * Parameters: - * mhandle A module handle from dynamic_load_module - * syms Host-side symbol table and malloc/free functions - * alloc Target-side memory allocation - * - * Effect: - * The module specified by mhandle is unloaded. Unloading causes all - * target memory to be deallocated, all symbols defined by the module to - * be purged, and any host-side storage used by the dynamic loader for - * this module to be released. - * - * Returns: - * Zero for success. On error, the number of errors detected is returned. - * Individual errors are reported using syms->error_report(). - **************************************************************************** */ -extern int dynamic_unload_module(void *mhandle, /* the module - * handle */ - /* host support for symbols and - * storage */ - struct dynamic_loader_sym *syms, - /* the target memory allocator */ - struct dynamic_loader_allocate *alloc, - /* the target memory initializer */ - struct dynamic_loader_initialize *init); - -/***************************************************************************** - ***************************************************************************** - * A class used by the dynamic loader for input of the module image - ***************************************************************************** - **************************************************************************** */ -struct dynamic_loader_stream { -/* public: */ - /************************************************************************* - * read_buffer - * - * PARAMETERS : - * buffer Pointer to the buffer to fill - * bufsiz Amount of data desired in sizeof() units - * - * EFFECT : - * Reads the specified amount of data from the module input stream - * into the specified buffer. Returns the amount of data read in sizeof() - * units (which if less than the specification, represents an error). - * - * NOTES: - * In release 1 increments the file position by the number of bytes read - * - ************************************************************************ */ - int (*read_buffer) (struct dynamic_loader_stream *thisptr, - void *buffer, unsigned bufsiz); - - /************************************************************************* - * set_file_posn (release 1 only) - * - * PARAMETERS : - * posn Desired file position relative to start of file in sizeof() units. - * - * EFFECT : - * Adjusts the internal state of the stream object so that the next - * read_buffer call will begin to read at the specified offset from - * the beginning of the input module. Returns 0 for success, non-zero - * for failure. - * - ************************************************************************ */ - int (*set_file_posn) (struct dynamic_loader_stream *thisptr, - /* to be eliminated in release 2 */ - unsigned int posn); - -}; - -/***************************************************************************** - ***************************************************************************** - * A class used by the dynamic loader for symbol table support and - * miscellaneous host-side functions - ***************************************************************************** - **************************************************************************** */ - -typedef u32 ldr_addr; - -/* - * the structure of a symbol known to the dynamic loader - */ -struct dynload_symbol { - ldr_addr value; -}; - -struct dynamic_loader_sym { -/* public: */ - /************************************************************************* - * find_matching_symbol - * - * PARAMETERS : - * name The name of the desired symbol - * - * EFFECT : - * Locates a symbol matching the name specified. A pointer to the - * symbol is returned if it exists; 0 is returned if no such symbol is - * found. - * - ************************************************************************ */ - struct dynload_symbol *(*find_matching_symbol) - (struct dynamic_loader_sym *thisptr, const char *name); - - /************************************************************************* - * add_to_symbol_table - * - * PARAMETERS : - * nname Pointer to the name of the new symbol - * moduleid An opaque module id assigned by the dynamic loader - * - * EFFECT : - * The new symbol is added to the table. A pointer to the symbol is - * returned, or NULL is returned for failure. - * - * NOTES: - * It is permissible for this function to return NULL; the effect is that - * the named symbol will not be available to resolve references in - * subsequent loads. Returning NULL will not cause the current load - * to fail. - ************************************************************************ */ - struct dynload_symbol *(*add_to_symbol_table) - (struct dynamic_loader_sym * - thisptr, const char *nname, unsigned moduleid); - - /************************************************************************* - * purge_symbol_table - * - * PARAMETERS : - * moduleid An opaque module id assigned by the dynamic loader - * - * EFFECT : - * Each symbol in the symbol table whose moduleid matches the argument - * is removed from the table. - ************************************************************************ */ - void (*purge_symbol_table) (struct dynamic_loader_sym *thisptr, - unsigned moduleid); - - /************************************************************************* - * dload_allocate - * - * PARAMETERS : - * memsiz size of desired memory in sizeof() units - * - * EFFECT : - * Returns a pointer to some "host" memory for use by the dynamic - * loader, or NULL for failure. - * This function is serves as a replaceable form of "malloc" to - * allow the user to configure the memory usage of the dynamic loader. - ************************************************************************ */ - void *(*dload_allocate) (struct dynamic_loader_sym *thisptr, - unsigned memsiz); - - /************************************************************************* - * dload_deallocate - * - * PARAMETERS : - * memptr pointer to previously allocated memory - * - * EFFECT : - * Releases the previously allocated "host" memory. - ************************************************************************ */ - void (*dload_deallocate) (struct dynamic_loader_sym *thisptr, - void *memptr); - - /************************************************************************* - * error_report - * - * PARAMETERS : - * errstr pointer to an error string - * args additional arguments - * - * EFFECT : - * This function provides an error reporting interface for the dynamic - * loader. The error string and arguments are designed as for the - * library function vprintf. - ************************************************************************ */ - void (*error_report) (struct dynamic_loader_sym *thisptr, - const char *errstr, va_list args); - -}; /* class dynamic_loader_sym */ - -/***************************************************************************** - ***************************************************************************** - * A class used by the dynamic loader to allocate and deallocate target memory. - ***************************************************************************** - **************************************************************************** */ - -struct ldr_section_info { - /* Name of the memory section assigned at build time */ - const char *name; - ldr_addr run_addr; /* execution address of the section */ - ldr_addr load_addr; /* load address of the section */ - ldr_addr size; /* size of the section in addressable units */ -#ifndef _BIG_ENDIAN - u16 page; /* memory page or view */ - u16 type; /* one of the section types below */ -#else - u16 type; /* one of the section types below */ - u16 page; /* memory page or view */ -#endif - /* a context field for use by dynamic_loader_allocate; - * ignored but maintained by the dynamic loader */ - u32 context; -}; - -/* use this macro to extract type of section from ldr_section_info.type field */ -#define DLOAD_SECTION_TYPE(typeinfo) (typeinfo & 0xF) - -/* type of section to be allocated */ -#define DLOAD_TEXT 0 -#define DLOAD_DATA 1 -#define DLOAD_BSS 2 - /* internal use only, run-time cinit will be of type DLOAD_DATA */ -#define DLOAD_CINIT 3 - -struct dynamic_loader_allocate { -/* public: */ - - /************************************************************************* - * Function allocate - * - * Parameters: - * info A pointer to an information block for the section - * align The alignment of the storage in target AUs - * - * Effect: - * Allocates target memory for the specified section and fills in the - * load_addr and run_addr fields of the section info structure. Returns TRUE - * for success, FALSE for failure. - * - * Notes: - * Frequently load_addr and run_addr are the same, but if they are not - * load_addr is used with dynamic_loader_initialize, and run_addr is - * used for almost all relocations. This function should always initialize - * both fields. - ************************************************************************ */ - int (*dload_allocate) (struct dynamic_loader_allocate *thisptr, - struct ldr_section_info *info, unsigned align); - - /************************************************************************* - * Function deallocate - * - * Parameters: - * info A pointer to an information block for the section - * - * Effect: - * Releases the target memory previously allocated. - * - * Notes: - * The content of the info->name field is undefined on call to this function. - ************************************************************************ */ - void (*dload_deallocate) (struct dynamic_loader_allocate *thisptr, - struct ldr_section_info *info); - -}; /* class dynamic_loader_allocate */ - -/***************************************************************************** - ***************************************************************************** - * A class used by the dynamic loader to load data into a target. This class - * provides the interface-specific functions needed to load data. - ***************************************************************************** - **************************************************************************** */ - -struct dynamic_loader_initialize { -/* public: */ - /************************************************************************* - * Function connect - * - * Parameters: - * none - * - * Effect: - * Connect to the initialization interface. Returns TRUE for success, - * FALSE for failure. - * - * Notes: - * This function is called prior to use of any other functions in - * this interface. - ************************************************************************ */ - int (*connect) (struct dynamic_loader_initialize *thisptr); - - /************************************************************************* - * Function readmem - * - * Parameters: - * bufr Pointer to a word-aligned buffer for the result - * locn Target address of first data element - * info Section info for the section in which the address resides - * bytsiz Size of the data to be read in sizeof() units - * - * Effect: - * Fills the specified buffer with data from the target. Returns TRUE for - * success, FALSE for failure. - ************************************************************************ */ - int (*readmem) (struct dynamic_loader_initialize *thisptr, - void *bufr, - ldr_addr locn, - struct ldr_section_info *info, unsigned bytsiz); - - /************************************************************************* - * Function writemem - * - * Parameters: - * bufr Pointer to a word-aligned buffer of data - * locn Target address of first data element to be written - * info Section info for the section in which the address resides - * bytsiz Size of the data to be written in sizeof() units - * - * Effect: - * Writes the specified buffer to the target. Returns TRUE for success, - * FALSE for failure. - ************************************************************************ */ - int (*writemem) (struct dynamic_loader_initialize *thisptr, - void *bufr, - ldr_addr locn, - struct ldr_section_info *info, unsigned bytsiz); - - /************************************************************************* - * Function fillmem - * - * Parameters: - * locn Target address of first data element to be written - * info Section info for the section in which the address resides - * bytsiz Size of the data to be written in sizeof() units - * val Value to be written in each byte - * Effect: - * Fills the specified area of target memory. Returns TRUE for success, - * FALSE for failure. - ************************************************************************ */ - int (*fillmem) (struct dynamic_loader_initialize *thisptr, - ldr_addr locn, struct ldr_section_info *info, - unsigned bytsiz, unsigned val); - - /************************************************************************* - * Function execute - * - * Parameters: - * start Starting address - * - * Effect: - * The target code at the specified starting address is executed. - * - * Notes: - * This function is called at the end of the dynamic load process - * if the input module has specified a starting address. - ************************************************************************ */ - int (*execute) (struct dynamic_loader_initialize *thisptr, - ldr_addr start); - - /************************************************************************* - * Function release - * - * Parameters: - * none - * - * Effect: - * Releases the connection to the load interface. - * - * Notes: - * This function is called at the end of the dynamic load process. - ************************************************************************ */ - void (*release) (struct dynamic_loader_initialize *thisptr); - -}; /* class dynamic_loader_initialize */ - -#endif /* _DYNAMIC_LOADER_H_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/getsection.h b/drivers/staging/tidspbridge/include/dspbridge/getsection.h deleted file mode 100644 index 626063dd9dfe..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/getsection.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * getsection.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * This file provides an API add-on to the dynamic loader that allows the user - * to query section information and extract section data from dynamic load - * modules. - * - * Notes: - * Functions in this API assume that the supplied dynamic_loader_stream - * object supports the set_file_posn method. - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _GETSECTION_H_ -#define _GETSECTION_H_ - -#include "dynamic_loader.h" - -/* - * Procedure dload_module_open - * - * Parameters: - * module The input stream that supplies the module image - * syms Host-side malloc/free and error reporting functions. - * Other methods are unused. - * - * Effect: - * Reads header information from a dynamic loader module using the specified - * stream object, and returns a handle for the module information. This - * handle may be used in subsequent query calls to obtain information - * contained in the module. - * - * Returns: - * NULL if an error is encountered, otherwise a module handle for use - * in subsequent operations. - */ -extern void *dload_module_open(struct dynamic_loader_stream - *module, struct dynamic_loader_sym - *syms); - -/* - * Procedure dload_get_section_info - * - * Parameters: - * minfo Handle from dload_module_open for this module - * section_name Pointer to the string name of the section desired - * section_info Address of a section info structure pointer to be initialized - * - * Effect: - * Finds the specified section in the module information, and fills in - * the provided ldr_section_info structure. - * - * Returns: - * TRUE for success, FALSE for section not found - */ -extern int dload_get_section_info(void *minfo, - const char *section_name, - const struct ldr_section_info - **const section_info); - -/* - * Procedure dload_get_section - * - * Parameters: - * minfo Handle from dload_module_open for this module - * section_info Pointer to a section info structure for the desired section - * section_data Buffer to contain the section initialized data - * - * Effect: - * Copies the initialized data for the specified section into the - * supplied buffer. - * - * Returns: - * TRUE for success, FALSE for section not found - */ -extern int dload_get_section(void *minfo, - const struct ldr_section_info *section_info, - void *section_data); - -/* - * Procedure dload_module_close - * - * Parameters: - * minfo Handle from dload_module_open for this module - * - * Effect: - * Releases any storage associated with the module handle. On return, - * the module handle is invalid. - * - * Returns: - * Zero for success. On error, the number of errors detected is returned. - * Individual errors are reported using syms->error_report(), where syms was - * an argument to dload_module_open - */ -extern void dload_module_close(void *minfo); - -#endif /* _GETSECTION_H_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/gh.h b/drivers/staging/tidspbridge/include/dspbridge/gh.h deleted file mode 100644 index e4303b4bf5fd..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/gh.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * gh.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef GH_ -#define GH_ -#include - -extern struct gh_t_hash_tab *gh_create(u32 val_size, - u32 (*hash)(const void *), bool (*match)(const void *, - const void *), void (*delete) (void *)); -extern void gh_delete(struct gh_t_hash_tab *hash_tab); -extern void *gh_find(struct gh_t_hash_tab *hash_tab, const void *key); -extern void *gh_insert(struct gh_t_hash_tab *hash_tab, const void *key, - const void *value); -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE -void gh_iterate(struct gh_t_hash_tab *hash_tab, - void (*callback)(void *, void *), void *user_data); -#endif -#endif /* GH_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/host_os.h b/drivers/staging/tidspbridge/include/dspbridge/host_os.h deleted file mode 100644 index d1441db469fc..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/host_os.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * host_os.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _HOST_OS_H_ -#define _HOST_OS_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* TODO -- Remove, once omap-iommu is used */ -#define INT_DSP_MMU_IRQ (28 + NR_IRQS) - -#define PRCM_VDD1 1 - -extern struct platform_device *omap_dspbridge_dev; -extern struct device *bridge; - -#endif diff --git a/drivers/staging/tidspbridge/include/dspbridge/io.h b/drivers/staging/tidspbridge/include/dspbridge/io.h deleted file mode 100644 index 750571856908..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/io.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * io.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * The io module manages IO between CHNL and msg_ctrl. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef IO_ -#define IO_ - -#include -#include - -/* IO Objects: */ -struct io_mgr; - -/* IO manager attributes: */ -struct io_attrs { - u8 birq; /* Channel's I/O IRQ number. */ - bool irq_shared; /* TRUE if the IRQ is shareable. */ - u32 word_size; /* DSP Word size. */ - u32 shm_base; /* Physical base address of shared memory. */ - u32 sm_length; /* Size (in bytes) of shared memory. */ -}; - - -/* - * ======== io_create ======== - * Purpose: - * Create an IO manager object, responsible for managing IO between - * CHNL and msg_ctrl. - * Parameters: - * channel_mgr: Location to store a channel manager object on - * output. - * hdev_obj: Handle to a device object. - * mgr_attrts: IO manager attributes. - * mgr_attrts->birq: I/O IRQ number. - * mgr_attrts->irq_shared: TRUE if the IRQ is shareable. - * mgr_attrts->word_size: DSP Word size in equivalent PC bytes.. - * Returns: - * 0: Success; - * -ENOMEM: Insufficient memory for requested resources. - * -EIO: Unable to plug channel ISR for configured IRQ. - * -EINVAL: Invalid DSP word size (must be > 0). - * Invalid base address for DSP communications. - * Requires: - * io_man != NULL. - * mgr_attrts != NULL. - * Ensures: - */ -extern int io_create(struct io_mgr **io_man, - struct dev_object *hdev_obj, - const struct io_attrs *mgr_attrts); - -/* - * ======== io_destroy ======== - * Purpose: - * Destroy the IO manager. - * Parameters: - * hio_mgr: IOmanager object. - * Returns: - * 0: Success. - * -EFAULT: hio_mgr was invalid. - * Requires: - * Ensures: - */ -extern int io_destroy(struct io_mgr *hio_mgr); - -#endif /* CHNL_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/io_sm.h b/drivers/staging/tidspbridge/include/dspbridge/io_sm.h deleted file mode 100644 index 903ff12b14de..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/io_sm.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * io_sm.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * IO dispatcher for a shared memory channel driver. - * Also, includes macros to simulate shm via port io calls. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef IOSM_ -#define IOSM_ - -#include -#include - -#include -#include /* shared mailbox codes */ - -/* Magic code used to determine if DSP signaled exception. */ -#define DEH_BASE MBX_DEH_BASE -#define DEH_LIMIT MBX_DEH_LIMIT - -#define IO_INPUT 0 -#define IO_OUTPUT 1 -#define IO_SERVICE 2 - -#ifdef CONFIG_TIDSPBRIDGE_DVFS -/* The maximum number of OPPs that are supported */ -extern s32 dsp_max_opps; -/* The Vdd1 opp table information */ -extern u32 vdd1_dsp_freq[6][4]; -#endif - -/* - * ======== io_cancel_chnl ======== - * Purpose: - * Cancel IO on a given channel. - * Parameters: - * hio_mgr: IO Manager. - * chnl: Index of channel to cancel IO on. - * Returns: - * Requires: - * Valid hio_mgr. - * Ensures: - */ -extern void io_cancel_chnl(struct io_mgr *hio_mgr, u32 chnl); - -/* - * ======== io_dpc ======== - * Purpose: - * Deferred procedure call for shared memory channel driver ISR. Carries - * out the dispatch of I/O. - * Parameters: - * ref_data: Pointer to reference data registered via a call to - * DPC_Create(). - * Returns: - * Requires: - * Must not block. - * Must not acquire resources. - * All data touched must be locked in memory if running in kernel mode. - * Ensures: - * Non-preemptible (but interruptible). - */ -extern void io_dpc(unsigned long ref_data); - -/* - * ======== io_mbox_msg ======== - * Purpose: - * Main message handler for the shared memory Bridge channel manager. - * Determine if this message is ours, then schedules a DPC to - * dispatch I/O. - * Parameters: - * self: Pointer to its own notifier_block struct. - * len: Length of message. - * msg: Message code received. - * Returns: - * NOTIFY_OK if handled; NOTIFY_BAD otherwise. - */ -int io_mbox_msg(struct notifier_block *self, unsigned long len, void *msg); - -/* - * ======== io_request_chnl ======== - * Purpose: - * Request I/O from the DSP. Sets flags in shared memory, then interrupts - * the DSP. - * Parameters: - * hio_mgr: IO manager handle. - * pchnl: Ptr to the channel requesting I/O. - * io_mode: Mode of channel: {IO_INPUT | IO_OUTPUT}. - * Returns: - * Requires: - * pchnl != NULL - * Ensures: - */ -extern void io_request_chnl(struct io_mgr *io_manager, - struct chnl_object *pchnl, - u8 io_mode, u16 *mbx_val); - -/* - * ======== iosm_schedule ======== - * Purpose: - * Schedule DPC for IO. - * Parameters: - * pio_mgr: Ptr to a I/O manager. - * Returns: - * Requires: - * pchnl != NULL - * Ensures: - */ -extern void iosm_schedule(struct io_mgr *io_manager); - -/* - * ======== io_sh_msetting ======== - * Purpose: - * Sets the shared memory setting - * Parameters: - * hio_mgr: Handle to a I/O manager. - * desc: Shared memory type - * pargs: Ptr to shm setting - * Returns: - * Requires: - * hio_mgr != NULL - * pargs != NULL - * Ensures: - */ -extern int io_sh_msetting(struct io_mgr *hio_mgr, u8 desc, void *pargs); - -/* - * Misc functions for the CHNL_IO shared memory library: - */ - -/* Maximum channel bufsize that can be used. */ -extern u32 io_buf_size(struct io_mgr *hio_mgr); - -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE -/* - * ========print_dsp_trace_buffer ======== - * Print DSP tracebuffer. - */ -extern int print_dsp_trace_buffer(struct bridge_dev_context - *hbridge_context); - -int dump_dsp_stack(struct bridge_dev_context *bridge_context); - -void dump_dl_modules(struct bridge_dev_context *bridge_context); - -void print_dsp_debug_trace(struct io_mgr *hio_mgr); -#endif - -#endif /* IOSM_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/mbx_sh.h b/drivers/staging/tidspbridge/include/dspbridge/mbx_sh.h deleted file mode 100644 index d4cb3948baba..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/mbx_sh.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * mbx_sh.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Definitions for shared mailbox cmd/data values.(used on both - * the GPP and DSP sides). - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* - * Bridge usage of OMAP mailbox 1 is determined by the "class" of the - * mailbox interrupt's cmd value received. The class value are defined - * as a bit (10 thru 15) being set. - * - * Note: Only 16 bits of each is used. Other 16 bit data reg available. - * - * 16 bit Mbx bit defns: - * - * A). Exception/Error handling (Module DEH) : class = 0. - * - * 15 10 0 - * --------------------------------- - * |0|0|0|0|0|0|x|x|x|x|x|x|x|x|x|x| - * --------------------------------- - * | (class) | (module specific) | - * - * - * B: DSP-DMA link driver channels (DDMA) : class = 1. - * - * 15 10 0 - * --------------------------------- - * |0|0|0|0|0|1|b|b|b|b|b|c|c|c|c|c| - * --------------------------------- - * | (class) | (module specific) | - * - * where b -> buffer index (32 DDMA buffers/chnl max) - * c -> channel Id (32 DDMA chnls max) - * - * - * C: Proc-copy link driver channels (PCPY) : class = 2. - * - * 15 10 0 - * --------------------------------- - * |0|0|0|0|1|0|x|x|x|x|x|x|x|x|x|x| - * --------------------------------- - * | (class) | (module specific) | - * - * - * D: Zero-copy link driver channels (DDZC) : class = 4. - * - * 15 10 0 - * --------------------------------- - * |0|0|0|1|0|0|x|x|x|x|x|c|c|c|c|c| - * --------------------------------- - * | (class) | (module specific) | - * - * where x -> not used - * c -> channel Id (32 ZCPY chnls max) - * - * - * E: Power management : class = 8. - * - * 15 10 0 - * --------------------------------- - * |0|0|1|0|0|0|x|x|x|x|x|c|c|c|c|c| - - * 0010 00xx xxxc cccc - * 0010 00nn pppp qqqq - * nn: - * 00 = reserved - * 01 = pwr state change - * 10 = opp pre-change - * 11 = opp post-change - * - * if nn = pwr state change: - * pppp = don't care - * qqqq: - * 0010 = hibernate - * 0010 0001 0000 0010 - * 0110 = retention - * 0010 0001 0000 0110 - * others reserved - * - * if nn = opp pre-change: - * pppp = current opp - * qqqq = next opp - * - * if nn = opp post-change: - * pppp = prev opp - * qqqq = current opp - * - * --------------------------------- - * | (class) | (module specific) | - * - * where x -> not used - * c -> Power management command - * - */ - -#ifndef _MBX_SH_H -#define _MBX_SH_H - -#define MBX_PCPY_CLASS 0x0800 /* PROC-COPY " */ -#define MBX_PM_CLASS 0x2000 /* Power Management */ -#define MBX_DBG_CLASS 0x4000 /* For debugging purpose */ - -/* - * Exception Handler codes - * Magic code used to determine if DSP signaled exception. - */ -#define MBX_DEH_BASE 0x0 -#define MBX_DEH_USERS_BASE 0x100 /* 256 */ -#define MBX_DEH_LIMIT 0x3FF /* 1023 */ -#define MBX_DEH_RESET 0x101 /* DSP RESET (DEH) */ - -/* - * Link driver command/status codes. - */ - -/* Power Management Commands */ -#define MBX_PM_DSPIDLE (MBX_PM_CLASS + 0x0) -#define MBX_PM_DSPWAKEUP (MBX_PM_CLASS + 0x1) -#define MBX_PM_EMERGENCYSLEEP (MBX_PM_CLASS + 0x2) -#define MBX_PM_SETPOINT_PRENOTIFY (MBX_PM_CLASS + 0x6) -#define MBX_PM_SETPOINT_POSTNOTIFY (MBX_PM_CLASS + 0x7) -#define MBX_PM_DSPRETENTION (MBX_PM_CLASS + 0x8) -#define MBX_PM_DSPHIBERNATE (MBX_PM_CLASS + 0x9) -#define MBX_PM_HIBERNATE_EN (MBX_PM_CLASS + 0xA) -#define MBX_PM_OPP_REQ (MBX_PM_CLASS + 0xB) - -/* Bridge Debug Commands */ -#define MBX_DBG_SYSPRINTF (MBX_DBG_CLASS + 0x0) - -#endif /* _MBX_SH_H */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/memdefs.h b/drivers/staging/tidspbridge/include/dspbridge/memdefs.h deleted file mode 100644 index 78d2c5d0045b..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/memdefs.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * memdefs.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Global MEM constants and types, shared between Bridge driver and DSP API. - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef MEMDEFS_ -#define MEMDEFS_ - -/* - * MEM_VIRTUALSEGID is used by Node & Strm to access virtual address space in - * the correct client process context. - */ -#define MEM_SETVIRTUALSEGID 0x10000000 -#define MEM_GETVIRTUALSEGID 0x20000000 -#define MEM_MASKVIRTUALSEGID (MEM_SETVIRTUALSEGID | MEM_GETVIRTUALSEGID) - -#endif /* MEMDEFS_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/mgr.h b/drivers/staging/tidspbridge/include/dspbridge/mgr.h deleted file mode 100644 index 47b0318430e1..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/mgr.h +++ /dev/null @@ -1,205 +0,0 @@ -/* - * mgr.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * This is the DSP API RM module interface. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef MGR_ -#define MGR_ - -#include - -#define MAX_EVENTS 32 - -/* - * ======== mgr_wait_for_bridge_events ======== - * Purpose: - * Block on any Bridge event(s) - * Parameters: - * anotifications : array of pointers to notification objects. - * count : number of elements in above array - * pu_index : index of signaled event object - * utimeout : timeout interval in milliseocnds - * Returns: - * 0 : Success. - * -ETIME : Wait timed out. *pu_index is undetermined. - * Details: - */ - -int mgr_wait_for_bridge_events(struct dsp_notification - **anotifications, - u32 count, u32 *pu_index, - u32 utimeout); - -/* - * ======== mgr_create ======== - * Purpose: - * Creates the Manager Object. This is done during the driver loading. - * There is only one Manager Object in the DSP/BIOS Bridge. - * Parameters: - * mgr_obj: Location to store created MGR Object handle. - * dev_node_obj: Device object as known to the system. - * Returns: - * 0: Success - * -ENOMEM: Failed to Create the Object - * -EPERM: General Failure - * Requires: - * MGR Initialized (refs > 0 ) - * mgr_obj != NULL. - * Ensures: - * 0: *mgr_obj is a valid MGR interface to the device. - * MGR Object stores the DCD Manager Handle. - * MGR Object stored in the Regsitry. - * !0: MGR Object not created - * Details: - * DCD Dll is loaded and MGR Object stores the handle of the DLL. - */ -extern int mgr_create(struct mgr_object **mgr_obj, - struct cfg_devnode *dev_node_obj); - -/* - * ======== mgr_destroy ======== - * Purpose: - * Destroys the MGR object. Called upon driver unloading. - * Parameters: - * hmgr_obj: Handle to Manager object . - * Returns: - * 0: Success. - * DCD Manager freed; MGR Object destroyed; - * MGR Object deleted from the Registry. - * -EPERM: Failed to destroy MGR Object - * Requires: - * MGR Initialized (refs > 0 ) - * hmgr_obj is a valid MGR handle . - * Ensures: - * 0: MGR Object destroyed and hmgr_obj is Invalid MGR - * Handle. - */ -extern int mgr_destroy(struct mgr_object *hmgr_obj); - -/* - * ======== mgr_enum_node_info ======== - * Purpose: - * Enumerate and get configuration information about nodes configured - * in the node database. - * Parameters: - * node_id: The node index (base 0). - * pndb_props: Ptr to the dsp_ndbprops structure for output. - * undb_props_size: Size of the dsp_ndbprops structure. - * pu_num_nodes: Location where the number of nodes configured - * in the database will be returned. - * Returns: - * 0: Success. - * -EINVAL: Parameter node_id is > than the number of nodes. - * configutred in the system - * -EIDRM: During Enumeration there has been a change in - * the number of nodes configured or in the - * the properties of the enumerated nodes. - * -EPERM: Failed to querry the Node Data Base - * Requires: - * pNDBPROPS is not null - * undb_props_size >= sizeof(dsp_ndbprops) - * pu_num_nodes is not null - * MGR Initialized (refs > 0 ) - * Ensures: - * SUCCESS on successful retreival of data and *pu_num_nodes > 0 OR - * DSP_FAILED && *pu_num_nodes == 0. - * Details: - */ -extern int mgr_enum_node_info(u32 node_id, - struct dsp_ndbprops *pndb_props, - u32 undb_props_size, - u32 *pu_num_nodes); - -/* - * ======== mgr_enum_processor_info ======== - * Purpose: - * Enumerate and get configuration information about available DSP - * processors - * Parameters: - * processor_id: The processor index (zero-based). - * processor_info: Ptr to the dsp_processorinfo structure . - * processor_info_size: Size of dsp_processorinfo structure. - * pu_num_procs: Location where the number of DSPs configured - * in the database will be returned - * Returns: - * 0: Success. - * -EINVAL: Parameter processor_id is > than the number of - * DSP Processors in the system. - * -EPERM: Failed to querry the Node Data Base - * Requires: - * processor_info is not null - * pu_num_procs is not null - * processor_info_size >= sizeof(dsp_processorinfo) - * MGR Initialized (refs > 0 ) - * Ensures: - * SUCCESS on successful retreival of data and *pu_num_procs > 0 OR - * DSP_FAILED && *pu_num_procs == 0. - * Details: - */ -extern int mgr_enum_processor_info(u32 processor_id, - struct dsp_processorinfo - *processor_info, - u32 processor_info_size, - u8 *pu_num_procs); -/* - * ======== mgr_exit ======== - * Purpose: - * Decrement reference count, and free resources when reference count is - * 0. - * Parameters: - * Returns: - * Requires: - * MGR is initialized. - * Ensures: - * When reference count == 0, MGR's private resources are freed. - */ -extern void mgr_exit(void); - -/* - * ======== mgr_get_dcd_handle ======== - * Purpose: - * Retrieves the MGR handle. Accessor Function - * Parameters: - * mgr_handle: Handle to the Manager Object - * dcd_handle: Ptr to receive the DCD Handle. - * Returns: - * 0: Success - * -EPERM: Failure to get the Handle - * Requires: - * MGR is initialized. - * dcd_handle != NULL - * Ensures: - * 0 and *dcd_handle != NULL || - * -EPERM and *dcd_handle == NULL - */ -extern int mgr_get_dcd_handle(struct mgr_object - *mgr_handle, u32 *dcd_handle); - -/* - * ======== mgr_init ======== - * Purpose: - * Initialize MGR's private state, keeping a reference count on each - * call. Initializes the DCD. - * Parameters: - * Returns: - * TRUE if initialized; FALSE if error occurred. - * Requires: - * Ensures: - * TRUE: A requirement for the other public MGR functions. - */ -extern bool mgr_init(void); - -#endif /* MGR_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/mgrpriv.h b/drivers/staging/tidspbridge/include/dspbridge/mgrpriv.h deleted file mode 100644 index 3a4e337c040d..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/mgrpriv.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * mgrpriv.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Global MGR constants and types, shared by PROC, MGR, and DSP API. - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef MGRPRIV_ -#define MGRPRIV_ - -/* - * OMAP1510 specific - */ -#define MGR_MAXTLBENTRIES 32 - -/* RM MGR Object */ -struct mgr_object; - -struct mgr_tlbentry { - u32 dsp_virt; /* DSP virtual address */ - u32 gpp_phys; /* GPP physical address */ -}; - -/* - * The DSP_PROCESSOREXTINFO structure describes additional extended - * capabilities of a DSP processor not exposed to user. - */ -struct mgr_processorextinfo { - struct dsp_processorinfo ty_basic; /* user processor info */ - /* private dsp mmu entries */ - struct mgr_tlbentry ty_tlb[MGR_MAXTLBENTRIES]; -}; - -#endif /* MGRPRIV_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/msg.h b/drivers/staging/tidspbridge/include/dspbridge/msg.h deleted file mode 100644 index 2c8712c933fc..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/msg.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * msg.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP/BIOS Bridge msg_ctrl Module. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef MSG_ -#define MSG_ - -#include -#include - -/* - * ======== msg_create ======== - * Purpose: - * Create an object to manage message queues. Only one of these objects - * can exist per device object. The msg_ctrl manager must be created before - * the IO Manager. - * Parameters: - * msg_man: Location to store msg_ctrl manager handle on output. - * hdev_obj: The device object. - * msg_callback: Called whenever an RMS_EXIT message is received. - * Returns: - * Requires: - * msg_man != NULL. - * hdev_obj != NULL. - * msg_callback != NULL. - * Ensures: - */ -extern int msg_create(struct msg_mgr **msg_man, - struct dev_object *hdev_obj, - msg_onexit msg_callback); - -/* - * ======== msg_delete ======== - * Purpose: - * Delete a msg_ctrl manager allocated in msg_create(). - * Parameters: - * hmsg_mgr: Handle returned from msg_create(). - * Returns: - * Requires: - * Valid hmsg_mgr. - * Ensures: - */ -extern void msg_delete(struct msg_mgr *hmsg_mgr); - -#endif /* MSG_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/msgdefs.h b/drivers/staging/tidspbridge/include/dspbridge/msgdefs.h deleted file mode 100644 index 80a3fa1a8a33..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/msgdefs.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * msgdefs.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Global msg_ctrl constants and types. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef MSGDEFS_ -#define MSGDEFS_ - -/* msg_ctrl Objects: */ -struct msg_mgr; -struct msg_queue; - -/* Function prototype for callback to be called on RMS_EXIT message received */ -typedef void (*msg_onexit) (void *h, s32 node_status); - -#endif /* MSGDEFS_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/nldr.h b/drivers/staging/tidspbridge/include/dspbridge/nldr.h deleted file mode 100644 index c5e48ca6c548..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/nldr.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * nldr.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP/BIOS Bridge dynamic loader interface. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -#include -#include -#include -#include - -#ifndef NLDR_ -#define NLDR_ - -extern int nldr_allocate(struct nldr_object *nldr_obj, - void *priv_ref, const struct dcd_nodeprops - *node_props, - struct nldr_nodeobject **nldr_nodeobj, - bool *pf_phase_split); - -extern int nldr_create(struct nldr_object **nldr, - struct dev_object *hdev_obj, - const struct nldr_attrs *pattrs); - -extern void nldr_delete(struct nldr_object *nldr_obj); - -extern int nldr_get_fxn_addr(struct nldr_nodeobject *nldr_node_obj, - char *str_fxn, u32 * addr); - -extern int nldr_get_rmm_manager(struct nldr_object *nldr, - struct rmm_target_obj **rmm_mgr); - -extern int nldr_load(struct nldr_nodeobject *nldr_node_obj, - enum nldr_phase phase); -extern int nldr_unload(struct nldr_nodeobject *nldr_node_obj, - enum nldr_phase phase); -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE -int nldr_find_addr(struct nldr_nodeobject *nldr_node, u32 sym_addr, - u32 offset_range, void *offset_output, char *sym_name); -#endif - -#endif /* NLDR_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/nldrdefs.h b/drivers/staging/tidspbridge/include/dspbridge/nldrdefs.h deleted file mode 100644 index 7e3c7f58b496..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/nldrdefs.h +++ /dev/null @@ -1,259 +0,0 @@ -/* - * nldrdefs.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Global Dynamic + static/overlay Node loader (NLDR) constants and types. - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef NLDRDEFS_ -#define NLDRDEFS_ - -#include -#include - -#define NLDR_MAXPATHLENGTH 255 -/* NLDR Objects: */ -struct nldr_object; -struct nldr_nodeobject; - -/* - * ======== nldr_loadtype ======== - * Load types for a node. Must match values in node.h55. - */ -enum nldr_loadtype { - NLDR_STATICLOAD, /* Linked in base image, not overlay */ - NLDR_DYNAMICLOAD, /* Dynamically loaded node */ - NLDR_OVLYLOAD /* Linked in base image, overlay node */ -}; - -/* - * ======== nldr_ovlyfxn ======== - * Causes code or data to be copied from load address to run address. This - * is the "cod_writefxn" that gets passed to the DBLL_Library and is used as - * the ZL write function. - * - * Parameters: - * priv_ref: Handle to identify the node. - * dsp_run_addr: Run address of code or data. - * dsp_load_addr: Load address of code or data. - * ul_num_bytes: Number of (GPP) bytes to copy. - * mem_space: RMS_CODE or RMS_DATA. - * Returns: - * ul_num_bytes: Success. - * 0: Failure. - * Requires: - * Ensures: - */ -typedef u32(*nldr_ovlyfxn) (void *priv_ref, u32 dsp_run_addr, - u32 dsp_load_addr, u32 ul_num_bytes, u32 mem_space); - -/* - * ======== nldr_writefxn ======== - * Write memory function. Used for dynamic load writes. - * Parameters: - * priv_ref: Handle to identify the node. - * dsp_add: Address of code or data. - * pbuf: Code or data to be written - * ul_num_bytes: Number of (GPP) bytes to write. - * mem_space: DBLL_DATA or DBLL_CODE. - * Returns: - * ul_num_bytes: Success. - * 0: Failure. - * Requires: - * Ensures: - */ -typedef u32(*nldr_writefxn) (void *priv_ref, - u32 dsp_add, void *pbuf, - u32 ul_num_bytes, u32 mem_space); - -/* - * ======== nldr_attrs ======== - * Attributes passed to nldr_create function. - */ -struct nldr_attrs { - nldr_ovlyfxn ovly; - nldr_writefxn write; - u16 dsp_word_size; - u16 dsp_mau_size; -}; - -/* - * ======== nldr_phase ======== - * Indicates node create, delete, or execute phase function. - */ -enum nldr_phase { - NLDR_CREATE, - NLDR_DELETE, - NLDR_EXECUTE, - NLDR_NOPHASE -}; - -/* - * Typedefs of loader functions imported from a DLL, or defined in a - * function table. - */ - -/* - * ======== nldr_allocate ======== - * Allocate resources to manage the loading of a node on the DSP. - * - * Parameters: - * nldr_obj: Handle of loader that will load the node. - * priv_ref: Handle to identify the node. - * node_props: Pointer to a dcd_nodeprops for the node. - * nldr_nodeobj: Location to store node handle on output. This handle - * will be passed to nldr_load/nldr_unload. - * pf_phase_split: pointer to int variable referenced in node.c - * Returns: - * 0: Success. - * -ENOMEM: Insufficient memory on GPP. - * Requires: - * Valid nldr_obj. - * node_props != NULL. - * nldr_nodeobj != NULL. - * Ensures: - * 0: IsValidNode(*nldr_nodeobj). - * error: *nldr_nodeobj == NULL. - */ -typedef int(*nldr_allocatefxn) (struct nldr_object *nldr_obj, - void *priv_ref, - const struct dcd_nodeprops - * node_props, - struct nldr_nodeobject - **nldr_nodeobj, - bool *pf_phase_split); - -/* - * ======== nldr_create ======== - * Create a loader object. This object handles the loading and unloading of - * create, delete, and execute phase functions of nodes on the DSP target. - * - * Parameters: - * nldr: Location to store loader handle on output. - * hdev_obj: Device for this processor. - * pattrs: Loader attributes. - * Returns: - * 0: Success; - * -ENOMEM: Insufficient memory for requested resources. - * Requires: - * nldr != NULL. - * hdev_obj != NULL. - * pattrs != NULL. - * Ensures: - * 0: Valid *nldr. - * error: *nldr == NULL. - */ -typedef int(*nldr_createfxn) (struct nldr_object **nldr, - struct dev_object *hdev_obj, - const struct nldr_attrs *pattrs); - -/* - * ======== nldr_delete ======== - * Delete the NLDR loader. - * - * Parameters: - * nldr_obj: Node manager object. - * Returns: - * Requires: - * Valid nldr_obj. - * Ensures: - * nldr_obj invalid - */ -typedef void (*nldr_deletefxn) (struct nldr_object *nldr_obj); - -/* - * ======== NLDR_Free ======== - * Free resources allocated in nldr_allocate. - * - * Parameters: - * nldr_node_obj: Handle returned from nldr_allocate(). - * Returns: - * Requires: - * Valid nldr_node_obj. - * Ensures: - */ -typedef void (*nldr_freefxn) (struct nldr_nodeobject *nldr_node_obj); - -/* - * ======== nldr_get_fxn_addr ======== - * Get address of create, delete, or execute phase function of a node on - * the DSP. - * - * Parameters: - * nldr_node_obj: Handle returned from nldr_allocate(). - * str_fxn: Name of function. - * addr: Location to store function address. - * Returns: - * 0: Success. - * -ESPIPE: Address of function not found. - * Requires: - * Valid nldr_node_obj. - * addr != NULL; - * str_fxn != NULL; - * Ensures: - */ -typedef int(*nldr_getfxnaddrfxn) (struct nldr_nodeobject - * nldr_node_obj, - char *str_fxn, u32 * addr); - -/* - * ======== nldr_load ======== - * Load create, delete, or execute phase function of a node on the DSP. - * - * Parameters: - * nldr_node_obj: Handle returned from nldr_allocate(). - * phase: Type of function to load (create, delete, or execute). - * Returns: - * 0: Success. - * -ENOMEM: Insufficient memory on GPP. - * -ENXIO: Can't overlay phase because overlay memory - * is already in use. - * -EILSEQ: Failure in dynamic loader library. - * Requires: - * Valid nldr_node_obj. - * Ensures: - */ -typedef int(*nldr_loadfxn) (struct nldr_nodeobject *nldr_node_obj, - enum nldr_phase phase); - -/* - * ======== nldr_unload ======== - * Unload create, delete, or execute phase function of a node on the DSP. - * - * Parameters: - * nldr_node_obj: Handle returned from nldr_allocate(). - * phase: Node function to unload (create, delete, or execute). - * Returns: - * 0: Success. - * -ENOMEM: Insufficient memory on GPP. - * Requires: - * Valid nldr_node_obj. - * Ensures: - */ -typedef int(*nldr_unloadfxn) (struct nldr_nodeobject *nldr_node_obj, - enum nldr_phase phase); - -/* - * ======== node_ldr_fxns ======== - */ -struct node_ldr_fxns { - nldr_allocatefxn allocate; - nldr_createfxn create; - nldr_deletefxn delete; - nldr_getfxnaddrfxn get_fxn_addr; - nldr_loadfxn load; - nldr_unloadfxn unload; -}; - -#endif /* NLDRDEFS_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/node.h b/drivers/staging/tidspbridge/include/dspbridge/node.h deleted file mode 100644 index 68ed74a86c95..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/node.h +++ /dev/null @@ -1,524 +0,0 @@ -/* - * node.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP/BIOS Bridge Node Manager. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef NODE_ -#define NODE_ - -#include - -#include -#include -#include -#include - -/* - * ======== node_allocate ======== - * Purpose: - * Allocate GPP resources to manage a node on the DSP. - * Parameters: - * hprocessor: Handle of processor that is allocating the node. - * node_uuid: Pointer to a dsp_uuid for the node. - * pargs: Optional arguments to be passed to the node. - * attr_in: Optional pointer to node attributes (priority, - * timeout...) - * noderes: Location to store node resource info. - * Returns: - * 0: Success. - * -ENOMEM: Insufficient memory on GPP. - * -ENOKEY: Node UUID has not been registered. - * -ESPIPE: iAlg functions not found for a DAIS node. - * -EDOM: attr_in != NULL and attr_in->prio out of - * range. - * -EPERM: A failure occurred, unable to allocate node. - * -EBADR: Proccessor is not in the running state. - * Requires: - * hprocessor != NULL. - * node_uuid != NULL. - * noderes != NULL. - * Ensures: - * 0: IsValidNode(*ph_node). - * error: *noderes == NULL. - */ -extern int node_allocate(struct proc_object *hprocessor, - const struct dsp_uuid *node_uuid, - const struct dsp_cbdata - *pargs, const struct dsp_nodeattrin - *attr_in, - struct node_res_object **noderes, - struct process_context *pr_ctxt); - -/* - * ======== node_alloc_msg_buf ======== - * Purpose: - * Allocate and Prepare a buffer whose descriptor will be passed to a - * Node within a (dsp_msg)message - * Parameters: - * hnode: The node handle. - * usize: The size of the buffer to be allocated. - * pattr: Pointer to a dsp_bufferattr structure. - * pbuffer: Location to store the address of the allocated - * buffer on output. - * Returns: - * 0: Success. - * -EFAULT: Invalid node handle. - * -ENOMEM: Insufficent memory. - * -EPERM: General Failure. - * -EINVAL: Invalid Size. - * Requires: - * pbuffer != NULL. - * Ensures: - */ -extern int node_alloc_msg_buf(struct node_object *hnode, - u32 usize, struct dsp_bufferattr - *pattr, u8 **pbuffer); - -/* - * ======== node_change_priority ======== - * Purpose: - * Change the priority of an allocated node. - * Parameters: - * hnode: Node handle returned from node_allocate. - * prio: New priority level to set node's priority to. - * Returns: - * 0: Success. - * -EFAULT: Invalid hnode. - * -EDOM: prio is out of range. - * -EPERM: The specified node is not a task node. - * Unable to change node's runtime priority level. - * -EBADR: Node is not in the NODE_ALLOCATED, NODE_PAUSED, - * or NODE_RUNNING state. - * -ETIME: A timeout occurred before the DSP responded. - * Requires: - * Ensures: - * 0 && (Node's current priority == prio) - */ -extern int node_change_priority(struct node_object *hnode, s32 prio); - -/* - * ======== node_connect ======== - * Purpose: - * Connect two nodes on the DSP, or a node on the DSP to the GPP. In the - * case that the connection is being made between a node on the DSP and - * the GPP, one of the node handles (either node1 or node2) must be - * the constant NODE_HGPPNODE. - * Parameters: - * node1: Handle of first node to connect to second node. If - * this is a connection from the GPP to node2, node1 - * must be the constant NODE_HGPPNODE. Otherwise, node1 - * must be a node handle returned from a successful call - * to Node_Allocate(). - * node2: Handle of second node. Must be either NODE_HGPPNODE - * if this is a connection from DSP node to GPP, or a - * node handle returned from a successful call to - * node_allocate(). - * stream1: Output stream index on first node, to be connected - * to second node's input stream. Value must range from - * 0 <= stream1 < number of output streams. - * stream2: Input stream index on second node. Value must range - * from 0 <= stream2 < number of input streams. - * pattrs: Stream attributes (NULL ==> use defaults). - * conn_param: A pointer to a dsp_cbdata structure that defines - * connection parameter for device nodes to pass to DSP - * side. - * If the value of this parameter is NULL, then this API - * behaves like DSPNode_Connect. This parameter will have - * length of the string and the null terminated string in - * dsp_cbdata struct. This can be extended in future tp - * pass binary data. - * Returns: - * 0: Success. - * -EFAULT: Invalid node1 or node2. - * -ENOMEM: Insufficient host memory. - * -EINVAL: A stream index parameter is invalid. - * -EISCONN: A connection already exists for one of the - * indices stream1 or stream2. - * -EBADR: Either node1 or node2 is not in the - * NODE_ALLOCATED state. - * -ECONNREFUSED: No more connections available. - * -EPERM: Attempt to make an illegal connection (eg, - * Device node to device node, or device node to - * GPP), the two nodes are on different DSPs. - * Requires: - * Ensures: - */ -extern int node_connect(struct node_object *node1, - u32 stream1, - struct node_object *node2, - u32 stream2, - struct dsp_strmattr *pattrs, - struct dsp_cbdata - *conn_param); - -/* - * ======== node_create ======== - * Purpose: - * Create a node on the DSP by remotely calling the node's create - * function. If necessary, load code that contains the node's create - * function. - * Parameters: - * hnode: Node handle returned from node_allocate(). - * Returns: - * 0: Success. - * -EFAULT: Invalid hnode. - * -ESPIPE: Create function not found in the COFF file. - * -EBADR: Node is not in the NODE_ALLOCATED state. - * -ENOMEM: Memory allocation failure on the DSP. - * -ETIME: A timeout occurred before the DSP responded. - * -EPERM: A failure occurred, unable to create node. - * Requires: - * Ensures: - */ -extern int node_create(struct node_object *hnode); - -/* - * ======== node_create_mgr ======== - * Purpose: - * Create a NODE Manager object. This object handles the creation, - * deletion, and execution of nodes on the DSP target. The NODE Manager - * also maintains a pipe map of used and available node connections. - * Each DEV object should have exactly one NODE Manager object. - * - * Parameters: - * node_man: Location to store node manager handle on output. - * hdev_obj: Device for this processor. - * Returns: - * 0: Success; - * -ENOMEM: Insufficient memory for requested resources. - * -EPERM: General failure. - * Requires: - * node_man != NULL. - * hdev_obj != NULL. - * Ensures: - * 0: Valide *node_man. - * error: *node_man == NULL. - */ -extern int node_create_mgr(struct node_mgr **node_man, - struct dev_object *hdev_obj); - -/* - * ======== node_delete ======== - * Purpose: - * Delete resources allocated in node_allocate(). If the node was - * created, delete the node on the DSP by remotely calling the node's - * delete function. Loads the node's delete function if necessary. - * GPP side resources are freed after node's delete function returns. - * Parameters: - * noderes: Node resource info handle returned from - * node_allocate(). - * pr_ctxt: Pointer to process context data. - * Returns: - * 0: Success. - * -EFAULT: Invalid hnode. - * -ETIME: A timeout occurred before the DSP responded. - * -EPERM: A failure occurred in deleting the node. - * -ESPIPE: Delete function not found in the COFF file. - * Requires: - * Ensures: - * 0: hnode is invalid. - */ -extern int node_delete(struct node_res_object *noderes, - struct process_context *pr_ctxt); - -/* - * ======== node_delete_mgr ======== - * Purpose: - * Delete the NODE Manager. - * Parameters: - * hnode_mgr: Node manager object. - * Returns: - * 0: Success. - * Requires: - * Valid hnode_mgr. - * Ensures: - */ -extern int node_delete_mgr(struct node_mgr *hnode_mgr); - -/* - * ======== node_enum_nodes ======== - * Purpose: - * Enumerate the nodes currently allocated for the DSP. - * Parameters: - * hnode_mgr: Node manager returned from node_create_mgr(). - * node_tab: Array to copy node handles into. - * node_tab_size: Number of handles that can be written to node_tab. - * pu_num_nodes: Location where number of node handles written to - * node_tab will be written. - * pu_allocated: Location to write total number of allocated nodes. - * Returns: - * 0: Success. - * -EINVAL: node_tab is too small to hold all node handles. - * Requires: - * Valid hnode_mgr. - * node_tab != NULL || node_tab_size == 0. - * pu_num_nodes != NULL. - * pu_allocated != NULL. - * Ensures: - * - (-EINVAL && *pu_num_nodes == 0) - * - || (0 && *pu_num_nodes <= node_tab_size) && - * (*pu_allocated == *pu_num_nodes) - */ -extern int node_enum_nodes(struct node_mgr *hnode_mgr, - void **node_tab, - u32 node_tab_size, - u32 *pu_num_nodes, - u32 *pu_allocated); - -/* - * ======== node_free_msg_buf ======== - * Purpose: - * Free a message buffer previously allocated with node_alloc_msg_buf. - * Parameters: - * hnode: The node handle. - * pbuffer: (Address) Buffer allocated by node_alloc_msg_buf. - * pattr: Same buffer attributes passed to node_alloc_msg_buf. - * Returns: - * 0: Success. - * -EFAULT: Invalid node handle. - * -EPERM: Failure to free the buffer. - * Requires: - * pbuffer != NULL. - * Ensures: - */ -extern int node_free_msg_buf(struct node_object *hnode, - u8 *pbuffer, - struct dsp_bufferattr - *pattr); - -/* - * ======== node_get_attr ======== - * Purpose: - * Copy the current attributes of the specified node into a dsp_nodeattr - * structure. - * Parameters: - * hnode: Node object allocated from node_allocate(). - * pattr: Pointer to dsp_nodeattr structure to copy node's - * attributes. - * attr_size: Size of pattr. - * Returns: - * 0: Success. - * -EFAULT: Invalid hnode. - * Requires: - * pattr != NULL. - * Ensures: - * 0: *pattrs contains the node's current attributes. - */ -extern int node_get_attr(struct node_object *hnode, - struct dsp_nodeattr *pattr, u32 attr_size); - -/* - * ======== node_get_message ======== - * Purpose: - * Retrieve a message from a node on the DSP. The node must be either a - * message node, task node, or XDAIS socket node. - * If a message is not available, this function will block until a - * message is available, or the node's timeout value is reached. - * Parameters: - * hnode: Node handle returned from node_allocate(). - * message: Pointer to dsp_msg structure to copy the - * message into. - * utimeout: Timeout in milliseconds to wait for message. - * Returns: - * 0: Success. - * -EFAULT: Invalid hnode. - * -EPERM: Cannot retrieve messages from this type of node. - * Error occurred while trying to retrieve a message. - * -ETIME: Timeout occurred and no message is available. - * Requires: - * message != NULL. - * Ensures: - */ -extern int node_get_message(struct node_object *hnode, - struct dsp_msg *message, u32 utimeout); - -/* - * ======== node_get_nldr_obj ======== - * Purpose: - * Retrieve the Nldr manager - * Parameters: - * hnode_mgr: Node Manager - * nldr_ovlyobj: Pointer to a Nldr manager handle - * Returns: - * 0: Success. - * -EFAULT: Invalid hnode. - * Ensures: - */ -extern int node_get_nldr_obj(struct node_mgr *hnode_mgr, - struct nldr_object **nldr_ovlyobj); - -/* - * ======== node_on_exit ======== - * Purpose: - * Gets called when RMS_EXIT is received for a node. PROC needs to pass - * this function as a parameter to msg_create(). This function then gets - * called by the Bridge driver when an exit message for a node is received. - * Parameters: - * hnode: Handle of the node that the exit message is for. - * node_status: Return status of the node's execute phase. - * Returns: - * Ensures: - */ -void node_on_exit(struct node_object *hnode, s32 node_status); - -/* - * ======== node_pause ======== - * Purpose: - * Suspend execution of a node currently running on the DSP. - * Parameters: - * hnode: Node object representing a node currently - * running on the DSP. - * Returns: - * 0: Success. - * -EFAULT: Invalid hnode. - * -EPERM: Node is not a task or socket node. - * Failed to pause node. - * -ETIME: A timeout occurred before the DSP responded. - * DSP_EWRONGSTSATE: Node is not in NODE_RUNNING state. - * Requires: - * Ensures: - */ -extern int node_pause(struct node_object *hnode); - -/* - * ======== node_put_message ======== - * Purpose: - * Send a message to a message node, task node, or XDAIS socket node. - * This function will block until the message stream can accommodate - * the message, or a timeout occurs. The message will be copied, so Msg - * can be re-used immediately after return. - * Parameters: - * hnode: Node handle returned by node_allocate(). - * pmsg: Location of message to be sent to the node. - * utimeout: Timeout in msecs to wait. - * Returns: - * 0: Success. - * -EFAULT: Invalid hnode. - * -EPERM: Messages can't be sent to this type of node. - * Unable to send message. - * -ETIME: Timeout occurred before message could be set. - * -EBADR: Node is in invalid state for sending messages. - * Requires: - * pmsg != NULL. - * Ensures: - */ -extern int node_put_message(struct node_object *hnode, - const struct dsp_msg *pmsg, u32 utimeout); - -/* - * ======== node_register_notify ======== - * Purpose: - * Register to be notified on specific events for this node. - * Parameters: - * hnode: Node handle returned by node_allocate(). - * event_mask: Mask of types of events to be notified about. - * notify_type: Type of notification to be sent. - * hnotification: Handle to be used for notification. - * Returns: - * 0: Success. - * -EFAULT: Invalid hnode. - * -ENOMEM: Insufficient memory on GPP. - * -EINVAL: event_mask is invalid. - * -ENOSYS: Notification type specified by notify_type is not - * supported. - * Requires: - * hnotification != NULL. - * Ensures: - */ -extern int node_register_notify(struct node_object *hnode, - u32 event_mask, u32 notify_type, - struct dsp_notification - *hnotification); - -/* - * ======== node_run ======== - * Purpose: - * Start execution of a node's execute phase, or resume execution of - * a node that has been suspended (via node_pause()) on the DSP. Load - * the node's execute function if necessary. - * Parameters: - * hnode: Node object representing a node currently - * running on the DSP. - * Returns: - * 0: Success. - * -EFAULT: Invalid hnode. - * -EPERM: hnode doesn't represent a message, task or dais socket node. - * Unable to start or resume execution. - * -ETIME: A timeout occurred before the DSP responded. - * DSP_EWRONGSTSATE: Node is not in NODE_PAUSED or NODE_CREATED state. - * -ESPIPE: Execute function not found in the COFF file. - * Requires: - * Ensures: - */ -extern int node_run(struct node_object *hnode); - -/* - * ======== node_terminate ======== - * Purpose: - * Signal a node running on the DSP that it should exit its execute - * phase function. - * Parameters: - * hnode: Node object representing a node currently - * running on the DSP. - * pstatus: Location to store execute-phase function return - * value. - * Returns: - * 0: Success. - * -EFAULT: Invalid hnode. - * -ETIME: A timeout occurred before the DSP responded. - * -EPERM: Type of node specified cannot be terminated. - * Unable to terminate the node. - * -EBADR: Operation not valid for the current node state. - * Requires: - * pstatus != NULL. - * Ensures: - */ -extern int node_terminate(struct node_object *hnode, - int *pstatus); - -/* - * ======== node_get_uuid_props ======== - * Purpose: - * Fetch Node properties given the UUID - * Parameters: - * - */ -extern int node_get_uuid_props(void *hprocessor, - const struct dsp_uuid *node_uuid, - struct dsp_ndbprops - *node_props); - -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE -/** - * node_find_addr() - Find the closest symbol to the given address. - * - * @node_mgr: Node manager handle - * @sym_addr: Given address to find the closest symbol - * @offset_range: offset range to look fo the closest symbol - * @sym_addr_output: Symbol Output address - * @sym_name: String with the symbol name of the closest symbol - * - * This function finds the closest symbol to the address where a MMU - * Fault occurred on the DSP side. - */ -int node_find_addr(struct node_mgr *node_mgr, u32 sym_addr, - u32 offset_range, void *sym_addr_output, - char *sym_name); - -enum node_state node_get_state(void *hnode); -#endif - -#endif /* NODE_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/nodedefs.h b/drivers/staging/tidspbridge/include/dspbridge/nodedefs.h deleted file mode 100644 index fb9623d8a79a..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/nodedefs.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * nodedefs.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Global NODE constants and types, shared by PROCESSOR, NODE, and DISP. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef NODEDEFS_ -#define NODEDEFS_ - -#define NODE_SUSPENDEDPRI -1 - -/* NODE Objects: */ -struct node_mgr; -struct node_object; - -#endif /* NODEDEFS_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/nodepriv.h b/drivers/staging/tidspbridge/include/dspbridge/nodepriv.h deleted file mode 100644 index d5b54bb81e8e..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/nodepriv.h +++ /dev/null @@ -1,181 +0,0 @@ -/* - * nodepriv.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Private node header shared by NODE and DISP. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef NODEPRIV_ -#define NODEPRIV_ - -#include -#include -#include - -/* DSP address of node environment structure */ -typedef u32 nodeenv; - -/* - * Node create structures - */ - -/* Message node */ -struct node_msgargs { - u32 max_msgs; /* Max # of simultaneous messages for node */ - u32 seg_id; /* Segment for allocating message buffers */ - u32 notify_type; /* Notify type (SEM_post, SWI_post, etc.) */ - u32 arg_length; /* Length in 32-bit words of arg data block */ - u8 *pdata; /* Argument data for node */ -}; - -struct node_strmdef { - u32 buf_size; /* Size of buffers for SIO stream */ - u32 num_bufs; /* max # of buffers in SIO stream at once */ - u32 seg_id; /* Memory segment id to allocate buffers */ - u32 timeout; /* Timeout for blocking SIO calls */ - u32 buf_alignment; /* Buffer alignment */ - char *sz_device; /* Device name for stream */ -}; - -/* Task node */ -struct node_taskargs { - struct node_msgargs node_msg_args; - s32 prio; - u32 stack_size; - u32 sys_stack_size; - u32 stack_seg; - u32 dsp_heap_res_addr; /* DSP virtual heap address */ - u32 dsp_heap_addr; /* DSP virtual heap address */ - u32 heap_size; /* Heap size */ - u32 gpp_heap_addr; /* GPP virtual heap address */ - u32 profile_id; /* Profile ID */ - u32 num_inputs; - u32 num_outputs; - u32 dais_arg; /* Address of iAlg object */ - struct node_strmdef *strm_in_def; - struct node_strmdef *strm_out_def; -}; - -/* - * ======== node_createargs ======== - */ -struct node_createargs { - union { - struct node_msgargs node_msg_args; - struct node_taskargs task_arg_obj; - } asa; -}; - -/* - * ======== node_get_channel_id ======== - * Purpose: - * Get the channel index reserved for a stream connection between the - * host and a node. This index is reserved when node_connect() is called - * to connect the node with the host. This index should be passed to - * the CHNL_Open function when the stream is actually opened. - * Parameters: - * hnode: Node object allocated from node_allocate(). - * dir: Input (DSP_TONODE) or output (DSP_FROMNODE). - * index: Stream index. - * chan_id: Location to store channel index. - * Returns: - * 0: Success. - * -EFAULT: Invalid hnode. - * -EPERM: Not a task or DAIS socket node. - * -EINVAL: The node's stream corresponding to index and dir - * is not a stream to or from the host. - * Requires: - * Valid dir. - * chan_id != NULL. - * Ensures: - */ -extern int node_get_channel_id(struct node_object *hnode, - u32 dir, u32 index, u32 *chan_id); - -/* - * ======== node_get_strm_mgr ======== - * Purpose: - * Get the STRM manager for a node. - * Parameters: - * hnode: Node allocated with node_allocate(). - * strm_man: Location to store STRM manager on output. - * Returns: - * 0: Success. - * -EFAULT: Invalid hnode. - * Requires: - * strm_man != NULL. - * Ensures: - */ -extern int node_get_strm_mgr(struct node_object *hnode, - struct strm_mgr **strm_man); - -/* - * ======== node_get_timeout ======== - * Purpose: - * Get the timeout value of a node. - * Parameters: - * hnode: Node allocated with node_allocate(), or DSP_HGPPNODE. - * Returns: - * Node's timeout value. - * Requires: - * Valid hnode. - * Ensures: - */ -extern u32 node_get_timeout(struct node_object *hnode); - -/* - * ======== node_get_type ======== - * Purpose: - * Get the type (device, message, task, or XDAIS socket) of a node. - * Parameters: - * hnode: Node allocated with node_allocate(), or DSP_HGPPNODE. - * Returns: - * Node type: NODE_DEVICE, NODE_TASK, NODE_XDAIS, or NODE_GPP. - * Requires: - * Valid hnode. - * Ensures: - */ -extern enum node_type node_get_type(struct node_object *hnode); - -/* - * ======== get_node_info ======== - * Purpose: - * Get node information without holding semaphore. - * Parameters: - * hnode: Node allocated with node_allocate(), or DSP_HGPPNODE. - * Returns: - * Node info: priority, device owner, no. of streams, execution state - * NDB properties. - * Requires: - * Valid hnode. - * Ensures: - */ -extern void get_node_info(struct node_object *hnode, - struct dsp_nodeinfo *node_info); - -/* - * ======== node_get_load_type ======== - * Purpose: - * Get the load type (dynamic, overlay, static) of a node. - * Parameters: - * hnode: Node allocated with node_allocate(), or DSP_HGPPNODE. - * Returns: - * Node type: NLDR_DYNAMICLOAD, NLDR_OVLYLOAD, NLDR_STATICLOAD - * Requires: - * Valid hnode. - * Ensures: - */ -extern enum nldr_loadtype node_get_load_type(struct node_object *hnode); - -#endif /* NODEPRIV_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/ntfy.h b/drivers/staging/tidspbridge/include/dspbridge/ntfy.h deleted file mode 100644 index 6bb94d20e99a..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/ntfy.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - * ntfy.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Manage lists of notification events. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef NTFY_ -#define NTFY_ - -#include -#include -#include - -/** - * ntfy_object - head structure to nofify dspbridge events - * @head: List of notify objects - * @ntfy_lock: lock for list access. - * - */ -struct ntfy_object { - struct raw_notifier_head head;/* List of notifier objects */ - spinlock_t ntfy_lock; /* For critical sections */ -}; - -/** - * ntfy_event - structure store specify event to be notified - * @noti_block: List of notify objects - * @event: event that it respond - * @type: event type (only DSP_SIGNALEVENT supported) - * @sync_obj: sync_event used to set the event - * - */ -struct ntfy_event { - struct notifier_block noti_block; - u32 event; /* Events to be notified about */ - u32 type; /* Type of notification to be sent */ - struct sync_object sync_obj; -}; - - -/** - * dsp_notifier_event() - callback function to nofity events - * @this: pointer to itself struct notifier_block - * @event: event to be notified. - * @data: Currently not used. - * - */ -int dsp_notifier_event(struct notifier_block *this, unsigned long event, - void *data); - -/** - * ntfy_init() - Set the initial state of the ntfy_object structure. - * @no: pointer to ntfy_object structure. - * - * This function sets the initial state of the ntfy_object in order it - * can be used by the other ntfy functions. - */ - -static inline void ntfy_init(struct ntfy_object *no) -{ - spin_lock_init(&no->ntfy_lock); - RAW_INIT_NOTIFIER_HEAD(&no->head); -} - -/** - * ntfy_delete() - delete list of nofy events registered. - * @ntfy_obj: Pointer to the ntfy object structure. - * - * This function is used to remove all the notify events registered. - * unregister function is not needed in this function, to unregister - * a ntfy_event please look at ntfy_register function. - * - */ -static inline void ntfy_delete(struct ntfy_object *ntfy_obj) -{ - struct ntfy_event *ne; - struct notifier_block *nb; - - spin_lock_bh(&ntfy_obj->ntfy_lock); - nb = ntfy_obj->head.head; - while (nb) { - ne = container_of(nb, struct ntfy_event, noti_block); - nb = nb->next; - kfree(ne); - } - spin_unlock_bh(&ntfy_obj->ntfy_lock); -} - -/** - * ntfy_notify() - nofity all event register for an specific event. - * @ntfy_obj: Pointer to the ntfy_object structure. - * @event: event to be notified. - * - * This function traverses all the ntfy events registers and - * set the event with mach with @event. - */ -static inline void ntfy_notify(struct ntfy_object *ntfy_obj, u32 event) -{ - spin_lock_bh(&ntfy_obj->ntfy_lock); - raw_notifier_call_chain(&ntfy_obj->head, event, NULL); - spin_unlock_bh(&ntfy_obj->ntfy_lock); -} - - - -/** - * ntfy_init() - Create and initialize a ntfy_event structure. - * @event: event that the ntfy event will respond - * @type event type (only DSP_SIGNALEVENT supported) - * - * This function create a ntfy_event element and sets the event it will - * respond the ntfy_event in order it can be used by the other ntfy functions. - * In case of success it will return a pointer to the ntfy_event struct - * created. Otherwise it will return NULL; - */ - -static inline struct ntfy_event *ntfy_event_create(u32 event, u32 type) -{ - struct ntfy_event *ne; - ne = kmalloc(sizeof(struct ntfy_event), GFP_KERNEL); - if (ne) { - sync_init_event(&ne->sync_obj); - ne->noti_block.notifier_call = dsp_notifier_event; - ne->event = event; - ne->type = type; - } - return ne; -} - -/** - * ntfy_register() - register new ntfy_event into a given ntfy_object - * @ntfy_obj: Pointer to the ntfy_object structure. - * @noti: Pointer to the handle to be returned to the user space. - * @event event that the ntfy event will respond - * @type event type (only DSP_SIGNALEVENT supported) - * - * This function register a new ntfy_event into the ntfy_object list, - * which will respond to the @event passed. - * This function will return 0 in case of error. - * -EFAULT in case of bad pointers and - * DSP_EMemory in case of no memory to create ntfy_event. - */ -static inline int ntfy_register(struct ntfy_object *ntfy_obj, - struct dsp_notification *noti, - u32 event, u32 type) -{ - struct ntfy_event *ne; - int status = 0; - - if (!noti || !ntfy_obj) { - status = -EFAULT; - goto func_end; - } - if (!event) { - status = -EINVAL; - goto func_end; - } - ne = ntfy_event_create(event, type); - if (!ne) { - status = -ENOMEM; - goto func_end; - } - noti->handle = &ne->sync_obj; - - spin_lock_bh(&ntfy_obj->ntfy_lock); - raw_notifier_chain_register(&ntfy_obj->head, &ne->noti_block); - spin_unlock_bh(&ntfy_obj->ntfy_lock); -func_end: - return status; -} - -/** - * ntfy_unregister() - unregister a ntfy_event from a given ntfy_object - * @ntfy_obj: Pointer to the ntfy_object structure. - * @noti: Pointer to the event that will be removed. - * - * This function unregister a ntfy_event from the ntfy_object list, - * @noti contains the event which is wanted to be removed. - * This function will return 0 in case of error. - * -EFAULT in case of bad pointers and - * DSP_EMemory in case of no memory to create ntfy_event. - */ -static inline int ntfy_unregister(struct ntfy_object *ntfy_obj, - struct dsp_notification *noti) -{ - int status = 0; - struct ntfy_event *ne; - - if (!noti || !ntfy_obj) { - status = -EFAULT; - goto func_end; - } - - ne = container_of((struct sync_object *)noti, struct ntfy_event, - sync_obj); - spin_lock_bh(&ntfy_obj->ntfy_lock); - raw_notifier_chain_unregister(&ntfy_obj->head, - &ne->noti_block); - kfree(ne); - spin_unlock_bh(&ntfy_obj->ntfy_lock); -func_end: - return status; -} - -#endif /* NTFY_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/proc.h b/drivers/staging/tidspbridge/include/dspbridge/proc.h deleted file mode 100644 index 64c2457aae95..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/proc.h +++ /dev/null @@ -1,591 +0,0 @@ -/* - * proc.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * This is the DSP API RM module interface. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef PROC_ -#define PROC_ - -#include -#include -#include - -/* - * ======== proc_attach ======== - * Purpose: - * Prepare for communication with a particular DSP processor, and return - * a handle to the processor object. The PROC Object gets created - * Parameters: - * processor_id : The processor index (zero-based). - * hmgr_obj : Handle to the Manager Object - * attr_in : Ptr to the dsp_processorattrin structure. - * A NULL value means use default values. - * ph_processor : Ptr to location to store processor handle. - * Returns: - * 0 : Success. - * -EPERM : General failure. - * -EFAULT : Invalid processor handle. - * 0: Success; Processor already attached. - * Requires: - * ph_processor != NULL. - * PROC Initialized. - * Ensures: - * -EPERM, and *ph_processor == NULL, OR - * Success and *ph_processor is a Valid Processor handle OR - * 0 and *ph_processor is a Valid Processor. - * Details: - * When attr_in is NULL, the default timeout value is 10 seconds. - */ -extern int proc_attach(u32 processor_id, - const struct dsp_processorattrin - *attr_in, void **ph_processor, - struct process_context *pr_ctxt); - -/* - * ======== proc_auto_start ========= - * Purpose: - * A Particular device gets loaded with the default image - * if the AutoStart flag is set. - * Parameters: - * hdev_obj : Handle to the Device - * Returns: - * 0 : On Successful Loading - * -ENOENT : No DSP exec file found. - * -EPERM : General Failure - * Requires: - * hdev_obj != NULL. - * dev_node_obj != NULL. - * PROC Initialized. - * Ensures: - */ -extern int proc_auto_start(struct cfg_devnode *dev_node_obj, - struct dev_object *hdev_obj); - -/* - * ======== proc_ctrl ======== - * Purpose: - * Pass control information to the GPP device driver managing the DSP - * processor. This will be an OEM-only function, and not part of the - * 'Bridge application developer's API. - * Parameters: - * hprocessor : The processor handle. - * dw_cmd : Private driver IOCTL cmd ID. - * pargs : Ptr to an driver defined argument structure. - * Returns: - * 0 : SUCCESS - * -EFAULT : Invalid processor handle. - * -ETIME: A Timeout Occurred before the Control information - * could be sent. - * -EPERM : General Failure. - * Requires: - * PROC Initialized. - * Ensures - * Details: - * This function Calls bridge_dev_ctrl. - */ -extern int proc_ctrl(void *hprocessor, - u32 dw_cmd, struct dsp_cbdata *arg); - -/* - * ======== proc_detach ======== - * Purpose: - * Close a DSP processor and de-allocate all (GPP) resources reserved - * for it. The Processor Object is deleted. - * Parameters: - * pr_ctxt : The processor handle. - * Returns: - * 0 : Success. - * -EFAULT : InValid Handle. - * -EPERM : General failure. - * Requires: - * PROC Initialized. - * Ensures: - * PROC Object is destroyed. - */ -extern int proc_detach(struct process_context *pr_ctxt); - -/* - * ======== proc_enum_nodes ======== - * Purpose: - * Enumerate the nodes currently allocated on a processor. - * Parameters: - * hprocessor : The processor handle. - * node_tab : The first Location of an array allocated for node - * handles. - * node_tab_size: The number of (DSP_HNODE) handles that can be held - * to the memory the client has allocated for node_tab - * pu_num_nodes : Location where DSPProcessor_EnumNodes will return - * the number of valid handles written to node_tab - * pu_allocated : Location where DSPProcessor_EnumNodes will return - * the number of nodes that are allocated on the DSP. - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EINVAL : The amount of memory allocated for node_tab is - * insufficent. That is the number of nodes actually - * allocated on the DSP is greater than the value - * specified for node_tab_size. - * -EPERM : Unable to get Resource Information. - * Details: - * Requires - * pu_num_nodes is not NULL. - * pu_allocated is not NULL. - * node_tab is not NULL. - * PROC Initialized. - * Ensures: - * Details: - */ -extern int proc_enum_nodes(void *hprocessor, - void **node_tab, - u32 node_tab_size, - u32 *pu_num_nodes, - u32 *pu_allocated); - -/* - * ======== proc_get_resource_info ======== - * Purpose: - * Enumerate the resources currently available on a processor. - * Parameters: - * hprocessor : The processor handle. - * resource_type: Type of resource . - * resource_info: Ptr to the dsp_resourceinfo structure. - * resource_info_size: Size of the structure. - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EBADR: The processor is not in the PROC_RUNNING state. - * -ETIME: A timeout occurred before the DSP responded to the - * querry. - * -EPERM : Unable to get Resource Information - * Requires: - * resource_info is not NULL. - * Parameter resource_type is Valid.[TBD] - * resource_info_size is >= sizeof dsp_resourceinfo struct. - * PROC Initialized. - * Ensures: - * Details: - * This function currently returns - * -ENOSYS, and does not write any data to the resource_info struct. - */ -extern int proc_get_resource_info(void *hprocessor, - u32 resource_type, - struct dsp_resourceinfo - *resource_info, - u32 resource_info_size); - -/* - * ======== proc_get_dev_object ========= - * Purpose: - * Returns the DEV Hanlde for a given Processor handle - * Parameters: - * hprocessor : Processor Handle - * device_obj : Location to store the DEV Handle. - * Returns: - * 0 : Success; *device_obj has Dev handle - * -EPERM : Failure; *device_obj is zero. - * Requires: - * device_obj is not NULL - * PROC Initialized. - * Ensures: - * 0 : *device_obj is not NULL - * -EPERM : *device_obj is NULL. - */ -extern int proc_get_dev_object(void *hprocessor, - struct dev_object **device_obj); - -/* - * ======== proc_get_state ======== - * Purpose: - * Report the state of the specified DSP processor. - * Parameters: - * hprocessor : The processor handle. - * proc_state_obj : Ptr to location to store the dsp_processorstate - * structure. - * state_info_size: Size of dsp_processorstate. - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EPERM : General failure while querying processor state. - * Requires: - * proc_state_obj is not NULL - * state_info_size is >= than the size of dsp_processorstate structure. - * PROC Initialized. - * Ensures: - * Details: - */ -extern int proc_get_state(void *hprocessor, struct dsp_processorstate - *proc_state_obj, u32 state_info_size); - -/* - * ======== PROC_GetProcessorID ======== - * Purpose: - * Report the state of the specified DSP processor. - * Parameters: - * hprocessor : The processor handle. - * proc_id : Processor ID - * - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EPERM : General failure while querying processor state. - * Requires: - * proc_state_obj is not NULL - * state_info_size is >= than the size of dsp_processorstate structure. - * PROC Initialized. - * Ensures: - * Details: - */ -extern int proc_get_processor_id(void *proc, u32 * proc_id); - -/* - * ======== proc_get_trace ======== - * Purpose: - * Retrieve the trace buffer from the specified DSP processor. - * Parameters: - * hprocessor : The processor handle. - * pbuf : Ptr to buffer to hold trace output. - * max_size : Maximum size of the output buffer. - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EPERM : General failure while retrieving processor trace - * Buffer. - * Requires: - * pbuf is not NULL - * max_size is > 0. - * PROC Initialized. - * Ensures: - * Details: - */ -extern int proc_get_trace(void *hprocessor, u8 * pbuf, u32 max_size); - -/* - * ======== proc_load ======== - * Purpose: - * Reset a processor and load a new base program image. - * This will be an OEM-only function. - * Parameters: - * hprocessor: The processor handle. - * argc_index: The number of Arguments(strings)in the aArgV[] - * user_args: An Array of Arguments(Unicode Strings) - * user_envp: An Array of Environment settings(Unicode Strings) - * Returns: - * 0: Success. - * -ENOENT: The DSP Executable was not found. - * -EFAULT: Invalid processor handle. - * -EPERM : Unable to Load the Processor - * Requires: - * user_args is not NULL - * argc_index is > 0 - * PROC Initialized. - * Ensures: - * Success and ProcState == PROC_LOADED - * or DSP_FAILED status. - * Details: - * Does not implement access rights to control which GPP application - * can load the processor. - */ -extern int proc_load(void *hprocessor, - const s32 argc_index, const char **user_args, - const char **user_envp); - -/* - * ======== proc_register_notify ======== - * Purpose: - * Register to be notified of specific processor events - * Parameters: - * hprocessor : The processor handle. - * event_mask : Mask of types of events to be notified about. - * notify_type : Type of notification to be sent. - * hnotification: Handle to be used for notification. - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle or hnotification. - * -EINVAL : Parameter event_mask is Invalid - * DSP_ENOTIMP : The notification type specified in uNotifyMask - * is not supported. - * -EPERM : Unable to register for notification. - * Requires: - * hnotification is not NULL - * PROC Initialized. - * Ensures: - * Details: - */ -extern int proc_register_notify(void *hprocessor, - u32 event_mask, u32 notify_type, - struct dsp_notification - *hnotification); - -/* - * ======== proc_notify_clients ======== - * Purpose: - * Notify the Processor Clients - * Parameters: - * proc : The processor handle. - * events : Event to be notified about. - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EPERM : Failure to Set or Reset the Event - * Requires: - * events is Supported or Valid type of Event - * proc is a valid handle - * PROC Initialized. - * Ensures: - */ -extern int proc_notify_clients(void *proc, u32 events); - -/* - * ======== proc_notify_all_clients ======== - * Purpose: - * Notify the Processor Clients - * Parameters: - * proc : The processor handle. - * events : Event to be notified about. - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EPERM : Failure to Set or Reset the Event - * Requires: - * events is Supported or Valid type of Event - * proc is a valid handle - * PROC Initialized. - * Ensures: - * Details: - * NODE And STRM would use this function to notify their clients - * about the state changes in NODE or STRM. - */ -extern int proc_notify_all_clients(void *proc, u32 events); - -/* - * ======== proc_start ======== - * Purpose: - * Start a processor running. - * Processor must be in PROC_LOADED state. - * This will be an OEM-only function, and not part of the 'Bridge - * application developer's API. - * Parameters: - * hprocessor : The processor handle. - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EBADR: Processor is not in PROC_LOADED state. - * -EPERM : Unable to start the processor. - * Requires: - * PROC Initialized. - * Ensures: - * Success and ProcState == PROC_RUNNING or DSP_FAILED status. - * Details: - */ -extern int proc_start(void *hprocessor); - -/* - * ======== proc_stop ======== - * Purpose: - * Start a processor running. - * Processor must be in PROC_LOADED state. - * This will be an OEM-only function, and not part of the 'Bridge - * application developer's API. - * Parameters: - * hprocessor : The processor handle. - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EBADR: Processor is not in PROC_LOADED state. - * -EPERM : Unable to start the processor. - * Requires: - * PROC Initialized. - * Ensures: - * Success and ProcState == PROC_RUNNING or DSP_FAILED status. - * Details: - */ -extern int proc_stop(void *hprocessor); - -/* - * ======== proc_end_dma ======== - * Purpose: - * Begin a DMA transfer - * Parameters: - * hprocessor : The processor handle. - * pmpu_addr : Buffer start address - * ul_size : Buffer size - * dir : The direction of the transfer - * Requires: - * Memory was previously mapped. - */ -extern int proc_end_dma(void *hprocessor, void *pmpu_addr, u32 ul_size, - enum dma_data_direction dir); -/* - * ======== proc_begin_dma ======== - * Purpose: - * Begin a DMA transfer - * Parameters: - * hprocessor : The processor handle. - * pmpu_addr : Buffer start address - * ul_size : Buffer size - * dir : The direction of the transfer - * Requires: - * Memory was previously mapped. - */ -extern int proc_begin_dma(void *hprocessor, void *pmpu_addr, u32 ul_size, - enum dma_data_direction dir); - -/* - * ======== proc_flush_memory ======== - * Purpose: - * Flushes a buffer from the MPU data cache. - * Parameters: - * hprocessor : The processor handle. - * pmpu_addr : Buffer start address - * ul_size : Buffer size - * ul_flags : Reserved. - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EPERM : General failure. - * Requires: - * PROC Initialized. - * Ensures: - * Details: - * All the arguments are currently ignored. - */ -extern int proc_flush_memory(void *hprocessor, - void *pmpu_addr, u32 ul_size, u32 ul_flags); - -/* - * ======== proc_invalidate_memory ======== - * Purpose: - * Invalidates a buffer from the MPU data cache. - * Parameters: - * hprocessor : The processor handle. - * pmpu_addr : Buffer start address - * ul_size : Buffer size - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EPERM : General failure. - * Requires: - * PROC Initialized. - * Ensures: - * Details: - * All the arguments are currently ignored. - */ -extern int proc_invalidate_memory(void *hprocessor, - void *pmpu_addr, u32 ul_size); - -/* - * ======== proc_map ======== - * Purpose: - * Maps a MPU buffer to DSP address space. - * Parameters: - * hprocessor : The processor handle. - * pmpu_addr : Starting address of the memory region to map. - * ul_size : Size of the memory region to map. - * req_addr : Requested DSP start address. Offset-adjusted actual - * mapped address is in the last argument. - * pp_map_addr : Ptr to DSP side mapped u8 address. - * ul_map_attr : Optional endianness attributes, virt to phys flag. - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EPERM : General failure. - * -ENOMEM : MPU side memory allocation error. - * -ENOENT : Cannot find a reserved region starting with this - * : address. - * Requires: - * pmpu_addr is not NULL - * ul_size is not zero - * pp_map_addr is not NULL - * PROC Initialized. - * Ensures: - * Details: - */ -extern int proc_map(void *hprocessor, - void *pmpu_addr, - u32 ul_size, - void *req_addr, - void **pp_map_addr, u32 ul_map_attr, - struct process_context *pr_ctxt); - -/* - * ======== proc_reserve_memory ======== - * Purpose: - * Reserve a virtually contiguous region of DSP address space. - * Parameters: - * hprocessor : The processor handle. - * ul_size : Size of the address space to reserve. - * pp_rsv_addr : Ptr to DSP side reserved u8 address. - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EPERM : General failure. - * -ENOMEM : Cannot reserve chunk of this size. - * Requires: - * pp_rsv_addr is not NULL - * PROC Initialized. - * Ensures: - * Details: - */ -extern int proc_reserve_memory(void *hprocessor, - u32 ul_size, void **pp_rsv_addr, - struct process_context *pr_ctxt); - -/* - * ======== proc_un_map ======== - * Purpose: - * Removes a MPU buffer mapping from the DSP address space. - * Parameters: - * hprocessor : The processor handle. - * map_addr : Starting address of the mapped memory region. - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EPERM : General failure. - * -ENOENT : Cannot find a mapped region starting with this - * : address. - * Requires: - * map_addr is not NULL - * PROC Initialized. - * Ensures: - * Details: - */ -extern int proc_un_map(void *hprocessor, void *map_addr, - struct process_context *pr_ctxt); - -/* - * ======== proc_un_reserve_memory ======== - * Purpose: - * Frees a previously reserved region of DSP address space. - * Parameters: - * hprocessor : The processor handle. - * prsv_addr : Ptr to DSP side reservedBYTE address. - * Returns: - * 0 : Success. - * -EFAULT : Invalid processor handle. - * -EPERM : General failure. - * -ENOENT : Cannot find a reserved region starting with this - * : address. - * Requires: - * prsv_addr is not NULL - * PROC Initialized. - * Ensures: - * Details: - */ -extern int proc_un_reserve_memory(void *hprocessor, - void *prsv_addr, - struct process_context *pr_ctxt); - -#endif /* PROC_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/procpriv.h b/drivers/staging/tidspbridge/include/dspbridge/procpriv.h deleted file mode 100644 index 77d1f0ef95c3..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/procpriv.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * procpriv.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Global PROC constants and types, shared by PROC, MGR and DSP API. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef PROCPRIV_ -#define PROCPRIV_ - -/* RM PROC Object */ -struct proc_object; - -#endif /* PROCPRIV_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/pwr.h b/drivers/staging/tidspbridge/include/dspbridge/pwr.h deleted file mode 100644 index 0fb066488da9..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/pwr.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * pwr.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef PWR_ -#define PWR_ - -#include -#include - -/* valid sleep command codes that can be sent by GPP via mailbox: */ -#define PWR_DEEPSLEEP MBX_PM_DSPIDLE -#define PWR_EMERGENCYDEEPSLEEP MBX_PM_EMERGENCYSLEEP -#define PWR_WAKEUP MBX_PM_DSPWAKEUP - - -/* - * ======== pwr_sleep_dsp ======== - * Signal the DSP to go to sleep. - * - * Parameters: - * sleep_code: New sleep state for DSP. (Initially, valid codes - * are PWR_DEEPSLEEP or PWR_EMERGENCYDEEPSLEEP; both of - * these codes will simply put the DSP in deep sleep.) - * - * timeout: Maximum time (msec) that PWR should wait for - * confirmation that the DSP sleep state has been - * reached. If PWR should simply send the command to - * the DSP to go to sleep and then return (i.e., - * asynchrounous sleep), the timeout should be - * specified as zero. - * - * Returns: - * 0: Success. - * 0: Success, but the DSP was already asleep. - * -EINVAL: The specified sleep_code is not supported. - * -ETIME: A timeout occurred while waiting for DSP sleep - * confirmation. - * -EPERM: General failure, unable to send sleep command to - * the DSP. - */ -extern int pwr_sleep_dsp(const u32 sleep_code, const u32 timeout); - -/* - * ======== pwr_wake_dsp ======== - * Signal the DSP to wake from sleep. - * - * Parameters: - * timeout: Maximum time (msec) that PWR should wait for - * confirmation that the DSP is awake. If PWR should - * simply send a command to the DSP to wake and then - * return (i.e., asynchrounous wake), timeout should - * be specified as zero. - * - * Returns: - * 0: Success. - * 0: Success, but the DSP was already awake. - * -ETIME: A timeout occurred while waiting for wake - * confirmation. - * -EPERM: General failure, unable to send wake command to - * the DSP. - */ -extern int pwr_wake_dsp(const u32 timeout); - -/* - * ======== pwr_pm_pre_scale ======== - * Prescale notification to DSP. - * - * Parameters: - * voltage_domain: The voltage domain for which notification is sent - * level: The level of voltage domain - * - * Returns: - * 0: Success. - * 0: Success, but the DSP was already awake. - * -ETIME: A timeout occurred while waiting for wake - * confirmation. - * -EPERM: General failure, unable to send wake command to - * the DSP. - */ -extern int pwr_pm_pre_scale(u16 voltage_domain, u32 level); - -/* - * ======== pwr_pm_post_scale ======== - * PostScale notification to DSP. - * - * Parameters: - * voltage_domain: The voltage domain for which notification is sent - * level: The level of voltage domain - * - * Returns: - * 0: Success. - * 0: Success, but the DSP was already awake. - * -ETIME: A timeout occurred while waiting for wake - * confirmation. - * -EPERM: General failure, unable to send wake command to - * the DSP. - */ -extern int pwr_pm_post_scale(u16 voltage_domain, u32 level); - -#endif /* PWR_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/resourcecleanup.h b/drivers/staging/tidspbridge/include/dspbridge/resourcecleanup.h deleted file mode 100644 index 8c9c902a0432..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/resourcecleanup.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * resourcecleanup.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -#include - -extern int drv_remove_all_dmm_res_elements(void *process_ctxt); - -extern int drv_remove_all_node_res_elements(void *process_ctxt); - -extern int drv_remove_all_resources(void *process_ctxt); - -extern int drv_insert_node_res_element(void *hnode, void *node_resource, - void *process_ctxt); - -extern void drv_proc_node_update_heap_status(void *node_resource, s32 status); - -extern void drv_proc_node_update_status(void *node_resource, s32 status); - -extern int drv_proc_update_strm_res(u32 num_bufs, void *strm_resources); - -extern int drv_proc_insert_strm_res_element(void *stream_obj, - void *strm_res, - void *process_ctxt); - -extern int drv_remove_all_strm_res_elements(void *process_ctxt); - -extern enum node_state node_get_state(void *hnode); diff --git a/drivers/staging/tidspbridge/include/dspbridge/rmm.h b/drivers/staging/tidspbridge/include/dspbridge/rmm.h deleted file mode 100644 index f7a4dc8ecb4f..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/rmm.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * rmm.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * This memory manager provides general heap management and arbitrary - * alignment for any number of memory segments, and management of overlay - * memory. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef RMM_ -#define RMM_ - -/* - * ======== rmm_addr ======== - * DSP address + segid - */ -struct rmm_addr { - u32 addr; - s32 segid; -}; - -/* - * ======== rmm_segment ======== - * Memory segment on the DSP available for remote allocations. - */ -struct rmm_segment { - u32 base; /* Base of the segment */ - u32 length; /* Size of the segment (target MAUs) */ - s32 space; /* Code or data */ - u32 number; /* Number of Allocated Blocks */ -}; - -/* - * ======== RMM_Target ======== - */ -struct rmm_target_obj; - -/* - * ======== rmm_alloc ======== - * - * rmm_alloc is used to remotely allocate or reserve memory on the DSP. - * - * Parameters: - * target - Target returned from rmm_create(). - * segid - Memory segment to allocate from. - * size - Size (target MAUS) to allocate. - * align - alignment. - * dsp_address - If reserve is FALSE, the location to store allocated - * address on output, otherwise, the DSP address to - * reserve. - * reserve - If TRUE, reserve the memory specified by dsp_address. - * Returns: - * 0: Success. - * -ENOMEM: Memory allocation on GPP failed. - * -ENXIO: Cannot "allocate" overlay memory because it's - * already in use. - * Requires: - * RMM initialized. - * Valid target. - * dsp_address != NULL. - * size > 0 - * reserve || target->num_segs > 0. - * Ensures: - */ -extern int rmm_alloc(struct rmm_target_obj *target, u32 segid, u32 size, - u32 align, u32 *dsp_address, bool reserve); - -/* - * ======== rmm_create ======== - * Create a target object with memory segments for remote allocation. If - * seg_tab == NULL or num_segs == 0, memory can only be reserved through - * rmm_alloc(). - * - * Parameters: - * target_obj: - Location to store target on output. - * seg_tab: - Table of memory segments. - * num_segs: - Number of memory segments. - * Returns: - * 0: Success. - * -ENOMEM: Memory allocation failed. - * Requires: - * RMM initialized. - * target_obj != NULL. - * num_segs == 0 || seg_tab != NULL. - * Ensures: - * Success: Valid *target_obj. - * Failure: *target_obj == NULL. - */ -extern int rmm_create(struct rmm_target_obj **target_obj, - struct rmm_segment seg_tab[], u32 num_segs); - -/* - * ======== rmm_delete ======== - * Delete target allocated in rmm_create(). - * - * Parameters: - * target - Target returned from rmm_create(). - * Returns: - * Requires: - * RMM initialized. - * Valid target. - * Ensures: - */ -extern void rmm_delete(struct rmm_target_obj *target); - -/* - * ======== rmm_free ======== - * Free or unreserve memory allocated through rmm_alloc(). - * - * Parameters: - * target: - Target returned from rmm_create(). - * segid: - Segment of memory to free. - * dsp_address: - Address to free or unreserve. - * size: - Size of memory to free or unreserve. - * reserved: - TRUE if memory was reserved only, otherwise FALSE. - * Returns: - * Requires: - * RMM initialized. - * Valid target. - * reserved || segid < target->num_segs. - * reserve || [dsp_address, dsp_address + size] is a valid memory range. - * Ensures: - */ -extern bool rmm_free(struct rmm_target_obj *target, u32 segid, u32 dsp_addr, - u32 size, bool reserved); - -/* - * ======== rmm_stat ======== - * Obtain memory segment status - * - * Parameters: - * segid: Segment ID of the dynamic loading segment. - * mem_stat_buf: Pointer to allocated buffer into which memory stats are - * placed. - * Returns: - * TRUE: Success. - * FALSE: Failure. - * Requires: - * segid < target->num_segs - * Ensures: - */ -extern bool rmm_stat(struct rmm_target_obj *target, enum dsp_memtype segid, - struct dsp_memstat *mem_stat_buf); - -#endif /* RMM_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/rms_sh.h b/drivers/staging/tidspbridge/include/dspbridge/rms_sh.h deleted file mode 100644 index ba7f47845673..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/rms_sh.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * rms_sh.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP/BIOS Bridge Resource Manager Server shared definitions (used on both - * GPP and DSP sides). - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef RMS_SH_ -#define RMS_SH_ - -#include - -/* Memory Types: */ -#define RMS_CODE 0 /* Program space */ -#define RMS_DATA 1 /* Data space */ - -/* RM Server Command and Response Buffer Sizes: */ -#define RMS_COMMANDBUFSIZE 256 /* Size of command buffer */ - -/* Pre-Defined Command/Response Codes: */ -#define RMS_EXIT 0x80000000 /* GPP->Node: shutdown */ -#define RMS_EXITACK 0x40000000 /* Node->GPP: ack shutdown */ -#define RMS_BUFDESC 0x20000000 /* Arg1 SM buf, Arg2 SM size */ -#define RMS_KILLTASK 0x10000000 /* GPP->Node: Kill Task */ - -/* RM Server RPC Command Structure: */ -struct rms_command { - rms_word fxn; /* Server function address */ - rms_word arg1; /* First argument */ - rms_word arg2; /* Second argument */ - rms_word data; /* Function-specific data array */ -}; - -/* - * The rms_strm_def structure defines the parameters for both input and output - * streams, and is passed to a node's create function. - */ -struct rms_strm_def { - rms_word bufsize; /* Buffer size (in DSP words) */ - rms_word nbufs; /* Max number of bufs in stream */ - rms_word segid; /* Segment to allocate buffers */ - rms_word align; /* Alignment for allocated buffers */ - rms_word timeout; /* Timeout (msec) for blocking calls */ - char name[1]; /* Device Name (terminated by '\0') */ -}; - -/* Message node create args structure: */ -struct rms_msg_args { - rms_word max_msgs; /* Max # simultaneous msgs to node */ - rms_word segid; /* Mem segment for NODE_allocMsgBuf */ - rms_word notify_type; /* Type of message notification */ - rms_word arg_length; /* Length (in DSP chars) of arg data */ - rms_word arg_data; /* Arg data for node */ -}; - -/* Partial task create args structure */ -struct rms_more_task_args { - rms_word priority; /* Task's runtime priority level */ - rms_word stack_size; /* Task's stack size */ - rms_word sysstack_size; /* Task's system stack size (55x) */ - rms_word stack_seg; /* Memory segment for task's stack */ - rms_word heap_addr; /* base address of the node memory heap in - * external memory (DSP virtual address) */ - rms_word heap_size; /* size in MAUs of the node memory heap in - * external memory */ - rms_word misc; /* Misc field. Not used for 'normal' - * task nodes; for xDAIS socket nodes - * specifies the IALG_Fxn pointer. - */ - /* # input STRM definition structures */ - rms_word num_input_streams; -}; - -#endif /* RMS_SH_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/rmstypes.h b/drivers/staging/tidspbridge/include/dspbridge/rmstypes.h deleted file mode 100644 index 83c0f1d9619e..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/rmstypes.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * rmstypes.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP/BIOS Bridge Resource Manager Server shared data type definitions. - * - * Copyright (C) 2008 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef RMSTYPES_ -#define RMSTYPES_ -#include -typedef u32 rms_word; - -#endif /* RMSTYPES_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/strm.h b/drivers/staging/tidspbridge/include/dspbridge/strm.h deleted file mode 100644 index 97aee4c63d24..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/strm.h +++ /dev/null @@ -1,306 +0,0 @@ -/* - * strm.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSPBridge Stream Manager. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef STRM_ -#define STRM_ - -#include - -#include -#include - -/* - * ======== strm_allocate_buffer ======== - * Purpose: - * Allocate data buffer(s) for use with a stream. - * Parameter: - * strmres: Stream resource info handle returned from strm_open(). - * usize: Size (GPP bytes) of the buffer(s). - * num_bufs: Number of buffers to allocate. - * ap_buffer: Array to hold buffer addresses. - * Returns: - * 0: Success. - * -EFAULT: Invalid stream_obj. - * -ENOMEM: Insufficient memory. - * -EPERM: Failure occurred, unable to allocate buffers. - * -EINVAL: usize must be > 0 bytes. - * Requires: - * ap_buffer != NULL. - * Ensures: - */ -extern int strm_allocate_buffer(struct strm_res_object *strmres, - u32 usize, - u8 **ap_buffer, - u32 num_bufs, - struct process_context *pr_ctxt); - -/* - * ======== strm_close ======== - * Purpose: - * Close a stream opened with strm_open(). - * Parameter: - * strmres: Stream resource info handle returned from strm_open(). - * Returns: - * 0: Success. - * -EFAULT: Invalid stream_obj. - * -EPIPE: Some data buffers issued to the stream have not - * been reclaimed. - * -EPERM: Failure to close stream. - * Requires: - * Ensures: - */ -extern int strm_close(struct strm_res_object *strmres, - struct process_context *pr_ctxt); - -/* - * ======== strm_create ======== - * Purpose: - * Create a STRM manager object. This object holds information about the - * device needed to open streams. - * Parameters: - * strm_man: Location to store handle to STRM manager object on - * output. - * dev_obj: Device for this processor. - * Returns: - * 0: Success; - * -ENOMEM: Insufficient memory for requested resources. - * -EPERM: General failure. - * Requires: - * strm_man != NULL. - * dev_obj != NULL. - * Ensures: - * 0: Valid *strm_man. - * error: *strm_man == NULL. - */ -extern int strm_create(struct strm_mgr **strm_man, - struct dev_object *dev_obj); - -/* - * ======== strm_delete ======== - * Purpose: - * Delete the STRM Object. - * Parameters: - * strm_mgr_obj: Handle to STRM manager object from strm_create. - * Returns: - * Requires: - * Valid strm_mgr_obj. - * Ensures: - * strm_mgr_obj is not valid. - */ -extern void strm_delete(struct strm_mgr *strm_mgr_obj); - -/* - * ======== strm_free_buffer ======== - * Purpose: - * Free buffer(s) allocated with strm_allocate_buffer. - * Parameter: - * strmres: Stream resource info handle returned from strm_open(). - * ap_buffer: Array containing buffer addresses. - * num_bufs: Number of buffers to be freed. - * Returns: - * 0: Success. - * -EFAULT: Invalid stream handle. - * -EPERM: Failure occurred, unable to free buffers. - * Requires: - * ap_buffer != NULL. - * Ensures: - */ -extern int strm_free_buffer(struct strm_res_object *strmres, - u8 **ap_buffer, u32 num_bufs, - struct process_context *pr_ctxt); - -/* - * ======== strm_get_info ======== - * Purpose: - * Get information about a stream. User's dsp_streaminfo is contained - * in stream_info struct. stream_info also contains Bridge private info. - * Parameters: - * stream_obj: Stream handle returned from strm_open(). - * stream_info: Location to store stream info on output. - * uSteamInfoSize: Size of user's dsp_streaminfo structure. - * Returns: - * 0: Success. - * -EFAULT: Invalid stream_obj. - * -EINVAL: stream_info_size < sizeof(dsp_streaminfo). - * -EPERM: Unable to get stream info. - * Requires: - * stream_info != NULL. - * Ensures: - */ -extern int strm_get_info(struct strm_object *stream_obj, - struct stream_info *stream_info, - u32 stream_info_size); - -/* - * ======== strm_idle ======== - * Purpose: - * Idle a stream and optionally flush output data buffers. - * If this is an output stream and flush_data is TRUE, all data currently - * enqueued will be discarded. - * If this is an output stream and flush_data is FALSE, this function - * will block until all currently buffered data is output, or the timeout - * specified has been reached. - * After a successful call to strm_idle(), all buffers can immediately - * be reclaimed. - * Parameters: - * stream_obj: Stream handle returned from strm_open(). - * flush_data: If TRUE, discard output buffers. - * Returns: - * 0: Success. - * -EFAULT: Invalid stream_obj. - * -ETIME: A timeout occurred before the stream could be idled. - * -EPERM: Unable to idle stream. - * Requires: - * Ensures: - */ -extern int strm_idle(struct strm_object *stream_obj, bool flush_data); - -/* - * ======== strm_issue ======== - * Purpose: - * Send a buffer of data to a stream. - * Parameters: - * stream_obj: Stream handle returned from strm_open(). - * pbuf: Pointer to buffer of data to be sent to the stream. - * ul_bytes: Number of bytes of data in the buffer. - * ul_buf_size: Actual buffer size in bytes. - * dw_arg: A user argument that travels with the buffer. - * Returns: - * 0: Success. - * -EFAULT: Invalid stream_obj. - * -ENOSR: The stream is full. - * -EPERM: Failure occurred, unable to issue buffer. - * Requires: -* pbuf != NULL. - * Ensures: - */ -extern int strm_issue(struct strm_object *stream_obj, u8 * pbuf, - u32 ul_bytes, u32 ul_buf_size, u32 dw_arg); - -/* - * ======== strm_open ======== - * Purpose: - * Open a stream for sending/receiving data buffers to/from a task of - * DAIS socket node on the DSP. - * Parameters: - * hnode: Node handle returned from node_allocate(). - * dir: DSP_TONODE or DSP_FROMNODE. - * index: Stream index. - * pattr: Pointer to structure containing attributes to be - * applied to stream. Cannot be NULL. - * strmres: Location to store stream resource info handle on output. - * Returns: - * 0: Success. - * -EFAULT: Invalid hnode. - * -EPERM: Invalid direction. - * hnode is not a task or DAIS socket node. - * Unable to open stream. - * -EINVAL: Invalid index. - * Requires: - * strmres != NULL. - * pattr != NULL. - * Ensures: - * 0: *strmres is valid. - * error: *strmres == NULL. - */ -extern int strm_open(struct node_object *hnode, u32 dir, - u32 index, struct strm_attr *pattr, - struct strm_res_object **strmres, - struct process_context *pr_ctxt); - -/* - * ======== strm_reclaim ======== - * Purpose: - * Request a buffer back from a stream. - * Parameters: - * stream_obj: Stream handle returned from strm_open(). - * buf_ptr: Location to store pointer to reclaimed buffer. - * nbytes: Location where number of bytes of data in the - * buffer will be written. - * buff_size: Location where actual buffer size will be written. - * pdw_arg: Location where user argument that travels with - * the buffer will be written. - * Returns: - * 0: Success. - * -EFAULT: Invalid stream_obj. - * -ETIME: A timeout occurred before a buffer could be - * retrieved. - * -EPERM: Failure occurred, unable to reclaim buffer. - * Requires: - * buf_ptr != NULL. - * nbytes != NULL. - * pdw_arg != NULL. - * Ensures: - */ -extern int strm_reclaim(struct strm_object *stream_obj, - u8 **buf_ptr, u32 * nbytes, - u32 *buff_size, u32 *pdw_arg); - -/* - * ======== strm_register_notify ======== - * Purpose: - * Register to be notified on specific events for this stream. - * Parameters: - * stream_obj: Stream handle returned by strm_open(). - * event_mask: Mask of types of events to be notified about. - * notify_type: Type of notification to be sent. - * hnotification: Handle to be used for notification. - * Returns: - * 0: Success. - * -EFAULT: Invalid stream_obj. - * -ENOMEM: Insufficient memory on GPP. - * -EINVAL: event_mask is invalid. - * -ENOSYS: Notification type specified by notify_type is not - * supported. - * Requires: - * hnotification != NULL. - * Ensures: - */ -extern int strm_register_notify(struct strm_object *stream_obj, - u32 event_mask, u32 notify_type, - struct dsp_notification - *hnotification); - -/* - * ======== strm_select ======== - * Purpose: - * Select a ready stream. - * Parameters: - * strm_tab: Array of stream handles returned from strm_open(). - * strms: Number of stream handles in array. - * pmask: Location to store mask of ready streams on output. - * utimeout: Timeout value (milliseconds). - * Returns: - * 0: Success. - * -EDOM: strms out of range. - - * -EFAULT: Invalid stream handle in array. - * -ETIME: A timeout occurred before a stream became ready. - * -EPERM: Failure occurred, unable to select a stream. - * Requires: - * strm_tab != NULL. - * strms > 0. - * pmask != NULL. - * Ensures: - * 0: *pmask != 0 || utimeout == 0. - * Error: *pmask == 0. - */ -extern int strm_select(struct strm_object **strm_tab, - u32 strms, u32 *pmask, u32 utimeout); - -#endif /* STRM_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/strmdefs.h b/drivers/staging/tidspbridge/include/dspbridge/strmdefs.h deleted file mode 100644 index 4f90e6ba69ef..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/strmdefs.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * strmdefs.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Global STRM constants and types. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef STRMDEFS_ -#define STRMDEFS_ - -struct strm_mgr; - -struct strm_object; - -struct strm_attr { - void *user_event; - char *str_event_name; - void *virt_base; /* Process virtual base address of - * mapped SM */ - u32 virt_size; /* Size of virtual space in bytes */ - struct dsp_streamattrin *stream_attr_in; -}; - -struct stream_info { - enum dsp_strmmode strm_mode; /* transport mode of - * stream(DMA, ZEROCOPY..) */ - u32 segment_id; /* Segment strm allocs from. 0 is local mem */ - void *virt_base; /* " " Stream'process virt base */ - struct dsp_streaminfo *user_strm; /* User's stream information - * returned */ -}; - -#endif /* STRMDEFS_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/sync.h b/drivers/staging/tidspbridge/include/dspbridge/sync.h deleted file mode 100644 index fc19b9707087..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/sync.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * sync.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Provide synchronization services. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _SYNC_H -#define _SYNC_H - -#include -#include - - -/* Special timeout value indicating an infinite wait: */ -#define SYNC_INFINITE 0xffffffff - -/** - * struct sync_object - the basic sync_object structure - * @comp: use to signal events - * @multi_comp: use to signal multiple events. - * - */ -struct sync_object{ - struct completion comp; - struct completion *multi_comp; -}; - -/** - * sync_init_event() - set initial state for a sync_event element - * @event: event to be initialized. - * - * Set the initial state for a sync_event element. - */ - -static inline void sync_init_event(struct sync_object *event) -{ - init_completion(&event->comp); - event->multi_comp = NULL; -} - -/** - * sync_reset_event() - reset a sync_event element - * @event: event to be reset. - * - * This function reset to the initial state to @event. - */ - -static inline void sync_reset_event(struct sync_object *event) -{ - reinit_completion(&event->comp); - event->multi_comp = NULL; -} - -/** - * sync_set_event() - set or signal and specified event - * @event: Event to be set.. - * - * set the @event, if there is an thread waiting for the event - * it will be waken up, this function only wakes one thread. - */ - -void sync_set_event(struct sync_object *event); - -/** - * sync_wait_on_event() - waits for a event to be set. - * @event: events to wait for it. - * @timeout timeout on waiting for the evetn. - * - * This function will wait until @event is set or until timeout. In case of - * success the function will return 0 and - * in case of timeout the function will return -ETIME - * in case of signal the function will return -ERESTARTSYS - */ - -static inline int sync_wait_on_event(struct sync_object *event, - unsigned timeout) -{ - int res; - - res = wait_for_completion_interruptible_timeout(&event->comp, - msecs_to_jiffies(timeout)); - if (!res) - res = -ETIME; - else if (res > 0) - res = 0; - - return res; -} - -/** - * sync_wait_on_multiple_events() - waits for multiple events to be set. - * @events: Array of events to wait for them. - * @count: number of elements of the array. - * @timeout timeout on waiting for the evetns. - * @pu_index index of the event set. - * - * This function will wait until any of the array element is set or until - * timeout. In case of success the function will return 0 and - * @pu_index will store the index of the array element set and in case - * of timeout the function will return -ETIME. - */ - -int sync_wait_on_multiple_events(struct sync_object **events, - unsigned count, unsigned timeout, - unsigned *index); - -#endif /* _SYNC_H */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/uuidutil.h b/drivers/staging/tidspbridge/include/dspbridge/uuidutil.h deleted file mode 100644 index b4951a1381e7..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/uuidutil.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * uuidutil.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * This file contains the specification of UUID helper functions. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef UUIDUTIL_ -#define UUIDUTIL_ - -#define MAXUUIDLEN 37 - -#endif /* UUIDUTIL_ */ diff --git a/drivers/staging/tidspbridge/include/dspbridge/wdt.h b/drivers/staging/tidspbridge/include/dspbridge/wdt.h deleted file mode 100644 index 36193db2e9a3..000000000000 --- a/drivers/staging/tidspbridge/include/dspbridge/wdt.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * wdt.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * IO dispatcher for a shared memory channel driver. - * - * Copyright (C) 2010 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#ifndef __DSP_WDT3_H_ -#define __DSP_WDT3_H_ - -/* WDT defines */ -#define OMAP3_WDT3_ISR_OFFSET 0x0018 - - -/** - * struct dsp_wdt_setting - the basic dsp_wdt_setting structure - * @reg_base: pointer to the base of the wdt registers - * @sm_wdt: pointer to flags in shared memory - * @wdt3_tasklet tasklet to manage wdt event - * @fclk handle to wdt3 functional clock - * @iclk handle to wdt3 interface clock - * - * This struct is used in the function to manage wdt3. - */ - -struct dsp_wdt_setting { - void __iomem *reg_base; - struct shm *sm_wdt; - struct tasklet_struct wdt3_tasklet; - struct clk *fclk; - struct clk *iclk; -}; - -/** - * dsp_wdt_init() - initialize wdt3 module. - * - * This function initialize to wdt3 module, so that - * other wdt3 function can be used. - */ -int dsp_wdt_init(void); - -/** - * dsp_wdt_exit() - initialize wdt3 module. - * - * This function frees all resources allocated for wdt3 module. - */ -void dsp_wdt_exit(void); - -/** - * dsp_wdt_enable() - enable/disable wdt3 - * @enable: bool value to enable/disable wdt3 - * - * This function enables or disables wdt3 base on @enable value. - * - */ -void dsp_wdt_enable(bool enable); - -/** - * dsp_wdt_sm_set() - store pointer to the share memory - * @data: pointer to dspbridge share memory - * - * This function is used to pass a valid pointer to share memory, - * so that the flags can be set in order DSP side can read them. - * - */ -void dsp_wdt_sm_set(void *data); - -#endif - diff --git a/drivers/staging/tidspbridge/pmgr/chnl.c b/drivers/staging/tidspbridge/pmgr/chnl.c deleted file mode 100644 index e03c32679aa5..000000000000 --- a/drivers/staging/tidspbridge/pmgr/chnl.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * chnl.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP API channel interface: multiplexes data streams through the single - * physical link managed by a Bridge Bridge driver. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- OS Adaptation Layer */ -#include - -/* ----------------------------------- Platform Manager */ -#include -#include - -/* ----------------------------------- Others */ -#include -#include - -/* ----------------------------------- This */ -#include - -/* - * ======== chnl_create ======== - * Purpose: - * Create a channel manager object, responsible for opening new channels - * and closing old ones for a given 'Bridge board. - */ -int chnl_create(struct chnl_mgr **channel_mgr, - struct dev_object *hdev_obj, - const struct chnl_mgrattrs *mgr_attrts) -{ - int status; - struct chnl_mgr *hchnl_mgr; - struct chnl_mgr_ *chnl_mgr_obj = NULL; - - *channel_mgr = NULL; - - /* Validate args: */ - if ((0 < mgr_attrts->max_channels) && - (mgr_attrts->max_channels <= CHNL_MAXCHANNELS)) - status = 0; - else if (mgr_attrts->max_channels == 0) - status = -EINVAL; - else - status = -ECHRNG; - - if (mgr_attrts->word_size == 0) - status = -EINVAL; - - if (!status) { - status = dev_get_chnl_mgr(hdev_obj, &hchnl_mgr); - if (!status && hchnl_mgr != NULL) - status = -EEXIST; - - } - - if (!status) { - struct bridge_drv_interface *intf_fxns; - - dev_get_intf_fxns(hdev_obj, &intf_fxns); - /* Let Bridge channel module finish the create: */ - status = (*intf_fxns->chnl_create) (&hchnl_mgr, hdev_obj, - mgr_attrts); - if (!status) { - /* Fill in DSP API channel module's fields of the - * chnl_mgr structure */ - chnl_mgr_obj = (struct chnl_mgr_ *)hchnl_mgr; - chnl_mgr_obj->intf_fxns = intf_fxns; - /* Finally, return the new channel manager handle: */ - *channel_mgr = hchnl_mgr; - } - } - - return status; -} - -/* - * ======== chnl_destroy ======== - * Purpose: - * Close all open channels, and destroy the channel manager. - */ -int chnl_destroy(struct chnl_mgr *hchnl_mgr) -{ - struct chnl_mgr_ *chnl_mgr_obj = (struct chnl_mgr_ *)hchnl_mgr; - struct bridge_drv_interface *intf_fxns; - int status; - - if (chnl_mgr_obj) { - intf_fxns = chnl_mgr_obj->intf_fxns; - /* Let Bridge channel module destroy the chnl_mgr: */ - status = (*intf_fxns->chnl_destroy) (hchnl_mgr); - } else { - status = -EFAULT; - } - - return status; -} diff --git a/drivers/staging/tidspbridge/pmgr/chnlobj.h b/drivers/staging/tidspbridge/pmgr/chnlobj.h deleted file mode 100644 index 6795e0aa8fd6..000000000000 --- a/drivers/staging/tidspbridge/pmgr/chnlobj.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * chnlobj.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Structure subcomponents of channel class library channel objects which - * are exposed to DSP API from Bridge driver. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef CHNLOBJ_ -#define CHNLOBJ_ - -#include -#include - -/* - * This struct is the first field in a chnl_mgr struct. Other. implementation - * specific fields follow this structure in memory. - */ -struct chnl_mgr_ { - /* These must be the first fields in a chnl_mgr struct: */ - - /* Function interface to Bridge driver. */ - struct bridge_drv_interface *intf_fxns; -}; - -/* - * This struct is the first field in a chnl_object struct. Other, - * implementation specific fields follow this structure in memory. - */ -struct chnl_object_ { - /* These must be the first fields in a chnl_object struct: */ - struct chnl_mgr_ *chnl_mgr_obj; /* Pointer back to channel manager. */ -}; - -#endif /* CHNLOBJ_ */ diff --git a/drivers/staging/tidspbridge/pmgr/cmm.c b/drivers/staging/tidspbridge/pmgr/cmm.c deleted file mode 100644 index f961e0ec9da8..000000000000 --- a/drivers/staging/tidspbridge/pmgr/cmm.c +++ /dev/null @@ -1,915 +0,0 @@ -/* - * cmm.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * The Communication(Shared) Memory Management(CMM) module provides - * shared memory management services for DSP/BIOS Bridge data streaming - * and messaging. - * - * Multiple shared memory segments can be registered with CMM. - * Each registered SM segment is represented by a SM "allocator" that - * describes a block of physically contiguous shared memory used for - * future allocations by CMM. - * - * Memory is coalesced back to the appropriate heap when a buffer is - * freed. - * - * Notes: - * Va: Virtual address. - * Pa: Physical or kernel system address. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- OS Adaptation Layer */ -#include - -/* ----------------------------------- Platform Manager */ -#include -#include - -/* ----------------------------------- This */ -#include - -/* ----------------------------------- Defines, Data Structures, Typedefs */ -#define NEXT_PA(pnode) (pnode->pa + pnode->size) - -/* Other bus/platform translations */ -#define DSPPA2GPPPA(base, x, y) ((x)+(y)) -#define GPPPA2DSPPA(base, x, y) ((x)-(y)) - -/* - * Allocators define a block of contiguous memory used for future allocations. - * - * sma - shared memory allocator. - * vma - virtual memory allocator.(not used). - */ -struct cmm_allocator { /* sma */ - unsigned int shm_base; /* Start of physical SM block */ - u32 sm_size; /* Size of SM block in bytes */ - unsigned int vm_base; /* Start of VM block. (Dev driver - * context for 'sma') */ - u32 dsp_phys_addr_offset; /* DSP PA to GPP PA offset for this - * SM space */ - s8 c_factor; /* DSPPa to GPPPa Conversion Factor */ - unsigned int dsp_base; /* DSP virt base byte address */ - u32 dsp_size; /* DSP seg size in bytes */ - struct cmm_object *cmm_mgr; /* back ref to parent mgr */ - /* node list of available memory */ - struct list_head free_list; - /* node list of memory in use */ - struct list_head in_use_list; -}; - -struct cmm_xlator { /* Pa<->Va translator object */ - /* CMM object this translator associated */ - struct cmm_object *cmm_mgr; - /* - * Client process virtual base address that corresponds to phys SM - * base address for translator's seg_id. - * Only 1 segment ID currently supported. - */ - unsigned int virt_base; /* virtual base address */ - u32 virt_size; /* size of virt space in bytes */ - u32 seg_id; /* Segment Id */ -}; - -/* CMM Mgr */ -struct cmm_object { - /* - * Cmm Lock is used to serialize access mem manager for multi-threads. - */ - struct mutex cmm_lock; /* Lock to access cmm mgr */ - struct list_head node_free_list; /* Free list of memory nodes */ - u32 min_block_size; /* Min SM block; default 16 bytes */ - u32 page_size; /* Memory Page size (1k/4k) */ - /* GPP SM segment ptrs */ - struct cmm_allocator *pa_gppsm_seg_tab[CMM_MAXGPPSEGS]; -}; - -/* Default CMM Mgr attributes */ -static struct cmm_mgrattrs cmm_dfltmgrattrs = { - /* min_block_size, min block size(bytes) allocated by cmm mgr */ - 16 -}; - -/* Default allocation attributes */ -static struct cmm_attrs cmm_dfltalctattrs = { - 1 /* seg_id, default segment Id for allocator */ -}; - -/* Address translator default attrs */ -static struct cmm_xlatorattrs cmm_dfltxlatorattrs = { - /* seg_id, does not have to match cmm_dfltalctattrs ul_seg_id */ - 1, - 0, /* dsp_bufs */ - 0, /* dsp_buf_size */ - NULL, /* vm_base */ - 0, /* vm_size */ -}; - -/* SM node representing a block of memory. */ -struct cmm_mnode { - struct list_head link; /* must be 1st element */ - u32 pa; /* Phys addr */ - u32 va; /* Virtual address in device process context */ - u32 size; /* SM block size in bytes */ - u32 client_proc; /* Process that allocated this mem block */ -}; - -/* ----------------------------------- Function Prototypes */ -static void add_to_free_list(struct cmm_allocator *allocator, - struct cmm_mnode *pnode); -static struct cmm_allocator *get_allocator(struct cmm_object *cmm_mgr_obj, - u32 ul_seg_id); -static struct cmm_mnode *get_free_block(struct cmm_allocator *allocator, - u32 usize); -static struct cmm_mnode *get_node(struct cmm_object *cmm_mgr_obj, u32 dw_pa, - u32 dw_va, u32 ul_size); -/* get available slot for new allocator */ -static s32 get_slot(struct cmm_object *cmm_mgr_obj); -static void un_register_gppsm_seg(struct cmm_allocator *psma); - -/* - * ======== cmm_calloc_buf ======== - * Purpose: - * Allocate a SM buffer, zero contents, and return the physical address - * and optional driver context virtual address(pp_buf_va). - * - * The freelist is sorted in increasing size order. Get the first - * block that satifies the request and sort the remaining back on - * the freelist; if large enough. The kept block is placed on the - * inUseList. - */ -void *cmm_calloc_buf(struct cmm_object *hcmm_mgr, u32 usize, - struct cmm_attrs *pattrs, void **pp_buf_va) -{ - struct cmm_object *cmm_mgr_obj = (struct cmm_object *)hcmm_mgr; - void *buf_pa = NULL; - struct cmm_mnode *pnode = NULL; - struct cmm_mnode *new_node = NULL; - struct cmm_allocator *allocator = NULL; - u32 delta_size; - u8 *pbyte = NULL; - s32 cnt; - - if (pattrs == NULL) - pattrs = &cmm_dfltalctattrs; - - if (pp_buf_va != NULL) - *pp_buf_va = NULL; - - if (cmm_mgr_obj && (usize != 0)) { - if (pattrs->seg_id > 0) { - /* SegId > 0 is SM */ - /* get the allocator object for this segment id */ - allocator = - get_allocator(cmm_mgr_obj, pattrs->seg_id); - /* keep block size a multiple of min_block_size */ - usize = - ((usize - 1) & ~(cmm_mgr_obj->min_block_size - - 1)) - + cmm_mgr_obj->min_block_size; - mutex_lock(&cmm_mgr_obj->cmm_lock); - pnode = get_free_block(allocator, usize); - } - if (pnode) { - delta_size = (pnode->size - usize); - if (delta_size >= cmm_mgr_obj->min_block_size) { - /* create a new block with the leftovers and - * add to freelist */ - new_node = - get_node(cmm_mgr_obj, pnode->pa + usize, - pnode->va + usize, - (u32) delta_size); - /* leftovers go free */ - add_to_free_list(allocator, new_node); - /* adjust our node's size */ - pnode->size = usize; - } - /* Tag node with client process requesting allocation - * We'll need to free up a process's alloc'd SM if the - * client process goes away. - */ - /* Return TGID instead of process handle */ - pnode->client_proc = current->tgid; - - /* put our node on InUse list */ - list_add_tail(&pnode->link, &allocator->in_use_list); - buf_pa = (void *)pnode->pa; /* physical address */ - /* clear mem */ - pbyte = (u8 *) pnode->va; - for (cnt = 0; cnt < (s32) usize; cnt++, pbyte++) - *pbyte = 0; - - if (pp_buf_va != NULL) { - /* Virtual address */ - *pp_buf_va = (void *)pnode->va; - } - } - mutex_unlock(&cmm_mgr_obj->cmm_lock); - } - return buf_pa; -} - -/* - * ======== cmm_create ======== - * Purpose: - * Create a communication memory manager object. - */ -int cmm_create(struct cmm_object **ph_cmm_mgr, - struct dev_object *hdev_obj, - const struct cmm_mgrattrs *mgr_attrts) -{ - struct cmm_object *cmm_obj = NULL; - int status = 0; - - *ph_cmm_mgr = NULL; - /* create, zero, and tag a cmm mgr object */ - cmm_obj = kzalloc(sizeof(struct cmm_object), GFP_KERNEL); - if (!cmm_obj) - return -ENOMEM; - - if (mgr_attrts == NULL) - mgr_attrts = &cmm_dfltmgrattrs; /* set defaults */ - - /* save away smallest block allocation for this cmm mgr */ - cmm_obj->min_block_size = mgr_attrts->min_block_size; - cmm_obj->page_size = PAGE_SIZE; - - /* create node free list */ - INIT_LIST_HEAD(&cmm_obj->node_free_list); - mutex_init(&cmm_obj->cmm_lock); - *ph_cmm_mgr = cmm_obj; - - return status; -} - -/* - * ======== cmm_destroy ======== - * Purpose: - * Release the communication memory manager resources. - */ -int cmm_destroy(struct cmm_object *hcmm_mgr, bool force) -{ - struct cmm_object *cmm_mgr_obj = (struct cmm_object *)hcmm_mgr; - struct cmm_info temp_info; - int status = 0; - s32 slot_seg; - struct cmm_mnode *node, *tmp; - - if (!hcmm_mgr) { - status = -EFAULT; - return status; - } - mutex_lock(&cmm_mgr_obj->cmm_lock); - /* If not force then fail if outstanding allocations exist */ - if (!force) { - /* Check for outstanding memory allocations */ - status = cmm_get_info(hcmm_mgr, &temp_info); - if (!status) { - if (temp_info.total_in_use_cnt > 0) { - /* outstanding allocations */ - status = -EPERM; - } - } - } - if (!status) { - /* UnRegister SM allocator */ - for (slot_seg = 0; slot_seg < CMM_MAXGPPSEGS; slot_seg++) { - if (cmm_mgr_obj->pa_gppsm_seg_tab[slot_seg] != NULL) { - un_register_gppsm_seg - (cmm_mgr_obj->pa_gppsm_seg_tab[slot_seg]); - /* Set slot to NULL for future reuse */ - cmm_mgr_obj->pa_gppsm_seg_tab[slot_seg] = NULL; - } - } - } - list_for_each_entry_safe(node, tmp, &cmm_mgr_obj->node_free_list, - link) { - list_del(&node->link); - kfree(node); - } - mutex_unlock(&cmm_mgr_obj->cmm_lock); - if (!status) { - /* delete CS & cmm mgr object */ - mutex_destroy(&cmm_mgr_obj->cmm_lock); - kfree(cmm_mgr_obj); - } - return status; -} - -/* - * ======== cmm_free_buf ======== - * Purpose: - * Free the given buffer. - */ -int cmm_free_buf(struct cmm_object *hcmm_mgr, void *buf_pa, u32 ul_seg_id) -{ - struct cmm_object *cmm_mgr_obj = (struct cmm_object *)hcmm_mgr; - int status = -EFAULT; - struct cmm_mnode *curr, *tmp; - struct cmm_allocator *allocator; - struct cmm_attrs *pattrs; - - if (ul_seg_id == 0) { - pattrs = &cmm_dfltalctattrs; - ul_seg_id = pattrs->seg_id; - } - if (!hcmm_mgr || !(ul_seg_id > 0)) { - status = -EFAULT; - return status; - } - - allocator = get_allocator(cmm_mgr_obj, ul_seg_id); - if (!allocator) - return status; - - mutex_lock(&cmm_mgr_obj->cmm_lock); - list_for_each_entry_safe(curr, tmp, &allocator->in_use_list, link) { - if (curr->pa == (u32) buf_pa) { - list_del(&curr->link); - add_to_free_list(allocator, curr); - status = 0; - break; - } - } - mutex_unlock(&cmm_mgr_obj->cmm_lock); - - return status; -} - -/* - * ======== cmm_get_handle ======== - * Purpose: - * Return the communication memory manager object for this device. - * This is typically called from the client process. - */ -int cmm_get_handle(void *hprocessor, struct cmm_object **ph_cmm_mgr) -{ - int status = 0; - struct dev_object *hdev_obj; - - if (hprocessor != NULL) - status = proc_get_dev_object(hprocessor, &hdev_obj); - else - hdev_obj = dev_get_first(); /* default */ - - if (!status) - status = dev_get_cmm_mgr(hdev_obj, ph_cmm_mgr); - - return status; -} - -/* - * ======== cmm_get_info ======== - * Purpose: - * Return the current memory utilization information. - */ -int cmm_get_info(struct cmm_object *hcmm_mgr, - struct cmm_info *cmm_info_obj) -{ - struct cmm_object *cmm_mgr_obj = (struct cmm_object *)hcmm_mgr; - u32 ul_seg; - int status = 0; - struct cmm_allocator *altr; - struct cmm_mnode *curr; - - if (!hcmm_mgr) { - status = -EFAULT; - return status; - } - mutex_lock(&cmm_mgr_obj->cmm_lock); - cmm_info_obj->num_gppsm_segs = 0; /* # of SM segments */ - /* Total # of outstanding alloc */ - cmm_info_obj->total_in_use_cnt = 0; - /* min block size */ - cmm_info_obj->min_block_size = cmm_mgr_obj->min_block_size; - /* check SM memory segments */ - for (ul_seg = 1; ul_seg <= CMM_MAXGPPSEGS; ul_seg++) { - /* get the allocator object for this segment id */ - altr = get_allocator(cmm_mgr_obj, ul_seg); - if (!altr) - continue; - cmm_info_obj->num_gppsm_segs++; - cmm_info_obj->seg_info[ul_seg - 1].seg_base_pa = - altr->shm_base - altr->dsp_size; - cmm_info_obj->seg_info[ul_seg - 1].total_seg_size = - altr->dsp_size + altr->sm_size; - cmm_info_obj->seg_info[ul_seg - 1].gpp_base_pa = - altr->shm_base; - cmm_info_obj->seg_info[ul_seg - 1].gpp_size = - altr->sm_size; - cmm_info_obj->seg_info[ul_seg - 1].dsp_base_va = - altr->dsp_base; - cmm_info_obj->seg_info[ul_seg - 1].dsp_size = - altr->dsp_size; - cmm_info_obj->seg_info[ul_seg - 1].seg_base_va = - altr->vm_base - altr->dsp_size; - cmm_info_obj->seg_info[ul_seg - 1].in_use_cnt = 0; - - list_for_each_entry(curr, &altr->in_use_list, link) { - cmm_info_obj->total_in_use_cnt++; - cmm_info_obj->seg_info[ul_seg - 1].in_use_cnt++; - } - } - mutex_unlock(&cmm_mgr_obj->cmm_lock); - return status; -} - -/* - * ======== cmm_register_gppsm_seg ======== - * Purpose: - * Register a block of SM with the CMM to be used for later GPP SM - * allocations. - */ -int cmm_register_gppsm_seg(struct cmm_object *hcmm_mgr, - u32 dw_gpp_base_pa, u32 ul_size, - u32 dsp_addr_offset, s8 c_factor, - u32 dw_dsp_base, u32 ul_dsp_size, - u32 *sgmt_id, u32 gpp_base_va) -{ - struct cmm_object *cmm_mgr_obj = (struct cmm_object *)hcmm_mgr; - struct cmm_allocator *psma = NULL; - int status = 0; - struct cmm_mnode *new_node; - s32 slot_seg; - - dev_dbg(bridge, "%s: dw_gpp_base_pa %x ul_size %x dsp_addr_offset %x dw_dsp_base %x ul_dsp_size %x gpp_base_va %x\n", - __func__, dw_gpp_base_pa, ul_size, dsp_addr_offset, - dw_dsp_base, ul_dsp_size, gpp_base_va); - - if (!hcmm_mgr) - return -EFAULT; - - /* make sure we have room for another allocator */ - mutex_lock(&cmm_mgr_obj->cmm_lock); - - slot_seg = get_slot(cmm_mgr_obj); - if (slot_seg < 0) { - status = -EPERM; - goto func_end; - } - - /* Check if input ul_size is big enough to alloc at least one block */ - if (ul_size < cmm_mgr_obj->min_block_size) { - status = -EINVAL; - goto func_end; - } - - /* create, zero, and tag an SM allocator object */ - psma = kzalloc(sizeof(struct cmm_allocator), GFP_KERNEL); - if (!psma) { - status = -ENOMEM; - goto func_end; - } - - psma->cmm_mgr = hcmm_mgr; /* ref to parent */ - psma->shm_base = dw_gpp_base_pa; /* SM Base phys */ - psma->sm_size = ul_size; /* SM segment size in bytes */ - psma->vm_base = gpp_base_va; - psma->dsp_phys_addr_offset = dsp_addr_offset; - psma->c_factor = c_factor; - psma->dsp_base = dw_dsp_base; - psma->dsp_size = ul_dsp_size; - if (psma->vm_base == 0) { - status = -EPERM; - goto func_end; - } - /* return the actual segment identifier */ - *sgmt_id = (u32) slot_seg + 1; - - INIT_LIST_HEAD(&psma->free_list); - INIT_LIST_HEAD(&psma->in_use_list); - - /* Get a mem node for this hunk-o-memory */ - new_node = get_node(cmm_mgr_obj, dw_gpp_base_pa, - psma->vm_base, ul_size); - /* Place node on the SM allocator's free list */ - if (new_node) { - list_add_tail(&new_node->link, &psma->free_list); - } else { - status = -ENOMEM; - goto func_end; - } - /* make entry */ - cmm_mgr_obj->pa_gppsm_seg_tab[slot_seg] = psma; - -func_end: - /* Cleanup allocator */ - if (status && psma) - un_register_gppsm_seg(psma); - mutex_unlock(&cmm_mgr_obj->cmm_lock); - - return status; -} - -/* - * ======== cmm_un_register_gppsm_seg ======== - * Purpose: - * UnRegister GPP SM segments with the CMM. - */ -int cmm_un_register_gppsm_seg(struct cmm_object *hcmm_mgr, - u32 ul_seg_id) -{ - struct cmm_object *cmm_mgr_obj = (struct cmm_object *)hcmm_mgr; - int status = 0; - struct cmm_allocator *psma; - u32 ul_id = ul_seg_id; - - if (!hcmm_mgr) - return -EFAULT; - - if (ul_seg_id == CMM_ALLSEGMENTS) - ul_id = 1; - - if ((ul_id <= 0) || (ul_id > CMM_MAXGPPSEGS)) - return -EINVAL; - - /* - * FIXME: CMM_MAXGPPSEGS == 1. why use a while cycle? Seems to me like - * the ul_seg_id is not needed here. It must be always 1. - */ - while (ul_id <= CMM_MAXGPPSEGS) { - mutex_lock(&cmm_mgr_obj->cmm_lock); - /* slot = seg_id-1 */ - psma = cmm_mgr_obj->pa_gppsm_seg_tab[ul_id - 1]; - if (psma != NULL) { - un_register_gppsm_seg(psma); - /* Set alctr ptr to NULL for future reuse */ - cmm_mgr_obj->pa_gppsm_seg_tab[ul_id - 1] = NULL; - } else if (ul_seg_id != CMM_ALLSEGMENTS) { - status = -EPERM; - } - mutex_unlock(&cmm_mgr_obj->cmm_lock); - if (ul_seg_id != CMM_ALLSEGMENTS) - break; - - ul_id++; - } /* end while */ - return status; -} - -/* - * ======== un_register_gppsm_seg ======== - * Purpose: - * UnRegister the SM allocator by freeing all its resources and - * nulling cmm mgr table entry. - * Note: - * This routine is always called within cmm lock crit sect. - */ -static void un_register_gppsm_seg(struct cmm_allocator *psma) -{ - struct cmm_mnode *curr, *tmp; - - /* free nodes on free list */ - list_for_each_entry_safe(curr, tmp, &psma->free_list, link) { - list_del(&curr->link); - kfree(curr); - } - - /* free nodes on InUse list */ - list_for_each_entry_safe(curr, tmp, &psma->in_use_list, link) { - list_del(&curr->link); - kfree(curr); - } - - if ((void *)psma->vm_base != NULL) - MEM_UNMAP_LINEAR_ADDRESS((void *)psma->vm_base); - - /* Free allocator itself */ - kfree(psma); -} - -/* - * ======== get_slot ======== - * Purpose: - * An available slot # is returned. Returns negative on failure. - */ -static s32 get_slot(struct cmm_object *cmm_mgr_obj) -{ - s32 slot_seg = -1; /* neg on failure */ - /* get first available slot in cmm mgr SMSegTab[] */ - for (slot_seg = 0; slot_seg < CMM_MAXGPPSEGS; slot_seg++) { - if (cmm_mgr_obj->pa_gppsm_seg_tab[slot_seg] == NULL) - break; - - } - if (slot_seg == CMM_MAXGPPSEGS) - slot_seg = -1; /* failed */ - - return slot_seg; -} - -/* - * ======== get_node ======== - * Purpose: - * Get a memory node from freelist or create a new one. - */ -static struct cmm_mnode *get_node(struct cmm_object *cmm_mgr_obj, u32 dw_pa, - u32 dw_va, u32 ul_size) -{ - struct cmm_mnode *pnode; - - /* Check cmm mgr's node freelist */ - if (list_empty(&cmm_mgr_obj->node_free_list)) { - pnode = kzalloc(sizeof(struct cmm_mnode), GFP_KERNEL); - if (!pnode) - return NULL; - } else { - /* surely a valid element */ - pnode = list_first_entry(&cmm_mgr_obj->node_free_list, - struct cmm_mnode, link); - list_del_init(&pnode->link); - } - - pnode->pa = dw_pa; - pnode->va = dw_va; - pnode->size = ul_size; - - return pnode; -} - -/* - * ======== delete_node ======== - * Purpose: - * Put a memory node on the cmm nodelist for later use. - * Doesn't actually delete the node. Heap thrashing friendly. - */ -static void delete_node(struct cmm_object *cmm_mgr_obj, struct cmm_mnode *pnode) -{ - list_add_tail(&pnode->link, &cmm_mgr_obj->node_free_list); -} - -/* - * ====== get_free_block ======== - * Purpose: - * Scan the free block list and return the first block that satisfies - * the size. - */ -static struct cmm_mnode *get_free_block(struct cmm_allocator *allocator, - u32 usize) -{ - struct cmm_mnode *node, *tmp; - - if (!allocator) - return NULL; - - list_for_each_entry_safe(node, tmp, &allocator->free_list, link) { - if (usize <= node->size) { - list_del(&node->link); - return node; - } - } - - return NULL; -} - -/* - * ======== add_to_free_list ======== - * Purpose: - * Coalesce node into the freelist in ascending size order. - */ -static void add_to_free_list(struct cmm_allocator *allocator, - struct cmm_mnode *node) -{ - struct cmm_mnode *curr; - - if (!node) { - pr_err("%s: failed - node is NULL\n", __func__); - return; - } - - list_for_each_entry(curr, &allocator->free_list, link) { - if (NEXT_PA(curr) == node->pa) { - curr->size += node->size; - delete_node(allocator->cmm_mgr, node); - return; - } - if (curr->pa == NEXT_PA(node)) { - curr->pa = node->pa; - curr->va = node->va; - curr->size += node->size; - delete_node(allocator->cmm_mgr, node); - return; - } - } - list_for_each_entry(curr, &allocator->free_list, link) { - if (curr->size >= node->size) { - list_add_tail(&node->link, &curr->link); - return; - } - } - list_add_tail(&node->link, &allocator->free_list); -} - -/* - * ======== get_allocator ======== - * Purpose: - * Return the allocator for the given SM Segid. - * SegIds: 1,2,3..max. - */ -static struct cmm_allocator *get_allocator(struct cmm_object *cmm_mgr_obj, - u32 ul_seg_id) -{ - return cmm_mgr_obj->pa_gppsm_seg_tab[ul_seg_id - 1]; -} - -/* - * The CMM_Xlator[xxx] routines below are used by Node and Stream - * to perform SM address translation to the client process address space. - * A "translator" object is created by a node/stream for each SM seg used. - */ - -/* - * ======== cmm_xlator_create ======== - * Purpose: - * Create an address translator object. - */ -int cmm_xlator_create(struct cmm_xlatorobject **xlator, - struct cmm_object *hcmm_mgr, - struct cmm_xlatorattrs *xlator_attrs) -{ - struct cmm_xlator *xlator_object = NULL; - int status = 0; - - *xlator = NULL; - if (xlator_attrs == NULL) - xlator_attrs = &cmm_dfltxlatorattrs; /* set defaults */ - - xlator_object = kzalloc(sizeof(struct cmm_xlator), GFP_KERNEL); - if (xlator_object != NULL) { - xlator_object->cmm_mgr = hcmm_mgr; /* ref back to CMM */ - /* SM seg_id */ - xlator_object->seg_id = xlator_attrs->seg_id; - } else { - status = -ENOMEM; - } - if (!status) - *xlator = (struct cmm_xlatorobject *)xlator_object; - - return status; -} - -/* - * ======== cmm_xlator_alloc_buf ======== - */ -void *cmm_xlator_alloc_buf(struct cmm_xlatorobject *xlator, void *va_buf, - u32 pa_size) -{ - struct cmm_xlator *xlator_obj = (struct cmm_xlator *)xlator; - void *pbuf = NULL; - void *tmp_va_buff; - struct cmm_attrs attrs; - - if (xlator_obj) { - attrs.seg_id = xlator_obj->seg_id; - __raw_writel(0, va_buf); - /* Alloc SM */ - pbuf = - cmm_calloc_buf(xlator_obj->cmm_mgr, pa_size, &attrs, NULL); - if (pbuf) { - /* convert to translator(node/strm) process Virtual - * address */ - tmp_va_buff = cmm_xlator_translate(xlator, - pbuf, CMM_PA2VA); - __raw_writel((u32)tmp_va_buff, va_buf); - } - } - return pbuf; -} - -/* - * ======== cmm_xlator_free_buf ======== - * Purpose: - * Free the given SM buffer and descriptor. - * Does not free virtual memory. - */ -int cmm_xlator_free_buf(struct cmm_xlatorobject *xlator, void *buf_va) -{ - struct cmm_xlator *xlator_obj = (struct cmm_xlator *)xlator; - int status = -EPERM; - void *buf_pa = NULL; - - if (xlator_obj) { - /* convert Va to Pa so we can free it. */ - buf_pa = cmm_xlator_translate(xlator, buf_va, CMM_VA2PA); - if (buf_pa) { - status = cmm_free_buf(xlator_obj->cmm_mgr, buf_pa, - xlator_obj->seg_id); - if (status) { - /* Uh oh, this shouldn't happen. Descriptor - * gone! */ - pr_err("%s, line %d: Assertion failed\n", - __FILE__, __LINE__); - } - } - } - return status; -} - -/* - * ======== cmm_xlator_info ======== - * Purpose: - * Set/Get translator info. - */ -int cmm_xlator_info(struct cmm_xlatorobject *xlator, u8 **paddr, - u32 ul_size, u32 segm_id, bool set_info) -{ - struct cmm_xlator *xlator_obj = (struct cmm_xlator *)xlator; - int status = 0; - - if (xlator_obj) { - if (set_info) { - /* set translators virtual address range */ - xlator_obj->virt_base = (u32) *paddr; - xlator_obj->virt_size = ul_size; - } else { /* return virt base address */ - *paddr = (u8 *) xlator_obj->virt_base; - } - } else { - status = -EFAULT; - } - return status; -} - -/* - * ======== cmm_xlator_translate ======== - */ -void *cmm_xlator_translate(struct cmm_xlatorobject *xlator, void *paddr, - enum cmm_xlatetype xtype) -{ - u32 dw_addr_xlate = 0; - struct cmm_xlator *xlator_obj = (struct cmm_xlator *)xlator; - struct cmm_object *cmm_mgr_obj = NULL; - struct cmm_allocator *allocator = NULL; - u32 dw_offset = 0; - - if (!xlator_obj) - goto loop_cont; - - cmm_mgr_obj = (struct cmm_object *)xlator_obj->cmm_mgr; - /* get this translator's default SM allocator */ - allocator = cmm_mgr_obj->pa_gppsm_seg_tab[xlator_obj->seg_id - 1]; - if (!allocator) - goto loop_cont; - - if ((xtype == CMM_VA2DSPPA) || (xtype == CMM_VA2PA) || - (xtype == CMM_PA2VA)) { - if (xtype == CMM_PA2VA) { - /* Gpp Va = Va Base + offset */ - dw_offset = (u8 *) paddr - (u8 *) (allocator->shm_base - - allocator-> - dsp_size); - dw_addr_xlate = xlator_obj->virt_base + dw_offset; - /* Check if translated Va base is in range */ - if ((dw_addr_xlate < xlator_obj->virt_base) || - (dw_addr_xlate >= - (xlator_obj->virt_base + - xlator_obj->virt_size))) { - dw_addr_xlate = 0; /* bad address */ - } - } else { - /* Gpp PA = Gpp Base + offset */ - dw_offset = - (u8 *) paddr - (u8 *) xlator_obj->virt_base; - dw_addr_xlate = - allocator->shm_base - allocator->dsp_size + - dw_offset; - } - } else { - dw_addr_xlate = (u32) paddr; - } - /*Now convert address to proper target physical address if needed */ - if ((xtype == CMM_VA2DSPPA) || (xtype == CMM_PA2DSPPA)) { - /* Got Gpp Pa now, convert to DSP Pa */ - dw_addr_xlate = - GPPPA2DSPPA((allocator->shm_base - allocator->dsp_size), - dw_addr_xlate, - allocator->dsp_phys_addr_offset * - allocator->c_factor); - } else if (xtype == CMM_DSPPA2PA) { - /* Got DSP Pa, convert to GPP Pa */ - dw_addr_xlate = - DSPPA2GPPPA(allocator->shm_base - allocator->dsp_size, - dw_addr_xlate, - allocator->dsp_phys_addr_offset * - allocator->c_factor); - } -loop_cont: - return (void *)dw_addr_xlate; -} diff --git a/drivers/staging/tidspbridge/pmgr/cod.c b/drivers/staging/tidspbridge/pmgr/cod.c deleted file mode 100644 index 6c29379baf60..000000000000 --- a/drivers/staging/tidspbridge/pmgr/cod.c +++ /dev/null @@ -1,537 +0,0 @@ -/* - * cod.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * This module implements DSP code management for the DSP/BIOS Bridge - * environment. It is mostly a thin wrapper. - * - * This module provides an interface for loading both static and - * dynamic code objects onto DSP systems. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include - -/* ----------------------------------- Host OS */ -#include -#include -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- Platform Manager */ -/* Include appropriate loader header file */ -#include - -/* ----------------------------------- This */ -#include - -/* - * ======== cod_manager ======== - */ -struct cod_manager { - struct dbll_tar_obj *target; - struct dbll_library_obj *base_lib; - bool loaded; /* Base library loaded? */ - u32 entry; - struct dbll_fxns fxns; - struct dbll_attrs attrs; - char sz_zl_file[COD_MAXPATHLENGTH]; -}; - -/* - * ======== cod_libraryobj ======== - */ -struct cod_libraryobj { - struct dbll_library_obj *dbll_lib; - struct cod_manager *cod_mgr; -}; - -static struct dbll_fxns ldr_fxns = { - (dbll_close_fxn) dbll_close, - (dbll_create_fxn) dbll_create, - (dbll_delete_fxn) dbll_delete, - (dbll_exit_fxn) dbll_exit, - (dbll_get_attrs_fxn) dbll_get_attrs, - (dbll_get_addr_fxn) dbll_get_addr, - (dbll_get_c_addr_fxn) dbll_get_c_addr, - (dbll_get_sect_fxn) dbll_get_sect, - (dbll_init_fxn) dbll_init, - (dbll_load_fxn) dbll_load, - (dbll_open_fxn) dbll_open, - (dbll_read_sect_fxn) dbll_read_sect, - (dbll_unload_fxn) dbll_unload, -}; - -static bool no_op(void); - -/* - * File operations (originally were under kfile.c) - */ -static s32 cod_f_close(struct file *filp) -{ - /* Check for valid handle */ - if (!filp) - return -EFAULT; - - filp_close(filp, NULL); - - /* we can't use 0 here */ - return 0; -} - -static struct file *cod_f_open(const char *psz_file_name, const char *sz_mode) -{ - mm_segment_t fs; - struct file *filp; - - fs = get_fs(); - set_fs(get_ds()); - - /* ignore given mode and open file as read-only */ - filp = filp_open(psz_file_name, O_RDONLY, 0); - - if (IS_ERR(filp)) - filp = NULL; - - set_fs(fs); - - return filp; -} - -static s32 cod_f_read(void __user *pbuffer, s32 size, s32 count, - struct file *filp) -{ - /* check for valid file handle */ - if (!filp) - return -EFAULT; - - if ((size > 0) && (count > 0) && pbuffer) { - u32 dw_bytes_read; - mm_segment_t fs; - - /* read from file */ - fs = get_fs(); - set_fs(get_ds()); - dw_bytes_read = filp->f_op->read(filp, pbuffer, size * count, - &(filp->f_pos)); - set_fs(fs); - - if (!dw_bytes_read) - return -EBADF; - - return dw_bytes_read / size; - } - - return -EINVAL; -} - -static s32 cod_f_seek(struct file *filp, s32 offset, s32 origin) -{ - loff_t dw_cur_pos; - - /* check for valid file handle */ - if (!filp) - return -EFAULT; - - /* based on the origin flag, move the internal pointer */ - dw_cur_pos = filp->f_op->llseek(filp, offset, origin); - - if ((s32) dw_cur_pos < 0) - return -EPERM; - - /* we can't use 0 here */ - return 0; -} - -static s32 cod_f_tell(struct file *filp) -{ - loff_t dw_cur_pos; - - if (!filp) - return -EFAULT; - - /* Get current position */ - dw_cur_pos = filp->f_op->llseek(filp, 0, SEEK_CUR); - - if ((s32) dw_cur_pos < 0) - return -EPERM; - - return dw_cur_pos; -} - -/* - * ======== cod_close ======== - */ -void cod_close(struct cod_libraryobj *lib) -{ - struct cod_manager *hmgr; - - hmgr = lib->cod_mgr; - hmgr->fxns.close_fxn(lib->dbll_lib); - - kfree(lib); -} - -/* - * ======== cod_create ======== - * Purpose: - * Create an object to manage code on a DSP system. - * This object can be used to load an initial program image with - * arguments that can later be expanded with - * dynamically loaded object files. - * - */ -int cod_create(struct cod_manager **mgr, char *str_zl_file) -{ - struct cod_manager *mgr_new; - struct dbll_attrs zl_attrs; - int status = 0; - - /* assume failure */ - *mgr = NULL; - - mgr_new = kzalloc(sizeof(struct cod_manager), GFP_KERNEL); - if (mgr_new == NULL) - return -ENOMEM; - - /* Set up loader functions */ - mgr_new->fxns = ldr_fxns; - - /* initialize the ZL module */ - mgr_new->fxns.init_fxn(); - - zl_attrs.alloc = (dbll_alloc_fxn) no_op; - zl_attrs.free = (dbll_free_fxn) no_op; - zl_attrs.fread = (dbll_read_fxn) cod_f_read; - zl_attrs.fseek = (dbll_seek_fxn) cod_f_seek; - zl_attrs.ftell = (dbll_tell_fxn) cod_f_tell; - zl_attrs.fclose = (dbll_f_close_fxn) cod_f_close; - zl_attrs.fopen = (dbll_f_open_fxn) cod_f_open; - zl_attrs.sym_lookup = NULL; - zl_attrs.base_image = true; - zl_attrs.log_write = NULL; - zl_attrs.log_write_handle = NULL; - zl_attrs.write = NULL; - zl_attrs.rmm_handle = NULL; - zl_attrs.input_params = NULL; - zl_attrs.sym_handle = NULL; - zl_attrs.sym_arg = NULL; - - mgr_new->attrs = zl_attrs; - - status = mgr_new->fxns.create_fxn(&mgr_new->target, &zl_attrs); - - if (status) { - cod_delete(mgr_new); - return -ESPIPE; - } - - /* return the new manager */ - *mgr = mgr_new; - - return 0; -} - -/* - * ======== cod_delete ======== - * Purpose: - * Delete a code manager object. - */ -void cod_delete(struct cod_manager *cod_mgr_obj) -{ - if (cod_mgr_obj->base_lib) { - if (cod_mgr_obj->loaded) - cod_mgr_obj->fxns.unload_fxn(cod_mgr_obj->base_lib, - &cod_mgr_obj->attrs); - - cod_mgr_obj->fxns.close_fxn(cod_mgr_obj->base_lib); - } - if (cod_mgr_obj->target) { - cod_mgr_obj->fxns.delete_fxn(cod_mgr_obj->target); - cod_mgr_obj->fxns.exit_fxn(); - } - kfree(cod_mgr_obj); -} - -/* - * ======== cod_get_base_lib ======== - * Purpose: - * Get handle to the base image DBL library. - */ -int cod_get_base_lib(struct cod_manager *cod_mgr_obj, - struct dbll_library_obj **plib) -{ - int status = 0; - - *plib = (struct dbll_library_obj *)cod_mgr_obj->base_lib; - - return status; -} - -/* - * ======== cod_get_base_name ======== - */ -int cod_get_base_name(struct cod_manager *cod_mgr_obj, char *sz_name, - u32 usize) -{ - int status = 0; - - if (usize <= COD_MAXPATHLENGTH) - strlcpy(sz_name, cod_mgr_obj->sz_zl_file, usize); - else - status = -EPERM; - - return status; -} - -/* - * ======== cod_get_entry ======== - * Purpose: - * Retrieve the entry point of a loaded DSP program image - * - */ -int cod_get_entry(struct cod_manager *cod_mgr_obj, u32 *entry_pt) -{ - *entry_pt = cod_mgr_obj->entry; - - return 0; -} - -/* - * ======== cod_get_loader ======== - * Purpose: - * Get handle to the DBLL loader. - */ -int cod_get_loader(struct cod_manager *cod_mgr_obj, - struct dbll_tar_obj **loader) -{ - int status = 0; - - *loader = (struct dbll_tar_obj *)cod_mgr_obj->target; - - return status; -} - -/* - * ======== cod_get_section ======== - * Purpose: - * Retrieve the starting address and length of a section in the COFF file - * given the section name. - */ -int cod_get_section(struct cod_libraryobj *lib, char *str_sect, - u32 *addr, u32 *len) -{ - struct cod_manager *cod_mgr_obj; - int status = 0; - - *addr = 0; - *len = 0; - if (lib != NULL) { - cod_mgr_obj = lib->cod_mgr; - status = cod_mgr_obj->fxns.get_sect_fxn(lib->dbll_lib, str_sect, - addr, len); - } else { - status = -ESPIPE; - } - - return status; -} - -/* - * ======== cod_get_sym_value ======== - * Purpose: - * Retrieve the value for the specified symbol. The symbol is first - * searched for literally and then, if not found, searched for as a - * C symbol. - * - */ -int cod_get_sym_value(struct cod_manager *cod_mgr_obj, char *str_sym, - u32 *pul_value) -{ - struct dbll_sym_val *dbll_sym; - - dev_dbg(bridge, "%s: cod_mgr_obj: %p str_sym: %s pul_value: %p\n", - __func__, cod_mgr_obj, str_sym, pul_value); - if (cod_mgr_obj->base_lib) { - if (!cod_mgr_obj->fxns. - get_addr_fxn(cod_mgr_obj->base_lib, str_sym, &dbll_sym)) { - if (!cod_mgr_obj->fxns. - get_c_addr_fxn(cod_mgr_obj->base_lib, str_sym, - &dbll_sym)) - return -ESPIPE; - } - } else { - return -ESPIPE; - } - - *pul_value = dbll_sym->value; - - return 0; -} - -/* - * ======== cod_load_base ======== - * Purpose: - * Load the initial program image, optionally with command-line arguments, - * on the DSP system managed by the supplied handle. The program to be - * loaded must be the first element of the args array and must be a fully - * qualified pathname. - * Details: - * if num_argc doesn't match the number of arguments in the args array, the - * args array is searched for a NULL terminating entry, and argc is - * recalculated to reflect this. In this way, we can support NULL - * terminating args arrays, if num_argc is very large. - */ -int cod_load_base(struct cod_manager *cod_mgr_obj, u32 num_argc, char *args[], - cod_writefxn pfn_write, void *arb, char *envp[]) -{ - dbll_flags flags; - struct dbll_attrs save_attrs; - struct dbll_attrs new_attrs; - int status; - u32 i; - - /* - * Make sure every argv[] stated in argc has a value, or change argc to - * reflect true number in NULL terminated argv array. - */ - for (i = 0; i < num_argc; i++) { - if (args[i] == NULL) { - num_argc = i; - break; - } - } - - /* set the write function for this operation */ - cod_mgr_obj->fxns.get_attrs_fxn(cod_mgr_obj->target, &save_attrs); - - new_attrs = save_attrs; - new_attrs.write = (dbll_write_fxn) pfn_write; - new_attrs.input_params = arb; - new_attrs.alloc = (dbll_alloc_fxn) no_op; - new_attrs.free = (dbll_free_fxn) no_op; - new_attrs.log_write = NULL; - new_attrs.log_write_handle = NULL; - - /* Load the image */ - flags = DBLL_CODE | DBLL_DATA | DBLL_SYMB; - status = cod_mgr_obj->fxns.load_fxn(cod_mgr_obj->base_lib, flags, - &new_attrs, - &cod_mgr_obj->entry); - if (status) - cod_mgr_obj->fxns.close_fxn(cod_mgr_obj->base_lib); - - if (!status) - cod_mgr_obj->loaded = true; - else - cod_mgr_obj->base_lib = NULL; - - return status; -} - -/* - * ======== cod_open ======== - * Open library for reading sections. - */ -int cod_open(struct cod_manager *hmgr, char *sz_coff_path, - u32 flags, struct cod_libraryobj **lib_obj) -{ - int status = 0; - struct cod_libraryobj *lib = NULL; - - *lib_obj = NULL; - - lib = kzalloc(sizeof(struct cod_libraryobj), GFP_KERNEL); - if (lib == NULL) - status = -ENOMEM; - - if (!status) { - lib->cod_mgr = hmgr; - status = hmgr->fxns.open_fxn(hmgr->target, sz_coff_path, flags, - &lib->dbll_lib); - if (!status) - *lib_obj = lib; - } - - if (status) - pr_err("%s: error status 0x%x, sz_coff_path: %s flags: 0x%x\n", - __func__, status, sz_coff_path, flags); - return status; -} - -/* - * ======== cod_open_base ======== - * Purpose: - * Open base image for reading sections. - */ -int cod_open_base(struct cod_manager *hmgr, char *sz_coff_path, - dbll_flags flags) -{ - int status = 0; - struct dbll_library_obj *lib; - - /* if we previously opened a base image, close it now */ - if (hmgr->base_lib) { - if (hmgr->loaded) { - hmgr->fxns.unload_fxn(hmgr->base_lib, &hmgr->attrs); - hmgr->loaded = false; - } - hmgr->fxns.close_fxn(hmgr->base_lib); - hmgr->base_lib = NULL; - } - status = hmgr->fxns.open_fxn(hmgr->target, sz_coff_path, flags, &lib); - if (!status) { - /* hang onto the library for subsequent sym table usage */ - hmgr->base_lib = lib; - strncpy(hmgr->sz_zl_file, sz_coff_path, COD_MAXPATHLENGTH - 1); - hmgr->sz_zl_file[COD_MAXPATHLENGTH - 1] = '\0'; - } - - if (status) - pr_err("%s: error status 0x%x sz_coff_path: %s\n", __func__, - status, sz_coff_path); - return status; -} - -/* - * ======== cod_read_section ======== - * Purpose: - * Retrieve the content of a code section given the section name. - */ -int cod_read_section(struct cod_libraryobj *lib, char *str_sect, - char *str_content, u32 content_size) -{ - int status = 0; - - if (lib != NULL) - status = - lib->cod_mgr->fxns.read_sect_fxn(lib->dbll_lib, str_sect, - str_content, content_size); - else - status = -ESPIPE; - - return status; -} - -/* - * ======== no_op ======== - * Purpose: - * No Operation. - * - */ -static bool no_op(void) -{ - return true; -} diff --git a/drivers/staging/tidspbridge/pmgr/dbll.c b/drivers/staging/tidspbridge/pmgr/dbll.c deleted file mode 100644 index 8e21d1e47c9c..000000000000 --- a/drivers/staging/tidspbridge/pmgr/dbll.c +++ /dev/null @@ -1,1421 +0,0 @@ -/* - * dbll.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -#include - -/* ----------------------------------- OS Adaptation Layer */ - -/* Dynamic loader library interface */ -#include -#include - -/* ----------------------------------- This */ -#include -#include - -/* Max buffer length */ -#define MAXEXPR 128 - -#define DOFF_ALIGN(x) (((x) + 3) & ~3UL) - -/* - * ======== struct dbll_tar_obj* ======== - * A target may have one or more libraries of symbols/code/data loaded - * onto it, where a library is simply the symbols/code/data contained - * in a DOFF file. - */ -/* - * ======== dbll_tar_obj ======== - */ -struct dbll_tar_obj { - struct dbll_attrs attrs; - struct dbll_library_obj *head; /* List of all opened libraries */ -}; - -/* - * The following 4 typedefs are "super classes" of the dynamic loader - * library types used in dynamic loader functions (dynamic_loader.h). - */ -/* - * ======== dbll_stream ======== - * Contains dynamic_loader_stream - */ -struct dbll_stream { - struct dynamic_loader_stream dl_stream; - struct dbll_library_obj *lib; -}; - -/* - * ======== ldr_symbol ======== - */ -struct ldr_symbol { - struct dynamic_loader_sym dl_symbol; - struct dbll_library_obj *lib; -}; - -/* - * ======== dbll_alloc ======== - */ -struct dbll_alloc { - struct dynamic_loader_allocate dl_alloc; - struct dbll_library_obj *lib; -}; - -/* - * ======== dbll_init_obj ======== - */ -struct dbll_init_obj { - struct dynamic_loader_initialize dl_init; - struct dbll_library_obj *lib; -}; - -/* - * ======== DBLL_Library ======== - * A library handle is returned by DBLL_Open() and is passed to dbll_load() - * to load symbols/code/data, and to dbll_unload(), to remove the - * symbols/code/data loaded by dbll_load(). - */ - -/* - * ======== dbll_library_obj ======== - */ -struct dbll_library_obj { - struct dbll_library_obj *next; /* Next library in target's list */ - struct dbll_library_obj *prev; /* Previous in the list */ - struct dbll_tar_obj *target_obj; /* target for this library */ - - /* Objects needed by dynamic loader */ - struct dbll_stream stream; - struct ldr_symbol symbol; - struct dbll_alloc allocate; - struct dbll_init_obj init; - void *dload_mod_obj; - - char *file_name; /* COFF file name */ - void *fp; /* Opaque file handle */ - u32 entry; /* Entry point */ - void *desc; /* desc of DOFF file loaded */ - u32 open_ref; /* Number of times opened */ - u32 load_ref; /* Number of times loaded */ - struct gh_t_hash_tab *sym_tab; /* Hash table of symbols */ - u32 pos; -}; - -/* - * ======== dbll_symbol ======== - */ -struct dbll_symbol { - struct dbll_sym_val value; - char *name; -}; - -static void dof_close(struct dbll_library_obj *zl_lib); -static int dof_open(struct dbll_library_obj *zl_lib); -static s32 no_op(struct dynamic_loader_initialize *thisptr, void *bufr, - ldr_addr locn, struct ldr_section_info *info, - unsigned bytsize); - -/* - * Functions called by dynamic loader - * - */ -/* dynamic_loader_stream */ -static int dbll_read_buffer(struct dynamic_loader_stream *this, void *buffer, - unsigned bufsize); -static int dbll_set_file_posn(struct dynamic_loader_stream *this, - unsigned int pos); -/* dynamic_loader_sym */ -static struct dynload_symbol *dbll_find_symbol(struct dynamic_loader_sym *this, - const char *name); -static struct dynload_symbol *dbll_add_to_symbol_table(struct dynamic_loader_sym - *this, const char *name, - unsigned module_id); -static struct dynload_symbol *find_in_symbol_table(struct dynamic_loader_sym - *this, const char *name, - unsigned moduleid); -static void dbll_purge_symbol_table(struct dynamic_loader_sym *this, - unsigned module_id); -static void *allocate(struct dynamic_loader_sym *this, unsigned memsize); -static void deallocate(struct dynamic_loader_sym *this, void *mem_ptr); -static void dbll_err_report(struct dynamic_loader_sym *this, const char *errstr, - va_list args); -/* dynamic_loader_allocate */ -static int dbll_rmm_alloc(struct dynamic_loader_allocate *this, - struct ldr_section_info *info, unsigned align); -static void rmm_dealloc(struct dynamic_loader_allocate *this, - struct ldr_section_info *info); - -/* dynamic_loader_initialize */ -static int connect(struct dynamic_loader_initialize *this); -static int read_mem(struct dynamic_loader_initialize *this, void *buf, - ldr_addr addr, struct ldr_section_info *info, - unsigned bytes); -static int write_mem(struct dynamic_loader_initialize *this, void *buf, - ldr_addr addr, struct ldr_section_info *info, - unsigned nbytes); -static int fill_mem(struct dynamic_loader_initialize *this, ldr_addr addr, - struct ldr_section_info *info, unsigned bytes, - unsigned val); -static int execute(struct dynamic_loader_initialize *this, ldr_addr start); -static void release(struct dynamic_loader_initialize *this); - -/* symbol table hash functions */ -static u32 name_hash(const void *key); -static bool name_match(const void *key, const void *sp); -static void sym_delete(void *value); - -/* Symbol Redefinition */ -static int redefined_symbol; -static int gbl_search = 1; - -/* - * ======== dbll_close ======== - */ -void dbll_close(struct dbll_library_obj *zl_lib) -{ - struct dbll_tar_obj *zl_target; - - zl_target = zl_lib->target_obj; - zl_lib->open_ref--; - if (zl_lib->open_ref == 0) { - /* Remove library from list */ - if (zl_target->head == zl_lib) - zl_target->head = zl_lib->next; - - if (zl_lib->prev) - (zl_lib->prev)->next = zl_lib->next; - - if (zl_lib->next) - (zl_lib->next)->prev = zl_lib->prev; - - /* Free DOF resources */ - dof_close(zl_lib); - kfree(zl_lib->file_name); - - /* remove symbols from symbol table */ - if (zl_lib->sym_tab) - gh_delete(zl_lib->sym_tab); - - /* remove the library object itself */ - kfree(zl_lib); - zl_lib = NULL; - } -} - -/* - * ======== dbll_create ======== - */ -int dbll_create(struct dbll_tar_obj **target_obj, - struct dbll_attrs *pattrs) -{ - struct dbll_tar_obj *pzl_target; - int status = 0; - - /* Allocate DBL target object */ - pzl_target = kzalloc(sizeof(struct dbll_tar_obj), GFP_KERNEL); - if (target_obj != NULL) { - if (pzl_target == NULL) { - *target_obj = NULL; - status = -ENOMEM; - } else { - pzl_target->attrs = *pattrs; - *target_obj = (struct dbll_tar_obj *)pzl_target; - } - } - - return status; -} - -/* - * ======== dbll_delete ======== - */ -void dbll_delete(struct dbll_tar_obj *target) -{ - struct dbll_tar_obj *zl_target = (struct dbll_tar_obj *)target; - - kfree(zl_target); - -} - -/* - * ======== dbll_exit ======== - * Discontinue usage of DBL module. - */ -void dbll_exit(void) -{ - /* do nothing */ -} - -/* - * ======== dbll_get_addr ======== - * Get address of name in the specified library. - */ -bool dbll_get_addr(struct dbll_library_obj *zl_lib, char *name, - struct dbll_sym_val **sym_val) -{ - struct dbll_symbol *sym; - - sym = (struct dbll_symbol *)gh_find(zl_lib->sym_tab, name); - if (IS_ERR(sym)) - return false; - - *sym_val = &sym->value; - - dev_dbg(bridge, "%s: lib: %p name: %s paddr: %p\n", - __func__, zl_lib, name, sym_val); - return true; -} - -/* - * ======== dbll_get_attrs ======== - * Retrieve the attributes of the target. - */ -void dbll_get_attrs(struct dbll_tar_obj *target, struct dbll_attrs *pattrs) -{ - struct dbll_tar_obj *zl_target = (struct dbll_tar_obj *)target; - - if ((pattrs != NULL) && (zl_target != NULL)) - *pattrs = zl_target->attrs; - -} - -/* - * ======== dbll_get_c_addr ======== - * Get address of a "C" name in the specified library. - */ -bool dbll_get_c_addr(struct dbll_library_obj *zl_lib, char *name, - struct dbll_sym_val **sym_val) -{ - struct dbll_symbol *sym; - char cname[MAXEXPR + 1]; - - cname[0] = '_'; - - strncpy(cname + 1, name, sizeof(cname) - 2); - cname[MAXEXPR] = '\0'; /* insure '\0' string termination */ - - /* Check for C name, if not found */ - sym = (struct dbll_symbol *)gh_find(zl_lib->sym_tab, cname); - if (IS_ERR(sym)) - return false; - - *sym_val = &sym->value; - - return true; -} - -/* - * ======== dbll_get_sect ======== - * Get the base address and size (in bytes) of a COFF section. - */ -int dbll_get_sect(struct dbll_library_obj *lib, char *name, u32 *paddr, - u32 *psize) -{ - u32 byte_size; - bool opened_doff = false; - const struct ldr_section_info *sect = NULL; - struct dbll_library_obj *zl_lib = (struct dbll_library_obj *)lib; - int status = 0; - - /* If DOFF file is not open, we open it. */ - if (zl_lib != NULL) { - if (zl_lib->fp == NULL) { - status = dof_open(zl_lib); - if (!status) - opened_doff = true; - - } else { - (*(zl_lib->target_obj->attrs.fseek)) (zl_lib->fp, - zl_lib->pos, - SEEK_SET); - } - } else { - status = -EFAULT; - } - if (!status) { - byte_size = 1; - if (dload_get_section_info(zl_lib->desc, name, §)) { - *paddr = sect->load_addr; - *psize = sect->size * byte_size; - /* Make sure size is even for good swap */ - if (*psize % 2) - (*psize)++; - - /* Align size */ - *psize = DOFF_ALIGN(*psize); - } else { - status = -ENXIO; - } - } - if (opened_doff) { - dof_close(zl_lib); - opened_doff = false; - } - - dev_dbg(bridge, "%s: lib: %p name: %s paddr: %p psize: %p, status 0x%x\n", - __func__, lib, name, paddr, psize, status); - - return status; -} - -/* - * ======== dbll_init ======== - */ -bool dbll_init(void) -{ - /* do nothing */ - - return true; -} - -/* - * ======== dbll_load ======== - */ -int dbll_load(struct dbll_library_obj *lib, dbll_flags flags, - struct dbll_attrs *attrs, u32 *entry) -{ - struct dbll_library_obj *zl_lib = (struct dbll_library_obj *)lib; - struct dbll_tar_obj *dbzl; - bool got_symbols = true; - s32 err; - int status = 0; - bool opened_doff = false; - - /* - * Load if not already loaded. - */ - if (zl_lib->load_ref == 0 || !(flags & DBLL_DYNAMIC)) { - dbzl = zl_lib->target_obj; - dbzl->attrs = *attrs; - /* Create a hash table for symbols if not already created */ - if (zl_lib->sym_tab == NULL) { - got_symbols = false; - zl_lib->sym_tab = gh_create(sizeof(struct dbll_symbol), - name_hash, - name_match, sym_delete); - if (IS_ERR(zl_lib->sym_tab)) { - status = PTR_ERR(zl_lib->sym_tab); - zl_lib->sym_tab = NULL; - } - - } - /* - * Set up objects needed by the dynamic loader - */ - /* Stream */ - zl_lib->stream.dl_stream.read_buffer = dbll_read_buffer; - zl_lib->stream.dl_stream.set_file_posn = dbll_set_file_posn; - zl_lib->stream.lib = zl_lib; - /* Symbol */ - zl_lib->symbol.dl_symbol.find_matching_symbol = - dbll_find_symbol; - if (got_symbols) { - zl_lib->symbol.dl_symbol.add_to_symbol_table = - find_in_symbol_table; - } else { - zl_lib->symbol.dl_symbol.add_to_symbol_table = - dbll_add_to_symbol_table; - } - zl_lib->symbol.dl_symbol.purge_symbol_table = - dbll_purge_symbol_table; - zl_lib->symbol.dl_symbol.dload_allocate = allocate; - zl_lib->symbol.dl_symbol.dload_deallocate = deallocate; - zl_lib->symbol.dl_symbol.error_report = dbll_err_report; - zl_lib->symbol.lib = zl_lib; - /* Allocate */ - zl_lib->allocate.dl_alloc.dload_allocate = dbll_rmm_alloc; - zl_lib->allocate.dl_alloc.dload_deallocate = rmm_dealloc; - zl_lib->allocate.lib = zl_lib; - /* Init */ - zl_lib->init.dl_init.connect = connect; - zl_lib->init.dl_init.readmem = read_mem; - zl_lib->init.dl_init.writemem = write_mem; - zl_lib->init.dl_init.fillmem = fill_mem; - zl_lib->init.dl_init.execute = execute; - zl_lib->init.dl_init.release = release; - zl_lib->init.lib = zl_lib; - /* If COFF file is not open, we open it. */ - if (zl_lib->fp == NULL) { - status = dof_open(zl_lib); - if (!status) - opened_doff = true; - - } - if (!status) { - zl_lib->pos = (*(zl_lib->target_obj->attrs.ftell)) - (zl_lib->fp); - /* Reset file cursor */ - (*(zl_lib->target_obj->attrs.fseek)) (zl_lib->fp, - (long)0, - SEEK_SET); - symbols_reloaded = true; - /* The 5th argument, DLOAD_INITBSS, tells the DLL - * module to zero-init all BSS sections. In general, - * this is not necessary and also increases load time. - * We may want to make this configurable by the user */ - err = dynamic_load_module(&zl_lib->stream.dl_stream, - &zl_lib->symbol.dl_symbol, - &zl_lib->allocate.dl_alloc, - &zl_lib->init.dl_init, - DLOAD_INITBSS, - &zl_lib->dload_mod_obj); - - if (err != 0) { - status = -EILSEQ; - } else if (redefined_symbol) { - zl_lib->load_ref++; - dbll_unload(zl_lib, (struct dbll_attrs *)attrs); - redefined_symbol = false; - status = -EILSEQ; - } else { - *entry = zl_lib->entry; - } - } - } - if (!status) - zl_lib->load_ref++; - - /* Clean up DOFF resources */ - if (opened_doff) - dof_close(zl_lib); - - dev_dbg(bridge, "%s: lib: %p flags: 0x%x entry: %p, status 0x%x\n", - __func__, lib, flags, entry, status); - - return status; -} - -/* - * ======== dbll_open ======== - */ -int dbll_open(struct dbll_tar_obj *target, char *file, dbll_flags flags, - struct dbll_library_obj **lib_obj) -{ - struct dbll_tar_obj *zl_target = (struct dbll_tar_obj *)target; - struct dbll_library_obj *zl_lib = NULL; - s32 err; - int status = 0; - - zl_lib = zl_target->head; - while (zl_lib != NULL) { - if (strcmp(zl_lib->file_name, file) == 0) { - /* Library is already opened */ - zl_lib->open_ref++; - break; - } - zl_lib = zl_lib->next; - } - if (zl_lib == NULL) { - /* Allocate DBL library object */ - zl_lib = kzalloc(sizeof(struct dbll_library_obj), GFP_KERNEL); - if (zl_lib == NULL) { - status = -ENOMEM; - } else { - zl_lib->pos = 0; - /* Increment ref count to allow close on failure - * later on */ - zl_lib->open_ref++; - zl_lib->target_obj = zl_target; - /* Keep a copy of the file name */ - zl_lib->file_name = kzalloc(strlen(file) + 1, - GFP_KERNEL); - if (zl_lib->file_name == NULL) { - status = -ENOMEM; - } else { - strncpy(zl_lib->file_name, file, - strlen(file) + 1); - } - zl_lib->sym_tab = NULL; - } - } - /* - * Set up objects needed by the dynamic loader - */ - if (status) - goto func_cont; - - /* Stream */ - zl_lib->stream.dl_stream.read_buffer = dbll_read_buffer; - zl_lib->stream.dl_stream.set_file_posn = dbll_set_file_posn; - zl_lib->stream.lib = zl_lib; - /* Symbol */ - zl_lib->symbol.dl_symbol.add_to_symbol_table = dbll_add_to_symbol_table; - zl_lib->symbol.dl_symbol.find_matching_symbol = dbll_find_symbol; - zl_lib->symbol.dl_symbol.purge_symbol_table = dbll_purge_symbol_table; - zl_lib->symbol.dl_symbol.dload_allocate = allocate; - zl_lib->symbol.dl_symbol.dload_deallocate = deallocate; - zl_lib->symbol.dl_symbol.error_report = dbll_err_report; - zl_lib->symbol.lib = zl_lib; - /* Allocate */ - zl_lib->allocate.dl_alloc.dload_allocate = dbll_rmm_alloc; - zl_lib->allocate.dl_alloc.dload_deallocate = rmm_dealloc; - zl_lib->allocate.lib = zl_lib; - /* Init */ - zl_lib->init.dl_init.connect = connect; - zl_lib->init.dl_init.readmem = read_mem; - zl_lib->init.dl_init.writemem = write_mem; - zl_lib->init.dl_init.fillmem = fill_mem; - zl_lib->init.dl_init.execute = execute; - zl_lib->init.dl_init.release = release; - zl_lib->init.lib = zl_lib; - if (!status && zl_lib->fp == NULL) - status = dof_open(zl_lib); - - zl_lib->pos = (*(zl_lib->target_obj->attrs.ftell)) (zl_lib->fp); - (*(zl_lib->target_obj->attrs.fseek)) (zl_lib->fp, (long)0, SEEK_SET); - /* Create a hash table for symbols if flag is set */ - if (zl_lib->sym_tab != NULL || !(flags & DBLL_SYMB)) - goto func_cont; - - zl_lib->sym_tab = - gh_create(sizeof(struct dbll_symbol), name_hash, name_match, - sym_delete); - if (IS_ERR(zl_lib->sym_tab)) { - status = PTR_ERR(zl_lib->sym_tab); - zl_lib->sym_tab = NULL; - } else { - /* Do a fake load to get symbols - set write func to no_op */ - zl_lib->init.dl_init.writemem = no_op; - err = dynamic_open_module(&zl_lib->stream.dl_stream, - &zl_lib->symbol.dl_symbol, - &zl_lib->allocate.dl_alloc, - &zl_lib->init.dl_init, 0, - &zl_lib->dload_mod_obj); - if (err != 0) { - status = -EILSEQ; - } else { - /* Now that we have the symbol table, we can unload */ - err = dynamic_unload_module(zl_lib->dload_mod_obj, - &zl_lib->symbol.dl_symbol, - &zl_lib->allocate.dl_alloc, - &zl_lib->init.dl_init); - if (err != 0) - status = -EILSEQ; - - zl_lib->dload_mod_obj = NULL; - } - } -func_cont: - if (!status) { - if (zl_lib->open_ref == 1) { - /* First time opened - insert in list */ - if (zl_target->head) - (zl_target->head)->prev = zl_lib; - - zl_lib->prev = NULL; - zl_lib->next = zl_target->head; - zl_target->head = zl_lib; - } - *lib_obj = (struct dbll_library_obj *)zl_lib; - } else { - *lib_obj = NULL; - if (zl_lib != NULL) - dbll_close((struct dbll_library_obj *)zl_lib); - - } - - dev_dbg(bridge, "%s: target: %p file: %s lib_obj: %p, status 0x%x\n", - __func__, target, file, lib_obj, status); - - return status; -} - -/* - * ======== dbll_read_sect ======== - * Get the content of a COFF section. - */ -int dbll_read_sect(struct dbll_library_obj *lib, char *name, - char *buf, u32 size) -{ - struct dbll_library_obj *zl_lib = (struct dbll_library_obj *)lib; - bool opened_doff = false; - u32 byte_size; /* size of bytes */ - u32 ul_sect_size; /* size of section */ - const struct ldr_section_info *sect = NULL; - int status = 0; - - /* If DOFF file is not open, we open it. */ - if (zl_lib != NULL) { - if (zl_lib->fp == NULL) { - status = dof_open(zl_lib); - if (!status) - opened_doff = true; - - } else { - (*(zl_lib->target_obj->attrs.fseek)) (zl_lib->fp, - zl_lib->pos, - SEEK_SET); - } - } else { - status = -EFAULT; - } - if (status) - goto func_cont; - - byte_size = 1; - if (!dload_get_section_info(zl_lib->desc, name, §)) { - status = -ENXIO; - goto func_cont; - } - /* - * Ensure the supplied buffer size is sufficient to store - * the section buf to be read. - */ - ul_sect_size = sect->size * byte_size; - /* Make sure size is even for good swap */ - if (ul_sect_size % 2) - ul_sect_size++; - - /* Align size */ - ul_sect_size = DOFF_ALIGN(ul_sect_size); - if (ul_sect_size > size) { - status = -EPERM; - } else { - if (!dload_get_section(zl_lib->desc, sect, buf)) - status = -EBADF; - - } -func_cont: - if (opened_doff) { - dof_close(zl_lib); - opened_doff = false; - } - - dev_dbg(bridge, "%s: lib: %p name: %s buf: %p size: 0x%x, status 0x%x\n", - __func__, lib, name, buf, size, status); - return status; -} - -/* - * ======== dbll_unload ======== - */ -void dbll_unload(struct dbll_library_obj *lib, struct dbll_attrs *attrs) -{ - struct dbll_library_obj *zl_lib = (struct dbll_library_obj *)lib; - s32 err = 0; - - dev_dbg(bridge, "%s: lib: %p\n", __func__, lib); - zl_lib->load_ref--; - /* Unload only if reference count is 0 */ - if (zl_lib->load_ref != 0) - return; - - zl_lib->target_obj->attrs = *attrs; - if (zl_lib->dload_mod_obj) { - err = dynamic_unload_module(zl_lib->dload_mod_obj, - &zl_lib->symbol.dl_symbol, - &zl_lib->allocate.dl_alloc, - &zl_lib->init.dl_init); - if (err != 0) - dev_dbg(bridge, "%s: failed: 0x%x\n", __func__, err); - } - /* remove symbols from symbol table */ - if (zl_lib->sym_tab != NULL) { - gh_delete(zl_lib->sym_tab); - zl_lib->sym_tab = NULL; - } - /* delete DOFF desc since it holds *lots* of host OS - * resources */ - dof_close(zl_lib); -} - -/* - * ======== dof_close ======== - */ -static void dof_close(struct dbll_library_obj *zl_lib) -{ - if (zl_lib->desc) { - dload_module_close(zl_lib->desc); - zl_lib->desc = NULL; - } - /* close file */ - if (zl_lib->fp) { - (zl_lib->target_obj->attrs.fclose) (zl_lib->fp); - zl_lib->fp = NULL; - } -} - -/* - * ======== dof_open ======== - */ -static int dof_open(struct dbll_library_obj *zl_lib) -{ - void *open = *(zl_lib->target_obj->attrs.fopen); - int status = 0; - - /* First open the file for the dynamic loader, then open COF */ - zl_lib->fp = - (void *)((dbll_f_open_fxn) (open)) (zl_lib->file_name, "rb"); - - /* Open DOFF module */ - if (zl_lib->fp && zl_lib->desc == NULL) { - (*(zl_lib->target_obj->attrs.fseek)) (zl_lib->fp, (long)0, - SEEK_SET); - zl_lib->desc = - dload_module_open(&zl_lib->stream.dl_stream, - &zl_lib->symbol.dl_symbol); - if (zl_lib->desc == NULL) { - (zl_lib->target_obj->attrs.fclose) (zl_lib->fp); - zl_lib->fp = NULL; - status = -EBADF; - } - } else { - status = -EBADF; - } - - return status; -} - -/* - * ======== name_hash ======== - */ -static u32 name_hash(const void *key) -{ - u32 hash; - const char *name = key; - - hash = 0; - - while (*name) { - hash <<= 1; - hash ^= *name++; - } - - return hash; -} - -/* - * ======== name_match ======== - */ -static bool name_match(const void *key, const void *sp) -{ - if ((key != NULL) && (sp != NULL)) { - if (strcmp(key, ((struct dbll_symbol *)sp)->name) == 0) - return true; - } - return false; -} - -/* - * ======== no_op ======== - */ -static int no_op(struct dynamic_loader_initialize *thisptr, void *bufr, - ldr_addr locn, struct ldr_section_info *info, unsigned bytsize) -{ - return 1; -} - -/* - * ======== sym_delete ======== - */ -static void sym_delete(void *value) -{ - struct dbll_symbol *sp = (struct dbll_symbol *)value; - - kfree(sp->name); -} - -/* - * Dynamic Loader Functions - */ - -/* dynamic_loader_stream */ -/* - * ======== dbll_read_buffer ======== - */ -static int dbll_read_buffer(struct dynamic_loader_stream *this, void *buffer, - unsigned bufsize) -{ - struct dbll_stream *pstream = (struct dbll_stream *)this; - struct dbll_library_obj *lib; - int bytes_read = 0; - - lib = pstream->lib; - if (lib != NULL) { - bytes_read = - (*(lib->target_obj->attrs.fread)) (buffer, 1, bufsize, - lib->fp); - } - return bytes_read; -} - -/* - * ======== dbll_set_file_posn ======== - */ -static int dbll_set_file_posn(struct dynamic_loader_stream *this, - unsigned int pos) -{ - struct dbll_stream *pstream = (struct dbll_stream *)this; - struct dbll_library_obj *lib; - int status = 0; /* Success */ - - lib = pstream->lib; - if (lib != NULL) { - status = (*(lib->target_obj->attrs.fseek)) (lib->fp, (long)pos, - SEEK_SET); - } - - return status; -} - -/* dynamic_loader_sym */ - -/* - * ======== dbll_find_symbol ======== - */ -static struct dynload_symbol *dbll_find_symbol(struct dynamic_loader_sym *this, - const char *name) -{ - struct dynload_symbol *ret_sym; - struct ldr_symbol *ldr_sym = (struct ldr_symbol *)this; - struct dbll_library_obj *lib; - struct dbll_sym_val *dbll_sym = NULL; - bool status = false; /* Symbol not found yet */ - - lib = ldr_sym->lib; - if (lib != NULL) { - if (lib->target_obj->attrs.sym_lookup) { - /* Check current lib + base lib + dep lib + - * persistent lib */ - status = (*(lib->target_obj->attrs.sym_lookup)) - (lib->target_obj->attrs.sym_handle, - lib->target_obj->attrs.sym_arg, - lib->target_obj->attrs.rmm_handle, name, - &dbll_sym); - } else { - /* Just check current lib for symbol */ - status = dbll_get_addr((struct dbll_library_obj *)lib, - (char *)name, &dbll_sym); - if (!status) { - status = dbll_get_c_addr( - (struct dbll_library_obj *) - lib, (char *)name, - &dbll_sym); - } - } - } - - if (!status && gbl_search) - dev_dbg(bridge, "%s: Symbol not found: %s\n", __func__, name); - - ret_sym = (struct dynload_symbol *)dbll_sym; - return ret_sym; -} - -/* - * ======== find_in_symbol_table ======== - */ -static struct dynload_symbol *find_in_symbol_table(struct dynamic_loader_sym - *this, const char *name, - unsigned moduleid) -{ - struct ldr_symbol *ldr_sym = (struct ldr_symbol *)this; - struct dbll_library_obj *lib; - struct dbll_symbol *sym; - - lib = ldr_sym->lib; - sym = (struct dbll_symbol *)gh_find(lib->sym_tab, (char *)name); - - if (IS_ERR(sym)) - return NULL; - - return (struct dynload_symbol *)&sym->value; -} - -/* - * ======== dbll_add_to_symbol_table ======== - */ -static struct dynload_symbol *dbll_add_to_symbol_table(struct dynamic_loader_sym - *this, const char *name, - unsigned module_id) -{ - struct dbll_symbol *sym_ptr = NULL; - struct dbll_symbol symbol; - struct dynload_symbol *dbll_sym = NULL; - struct ldr_symbol *ldr_sym = (struct ldr_symbol *)this; - struct dbll_library_obj *lib; - struct dynload_symbol *ret; - - lib = ldr_sym->lib; - - /* Check to see if symbol is already defined in symbol table */ - if (!(lib->target_obj->attrs.base_image)) { - gbl_search = false; - dbll_sym = dbll_find_symbol(this, name); - gbl_search = true; - if (dbll_sym) { - redefined_symbol = true; - dev_dbg(bridge, "%s already defined in symbol table\n", - name); - return NULL; - } - } - /* Allocate string to copy symbol name */ - symbol.name = kzalloc(strlen((char *const)name) + 1, GFP_KERNEL); - if (symbol.name == NULL) - return NULL; - - if (symbol.name != NULL) { - /* Just copy name (value will be filled in by dynamic loader) */ - strncpy(symbol.name, (char *const)name, - strlen((char *const)name) + 1); - - /* Add symbol to symbol table */ - sym_ptr = - (struct dbll_symbol *)gh_insert(lib->sym_tab, (void *)name, - (void *)&symbol); - if (IS_ERR(sym_ptr)) { - kfree(symbol.name); - sym_ptr = NULL; - } - - } - if (sym_ptr != NULL) - ret = (struct dynload_symbol *)&sym_ptr->value; - else - ret = NULL; - - return ret; -} - -/* - * ======== dbll_purge_symbol_table ======== - */ -static void dbll_purge_symbol_table(struct dynamic_loader_sym *this, - unsigned module_id) -{ - struct ldr_symbol *ldr_sym = (struct ldr_symbol *)this; - struct dbll_library_obj *lib; - - lib = ldr_sym->lib; - /* May not need to do anything */ -} - -/* - * ======== allocate ======== - */ -static void *allocate(struct dynamic_loader_sym *this, unsigned memsize) -{ - struct ldr_symbol *ldr_sym = (struct ldr_symbol *)this; - struct dbll_library_obj *lib; - void *buf; - - lib = ldr_sym->lib; - - buf = kzalloc(memsize, GFP_KERNEL); - - return buf; -} - -/* - * ======== deallocate ======== - */ -static void deallocate(struct dynamic_loader_sym *this, void *mem_ptr) -{ - struct ldr_symbol *ldr_sym = (struct ldr_symbol *)this; - struct dbll_library_obj *lib; - - lib = ldr_sym->lib; - - kfree(mem_ptr); -} - -/* - * ======== dbll_err_report ======== - */ -static void dbll_err_report(struct dynamic_loader_sym *this, const char *errstr, - va_list args) -{ - struct ldr_symbol *ldr_sym = (struct ldr_symbol *)this; - struct dbll_library_obj *lib; - char temp_buf[MAXEXPR]; - - lib = ldr_sym->lib; - vsnprintf((char *)temp_buf, MAXEXPR, (char *)errstr, args); - dev_dbg(bridge, "%s\n", temp_buf); -} - -/* dynamic_loader_allocate */ - -/* - * ======== dbll_rmm_alloc ======== - */ -static int dbll_rmm_alloc(struct dynamic_loader_allocate *this, - struct ldr_section_info *info, unsigned align) -{ - struct dbll_alloc *dbll_alloc_obj = (struct dbll_alloc *)this; - struct dbll_library_obj *lib; - int status = 0; - u32 mem_sect_type; - struct rmm_addr rmm_addr_obj; - s32 ret = true; - unsigned stype = DLOAD_SECTION_TYPE(info->type); - char *token = NULL; - char *sz_sec_last_token = NULL; - char *sz_last_token = NULL; - char *sz_sect_name = NULL; - char *psz_cur; - s32 token_len = 0; - s32 seg_id = -1; - s32 req = -1; - s32 count = 0; - u32 alloc_size = 0; - u32 run_addr_flag = 0; - - lib = dbll_alloc_obj->lib; - - mem_sect_type = - (stype == DLOAD_TEXT) ? DBLL_CODE : (stype == - DLOAD_BSS) ? DBLL_BSS : - DBLL_DATA; - - /* Attempt to extract the segment ID and requirement information from - the name of the section */ - token_len = strlen((char *)(info->name)) + 1; - - sz_sect_name = kzalloc(token_len, GFP_KERNEL); - sz_last_token = kzalloc(token_len, GFP_KERNEL); - sz_sec_last_token = kzalloc(token_len, GFP_KERNEL); - - if (sz_sect_name == NULL || sz_sec_last_token == NULL || - sz_last_token == NULL) { - status = -ENOMEM; - goto func_cont; - } - strncpy(sz_sect_name, (char *)(info->name), token_len); - psz_cur = sz_sect_name; - while ((token = strsep(&psz_cur, ":")) && *token != '\0') { - strncpy(sz_sec_last_token, sz_last_token, - strlen(sz_last_token) + 1); - strncpy(sz_last_token, token, strlen(token) + 1); - token = strsep(&psz_cur, ":"); - count++; /* optimizes processing */ - } - /* If token is 0 or 1, and sz_sec_last_token is DYN_DARAM or DYN_SARAM, - or DYN_EXTERNAL, then mem granularity information is present - within the section name - only process if there are at least three - tokens within the section name (just a minor optimization) */ - if (count >= 3) { - status = kstrtos32(sz_last_token, 10, &req); - if (status) - goto func_cont; - } - - if ((req == 0) || (req == 1)) { - if (strcmp(sz_sec_last_token, "DYN_DARAM") == 0) { - seg_id = 0; - } else { - if (strcmp(sz_sec_last_token, "DYN_SARAM") == 0) { - seg_id = 1; - } else { - if (strcmp(sz_sec_last_token, - "DYN_EXTERNAL") == 0) - seg_id = 2; - } - } - } -func_cont: - kfree(sz_sect_name); - sz_sect_name = NULL; - kfree(sz_last_token); - sz_last_token = NULL; - kfree(sz_sec_last_token); - sz_sec_last_token = NULL; - - if (mem_sect_type == DBLL_CODE) - alloc_size = info->size + GEM_L1P_PREFETCH_SIZE; - else - alloc_size = info->size; - - if (info->load_addr != info->run_addr) - run_addr_flag = 1; - /* TODO - ideally, we can pass the alignment requirement also - * from here */ - if (lib != NULL) { - status = - (lib->target_obj->attrs.alloc) (lib->target_obj->attrs. - rmm_handle, mem_sect_type, - alloc_size, align, - (u32 *) &rmm_addr_obj, - seg_id, req, false); - } - if (status) { - ret = false; - } else { - /* RMM gives word address. Need to convert to byte address */ - info->load_addr = rmm_addr_obj.addr * DSPWORDSIZE; - if (!run_addr_flag) - info->run_addr = info->load_addr; - info->context = (u32) rmm_addr_obj.segid; - dev_dbg(bridge, "%s: %s base = 0x%x len = 0x%x, info->run_addr 0x%x, info->load_addr 0x%x\n", - __func__, info->name, info->load_addr / DSPWORDSIZE, - info->size / DSPWORDSIZE, info->run_addr, - info->load_addr); - } - return ret; -} - -/* - * ======== rmm_dealloc ======== - */ -static void rmm_dealloc(struct dynamic_loader_allocate *this, - struct ldr_section_info *info) -{ - struct dbll_alloc *dbll_alloc_obj = (struct dbll_alloc *)this; - struct dbll_library_obj *lib; - u32 segid; - int status = 0; - unsigned stype = DLOAD_SECTION_TYPE(info->type); - u32 mem_sect_type; - u32 free_size = 0; - - mem_sect_type = - (stype == DLOAD_TEXT) ? DBLL_CODE : (stype == - DLOAD_BSS) ? DBLL_BSS : - DBLL_DATA; - lib = dbll_alloc_obj->lib; - /* segid was set by alloc function */ - segid = (u32) info->context; - if (mem_sect_type == DBLL_CODE) - free_size = info->size + GEM_L1P_PREFETCH_SIZE; - else - free_size = info->size; - if (lib != NULL) { - status = - (lib->target_obj->attrs.free) (lib->target_obj->attrs. - sym_handle, segid, - info->load_addr / - DSPWORDSIZE, free_size, - false); - } -} - -/* dynamic_loader_initialize */ -/* - * ======== connect ======== - */ -static int connect(struct dynamic_loader_initialize *this) -{ - return true; -} - -/* - * ======== read_mem ======== - * This function does not need to be implemented. - */ -static int read_mem(struct dynamic_loader_initialize *this, void *buf, - ldr_addr addr, struct ldr_section_info *info, - unsigned nbytes) -{ - struct dbll_init_obj *init_obj = (struct dbll_init_obj *)this; - struct dbll_library_obj *lib; - int bytes_read = 0; - - lib = init_obj->lib; - /* Need bridge_brd_read function */ - return bytes_read; -} - -/* - * ======== write_mem ======== - */ -static int write_mem(struct dynamic_loader_initialize *this, void *buf, - ldr_addr addr, struct ldr_section_info *info, - unsigned bytes) -{ - struct dbll_init_obj *init_obj = (struct dbll_init_obj *)this; - struct dbll_library_obj *lib; - struct dbll_tar_obj *target_obj; - struct dbll_sect_info sect_info; - u32 mem_sect_type; - bool ret = true; - - lib = init_obj->lib; - if (!lib) - return false; - - target_obj = lib->target_obj; - - mem_sect_type = - (DLOAD_SECTION_TYPE(info->type) == - DLOAD_TEXT) ? DBLL_CODE : DBLL_DATA; - if (target_obj && target_obj->attrs.write) { - ret = - (*target_obj->attrs.write) (target_obj->attrs.input_params, - addr, buf, bytes, - mem_sect_type); - - if (target_obj->attrs.log_write) { - sect_info.name = info->name; - sect_info.sect_run_addr = info->run_addr; - sect_info.sect_load_addr = info->load_addr; - sect_info.size = info->size; - sect_info.type = mem_sect_type; - /* Pass the information about what we've written to - * another module */ - (*target_obj->attrs.log_write) (target_obj->attrs. - log_write_handle, - §_info, addr, - bytes); - } - } - return ret; -} - -/* - * ======== fill_mem ======== - * Fill bytes of memory at a given address with a given value by - * writing from a buffer containing the given value. Write in - * sets of MAXEXPR (128) bytes to avoid large stack buffer issues. - */ -static int fill_mem(struct dynamic_loader_initialize *this, ldr_addr addr, - struct ldr_section_info *info, unsigned bytes, unsigned val) -{ - bool ret = true; - char *pbuf; - struct dbll_library_obj *lib; - struct dbll_init_obj *init_obj = (struct dbll_init_obj *)this; - - lib = init_obj->lib; - pbuf = NULL; - /* Pass the NULL pointer to write_mem to get the start address of Shared - memory. This is a trick to just get the start address, there is no - writing taking place with this Writemem - */ - if ((lib->target_obj->attrs.write) != (dbll_write_fxn) no_op) - write_mem(this, &pbuf, addr, info, 0); - if (pbuf) - memset(pbuf, val, bytes); - - return ret; -} - -/* - * ======== execute ======== - */ -static int execute(struct dynamic_loader_initialize *this, ldr_addr start) -{ - struct dbll_init_obj *init_obj = (struct dbll_init_obj *)this; - struct dbll_library_obj *lib; - bool ret = true; - - lib = init_obj->lib; - /* Save entry point */ - if (lib != NULL) - lib->entry = (u32) start; - - return ret; -} - -/* - * ======== release ======== - */ -static void release(struct dynamic_loader_initialize *this) -{ -} - -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE -/** - * find_symbol_context - Basic symbol context structure - * @address: Symbol Address - * @offset_range: Offset range where the search for the DSP symbol - * started. - * @cur_best_offset: Best offset to start looking for the DSP symbol - * @sym_addr: Address of the DSP symbol - * @name: Symbol name - * - */ -struct find_symbol_context { - /* input */ - u32 address; - u32 offset_range; - /* state */ - u32 cur_best_offset; - /* output */ - u32 sym_addr; - char name[120]; -}; - -/** - * find_symbol_callback() - Validates symbol address and copies the symbol name - * to the user data. - * @elem: dsp library context - * @user_data: Find symbol context - * - */ -void find_symbol_callback(void *elem, void *user_data) -{ - struct dbll_symbol *symbol = elem; - struct find_symbol_context *context = user_data; - u32 symbol_addr = symbol->value.value; - u32 offset = context->address - symbol_addr; - - /* - * Address given should be greater than symbol address, - * symbol address should be within specified range - * and the offset should be better than previous one - */ - if (context->address >= symbol_addr && symbol_addr < (u32)-1 && - offset < context->cur_best_offset) { - context->cur_best_offset = offset; - context->sym_addr = symbol_addr; - strlcpy(context->name, symbol->name, sizeof(context->name)); - } - - return; -} - -/** - * dbll_find_dsp_symbol() - This function retrieves the dsp symbol from the dsp binary. - * @zl_lib: DSP binary obj library pointer - * @address: Given address to find the dsp symbol - * @offset_range: offset range to look for dsp symbol - * @sym_addr_output: Symbol Output address - * @name_output: String with the dsp symbol - * - * This function retrieves the dsp symbol from the dsp binary. - */ -bool dbll_find_dsp_symbol(struct dbll_library_obj *zl_lib, u32 address, - u32 offset_range, u32 *sym_addr_output, - char *name_output) -{ - bool status = false; - struct find_symbol_context context; - - context.address = address; - context.offset_range = offset_range; - context.cur_best_offset = offset_range; - context.sym_addr = 0; - context.name[0] = '\0'; - - gh_iterate(zl_lib->sym_tab, find_symbol_callback, &context); - - if (context.name[0]) { - status = true; - strcpy(name_output, context.name); - *sym_addr_output = context.sym_addr; - } - - return status; -} -#endif diff --git a/drivers/staging/tidspbridge/pmgr/dev.c b/drivers/staging/tidspbridge/pmgr/dev.c deleted file mode 100644 index 616dc1f63070..000000000000 --- a/drivers/staging/tidspbridge/pmgr/dev.c +++ /dev/null @@ -1,969 +0,0 @@ -/* - * dev.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Implementation of Bridge Bridge driver device operations. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include -#include - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- Platform Manager */ -#include -#include -#include -#include - -/* ----------------------------------- Resource Manager */ -#include -#include - -/* ----------------------------------- Others */ -#include /* DSP API version info. */ - -#include -#include -#include -#include -#include - -/* ----------------------------------- This */ -#include - -/* ----------------------------------- Defines, Data Structures, Typedefs */ - -#define MAKEVERSION(major, minor) (major * 10 + minor) -#define BRD_API_VERSION MAKEVERSION(BRD_API_MAJOR_VERSION, \ - BRD_API_MINOR_VERSION) - -/* The Bridge device object: */ -struct dev_object { - struct list_head link; /* Link to next dev_object. */ - u8 dev_type; /* Device Type */ - struct cfg_devnode *dev_node_obj; /* Platform specific dev id */ - /* Bridge Context Handle */ - struct bridge_dev_context *bridge_context; - /* Function interface to Bridge driver. */ - struct bridge_drv_interface bridge_interface; - struct brd_object *lock_owner; /* Client with exclusive access. */ - struct cod_manager *cod_mgr; /* Code manager handle. */ - struct chnl_mgr *chnl_mgr; /* Channel manager. */ - struct deh_mgr *deh_mgr; /* DEH manager. */ - struct msg_mgr *msg_mgr; /* Message manager. */ - struct io_mgr *iomgr; /* IO manager (CHNL, msg_ctrl) */ - struct cmm_object *cmm_mgr; /* SM memory manager. */ - struct dmm_object *dmm_mgr; /* Dynamic memory manager. */ - u32 word_size; /* DSP word size: quick access. */ - struct drv_object *drv_obj; /* Driver Object */ - /* List of Processors attached to this device */ - struct list_head proc_list; - struct node_mgr *node_mgr; -}; - -struct drv_ext { - struct list_head link; - char sz_string[MAXREGPATHLENGTH]; -}; - -/* ----------------------------------- Function Prototypes */ -static int fxn_not_implemented(int arg, ...); -static int init_cod_mgr(struct dev_object *dev_obj); -static void store_interface_fxns(struct bridge_drv_interface *drv_fxns, - struct bridge_drv_interface *intf_fxns); -/* - * ======== dev_brd_write_fxn ======== - * Purpose: - * Exported function to be used as the COD write function. This function - * is passed a handle to a DEV_hObject, then calls the - * device's bridge_brd_write() function. - */ -u32 dev_brd_write_fxn(void *arb, u32 dsp_add, void *host_buf, - u32 ul_num_bytes, u32 mem_space) -{ - struct dev_object *dev_obj = (struct dev_object *)arb; - u32 ul_written = 0; - int status; - - if (dev_obj) { - /* Require of BrdWrite() */ - status = (*dev_obj->bridge_interface.brd_write) ( - dev_obj->bridge_context, host_buf, - dsp_add, ul_num_bytes, mem_space); - /* Special case of getting the address only */ - if (ul_num_bytes == 0) - ul_num_bytes = 1; - if (!status) - ul_written = ul_num_bytes; - - } - return ul_written; -} - -/* - * ======== dev_create_device ======== - * Purpose: - * Called by the operating system to load the PM Bridge Driver for a - * PM board (device). - */ -int dev_create_device(struct dev_object **device_obj, - const char *driver_file_name, - struct cfg_devnode *dev_node_obj) -{ - struct cfg_hostres *host_res; - struct bridge_drv_interface *drv_fxns = NULL; - struct dev_object *dev_obj = NULL; - struct chnl_mgrattrs mgr_attrs; - struct io_attrs io_mgr_attrs; - u32 num_windows; - struct drv_object *hdrv_obj = NULL; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - int status = 0; - - status = drv_request_bridge_res_dsp((void *)&host_res); - - if (status) { - dev_dbg(bridge, "%s: Failed to reserve bridge resources\n", - __func__); - goto leave; - } - - /* Get the Bridge driver interface functions */ - bridge_drv_entry(&drv_fxns, driver_file_name); - - /* Retrieve the Object handle from the driver data */ - if (drv_datap && drv_datap->drv_object) { - hdrv_obj = drv_datap->drv_object; - } else { - status = -EPERM; - pr_err("%s: Failed to retrieve the object handle\n", __func__); - } - - /* Create the device object, and pass a handle to the Bridge driver for - * storage. */ - if (!status) { - dev_obj = kzalloc(sizeof(struct dev_object), GFP_KERNEL); - if (dev_obj) { - /* Fill out the rest of the Dev Object structure: */ - dev_obj->dev_node_obj = dev_node_obj; - dev_obj->cod_mgr = NULL; - dev_obj->chnl_mgr = NULL; - dev_obj->deh_mgr = NULL; - dev_obj->lock_owner = NULL; - dev_obj->word_size = DSPWORDSIZE; - dev_obj->drv_obj = hdrv_obj; - dev_obj->dev_type = DSP_UNIT; - /* Store this Bridge's interface functions, based on its - * version. */ - store_interface_fxns(drv_fxns, - &dev_obj->bridge_interface); - - /* Call fxn_dev_create() to get the Bridge's device - * context handle. */ - status = (dev_obj->bridge_interface.dev_create) - (&dev_obj->bridge_context, dev_obj, - host_res); - } else { - status = -ENOMEM; - } - } - /* Attempt to create the COD manager for this device: */ - if (!status) - status = init_cod_mgr(dev_obj); - - /* Attempt to create the channel manager for this device: */ - if (!status) { - mgr_attrs.max_channels = CHNL_MAXCHANNELS; - io_mgr_attrs.birq = host_res->birq_registers; - io_mgr_attrs.irq_shared = - (host_res->birq_attrib & CFG_IRQSHARED); - io_mgr_attrs.word_size = DSPWORDSIZE; - mgr_attrs.word_size = DSPWORDSIZE; - num_windows = host_res->num_mem_windows; - if (num_windows) { - /* Assume last memory window is for CHNL */ - io_mgr_attrs.shm_base = host_res->mem_base[1] + - host_res->offset_for_monitor; - io_mgr_attrs.sm_length = - host_res->mem_length[1] - - host_res->offset_for_monitor; - } else { - io_mgr_attrs.shm_base = 0; - io_mgr_attrs.sm_length = 0; - pr_err("%s: No memory reserved for shared structures\n", - __func__); - } - status = chnl_create(&dev_obj->chnl_mgr, dev_obj, &mgr_attrs); - if (status == -ENOSYS) { - /* It's OK for a device not to have a channel - * manager: */ - status = 0; - } - /* Create CMM mgr even if Msg Mgr not impl. */ - status = cmm_create(&dev_obj->cmm_mgr, - (struct dev_object *)dev_obj, NULL); - /* Only create IO manager if we have a channel manager */ - if (!status && dev_obj->chnl_mgr) { - status = io_create(&dev_obj->iomgr, dev_obj, - &io_mgr_attrs); - } - /* Only create DEH manager if we have an IO manager */ - if (!status) { - /* Instantiate the DEH module */ - status = bridge_deh_create(&dev_obj->deh_mgr, dev_obj); - } - /* Create DMM mgr . */ - status = dmm_create(&dev_obj->dmm_mgr, - (struct dev_object *)dev_obj, NULL); - } - /* Add the new DEV_Object to the global list: */ - if (!status) - status = drv_insert_dev_object(hdrv_obj, dev_obj); - - /* Create the Processor List */ - if (!status) - INIT_LIST_HEAD(&dev_obj->proc_list); -leave: - /* If all went well, return a handle to the dev object; - * else, cleanup and return NULL in the OUT parameter. */ - if (!status) { - *device_obj = dev_obj; - } else { - if (dev_obj) { - if (dev_obj->cod_mgr) - cod_delete(dev_obj->cod_mgr); - if (dev_obj->dmm_mgr) - dmm_destroy(dev_obj->dmm_mgr); - kfree(dev_obj); - } - - *device_obj = NULL; - } - - return status; -} - -/* - * ======== dev_create2 ======== - * Purpose: - * After successful loading of the image from api_init_complete2 - * (PROC Auto_Start) or proc_load this fxn is called. This creates - * the Node Manager and updates the DEV Object. - */ -int dev_create2(struct dev_object *hdev_obj) -{ - int status = 0; - struct dev_object *dev_obj = hdev_obj; - - /* There can be only one Node Manager per DEV object */ - status = node_create_mgr(&dev_obj->node_mgr, hdev_obj); - if (status) - dev_obj->node_mgr = NULL; - - return status; -} - -/* - * ======== dev_destroy2 ======== - * Purpose: - * Destroys the Node manager for this device. - */ -int dev_destroy2(struct dev_object *hdev_obj) -{ - int status = 0; - struct dev_object *dev_obj = hdev_obj; - - if (dev_obj->node_mgr) { - if (node_delete_mgr(dev_obj->node_mgr)) - status = -EPERM; - else - dev_obj->node_mgr = NULL; - - } - - return status; -} - -/* - * ======== dev_destroy_device ======== - * Purpose: - * Destroys the channel manager for this device, if any, calls - * bridge_dev_destroy(), and then attempts to unload the Bridge module. - */ -int dev_destroy_device(struct dev_object *hdev_obj) -{ - int status = 0; - struct dev_object *dev_obj = hdev_obj; - - if (hdev_obj) { - if (dev_obj->cod_mgr) { - cod_delete(dev_obj->cod_mgr); - dev_obj->cod_mgr = NULL; - } - - if (dev_obj->node_mgr) { - node_delete_mgr(dev_obj->node_mgr); - dev_obj->node_mgr = NULL; - } - - /* Free the io, channel, and message managers for this board: */ - if (dev_obj->iomgr) { - io_destroy(dev_obj->iomgr); - dev_obj->iomgr = NULL; - } - if (dev_obj->chnl_mgr) { - chnl_destroy(dev_obj->chnl_mgr); - dev_obj->chnl_mgr = NULL; - } - if (dev_obj->msg_mgr) { - msg_delete(dev_obj->msg_mgr); - dev_obj->msg_mgr = NULL; - } - - if (dev_obj->deh_mgr) { - /* Uninitialize DEH module. */ - bridge_deh_destroy(dev_obj->deh_mgr); - dev_obj->deh_mgr = NULL; - } - if (dev_obj->cmm_mgr) { - cmm_destroy(dev_obj->cmm_mgr, true); - dev_obj->cmm_mgr = NULL; - } - - if (dev_obj->dmm_mgr) { - dmm_destroy(dev_obj->dmm_mgr); - dev_obj->dmm_mgr = NULL; - } - - /* Call the driver's bridge_dev_destroy() function: */ - /* Require of DevDestroy */ - if (dev_obj->bridge_context) { - status = (*dev_obj->bridge_interface.dev_destroy) - (dev_obj->bridge_context); - dev_obj->bridge_context = NULL; - } else - status = -EPERM; - if (!status) { - /* Remove this DEV_Object from the global list: */ - drv_remove_dev_object(dev_obj->drv_obj, dev_obj); - /* Free The library * LDR_FreeModule - * (dev_obj->module_obj); */ - /* Free this dev object: */ - kfree(dev_obj); - dev_obj = NULL; - } - } else { - status = -EFAULT; - } - - return status; -} - -/* - * ======== dev_get_chnl_mgr ======== - * Purpose: - * Retrieve the handle to the channel manager handle created for this - * device. - */ -int dev_get_chnl_mgr(struct dev_object *hdev_obj, - struct chnl_mgr **mgr) -{ - int status = 0; - struct dev_object *dev_obj = hdev_obj; - - if (hdev_obj) { - *mgr = dev_obj->chnl_mgr; - } else { - *mgr = NULL; - status = -EFAULT; - } - - return status; -} - -/* - * ======== dev_get_cmm_mgr ======== - * Purpose: - * Retrieve the handle to the shared memory manager created for this - * device. - */ -int dev_get_cmm_mgr(struct dev_object *hdev_obj, - struct cmm_object **mgr) -{ - int status = 0; - struct dev_object *dev_obj = hdev_obj; - - if (hdev_obj) { - *mgr = dev_obj->cmm_mgr; - } else { - *mgr = NULL; - status = -EFAULT; - } - - return status; -} - -/* - * ======== dev_get_dmm_mgr ======== - * Purpose: - * Retrieve the handle to the dynamic memory manager created for this - * device. - */ -int dev_get_dmm_mgr(struct dev_object *hdev_obj, - struct dmm_object **mgr) -{ - int status = 0; - struct dev_object *dev_obj = hdev_obj; - - if (hdev_obj) { - *mgr = dev_obj->dmm_mgr; - } else { - *mgr = NULL; - status = -EFAULT; - } - - return status; -} - -/* - * ======== dev_get_cod_mgr ======== - * Purpose: - * Retrieve the COD manager create for this device. - */ -int dev_get_cod_mgr(struct dev_object *hdev_obj, - struct cod_manager **cod_mgr) -{ - int status = 0; - struct dev_object *dev_obj = hdev_obj; - - if (hdev_obj) { - *cod_mgr = dev_obj->cod_mgr; - } else { - *cod_mgr = NULL; - status = -EFAULT; - } - - return status; -} - -/* - * ========= dev_get_deh_mgr ======== - */ -int dev_get_deh_mgr(struct dev_object *hdev_obj, - struct deh_mgr **deh_manager) -{ - int status = 0; - - if (hdev_obj) { - *deh_manager = hdev_obj->deh_mgr; - } else { - *deh_manager = NULL; - status = -EFAULT; - } - return status; -} - -/* - * ======== dev_get_dev_node ======== - * Purpose: - * Retrieve the platform specific device ID for this device. - */ -int dev_get_dev_node(struct dev_object *hdev_obj, - struct cfg_devnode **dev_nde) -{ - int status = 0; - struct dev_object *dev_obj = hdev_obj; - - if (hdev_obj) { - *dev_nde = dev_obj->dev_node_obj; - } else { - *dev_nde = NULL; - status = -EFAULT; - } - - return status; -} - -/* - * ======== dev_get_first ======== - * Purpose: - * Retrieve the first Device Object handle from an internal linked list - * DEV_OBJECTs maintained by DEV. - */ -struct dev_object *dev_get_first(void) -{ - struct dev_object *dev_obj = NULL; - - dev_obj = (struct dev_object *)drv_get_first_dev_object(); - - return dev_obj; -} - -/* - * ======== dev_get_intf_fxns ======== - * Purpose: - * Retrieve the Bridge interface function structure for the loaded driver. - * if_fxns != NULL. - */ -int dev_get_intf_fxns(struct dev_object *hdev_obj, - struct bridge_drv_interface **if_fxns) -{ - int status = 0; - struct dev_object *dev_obj = hdev_obj; - - if (hdev_obj) { - *if_fxns = &dev_obj->bridge_interface; - } else { - *if_fxns = NULL; - status = -EFAULT; - } - - return status; -} - -/* - * ========= dev_get_io_mgr ======== - */ -int dev_get_io_mgr(struct dev_object *hdev_obj, - struct io_mgr **io_man) -{ - int status = 0; - - if (hdev_obj) { - *io_man = hdev_obj->iomgr; - } else { - *io_man = NULL; - status = -EFAULT; - } - - return status; -} - -/* - * ======== dev_get_next ======== - * Purpose: - * Retrieve the next Device Object handle from an internal linked list - * of DEV_OBJECTs maintained by DEV, after having previously called - * dev_get_first() and zero or more dev_get_next - */ -struct dev_object *dev_get_next(struct dev_object *hdev_obj) -{ - struct dev_object *next_dev_object = NULL; - - if (hdev_obj) { - next_dev_object = (struct dev_object *) - drv_get_next_dev_object((u32) hdev_obj); - } - - return next_dev_object; -} - -/* - * ========= dev_get_msg_mgr ======== - */ -void dev_get_msg_mgr(struct dev_object *hdev_obj, struct msg_mgr **msg_man) -{ - *msg_man = hdev_obj->msg_mgr; -} - -/* - * ======== dev_get_node_manager ======== - * Purpose: - * Retrieve the Node Manager Handle - */ -int dev_get_node_manager(struct dev_object *hdev_obj, - struct node_mgr **node_man) -{ - int status = 0; - struct dev_object *dev_obj = hdev_obj; - - if (hdev_obj) { - *node_man = dev_obj->node_mgr; - } else { - *node_man = NULL; - status = -EFAULT; - } - - return status; -} - -/* - * ======== dev_get_symbol ======== - */ -int dev_get_symbol(struct dev_object *hdev_obj, - const char *str_sym, u32 *pul_value) -{ - int status = 0; - struct cod_manager *cod_mgr; - - if (hdev_obj) { - status = dev_get_cod_mgr(hdev_obj, &cod_mgr); - if (cod_mgr) - status = cod_get_sym_value(cod_mgr, (char *)str_sym, - pul_value); - else - status = -EFAULT; - } - - return status; -} - -/* - * ======== dev_get_bridge_context ======== - * Purpose: - * Retrieve the Bridge Context handle, as returned by the - * bridge_dev_create fxn. - */ -int dev_get_bridge_context(struct dev_object *hdev_obj, - struct bridge_dev_context **phbridge_context) -{ - int status = 0; - struct dev_object *dev_obj = hdev_obj; - - if (hdev_obj) { - *phbridge_context = dev_obj->bridge_context; - } else { - *phbridge_context = NULL; - status = -EFAULT; - } - - return status; -} - -/* - * ======== dev_notify_clients ======== - * Purpose: - * Notify all clients of this device of a change in device status. - */ -int dev_notify_clients(struct dev_object *dev_obj, u32 ret) -{ - struct list_head *curr; - - /* - * FIXME: this code needs struct proc_object to have a list_head - * at the beginning. If not, this can go horribly wrong. - */ - list_for_each(curr, &dev_obj->proc_list) - proc_notify_clients((void *)curr, ret); - - return 0; -} - -/* - * ======== dev_remove_device ======== - */ -int dev_remove_device(struct cfg_devnode *dev_node_obj) -{ - struct dev_object *hdev_obj; /* handle to device object */ - int status = 0; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - if (!drv_datap) - status = -ENODATA; - - if (!dev_node_obj) - status = -EFAULT; - - /* Retrieve the device object handle originally stored with - * the dev_node: */ - if (!status) { - /* check the device string and then store dev object */ - if (!strcmp((char *)((struct drv_ext *)dev_node_obj)->sz_string, - "TIOMAP1510")) { - hdev_obj = drv_datap->dev_object; - /* Destroy the device object. */ - status = dev_destroy_device(hdev_obj); - } else { - status = -EPERM; - } - } - - if (status) - pr_err("%s: Failed, status 0x%x\n", __func__, status); - - return status; -} - -/* - * ======== dev_set_chnl_mgr ======== - * Purpose: - * Set the channel manager for this device. - */ -int dev_set_chnl_mgr(struct dev_object *hdev_obj, - struct chnl_mgr *hmgr) -{ - int status = 0; - struct dev_object *dev_obj = hdev_obj; - - if (hdev_obj) - dev_obj->chnl_mgr = hmgr; - else - status = -EFAULT; - - return status; -} - -/* - * ======== dev_set_msg_mgr ======== - * Purpose: - * Set the message manager for this device. - */ -void dev_set_msg_mgr(struct dev_object *hdev_obj, struct msg_mgr *hmgr) -{ - hdev_obj->msg_mgr = hmgr; -} - -/* - * ======== dev_start_device ======== - * Purpose: - * Initializes the new device with the BRIDGE environment. - */ -int dev_start_device(struct cfg_devnode *dev_node_obj) -{ - struct dev_object *hdev_obj = NULL; /* handle to 'Bridge Device */ - /* Bridge driver filename */ - char *bridge_file_name = "UMA"; - int status; - struct mgr_object *hmgr_obj = NULL; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - /* Given all resources, create a device object. */ - status = dev_create_device(&hdev_obj, bridge_file_name, - dev_node_obj); - if (!status) { - /* Store away the hdev_obj with the DEVNODE */ - if (!drv_datap || !dev_node_obj) { - status = -EFAULT; - pr_err("%s: Failed, status 0x%x\n", __func__, status); - } else if (!(strcmp((char *)dev_node_obj, "TIOMAP1510"))) { - drv_datap->dev_object = (void *) hdev_obj; - } - if (!status) { - /* Create the Manager Object */ - status = mgr_create(&hmgr_obj, dev_node_obj); - if (status && !(strcmp((char *)dev_node_obj, - "TIOMAP1510"))) { - /* Ensure the device extension is NULL */ - drv_datap->dev_object = NULL; - } - } - if (status) { - /* Clean up */ - dev_destroy_device(hdev_obj); - hdev_obj = NULL; - } - } - - return status; -} - -/* - * ======== fxn_not_implemented ======== - * Purpose: - * Takes the place of a Bridge Null Function. - * Parameters: - * Multiple, optional. - * Returns: - * -ENOSYS: Always. - */ -static int fxn_not_implemented(int arg, ...) -{ - return -ENOSYS; -} - -/* - * ======== init_cod_mgr ======== - * Purpose: - * Create a COD manager for this device. - * Parameters: - * dev_obj: Pointer to device object created with - * dev_create_device() - * Returns: - * 0: Success. - * -EFAULT: Invalid hdev_obj. - * Requires: - * Should only be called once by dev_create_device() for a given DevObject. - * Ensures: - */ -static int init_cod_mgr(struct dev_object *dev_obj) -{ - int status = 0; - char *sz_dummy_file = "dummy"; - - status = cod_create(&dev_obj->cod_mgr, sz_dummy_file); - - return status; -} - -/* - * ======== dev_insert_proc_object ======== - * Purpose: - * Insert a ProcObject into the list maintained by DEV. - * Parameters: - * p_proc_object: Ptr to ProcObject to insert. - * dev_obj: Ptr to Dev Object where the list is. - * already_attached: Ptr to return the bool - * Returns: - * 0: If successful. - * Requires: - * List Exists - * hdev_obj is Valid handle - * DEV Initialized - * already_attached != NULL - * proc_obj != 0 - * Ensures: - * 0 and List is not Empty. - */ -int dev_insert_proc_object(struct dev_object *hdev_obj, - u32 proc_obj, bool *already_attached) -{ - struct dev_object *dev_obj = (struct dev_object *)hdev_obj; - - if (!list_empty(&dev_obj->proc_list)) - *already_attached = true; - - /* Add DevObject to tail. */ - /* - * FIXME: this code needs struct proc_object to have a list_head - * at the beginning. If not, this can go horribly wrong. - */ - list_add_tail((struct list_head *)proc_obj, &dev_obj->proc_list); - - return 0; -} - -/* - * ======== dev_remove_proc_object ======== - * Purpose: - * Search for and remove a Proc object from the given list maintained - * by the DEV - * Parameters: - * p_proc_object: Ptr to ProcObject to insert. - * dev_obj Ptr to Dev Object where the list is. - * Returns: - * 0: If successful. - * Requires: - * List exists and is not empty - * proc_obj != 0 - * hdev_obj is a valid Dev handle. - * Ensures: - * Details: - * List will be deleted when the DEV is destroyed. - */ -int dev_remove_proc_object(struct dev_object *hdev_obj, u32 proc_obj) -{ - int status = -EPERM; - struct list_head *cur_elem; - struct dev_object *dev_obj = (struct dev_object *)hdev_obj; - - /* Search list for dev_obj: */ - list_for_each(cur_elem, &dev_obj->proc_list) { - if ((u32) cur_elem == proc_obj) { - list_del(cur_elem); - status = 0; - break; - } - } - - return status; -} - -int dev_get_dev_type(struct dev_object *dev_obj, u8 *dev_type) -{ - *dev_type = dev_obj->dev_type; - return 0; -} - -/* - * ======== store_interface_fxns ======== - * Purpose: - * Copy the Bridge's interface functions into the device object, - * ensuring that fxn_not_implemented() is set for: - * - * 1. All Bridge function pointers which are NULL; and - * 2. All function slots in the struct dev_object structure which have no - * corresponding slots in the the Bridge's interface, because the Bridge - * is of an *older* version. - * Parameters: - * intf_fxns: Interface fxn Structure of the Bridge's Dev Object. - * drv_fxns: Interface Fxns offered by the Bridge during DEV_Create(). - * Returns: - * Requires: - * Input pointers are valid. - * Bridge driver is *not* written for a newer DSP API. - * Ensures: - * All function pointers in the dev object's fxn interface are not NULL. - */ -static void store_interface_fxns(struct bridge_drv_interface *drv_fxns, - struct bridge_drv_interface *intf_fxns) -{ - u32 bridge_version; - - /* Local helper macro: */ -#define STORE_FXN(cast, pfn) \ - (intf_fxns->pfn = ((drv_fxns->pfn != NULL) ? drv_fxns->pfn : \ - (cast)fxn_not_implemented)) - - bridge_version = MAKEVERSION(drv_fxns->brd_api_major_version, - drv_fxns->brd_api_minor_version); - intf_fxns->brd_api_major_version = drv_fxns->brd_api_major_version; - intf_fxns->brd_api_minor_version = drv_fxns->brd_api_minor_version; - /* Install functions up to DSP API version .80 (first alpha): */ - if (bridge_version > 0) { - STORE_FXN(fxn_dev_create, dev_create); - STORE_FXN(fxn_dev_destroy, dev_destroy); - STORE_FXN(fxn_dev_ctrl, dev_cntrl); - STORE_FXN(fxn_brd_monitor, brd_monitor); - STORE_FXN(fxn_brd_start, brd_start); - STORE_FXN(fxn_brd_stop, brd_stop); - STORE_FXN(fxn_brd_status, brd_status); - STORE_FXN(fxn_brd_read, brd_read); - STORE_FXN(fxn_brd_write, brd_write); - STORE_FXN(fxn_brd_setstate, brd_set_state); - STORE_FXN(fxn_brd_memcopy, brd_mem_copy); - STORE_FXN(fxn_brd_memwrite, brd_mem_write); - STORE_FXN(fxn_brd_memmap, brd_mem_map); - STORE_FXN(fxn_brd_memunmap, brd_mem_un_map); - STORE_FXN(fxn_chnl_create, chnl_create); - STORE_FXN(fxn_chnl_destroy, chnl_destroy); - STORE_FXN(fxn_chnl_open, chnl_open); - STORE_FXN(fxn_chnl_close, chnl_close); - STORE_FXN(fxn_chnl_addioreq, chnl_add_io_req); - STORE_FXN(fxn_chnl_getioc, chnl_get_ioc); - STORE_FXN(fxn_chnl_cancelio, chnl_cancel_io); - STORE_FXN(fxn_chnl_flushio, chnl_flush_io); - STORE_FXN(fxn_chnl_getinfo, chnl_get_info); - STORE_FXN(fxn_chnl_getmgrinfo, chnl_get_mgr_info); - STORE_FXN(fxn_chnl_idle, chnl_idle); - STORE_FXN(fxn_chnl_registernotify, chnl_register_notify); - STORE_FXN(fxn_io_create, io_create); - STORE_FXN(fxn_io_destroy, io_destroy); - STORE_FXN(fxn_io_onloaded, io_on_loaded); - STORE_FXN(fxn_io_getprocload, io_get_proc_load); - STORE_FXN(fxn_msg_create, msg_create); - STORE_FXN(fxn_msg_createqueue, msg_create_queue); - STORE_FXN(fxn_msg_delete, msg_delete); - STORE_FXN(fxn_msg_deletequeue, msg_delete_queue); - STORE_FXN(fxn_msg_get, msg_get); - STORE_FXN(fxn_msg_put, msg_put); - STORE_FXN(fxn_msg_registernotify, msg_register_notify); - STORE_FXN(fxn_msg_setqueueid, msg_set_queue_id); - } - /* Add code for any additional functions in newerBridge versions here */ -#undef STORE_FXN -} diff --git a/drivers/staging/tidspbridge/pmgr/dmm.c b/drivers/staging/tidspbridge/pmgr/dmm.c deleted file mode 100644 index fcf564aa566d..000000000000 --- a/drivers/staging/tidspbridge/pmgr/dmm.c +++ /dev/null @@ -1,487 +0,0 @@ -/* - * dmm.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * The Dynamic Memory Manager (DMM) module manages the DSP Virtual address - * space that can be directly mapped to any MPU buffer or memory region - * - * Notes: - * Region: Generic memory entitiy having a start address and a size - * Chunk: Reserved region - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- OS Adaptation Layer */ -#include - -/* ----------------------------------- Platform Manager */ -#include -#include - -/* ----------------------------------- This */ -#include - -/* ----------------------------------- Defines, Data Structures, Typedefs */ -#define DMM_ADDR_VIRTUAL(a) \ - (((struct map_page *)(a) - virtual_mapping_table) * PG_SIZE4K +\ - dyn_mem_map_beg) -#define DMM_ADDR_TO_INDEX(a) (((a) - dyn_mem_map_beg) / PG_SIZE4K) - -/* DMM Mgr */ -struct dmm_object { - /* Dmm Lock is used to serialize access mem manager for - * multi-threads. */ - spinlock_t dmm_lock; /* Lock to access dmm mgr */ -}; - -struct map_page { - u32 region_size:15; - u32 mapped_size:15; - u32 reserved:1; - u32 mapped:1; -}; - -/* Create the free list */ -static struct map_page *virtual_mapping_table; -static u32 free_region; /* The index of free region */ -static u32 free_size; -static u32 dyn_mem_map_beg; /* The Beginning of dynamic memory mapping */ -static u32 table_size; /* The size of virt and phys pages tables */ - -/* ----------------------------------- Function Prototypes */ -static struct map_page *get_region(u32 addr); -static struct map_page *get_free_region(u32 len); -static struct map_page *get_mapped_region(u32 addrs); - -/* ======== dmm_create_tables ======== - * Purpose: - * Create table to hold the information of physical address - * the buffer pages that is passed by the user, and the table - * to hold the information of the virtual memory that is reserved - * for DSP. - */ -int dmm_create_tables(struct dmm_object *dmm_mgr, u32 addr, u32 size) -{ - struct dmm_object *dmm_obj = (struct dmm_object *)dmm_mgr; - int status = 0; - - status = dmm_delete_tables(dmm_obj); - if (!status) { - dyn_mem_map_beg = addr; - table_size = PG_ALIGN_HIGH(size, PG_SIZE4K) / PG_SIZE4K; - /* Create the free list */ - virtual_mapping_table = __vmalloc(table_size * - sizeof(struct map_page), GFP_KERNEL | - __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL); - if (virtual_mapping_table == NULL) - status = -ENOMEM; - else { - /* On successful allocation, - * all entries are zero ('free') */ - free_region = 0; - free_size = table_size * PG_SIZE4K; - virtual_mapping_table[0].region_size = table_size; - } - } - - if (status) - pr_err("%s: failure, status 0x%x\n", __func__, status); - - return status; -} - -/* - * ======== dmm_create ======== - * Purpose: - * Create a dynamic memory manager object. - */ -int dmm_create(struct dmm_object **dmm_manager, - struct dev_object *hdev_obj, - const struct dmm_mgrattrs *mgr_attrts) -{ - struct dmm_object *dmm_obj = NULL; - int status = 0; - - *dmm_manager = NULL; - /* create, zero, and tag a cmm mgr object */ - dmm_obj = kzalloc(sizeof(struct dmm_object), GFP_KERNEL); - if (dmm_obj != NULL) { - spin_lock_init(&dmm_obj->dmm_lock); - *dmm_manager = dmm_obj; - } else { - status = -ENOMEM; - } - - return status; -} - -/* - * ======== dmm_destroy ======== - * Purpose: - * Release the communication memory manager resources. - */ -int dmm_destroy(struct dmm_object *dmm_mgr) -{ - struct dmm_object *dmm_obj = (struct dmm_object *)dmm_mgr; - int status = 0; - - if (dmm_mgr) { - status = dmm_delete_tables(dmm_obj); - if (!status) - kfree(dmm_obj); - } else - status = -EFAULT; - - return status; -} - -/* - * ======== dmm_delete_tables ======== - * Purpose: - * Delete DMM Tables. - */ -int dmm_delete_tables(struct dmm_object *dmm_mgr) -{ - int status = 0; - - /* Delete all DMM tables */ - if (dmm_mgr) - vfree(virtual_mapping_table); - else - status = -EFAULT; - return status; -} - -/* - * ======== dmm_get_handle ======== - * Purpose: - * Return the dynamic memory manager object for this device. - * This is typically called from the client process. - */ -int dmm_get_handle(void *hprocessor, struct dmm_object **dmm_manager) -{ - int status = 0; - struct dev_object *hdev_obj; - - if (hprocessor != NULL) - status = proc_get_dev_object(hprocessor, &hdev_obj); - else - hdev_obj = dev_get_first(); /* default */ - - if (!status) - status = dev_get_dmm_mgr(hdev_obj, dmm_manager); - - return status; -} - -/* - * ======== dmm_map_memory ======== - * Purpose: - * Add a mapping block to the reserved chunk. DMM assumes that this block - * will be mapped in the DSP/IVA's address space. DMM returns an error if a - * mapping overlaps another one. This function stores the info that will be - * required later while unmapping the block. - */ -int dmm_map_memory(struct dmm_object *dmm_mgr, u32 addr, u32 size) -{ - struct dmm_object *dmm_obj = (struct dmm_object *)dmm_mgr; - struct map_page *chunk; - int status = 0; - - spin_lock(&dmm_obj->dmm_lock); - /* Find the Reserved memory chunk containing the DSP block to - * be mapped */ - chunk = (struct map_page *)get_region(addr); - if (chunk != NULL) { - /* Mark the region 'mapped', leave the 'reserved' info as-is */ - chunk->mapped = true; - chunk->mapped_size = (size / PG_SIZE4K); - } else - status = -ENOENT; - spin_unlock(&dmm_obj->dmm_lock); - - dev_dbg(bridge, "%s dmm_mgr %p, addr %x, size %x\n\tstatus %x, chunk %p", - __func__, dmm_mgr, addr, size, status, chunk); - - return status; -} - -/* - * ======== dmm_reserve_memory ======== - * Purpose: - * Reserve a chunk of virtually contiguous DSP/IVA address space. - */ -int dmm_reserve_memory(struct dmm_object *dmm_mgr, u32 size, - u32 *prsv_addr) -{ - int status = 0; - struct dmm_object *dmm_obj = (struct dmm_object *)dmm_mgr; - struct map_page *node; - u32 rsv_addr = 0; - u32 rsv_size = 0; - - spin_lock(&dmm_obj->dmm_lock); - - /* Try to get a DSP chunk from the free list */ - node = get_free_region(size); - if (node != NULL) { - /* DSP chunk of given size is available. */ - rsv_addr = DMM_ADDR_VIRTUAL(node); - /* Calculate the number entries to use */ - rsv_size = size / PG_SIZE4K; - if (rsv_size < node->region_size) { - /* Mark remainder of free region */ - node[rsv_size].mapped = false; - node[rsv_size].reserved = false; - node[rsv_size].region_size = - node->region_size - rsv_size; - node[rsv_size].mapped_size = 0; - } - /* get_region will return first fit chunk. But we only use what - is requested. */ - node->mapped = false; - node->reserved = true; - node->region_size = rsv_size; - node->mapped_size = 0; - /* Return the chunk's starting address */ - *prsv_addr = rsv_addr; - } else - /*dSP chunk of given size is not available */ - status = -ENOMEM; - - spin_unlock(&dmm_obj->dmm_lock); - - dev_dbg(bridge, "%s dmm_mgr %p, size %x, prsv_addr %p\n\tstatus %x, rsv_addr %x, rsv_size %x\n", - __func__, dmm_mgr, size, - prsv_addr, status, rsv_addr, rsv_size); - - return status; -} - -/* - * ======== dmm_un_map_memory ======== - * Purpose: - * Remove the mapped block from the reserved chunk. - */ -int dmm_un_map_memory(struct dmm_object *dmm_mgr, u32 addr, u32 *psize) -{ - struct dmm_object *dmm_obj = (struct dmm_object *)dmm_mgr; - struct map_page *chunk; - int status = 0; - - spin_lock(&dmm_obj->dmm_lock); - chunk = get_mapped_region(addr); - if (chunk == NULL) - status = -ENOENT; - - if (!status) { - /* Unmap the region */ - *psize = chunk->mapped_size * PG_SIZE4K; - chunk->mapped = false; - chunk->mapped_size = 0; - } - spin_unlock(&dmm_obj->dmm_lock); - - dev_dbg(bridge, "%s: dmm_mgr %p, addr %x, psize %p\n\tstatus %x, chunk %p\n", - __func__, dmm_mgr, addr, psize, status, chunk); - - return status; -} - -/* - * ======== dmm_un_reserve_memory ======== - * Purpose: - * Free a chunk of reserved DSP/IVA address space. - */ -int dmm_un_reserve_memory(struct dmm_object *dmm_mgr, u32 rsv_addr) -{ - struct dmm_object *dmm_obj = (struct dmm_object *)dmm_mgr; - struct map_page *chunk; - u32 i; - int status = 0; - u32 chunk_size; - - spin_lock(&dmm_obj->dmm_lock); - - /* Find the chunk containing the reserved address */ - chunk = get_mapped_region(rsv_addr); - if (chunk == NULL) - status = -ENOENT; - - if (!status) { - /* Free all the mapped pages for this reserved region */ - i = 0; - while (i < chunk->region_size) { - if (chunk[i].mapped) { - /* Remove mapping from the page tables. */ - chunk_size = chunk[i].mapped_size; - /* Clear the mapping flags */ - chunk[i].mapped = false; - chunk[i].mapped_size = 0; - i += chunk_size; - } else - i++; - } - /* Clear the flags (mark the region 'free') */ - chunk->reserved = false; - /* NOTE: We do NOT coalesce free regions here. - * Free regions are coalesced in get_region(), as it traverses - *the whole mapping table - */ - } - spin_unlock(&dmm_obj->dmm_lock); - - dev_dbg(bridge, "%s: dmm_mgr %p, rsv_addr %x\n\tstatus %x chunk %p", - __func__, dmm_mgr, rsv_addr, status, chunk); - - return status; -} - -/* - * ======== get_region ======== - * Purpose: - * Returns a region containing the specified memory region - */ -static struct map_page *get_region(u32 addr) -{ - struct map_page *curr_region = NULL; - u32 i = 0; - - if (virtual_mapping_table != NULL) { - /* find page mapped by this address */ - i = DMM_ADDR_TO_INDEX(addr); - if (i < table_size) - curr_region = virtual_mapping_table + i; - } - - dev_dbg(bridge, "%s: curr_region %p, free_region %d, free_size %d\n", - __func__, curr_region, free_region, free_size); - return curr_region; -} - -/* - * ======== get_free_region ======== - * Purpose: - * Returns the requested free region - */ -static struct map_page *get_free_region(u32 len) -{ - struct map_page *curr_region = NULL; - u32 i = 0; - u32 region_size = 0; - u32 next_i = 0; - - if (virtual_mapping_table == NULL) - return curr_region; - if (len > free_size) { - /* Find the largest free region - * (coalesce during the traversal) */ - while (i < table_size) { - region_size = virtual_mapping_table[i].region_size; - next_i = i + region_size; - if (virtual_mapping_table[i].reserved == false) { - /* Coalesce, if possible */ - if (next_i < table_size && - virtual_mapping_table[next_i].reserved - == false) { - virtual_mapping_table[i].region_size += - virtual_mapping_table - [next_i].region_size; - continue; - } - region_size *= PG_SIZE4K; - if (region_size > free_size) { - free_region = i; - free_size = region_size; - } - } - i = next_i; - } - } - if (len <= free_size) { - curr_region = virtual_mapping_table + free_region; - free_region += (len / PG_SIZE4K); - free_size -= len; - } - return curr_region; -} - -/* - * ======== get_mapped_region ======== - * Purpose: - * Returns the requestedmapped region - */ -static struct map_page *get_mapped_region(u32 addrs) -{ - u32 i = 0; - struct map_page *curr_region = NULL; - - if (virtual_mapping_table == NULL) - return curr_region; - - i = DMM_ADDR_TO_INDEX(addrs); - if (i < table_size && (virtual_mapping_table[i].mapped || - virtual_mapping_table[i].reserved)) - curr_region = virtual_mapping_table + i; - return curr_region; -} - -#ifdef DSP_DMM_DEBUG -u32 dmm_mem_map_dump(struct dmm_object *dmm_mgr) -{ - struct map_page *curr_node = NULL; - u32 i; - u32 freemem = 0; - u32 bigsize = 0; - - spin_lock(&dmm_mgr->dmm_lock); - - if (virtual_mapping_table != NULL) { - for (i = 0; i < table_size; i += - virtual_mapping_table[i].region_size) { - curr_node = virtual_mapping_table + i; - if (curr_node->reserved) { - /*printk("RESERVED size = 0x%x, " - "Map size = 0x%x\n", - (curr_node->region_size * PG_SIZE4K), - (curr_node->mapped == false) ? 0 : - (curr_node->mapped_size * PG_SIZE4K)); - */ - } else { -/* printk("UNRESERVED size = 0x%x\n", - (curr_node->region_size * PG_SIZE4K)); - */ - freemem += (curr_node->region_size * PG_SIZE4K); - if (curr_node->region_size > bigsize) - bigsize = curr_node->region_size; - } - } - } - spin_unlock(&dmm_mgr->dmm_lock); - dev_info(bridge, "Total DSP VA FREE memory = %d Mbytes\n", - freemem / (1024 * 1024)); - dev_info(bridge, "Total DSP VA USED memory= %d Mbytes\n", - (((table_size * PG_SIZE4K) - freemem)) / (1024 * 1024)); - dev_info(bridge, "DSP VA - Biggest FREE block = %d Mbytes\n", - (bigsize * PG_SIZE4K / (1024 * 1024))); - - return 0; -} -#endif diff --git a/drivers/staging/tidspbridge/pmgr/dspapi.c b/drivers/staging/tidspbridge/pmgr/dspapi.c deleted file mode 100644 index c4ccf17d21c0..000000000000 --- a/drivers/staging/tidspbridge/pmgr/dspapi.c +++ /dev/null @@ -1,1841 +0,0 @@ -/* - * dspapi.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Common DSP API functions, also includes the wrapper - * functions called directly by the DeviceIOControl interface. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- OS Adaptation Layer */ -#include - -/* ----------------------------------- Platform Manager */ -#include -#include -#include - -#include -#include - -/* ----------------------------------- Resource Manager */ -#include -#include -#include -#include - -/* ----------------------------------- Others */ -#include -#include -#include - -/* ----------------------------------- This */ -#include -#include - -#include - -/* ----------------------------------- Defines, Data Structures, Typedefs */ -#define MAX_TRACEBUFLEN 255 -#define MAX_LOADARGS 16 -#define MAX_NODES 64 -#define MAX_STREAMS 16 -#define MAX_BUFS 64 - -/* Used to get dspbridge ioctl table */ -#define DB_GET_IOC_TABLE(cmd) (DB_GET_MODULE(cmd) >> DB_MODULE_SHIFT) - -/* Device IOCtl function pointer */ -struct api_cmd { - u32(*fxn) (union trapped_args *args, void *pr_ctxt); - u32 index; -}; - -/* ----------------------------------- Globals */ -static u32 api_c_refs; - -/* - * Function tables. - * The order of these functions MUST be the same as the order of the command - * numbers defined in dspapi-ioctl.h This is how an IOCTL number in user mode - * turns into a function call in kernel mode. - */ - -/* MGR wrapper functions */ -static struct api_cmd mgr_cmd[] = { - {mgrwrap_enum_node_info}, /* MGR_ENUMNODE_INFO */ - {mgrwrap_enum_proc_info}, /* MGR_ENUMPROC_INFO */ - {mgrwrap_register_object}, /* MGR_REGISTEROBJECT */ - {mgrwrap_unregister_object}, /* MGR_UNREGISTEROBJECT */ - {mgrwrap_wait_for_bridge_events}, /* MGR_WAIT */ - {mgrwrap_get_process_resources_info}, /* MGR_GET_PROC_RES */ -}; - -/* PROC wrapper functions */ -static struct api_cmd proc_cmd[] = { - {procwrap_attach}, /* PROC_ATTACH */ - {procwrap_ctrl}, /* PROC_CTRL */ - {procwrap_detach}, /* PROC_DETACH */ - {procwrap_enum_node_info}, /* PROC_ENUMNODE */ - {procwrap_enum_resources}, /* PROC_ENUMRESOURCES */ - {procwrap_get_state}, /* PROC_GET_STATE */ - {procwrap_get_trace}, /* PROC_GET_TRACE */ - {procwrap_load}, /* PROC_LOAD */ - {procwrap_register_notify}, /* PROC_REGISTERNOTIFY */ - {procwrap_start}, /* PROC_START */ - {procwrap_reserve_memory}, /* PROC_RSVMEM */ - {procwrap_un_reserve_memory}, /* PROC_UNRSVMEM */ - {procwrap_map}, /* PROC_MAPMEM */ - {procwrap_un_map}, /* PROC_UNMAPMEM */ - {procwrap_flush_memory}, /* PROC_FLUSHMEMORY */ - {procwrap_stop}, /* PROC_STOP */ - {procwrap_invalidate_memory}, /* PROC_INVALIDATEMEMORY */ - {procwrap_begin_dma}, /* PROC_BEGINDMA */ - {procwrap_end_dma}, /* PROC_ENDDMA */ -}; - -/* NODE wrapper functions */ -static struct api_cmd node_cmd[] = { - {nodewrap_allocate}, /* NODE_ALLOCATE */ - {nodewrap_alloc_msg_buf}, /* NODE_ALLOCMSGBUF */ - {nodewrap_change_priority}, /* NODE_CHANGEPRIORITY */ - {nodewrap_connect}, /* NODE_CONNECT */ - {nodewrap_create}, /* NODE_CREATE */ - {nodewrap_delete}, /* NODE_DELETE */ - {nodewrap_free_msg_buf}, /* NODE_FREEMSGBUF */ - {nodewrap_get_attr}, /* NODE_GETATTR */ - {nodewrap_get_message}, /* NODE_GETMESSAGE */ - {nodewrap_pause}, /* NODE_PAUSE */ - {nodewrap_put_message}, /* NODE_PUTMESSAGE */ - {nodewrap_register_notify}, /* NODE_REGISTERNOTIFY */ - {nodewrap_run}, /* NODE_RUN */ - {nodewrap_terminate}, /* NODE_TERMINATE */ - {nodewrap_get_uuid_props}, /* NODE_GETUUIDPROPS */ -}; - -/* STRM wrapper functions */ -static struct api_cmd strm_cmd[] = { - {strmwrap_allocate_buffer}, /* STRM_ALLOCATEBUFFER */ - {strmwrap_close}, /* STRM_CLOSE */ - {strmwrap_free_buffer}, /* STRM_FREEBUFFER */ - {strmwrap_get_event_handle}, /* STRM_GETEVENTHANDLE */ - {strmwrap_get_info}, /* STRM_GETINFO */ - {strmwrap_idle}, /* STRM_IDLE */ - {strmwrap_issue}, /* STRM_ISSUE */ - {strmwrap_open}, /* STRM_OPEN */ - {strmwrap_reclaim}, /* STRM_RECLAIM */ - {strmwrap_register_notify}, /* STRM_REGISTERNOTIFY */ - {strmwrap_select}, /* STRM_SELECT */ -}; - -/* CMM wrapper functions */ -static struct api_cmd cmm_cmd[] = { - {cmmwrap_calloc_buf}, /* CMM_ALLOCBUF */ - {cmmwrap_free_buf}, /* CMM_FREEBUF */ - {cmmwrap_get_handle}, /* CMM_GETHANDLE */ - {cmmwrap_get_info}, /* CMM_GETINFO */ -}; - -/* Array used to store ioctl table sizes. It can hold up to 8 entries */ -static u8 size_cmd[] = { - ARRAY_SIZE(mgr_cmd), - ARRAY_SIZE(proc_cmd), - ARRAY_SIZE(node_cmd), - ARRAY_SIZE(strm_cmd), - ARRAY_SIZE(cmm_cmd), -}; - -static inline void _cp_fm_usr(void *to, const void __user *from, - int *err, unsigned long bytes) -{ - if (*err) - return; - - if (unlikely(!from)) { - *err = -EFAULT; - return; - } - - if (unlikely(copy_from_user(to, from, bytes))) - *err = -EFAULT; -} - -#define CP_FM_USR(to, from, err, n) \ - _cp_fm_usr(to, from, &(err), (n) * sizeof(*(to))) - -static inline void _cp_to_usr(void __user *to, const void *from, - int *err, unsigned long bytes) -{ - if (*err) - return; - - if (unlikely(!to)) { - *err = -EFAULT; - return; - } - - if (unlikely(copy_to_user(to, from, bytes))) - *err = -EFAULT; -} - -#define CP_TO_USR(to, from, err, n) \ - _cp_to_usr(to, from, &(err), (n) * sizeof(*(from))) - -/* - * ======== api_call_dev_ioctl ======== - * Purpose: - * Call the (wrapper) function for the corresponding API IOCTL. - */ -inline int api_call_dev_ioctl(u32 cmd, union trapped_args *args, - u32 *result, void *pr_ctxt) -{ - u32(*ioctl_cmd) (union trapped_args *args, void *pr_ctxt) = NULL; - int i; - - if (_IOC_TYPE(cmd) != DB) { - pr_err("%s: Incompatible dspbridge ioctl number\n", __func__); - goto err; - } - - if (DB_GET_IOC_TABLE(cmd) > ARRAY_SIZE(size_cmd)) { - pr_err("%s: undefined ioctl module\n", __func__); - goto err; - } - - /* Check the size of the required cmd table */ - i = DB_GET_IOC(cmd); - if (i > size_cmd[DB_GET_IOC_TABLE(cmd)]) { - pr_err("%s: requested ioctl %d out of bounds for table %d\n", - __func__, i, DB_GET_IOC_TABLE(cmd)); - goto err; - } - - switch (DB_GET_MODULE(cmd)) { - case DB_MGR: - ioctl_cmd = mgr_cmd[i].fxn; - break; - case DB_PROC: - ioctl_cmd = proc_cmd[i].fxn; - break; - case DB_NODE: - ioctl_cmd = node_cmd[i].fxn; - break; - case DB_STRM: - ioctl_cmd = strm_cmd[i].fxn; - break; - case DB_CMM: - ioctl_cmd = cmm_cmd[i].fxn; - break; - } - - if (!ioctl_cmd) { - pr_err("%s: requested ioctl not defined\n", __func__); - goto err; - } else { - *result = (*ioctl_cmd) (args, pr_ctxt); - } - - return 0; - -err: - return -EINVAL; -} - -/* - * ======== api_exit ======== - */ -void api_exit(void) -{ - api_c_refs--; - - if (api_c_refs == 0) - mgr_exit(); -} - -/* - * ======== api_init ======== - * Purpose: - * Module initialization used by Bridge API. - */ -bool api_init(void) -{ - bool ret = true; - - if (api_c_refs == 0) - ret = mgr_init(); - - if (ret) - api_c_refs++; - - return ret; -} - -/* - * ======== api_init_complete2 ======== - * Purpose: - * Perform any required bridge initialization which cannot - * be performed in api_init() or dev_start_device() due - * to the fact that some services are not yet - * completely initialized. - * Parameters: - * Returns: - * 0: Allow this device to load - * -EPERM: Failure. - * Requires: - * Bridge API initialized. - * Ensures: - */ -int api_init_complete2(void) -{ - int status = 0; - struct cfg_devnode *dev_node; - struct dev_object *hdev_obj; - struct drv_data *drv_datap; - u8 dev_type; - - /* Walk the list of DevObjects, get each devnode, and attempting to - * autostart the board. Note that this requires COF loading, which - * requires KFILE. */ - for (hdev_obj = dev_get_first(); hdev_obj != NULL; - hdev_obj = dev_get_next(hdev_obj)) { - if (dev_get_dev_node(hdev_obj, &dev_node)) - continue; - - if (dev_get_dev_type(hdev_obj, &dev_type)) - continue; - - if ((dev_type == DSP_UNIT) || (dev_type == IVA_UNIT)) { - drv_datap = dev_get_drvdata(bridge); - - if (drv_datap && drv_datap->base_img) - proc_auto_start(dev_node, hdev_obj); - } - } - - return status; -} - -/* TODO: Remove deprecated and not implemented ioctl wrappers */ - -/* - * ======== mgrwrap_enum_node_info ======== - */ -u32 mgrwrap_enum_node_info(union trapped_args *args, void *pr_ctxt) -{ - u8 *pndb_props; - u32 num_nodes = 0; - int status; - u32 size = args->args_mgr_enumnode_info.ndb_props_size; - - if (size < sizeof(struct dsp_ndbprops)) - return -EINVAL; - size = sizeof(struct dsp_ndbprops); - - pndb_props = kmalloc(size, GFP_KERNEL); - if (pndb_props == NULL) - return -ENOMEM; - - status = - mgr_enum_node_info(args->args_mgr_enumnode_info.node_id, - (struct dsp_ndbprops *)pndb_props, size, - &num_nodes); - - CP_TO_USR(args->args_mgr_enumnode_info.ndb_props, pndb_props, status, - size); - CP_TO_USR(args->args_mgr_enumnode_info.num_nodes, &num_nodes, status, - 1); - kfree(pndb_props); - - return status; -} - -/* - * ======== mgrwrap_enum_proc_info ======== - */ -u32 mgrwrap_enum_proc_info(union trapped_args *args, void *pr_ctxt) -{ - u8 *processor_info; - u8 num_procs = 0; - int status; - u32 size = args->args_mgr_enumproc_info.processor_info_size; - - if (size < sizeof(struct dsp_processorinfo)) - return -EINVAL; - - if (size > sizeof(struct mgr_processorextinfo)) - size = sizeof(struct mgr_processorextinfo); - - processor_info = kzalloc(size, GFP_KERNEL); - if (processor_info == NULL) - return -ENOMEM; - - status = - mgr_enum_processor_info(args->args_mgr_enumproc_info. - processor_id, - (struct dsp_processorinfo *) - processor_info, size, &num_procs); - - CP_TO_USR(args->args_mgr_enumproc_info.processor_info, processor_info, - status, size); - CP_TO_USR(args->args_mgr_enumproc_info.num_procs, &num_procs, - status, 1); - kfree(processor_info); - - return status; -} - -#define WRAP_MAP2CALLER(x) x -/* - * ======== mgrwrap_register_object ======== - */ -u32 mgrwrap_register_object(union trapped_args *args, void *pr_ctxt) -{ - u32 ret; - struct dsp_uuid uuid_obj; - u32 path_size = 0; - char *psz_path_name = NULL; - int status = 0; - - CP_FM_USR(&uuid_obj, args->args_mgr_registerobject.uuid_obj, status, 1); - if (status) - goto func_end; - path_size = strlen_user((char *) - args->args_mgr_registerobject.sz_path_name); - if (!path_size) { - status = -EINVAL; - goto func_end; - } - - psz_path_name = kmalloc(path_size, GFP_KERNEL); - if (!psz_path_name) { - status = -ENOMEM; - goto func_end; - } - ret = strncpy_from_user(psz_path_name, - (char *)args->args_mgr_registerobject. - sz_path_name, path_size); - if (!ret) { - status = -EFAULT; - goto func_end; - } - - if (args->args_mgr_registerobject.obj_type >= DSP_DCDMAXOBJTYPE) { - status = -EINVAL; - goto func_end; - } - - status = dcd_register_object(&uuid_obj, - args->args_mgr_registerobject.obj_type, - (char *)psz_path_name); -func_end: - kfree(psz_path_name); - return status; -} - -/* - * ======== mgrwrap_unregister_object ======== - */ -u32 mgrwrap_unregister_object(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct dsp_uuid uuid_obj; - - CP_FM_USR(&uuid_obj, args->args_mgr_registerobject.uuid_obj, status, 1); - if (status) - goto func_end; - - status = dcd_unregister_object(&uuid_obj, - args->args_mgr_unregisterobject. - obj_type); -func_end: - return status; - -} - -/* - * ======== mgrwrap_wait_for_bridge_events ======== - */ -u32 mgrwrap_wait_for_bridge_events(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct dsp_notification *anotifications[MAX_EVENTS]; - struct dsp_notification notifications[MAX_EVENTS]; - u32 index = 0, i; - u32 count = args->args_mgr_wait.count; - - if (count > MAX_EVENTS) - return -EINVAL; - - /* get the array of pointers to user structures */ - CP_FM_USR(anotifications, args->args_mgr_wait.anotifications, - status, count); - /* get the events */ - for (i = 0; i < count; i++) { - CP_FM_USR(¬ifications[i], anotifications[i], status, 1); - if (status || !notifications[i].handle) - return -EINVAL; - /* set the array of pointers to kernel structures */ - anotifications[i] = ¬ifications[i]; - } - status = mgr_wait_for_bridge_events(anotifications, count, - &index, - args->args_mgr_wait. - timeout); - CP_TO_USR(args->args_mgr_wait.index, &index, status, 1); - return status; -} - -/* - * ======== MGRWRAP_GetProcessResourceInfo ======== - */ -u32 __deprecated mgrwrap_get_process_resources_info(union trapped_args *args, - void *pr_ctxt) -{ - pr_err("%s: deprecated dspbridge ioctl\n", __func__); - return 0; -} - -/* - * ======== procwrap_attach ======== - */ -u32 procwrap_attach(union trapped_args *args, void *pr_ctxt) -{ - void *processor; - int status = 0; - struct dsp_processorattrin proc_attr_in, *attr_in = NULL; - - /* Optional argument */ - if (args->args_proc_attach.attr_in) { - CP_FM_USR(&proc_attr_in, args->args_proc_attach.attr_in, status, - 1); - if (!status) - attr_in = &proc_attr_in; - else - goto func_end; - - } - status = proc_attach(args->args_proc_attach.processor_id, attr_in, - &processor, pr_ctxt); - CP_TO_USR(args->args_proc_attach.ph_processor, &processor, status, 1); -func_end: - return status; -} - -/* - * ======== procwrap_ctrl ======== - */ -u32 procwrap_ctrl(union trapped_args *args, void *pr_ctxt) -{ - u32 cb_data_size, __user * psize = (u32 __user *) - args->args_proc_ctrl.args; - u8 *pargs = NULL; - int status = 0; - void *hprocessor = ((struct process_context *)pr_ctxt)->processor; - - if (psize) { - if (get_user(cb_data_size, psize)) { - status = -EPERM; - goto func_end; - } - cb_data_size += sizeof(u32); - pargs = kmalloc(cb_data_size, GFP_KERNEL); - if (pargs == NULL) { - status = -ENOMEM; - goto func_end; - } - - CP_FM_USR(pargs, args->args_proc_ctrl.args, status, - cb_data_size); - } - if (!status) { - status = proc_ctrl(hprocessor, - args->args_proc_ctrl.cmd, - (struct dsp_cbdata *)pargs); - } - - /* CP_TO_USR(args->args_proc_ctrl.args, pargs, status, 1); */ - kfree(pargs); -func_end: - return status; -} - -/* - * ======== procwrap_detach ======== - */ -u32 __deprecated procwrap_detach(union trapped_args *args, void *pr_ctxt) -{ - /* proc_detach called at bridge_release only */ - pr_err("%s: deprecated dspbridge ioctl\n", __func__); - return 0; -} - -/* - * ======== procwrap_enum_node_info ======== - */ -u32 procwrap_enum_node_info(union trapped_args *args, void *pr_ctxt) -{ - int status; - void *node_tab[MAX_NODES]; - u32 num_nodes; - u32 alloc_cnt; - void *hprocessor = ((struct process_context *)pr_ctxt)->processor; - - if (!args->args_proc_enumnode_info.node_tab_size) - return -EINVAL; - - status = proc_enum_nodes(hprocessor, - node_tab, - args->args_proc_enumnode_info.node_tab_size, - &num_nodes, &alloc_cnt); - CP_TO_USR(args->args_proc_enumnode_info.node_tab, node_tab, status, - num_nodes); - CP_TO_USR(args->args_proc_enumnode_info.num_nodes, &num_nodes, - status, 1); - CP_TO_USR(args->args_proc_enumnode_info.allocated, &alloc_cnt, - status, 1); - return status; -} - -u32 procwrap_end_dma(union trapped_args *args, void *pr_ctxt) -{ - int status; - - if (args->args_proc_dma.dir >= DMA_NONE) - return -EINVAL; - - status = proc_end_dma(pr_ctxt, - args->args_proc_dma.mpu_addr, - args->args_proc_dma.size, - args->args_proc_dma.dir); - return status; -} - -u32 procwrap_begin_dma(union trapped_args *args, void *pr_ctxt) -{ - int status; - - if (args->args_proc_dma.dir >= DMA_NONE) - return -EINVAL; - - status = proc_begin_dma(pr_ctxt, - args->args_proc_dma.mpu_addr, - args->args_proc_dma.size, - args->args_proc_dma.dir); - return status; -} - -/* - * ======== procwrap_flush_memory ======== - */ -u32 procwrap_flush_memory(union trapped_args *args, void *pr_ctxt) -{ - int status; - - if (args->args_proc_flushmemory.flags > - PROC_WRITEBACK_INVALIDATE_MEM) - return -EINVAL; - - status = proc_flush_memory(pr_ctxt, - args->args_proc_flushmemory.mpu_addr, - args->args_proc_flushmemory.size, - args->args_proc_flushmemory.flags); - return status; -} - -/* - * ======== procwrap_invalidate_memory ======== - */ -u32 procwrap_invalidate_memory(union trapped_args *args, void *pr_ctxt) -{ - int status; - - status = - proc_invalidate_memory(pr_ctxt, - args->args_proc_invalidatememory.mpu_addr, - args->args_proc_invalidatememory.size); - return status; -} - -/* - * ======== procwrap_enum_resources ======== - */ -u32 procwrap_enum_resources(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct dsp_resourceinfo resource_info; - void *hprocessor = ((struct process_context *)pr_ctxt)->processor; - - if (args->args_proc_enumresources.resource_info_size < - sizeof(struct dsp_resourceinfo)) - return -EINVAL; - - status = - proc_get_resource_info(hprocessor, - args->args_proc_enumresources.resource_type, - &resource_info, - args->args_proc_enumresources. - resource_info_size); - - CP_TO_USR(args->args_proc_enumresources.resource_info, &resource_info, - status, 1); - - return status; - -} - -/* - * ======== procwrap_get_state ======== - */ -u32 procwrap_get_state(union trapped_args *args, void *pr_ctxt) -{ - int status; - struct dsp_processorstate proc_state; - void *hprocessor = ((struct process_context *)pr_ctxt)->processor; - - if (args->args_proc_getstate.state_info_size < - sizeof(struct dsp_processorstate)) - return -EINVAL; - - status = proc_get_state(hprocessor, &proc_state, - args->args_proc_getstate.state_info_size); - CP_TO_USR(args->args_proc_getstate.proc_state_obj, &proc_state, status, - 1); - return status; - -} - -/* - * ======== procwrap_get_trace ======== - */ -u32 procwrap_get_trace(union trapped_args *args, void *pr_ctxt) -{ - int status; - u8 *pbuf; - void *hprocessor = ((struct process_context *)pr_ctxt)->processor; - - if (args->args_proc_gettrace.max_size > MAX_TRACEBUFLEN) - return -EINVAL; - - pbuf = kzalloc(args->args_proc_gettrace.max_size, GFP_KERNEL); - if (pbuf != NULL) { - status = proc_get_trace(hprocessor, pbuf, - args->args_proc_gettrace.max_size); - } else { - status = -ENOMEM; - } - CP_TO_USR(args->args_proc_gettrace.buf, pbuf, status, - args->args_proc_gettrace.max_size); - kfree(pbuf); - - return status; -} - -/* - * ======== procwrap_load ======== - */ -u32 procwrap_load(union trapped_args *args, void *pr_ctxt) -{ - s32 i, len; - int status = 0; - char *temp; - s32 count = args->args_proc_load.argc_index; - u8 **argv = NULL, **envp = NULL; - void *hprocessor = ((struct process_context *)pr_ctxt)->processor; - - if (count <= 0 || count > MAX_LOADARGS) { - status = -EINVAL; - goto func_cont; - } - - argv = kmalloc(count * sizeof(u8 *), GFP_KERNEL); - if (!argv) { - status = -ENOMEM; - goto func_cont; - } - - CP_FM_USR(argv, args->args_proc_load.user_args, status, count); - if (status) { - kfree(argv); - argv = NULL; - goto func_cont; - } - - for (i = 0; i < count; i++) { - if (argv[i]) { - /* User space pointer to argument */ - temp = (char *)argv[i]; - /* len is increased by 1 to accommodate NULL */ - len = strlen_user((char *)temp) + 1; - /* Kernel space pointer to argument */ - argv[i] = kmalloc(len, GFP_KERNEL); - if (argv[i]) { - CP_FM_USR(argv[i], temp, status, len); - if (status) { - kfree(argv[i]); - argv[i] = NULL; - goto func_cont; - } - } else { - status = -ENOMEM; - goto func_cont; - } - } - } - /* TODO: validate this */ - if (args->args_proc_load.user_envp) { - /* number of elements in the envp array including NULL */ - count = 0; - do { - if (get_user(temp, - args->args_proc_load.user_envp + count)) { - status = -EFAULT; - goto func_cont; - } - count++; - } while (temp); - envp = kmalloc(count * sizeof(u8 *), GFP_KERNEL); - if (!envp) { - status = -ENOMEM; - goto func_cont; - } - - CP_FM_USR(envp, args->args_proc_load.user_envp, status, count); - if (status) { - kfree(envp); - envp = NULL; - goto func_cont; - } - for (i = 0; envp[i]; i++) { - /* User space pointer to argument */ - temp = (char *)envp[i]; - /* len is increased by 1 to accommodate NULL */ - len = strlen_user((char *)temp) + 1; - /* Kernel space pointer to argument */ - envp[i] = kmalloc(len, GFP_KERNEL); - if (envp[i]) { - CP_FM_USR(envp[i], temp, status, len); - if (status) { - kfree(envp[i]); - envp[i] = NULL; - goto func_cont; - } - } else { - status = -ENOMEM; - goto func_cont; - } - } - } - - if (!status) { - status = proc_load(hprocessor, - args->args_proc_load.argc_index, - (const char **)argv, (const char **)envp); - } -func_cont: - if (envp) { - i = 0; - while (envp[i]) - kfree(envp[i++]); - - kfree(envp); - } - - if (argv) { - count = args->args_proc_load.argc_index; - for (i = 0; (i < count) && argv[i]; i++) - kfree(argv[i]); - - kfree(argv); - } - - return status; -} - -/* - * ======== procwrap_map ======== - */ -u32 procwrap_map(union trapped_args *args, void *pr_ctxt) -{ - int status; - void *map_addr; - void *hprocessor = ((struct process_context *)pr_ctxt)->processor; - - if (!args->args_proc_mapmem.size) - return -EINVAL; - - status = proc_map(args->args_proc_mapmem.processor, - args->args_proc_mapmem.mpu_addr, - args->args_proc_mapmem.size, - args->args_proc_mapmem.req_addr, &map_addr, - args->args_proc_mapmem.map_attr, pr_ctxt); - if (!status) { - if (put_user(map_addr, args->args_proc_mapmem.map_addr)) { - status = -EINVAL; - proc_un_map(hprocessor, map_addr, pr_ctxt); - } - - } - return status; -} - -/* - * ======== procwrap_register_notify ======== - */ -u32 procwrap_register_notify(union trapped_args *args, void *pr_ctxt) -{ - int status; - struct dsp_notification notification; - void *hprocessor = ((struct process_context *)pr_ctxt)->processor; - - /* Initialize the notification data structure */ - notification.name = NULL; - notification.handle = NULL; - - status = proc_register_notify(hprocessor, - args->args_proc_register_notify.event_mask, - args->args_proc_register_notify.notify_type, - ¬ification); - CP_TO_USR(args->args_proc_register_notify.notification, ¬ification, - status, 1); - return status; -} - -/* - * ======== procwrap_reserve_memory ======== - */ -u32 procwrap_reserve_memory(union trapped_args *args, void *pr_ctxt) -{ - int status; - void *prsv_addr; - void *hprocessor = ((struct process_context *)pr_ctxt)->processor; - - if ((args->args_proc_rsvmem.size <= 0) || - (args->args_proc_rsvmem.size & (PG_SIZE4K - 1)) != 0) - return -EINVAL; - - status = proc_reserve_memory(hprocessor, - args->args_proc_rsvmem.size, &prsv_addr, - pr_ctxt); - if (!status) { - if (put_user(prsv_addr, args->args_proc_rsvmem.rsv_addr)) { - status = -EINVAL; - proc_un_reserve_memory(args->args_proc_rsvmem. - processor, prsv_addr, pr_ctxt); - } - } - return status; -} - -/* - * ======== procwrap_start ======== - */ -u32 procwrap_start(union trapped_args *args, void *pr_ctxt) -{ - u32 ret; - - ret = proc_start(((struct process_context *)pr_ctxt)->processor); - return ret; -} - -/* - * ======== procwrap_un_map ======== - */ -u32 procwrap_un_map(union trapped_args *args, void *pr_ctxt) -{ - int status; - - status = proc_un_map(((struct process_context *)pr_ctxt)->processor, - args->args_proc_unmapmem.map_addr, pr_ctxt); - return status; -} - -/* - * ======== procwrap_un_reserve_memory ======== - */ -u32 procwrap_un_reserve_memory(union trapped_args *args, void *pr_ctxt) -{ - int status; - void *hprocessor = ((struct process_context *)pr_ctxt)->processor; - - status = proc_un_reserve_memory(hprocessor, - args->args_proc_unrsvmem.rsv_addr, - pr_ctxt); - return status; -} - -/* - * ======== procwrap_stop ======== - */ -u32 procwrap_stop(union trapped_args *args, void *pr_ctxt) -{ - u32 ret; - - ret = proc_stop(((struct process_context *)pr_ctxt)->processor); - - return ret; -} - -/* - * ======== find_handle ========= - */ -inline void find_node_handle(struct node_res_object **noderes, - void *pr_ctxt, void *hnode) -{ - rcu_read_lock(); - *noderes = idr_find(((struct process_context *)pr_ctxt)->node_id, - (int)hnode - 1); - rcu_read_unlock(); - return; -} - - -/* - * ======== nodewrap_allocate ======== - */ -u32 nodewrap_allocate(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct dsp_uuid node_uuid; - u32 cb_data_size = 0; - u32 __user *psize = (u32 __user *) args->args_node_allocate.args; - u8 *pargs = NULL; - struct dsp_nodeattrin proc_attr_in, *attr_in = NULL; - struct node_res_object *node_res; - int nodeid; - void *hprocessor = ((struct process_context *)pr_ctxt)->processor; - - /* Optional argument */ - if (psize) { - if (get_user(cb_data_size, psize)) - status = -EPERM; - - cb_data_size += sizeof(u32); - if (!status) { - pargs = kmalloc(cb_data_size, GFP_KERNEL); - if (pargs == NULL) - status = -ENOMEM; - - } - CP_FM_USR(pargs, args->args_node_allocate.args, status, - cb_data_size); - } - CP_FM_USR(&node_uuid, args->args_node_allocate.node_id_ptr, status, 1); - if (status) - goto func_cont; - /* Optional argument */ - if (args->args_node_allocate.attr_in) { - CP_FM_USR(&proc_attr_in, args->args_node_allocate.attr_in, - status, 1); - if (!status) - attr_in = &proc_attr_in; - else - status = -ENOMEM; - - } - if (!status) { - status = node_allocate(hprocessor, - &node_uuid, (struct dsp_cbdata *)pargs, - attr_in, &node_res, pr_ctxt); - } - if (!status) { - nodeid = node_res->id + 1; - CP_TO_USR(args->args_node_allocate.node, &nodeid, - status, 1); - if (status) { - status = -EFAULT; - node_delete(node_res, pr_ctxt); - } - } -func_cont: - kfree(pargs); - - return status; -} - -/* - * ======== nodewrap_alloc_msg_buf ======== - */ -u32 nodewrap_alloc_msg_buf(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct dsp_bufferattr *pattr = NULL; - struct dsp_bufferattr attr; - u8 *pbuffer = NULL; - struct node_res_object *node_res; - - find_node_handle(&node_res, pr_ctxt, - args->args_node_allocmsgbuf.node); - - if (!node_res) - return -EFAULT; - - if (!args->args_node_allocmsgbuf.size) - return -EINVAL; - - if (args->args_node_allocmsgbuf.attr) { /* Optional argument */ - CP_FM_USR(&attr, args->args_node_allocmsgbuf.attr, status, 1); - if (!status) - pattr = &attr; - - } - /* argument */ - CP_FM_USR(&pbuffer, args->args_node_allocmsgbuf.buffer, status, 1); - if (!status) { - status = node_alloc_msg_buf(node_res->node, - args->args_node_allocmsgbuf.size, - pattr, &pbuffer); - } - CP_TO_USR(args->args_node_allocmsgbuf.buffer, &pbuffer, status, 1); - return status; -} - -/* - * ======== nodewrap_change_priority ======== - */ -u32 nodewrap_change_priority(union trapped_args *args, void *pr_ctxt) -{ - u32 ret; - struct node_res_object *node_res; - - find_node_handle(&node_res, pr_ctxt, - args->args_node_changepriority.node); - - if (!node_res) - return -EFAULT; - - ret = node_change_priority(node_res->node, - args->args_node_changepriority.prio); - - return ret; -} - -/* - * ======== nodewrap_connect ======== - */ -u32 nodewrap_connect(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct dsp_strmattr attrs; - struct dsp_strmattr *pattrs = NULL; - u32 cb_data_size; - u32 __user *psize = (u32 __user *) args->args_node_connect.conn_param; - u8 *pargs = NULL; - struct node_res_object *node_res1, *node_res2; - struct node_object *node1 = NULL, *node2 = NULL; - - if ((int)args->args_node_connect.node != DSP_HGPPNODE) { - find_node_handle(&node_res1, pr_ctxt, - args->args_node_connect.node); - if (node_res1) - node1 = node_res1->node; - } else { - node1 = args->args_node_connect.node; - } - - if ((int)args->args_node_connect.other_node != DSP_HGPPNODE) { - find_node_handle(&node_res2, pr_ctxt, - args->args_node_connect.other_node); - if (node_res2) - node2 = node_res2->node; - } else { - node2 = args->args_node_connect.other_node; - } - - if (!node1 || !node2) - return -EFAULT; - - /* Optional argument */ - if (psize) { - if (get_user(cb_data_size, psize)) - status = -EPERM; - - cb_data_size += sizeof(u32); - if (!status) { - pargs = kmalloc(cb_data_size, GFP_KERNEL); - if (pargs == NULL) { - status = -ENOMEM; - goto func_cont; - } - - } - CP_FM_USR(pargs, args->args_node_connect.conn_param, status, - cb_data_size); - if (status) - goto func_cont; - } - if (args->args_node_connect.attrs) { /* Optional argument */ - CP_FM_USR(&attrs, args->args_node_connect.attrs, status, 1); - if (!status) - pattrs = &attrs; - - } - if (!status) { - status = node_connect(node1, - args->args_node_connect.stream_id, - node2, - args->args_node_connect.other_stream, - pattrs, (struct dsp_cbdata *)pargs); - } -func_cont: - kfree(pargs); - - return status; -} - -/* - * ======== nodewrap_create ======== - */ -u32 nodewrap_create(union trapped_args *args, void *pr_ctxt) -{ - u32 ret; - struct node_res_object *node_res; - - find_node_handle(&node_res, pr_ctxt, args->args_node_create.node); - - if (!node_res) - return -EFAULT; - - ret = node_create(node_res->node); - - return ret; -} - -/* - * ======== nodewrap_delete ======== - */ -u32 nodewrap_delete(union trapped_args *args, void *pr_ctxt) -{ - u32 ret; - struct node_res_object *node_res; - - find_node_handle(&node_res, pr_ctxt, args->args_node_delete.node); - - if (!node_res) - return -EFAULT; - - ret = node_delete(node_res, pr_ctxt); - - return ret; -} - -/* - * ======== nodewrap_free_msg_buf ======== - */ -u32 nodewrap_free_msg_buf(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct dsp_bufferattr *pattr = NULL; - struct dsp_bufferattr attr; - struct node_res_object *node_res; - - find_node_handle(&node_res, pr_ctxt, args->args_node_freemsgbuf.node); - - if (!node_res) - return -EFAULT; - - if (args->args_node_freemsgbuf.attr) { /* Optional argument */ - CP_FM_USR(&attr, args->args_node_freemsgbuf.attr, status, 1); - if (!status) - pattr = &attr; - - } - - if (!args->args_node_freemsgbuf.buffer) - return -EFAULT; - - if (!status) { - status = node_free_msg_buf(node_res->node, - args->args_node_freemsgbuf.buffer, - pattr); - } - - return status; -} - -/* - * ======== nodewrap_get_attr ======== - */ -u32 nodewrap_get_attr(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct dsp_nodeattr attr; - struct node_res_object *node_res; - - find_node_handle(&node_res, pr_ctxt, args->args_node_getattr.node); - - if (!node_res) - return -EFAULT; - - status = node_get_attr(node_res->node, &attr, - args->args_node_getattr.attr_size); - CP_TO_USR(args->args_node_getattr.attr, &attr, status, 1); - - return status; -} - -/* - * ======== nodewrap_get_message ======== - */ -u32 nodewrap_get_message(union trapped_args *args, void *pr_ctxt) -{ - int status; - struct dsp_msg msg; - struct node_res_object *node_res; - - find_node_handle(&node_res, pr_ctxt, args->args_node_getmessage.node); - - if (!node_res) - return -EFAULT; - - status = node_get_message(node_res->node, &msg, - args->args_node_getmessage.timeout); - - CP_TO_USR(args->args_node_getmessage.message, &msg, status, 1); - - return status; -} - -/* - * ======== nodewrap_pause ======== - */ -u32 nodewrap_pause(union trapped_args *args, void *pr_ctxt) -{ - u32 ret; - struct node_res_object *node_res; - - find_node_handle(&node_res, pr_ctxt, args->args_node_pause.node); - - if (!node_res) - return -EFAULT; - - ret = node_pause(node_res->node); - - return ret; -} - -/* - * ======== nodewrap_put_message ======== - */ -u32 nodewrap_put_message(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct dsp_msg msg; - struct node_res_object *node_res; - - find_node_handle(&node_res, pr_ctxt, args->args_node_putmessage.node); - - if (!node_res) - return -EFAULT; - - CP_FM_USR(&msg, args->args_node_putmessage.message, status, 1); - - if (!status) { - status = - node_put_message(node_res->node, &msg, - args->args_node_putmessage.timeout); - } - - return status; -} - -/* - * ======== nodewrap_register_notify ======== - */ -u32 nodewrap_register_notify(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct dsp_notification notification; - struct node_res_object *node_res; - - find_node_handle(&node_res, pr_ctxt, - args->args_node_registernotify.node); - - if (!node_res) - return -EFAULT; - - /* Initialize the notification data structure */ - notification.name = NULL; - notification.handle = NULL; - - if (!args->args_proc_register_notify.event_mask) - CP_FM_USR(¬ification, - args->args_proc_register_notify.notification, - status, 1); - - status = node_register_notify(node_res->node, - args->args_node_registernotify.event_mask, - args->args_node_registernotify. - notify_type, ¬ification); - CP_TO_USR(args->args_node_registernotify.notification, ¬ification, - status, 1); - return status; -} - -/* - * ======== nodewrap_run ======== - */ -u32 nodewrap_run(union trapped_args *args, void *pr_ctxt) -{ - u32 ret; - struct node_res_object *node_res; - - find_node_handle(&node_res, pr_ctxt, args->args_node_run.node); - - if (!node_res) - return -EFAULT; - - ret = node_run(node_res->node); - - return ret; -} - -/* - * ======== nodewrap_terminate ======== - */ -u32 nodewrap_terminate(union trapped_args *args, void *pr_ctxt) -{ - int status; - int tempstatus; - struct node_res_object *node_res; - - find_node_handle(&node_res, pr_ctxt, args->args_node_terminate.node); - - if (!node_res) - return -EFAULT; - - status = node_terminate(node_res->node, &tempstatus); - - CP_TO_USR(args->args_node_terminate.status, &tempstatus, status, 1); - - return status; -} - -/* - * ======== nodewrap_get_uuid_props ======== - */ -u32 nodewrap_get_uuid_props(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct dsp_uuid node_uuid; - struct dsp_ndbprops *pnode_props = NULL; - void *hprocessor = ((struct process_context *)pr_ctxt)->processor; - - CP_FM_USR(&node_uuid, args->args_node_getuuidprops.node_id_ptr, status, - 1); - if (status) - goto func_cont; - pnode_props = kmalloc(sizeof(struct dsp_ndbprops), GFP_KERNEL); - if (pnode_props != NULL) { - status = - node_get_uuid_props(hprocessor, &node_uuid, pnode_props); - CP_TO_USR(args->args_node_getuuidprops.node_props, pnode_props, - status, 1); - } else - status = -ENOMEM; -func_cont: - kfree(pnode_props); - return status; -} - -/* - * ======== find_strm_handle ========= - */ -inline void find_strm_handle(struct strm_res_object **strmres, - void *pr_ctxt, void *hstream) -{ - rcu_read_lock(); - *strmres = idr_find(((struct process_context *)pr_ctxt)->stream_id, - (int)hstream - 1); - rcu_read_unlock(); - return; -} - -/* - * ======== strmwrap_allocate_buffer ======== - */ -u32 strmwrap_allocate_buffer(union trapped_args *args, void *pr_ctxt) -{ - int status; - u8 **ap_buffer = NULL; - u32 num_bufs = args->args_strm_allocatebuffer.num_bufs; - struct strm_res_object *strm_res; - - find_strm_handle(&strm_res, pr_ctxt, - args->args_strm_allocatebuffer.stream); - - if (!strm_res) - return -EFAULT; - - if (num_bufs > MAX_BUFS) - return -EINVAL; - - ap_buffer = kmalloc((num_bufs * sizeof(u8 *)), GFP_KERNEL); - if (ap_buffer == NULL) - return -ENOMEM; - - status = strm_allocate_buffer(strm_res, - args->args_strm_allocatebuffer.size, - ap_buffer, num_bufs, pr_ctxt); - if (!status) { - CP_TO_USR(args->args_strm_allocatebuffer.ap_buffer, ap_buffer, - status, num_bufs); - if (status) { - status = -EFAULT; - strm_free_buffer(strm_res, - ap_buffer, num_bufs, pr_ctxt); - } - } - kfree(ap_buffer); - - return status; -} - -/* - * ======== strmwrap_close ======== - */ -u32 strmwrap_close(union trapped_args *args, void *pr_ctxt) -{ - struct strm_res_object *strm_res; - - find_strm_handle(&strm_res, pr_ctxt, args->args_strm_close.stream); - - if (!strm_res) - return -EFAULT; - - return strm_close(strm_res, pr_ctxt); -} - -/* - * ======== strmwrap_free_buffer ======== - */ -u32 strmwrap_free_buffer(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - u8 **ap_buffer = NULL; - u32 num_bufs = args->args_strm_freebuffer.num_bufs; - struct strm_res_object *strm_res; - - find_strm_handle(&strm_res, pr_ctxt, - args->args_strm_freebuffer.stream); - - if (!strm_res) - return -EFAULT; - - if (num_bufs > MAX_BUFS) - return -EINVAL; - - ap_buffer = kmalloc_array(num_bufs, sizeof(u8 *), GFP_KERNEL); - if (ap_buffer == NULL) - return -ENOMEM; - - CP_FM_USR(ap_buffer, args->args_strm_freebuffer.ap_buffer, status, - num_bufs); - - if (!status) - status = strm_free_buffer(strm_res, - ap_buffer, num_bufs, pr_ctxt); - - CP_TO_USR(args->args_strm_freebuffer.ap_buffer, ap_buffer, status, - num_bufs); - kfree(ap_buffer); - - return status; -} - -/* - * ======== strmwrap_get_event_handle ======== - */ -u32 __deprecated strmwrap_get_event_handle(union trapped_args *args, - void *pr_ctxt) -{ - pr_err("%s: deprecated dspbridge ioctl\n", __func__); - return -ENOSYS; -} - -/* - * ======== strmwrap_get_info ======== - */ -u32 strmwrap_get_info(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct stream_info strm_info; - struct dsp_streaminfo user; - struct dsp_streaminfo *temp; - struct strm_res_object *strm_res; - - find_strm_handle(&strm_res, pr_ctxt, - args->args_strm_getinfo.stream); - - if (!strm_res) - return -EFAULT; - - CP_FM_USR(&strm_info, args->args_strm_getinfo.stream_info, status, 1); - temp = strm_info.user_strm; - - strm_info.user_strm = &user; - - if (!status) { - status = strm_get_info(strm_res->stream, - &strm_info, - args->args_strm_getinfo. - stream_info_size); - } - CP_TO_USR(temp, strm_info.user_strm, status, 1); - strm_info.user_strm = temp; - CP_TO_USR(args->args_strm_getinfo.stream_info, &strm_info, status, 1); - return status; -} - -/* - * ======== strmwrap_idle ======== - */ -u32 strmwrap_idle(union trapped_args *args, void *pr_ctxt) -{ - u32 ret; - struct strm_res_object *strm_res; - - find_strm_handle(&strm_res, pr_ctxt, args->args_strm_idle.stream); - - if (!strm_res) - return -EFAULT; - - ret = strm_idle(strm_res->stream, args->args_strm_idle.flush_flag); - - return ret; -} - -/* - * ======== strmwrap_issue ======== - */ -u32 strmwrap_issue(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct strm_res_object *strm_res; - - find_strm_handle(&strm_res, pr_ctxt, args->args_strm_issue.stream); - - if (!strm_res) - return -EFAULT; - - if (!args->args_strm_issue.buffer) - return -EFAULT; - - /* No need of doing CP_FM_USR for the user buffer (pbuffer) - as this is done in Bridge internal function bridge_chnl_add_io_req - in chnl_sm.c */ - status = strm_issue(strm_res->stream, - args->args_strm_issue.buffer, - args->args_strm_issue.bytes, - args->args_strm_issue.buf_size, - args->args_strm_issue.arg); - - return status; -} - -/* - * ======== strmwrap_open ======== - */ -u32 strmwrap_open(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct strm_attr attr; - struct strm_res_object *strm_res_obj; - struct dsp_streamattrin strm_attr_in; - struct node_res_object *node_res; - int strmid; - - find_node_handle(&node_res, pr_ctxt, args->args_strm_open.node); - - if (!node_res) - return -EFAULT; - - CP_FM_USR(&attr, args->args_strm_open.attr_in, status, 1); - - if (attr.stream_attr_in != NULL) { /* Optional argument */ - CP_FM_USR(&strm_attr_in, attr.stream_attr_in, status, 1); - if (!status) { - attr.stream_attr_in = &strm_attr_in; - if (attr.stream_attr_in->strm_mode == STRMMODE_LDMA) - return -ENOSYS; - } - - } - status = strm_open(node_res->node, - args->args_strm_open.direction, - args->args_strm_open.index, &attr, &strm_res_obj, - pr_ctxt); - if (!status) { - strmid = strm_res_obj->id + 1; - CP_TO_USR(args->args_strm_open.stream, &strmid, status, 1); - } - return status; -} - -/* - * ======== strmwrap_reclaim ======== - */ -u32 strmwrap_reclaim(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - u8 *buf_ptr; - u32 ul_bytes; - u32 dw_arg; - u32 ul_buf_size; - struct strm_res_object *strm_res; - - find_strm_handle(&strm_res, pr_ctxt, args->args_strm_reclaim.stream); - - if (!strm_res) - return -EFAULT; - - status = strm_reclaim(strm_res->stream, &buf_ptr, - &ul_bytes, &ul_buf_size, &dw_arg); - CP_TO_USR(args->args_strm_reclaim.buf_ptr, &buf_ptr, status, 1); - CP_TO_USR(args->args_strm_reclaim.bytes, &ul_bytes, status, 1); - CP_TO_USR(args->args_strm_reclaim.arg, &dw_arg, status, 1); - - if (args->args_strm_reclaim.buf_size_ptr != NULL) { - CP_TO_USR(args->args_strm_reclaim.buf_size_ptr, &ul_buf_size, - status, 1); - } - - return status; -} - -/* - * ======== strmwrap_register_notify ======== - */ -u32 strmwrap_register_notify(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct dsp_notification notification; - struct strm_res_object *strm_res; - - find_strm_handle(&strm_res, pr_ctxt, - args->args_strm_registernotify.stream); - - if (!strm_res) - return -EFAULT; - - /* Initialize the notification data structure */ - notification.name = NULL; - notification.handle = NULL; - - status = strm_register_notify(strm_res->stream, - args->args_strm_registernotify.event_mask, - args->args_strm_registernotify. - notify_type, ¬ification); - CP_TO_USR(args->args_strm_registernotify.notification, ¬ification, - status, 1); - - return status; -} - -/* - * ======== strmwrap_select ======== - */ -u32 strmwrap_select(union trapped_args *args, void *pr_ctxt) -{ - u32 mask = 0; - struct strm_object *strm_tab[MAX_STREAMS]; - int status = 0; - struct strm_res_object *strm_res; - int *ids[MAX_STREAMS]; - int i; - - if (args->args_strm_select.strm_num > MAX_STREAMS) - return -EINVAL; - - CP_FM_USR(ids, args->args_strm_select.stream_tab, status, - args->args_strm_select.strm_num); - - if (status) - return status; - - for (i = 0; i < args->args_strm_select.strm_num; i++) { - find_strm_handle(&strm_res, pr_ctxt, ids[i]); - - if (!strm_res) - return -EFAULT; - - strm_tab[i] = strm_res->stream; - } - - if (!status) { - status = strm_select(strm_tab, args->args_strm_select.strm_num, - &mask, args->args_strm_select.timeout); - } - CP_TO_USR(args->args_strm_select.mask, &mask, status, 1); - return status; -} - -/* CMM */ - -/* - * ======== cmmwrap_calloc_buf ======== - */ -u32 __deprecated cmmwrap_calloc_buf(union trapped_args *args, void *pr_ctxt) -{ - /* This operation is done in kernel */ - pr_err("%s: deprecated dspbridge ioctl\n", __func__); - return -ENOSYS; -} - -/* - * ======== cmmwrap_free_buf ======== - */ -u32 __deprecated cmmwrap_free_buf(union trapped_args *args, void *pr_ctxt) -{ - /* This operation is done in kernel */ - pr_err("%s: deprecated dspbridge ioctl\n", __func__); - return -ENOSYS; -} - -/* - * ======== cmmwrap_get_handle ======== - */ -u32 cmmwrap_get_handle(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct cmm_object *hcmm_mgr; - void *hprocessor = ((struct process_context *)pr_ctxt)->processor; - - status = cmm_get_handle(hprocessor, &hcmm_mgr); - - CP_TO_USR(args->args_cmm_gethandle.cmm_mgr, &hcmm_mgr, status, 1); - - return status; -} - -/* - * ======== cmmwrap_get_info ======== - */ -u32 cmmwrap_get_info(union trapped_args *args, void *pr_ctxt) -{ - int status = 0; - struct cmm_info cmm_info_obj; - - status = cmm_get_info(args->args_cmm_getinfo.cmm_mgr, &cmm_info_obj); - - CP_TO_USR(args->args_cmm_getinfo.cmm_info_obj, &cmm_info_obj, status, - 1); - - return status; -} diff --git a/drivers/staging/tidspbridge/pmgr/io.c b/drivers/staging/tidspbridge/pmgr/io.c deleted file mode 100644 index 4073c9c672fd..000000000000 --- a/drivers/staging/tidspbridge/pmgr/io.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * io.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * IO manager interface: Manages IO between CHNL and msg_ctrl. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- Platform Manager */ -#include - -/* ----------------------------------- This */ -#include -#include - -/* - * ======== io_create ======== - * Purpose: - * Create an IO manager object, responsible for managing IO between - * CHNL and msg_ctrl - */ -int io_create(struct io_mgr **io_man, struct dev_object *hdev_obj, - const struct io_attrs *mgr_attrts) -{ - struct bridge_drv_interface *intf_fxns; - struct io_mgr *hio_mgr = NULL; - struct io_mgr_ *pio_mgr = NULL; - int status = 0; - - *io_man = NULL; - - /* A memory base of 0 implies no memory base: */ - if ((mgr_attrts->shm_base != 0) && (mgr_attrts->sm_length == 0)) - status = -EINVAL; - - if (mgr_attrts->word_size == 0) - status = -EINVAL; - - if (!status) { - dev_get_intf_fxns(hdev_obj, &intf_fxns); - - /* Let Bridge channel module finish the create: */ - status = (*intf_fxns->io_create) (&hio_mgr, hdev_obj, - mgr_attrts); - - if (!status) { - pio_mgr = (struct io_mgr_ *)hio_mgr; - pio_mgr->intf_fxns = intf_fxns; - pio_mgr->dev_obj = hdev_obj; - - /* Return the new channel manager handle: */ - *io_man = hio_mgr; - } - } - - return status; -} - -/* - * ======== io_destroy ======== - * Purpose: - * Delete IO manager. - */ -int io_destroy(struct io_mgr *hio_mgr) -{ - struct bridge_drv_interface *intf_fxns; - struct io_mgr_ *pio_mgr = (struct io_mgr_ *)hio_mgr; - int status; - - intf_fxns = pio_mgr->intf_fxns; - - /* Let Bridge channel module destroy the io_mgr: */ - status = (*intf_fxns->io_destroy) (hio_mgr); - - return status; -} diff --git a/drivers/staging/tidspbridge/pmgr/ioobj.h b/drivers/staging/tidspbridge/pmgr/ioobj.h deleted file mode 100644 index 7defd9481458..000000000000 --- a/drivers/staging/tidspbridge/pmgr/ioobj.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * ioobj.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Structure subcomponents of channel class library IO objects which - * are exposed to DSP API from Bridge driver. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef IOOBJ_ -#define IOOBJ_ - -#include -#include - -/* - * This struct is the first field in a io_mgr struct. Other, implementation - * specific fields follow this structure in memory. - */ -struct io_mgr_ { - /* These must be the first fields in a io_mgr struct: */ - struct bridge_dev_context *bridge_context; /* Bridge context. */ - /* Function interface to Bridge driver. */ - struct bridge_drv_interface *intf_fxns; - struct dev_object *dev_obj; /* Device this board represents. */ -}; - -#endif /* IOOBJ_ */ diff --git a/drivers/staging/tidspbridge/pmgr/msg.c b/drivers/staging/tidspbridge/pmgr/msg.c deleted file mode 100644 index f093cfb51c00..000000000000 --- a/drivers/staging/tidspbridge/pmgr/msg.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * msg.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP/BIOS Bridge msg_ctrl Module. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- Bridge Driver */ -#include - -/* ----------------------------------- Platform Manager */ -#include - -/* ----------------------------------- This */ -#include -#include - -/* - * ======== msg_create ======== - * Purpose: - * Create an object to manage message queues. Only one of these objects - * can exist per device object. - */ -int msg_create(struct msg_mgr **msg_man, - struct dev_object *hdev_obj, msg_onexit msg_callback) -{ - struct bridge_drv_interface *intf_fxns; - struct msg_mgr_ *msg_mgr_obj; - struct msg_mgr *hmsg_mgr; - int status = 0; - - *msg_man = NULL; - - dev_get_intf_fxns(hdev_obj, &intf_fxns); - - /* Let Bridge message module finish the create: */ - status = - (*intf_fxns->msg_create) (&hmsg_mgr, hdev_obj, msg_callback); - - if (!status) { - /* Fill in DSP API message module's fields of the msg_mgr - * structure */ - msg_mgr_obj = (struct msg_mgr_ *)hmsg_mgr; - msg_mgr_obj->intf_fxns = intf_fxns; - - /* Finally, return the new message manager handle: */ - *msg_man = hmsg_mgr; - } else { - status = -EPERM; - } - return status; -} - -/* - * ======== msg_delete ======== - * Purpose: - * Delete a msg_ctrl manager allocated in msg_create(). - */ -void msg_delete(struct msg_mgr *hmsg_mgr) -{ - struct msg_mgr_ *msg_mgr_obj = (struct msg_mgr_ *)hmsg_mgr; - struct bridge_drv_interface *intf_fxns; - - if (msg_mgr_obj) { - intf_fxns = msg_mgr_obj->intf_fxns; - - /* Let Bridge message module destroy the msg_mgr: */ - (*intf_fxns->msg_delete) (hmsg_mgr); - } else { - dev_dbg(bridge, "%s: Error hmsg_mgr handle: %p\n", - __func__, hmsg_mgr); - } -} diff --git a/drivers/staging/tidspbridge/pmgr/msgobj.h b/drivers/staging/tidspbridge/pmgr/msgobj.h deleted file mode 100644 index 14ca633c56cb..000000000000 --- a/drivers/staging/tidspbridge/pmgr/msgobj.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * msgobj.h - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Structure subcomponents of channel class library msg_ctrl objects which - * are exposed to DSP API from Bridge driver. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef MSGOBJ_ -#define MSGOBJ_ - -#include - -#include - -/* - * This struct is the first field in a msg_mgr struct. Other, implementation - * specific fields follow this structure in memory. - */ -struct msg_mgr_ { - /* The first field must match that in _msg_sm.h */ - - /* Function interface to Bridge driver. */ - struct bridge_drv_interface *intf_fxns; -}; - -#endif /* MSGOBJ_ */ diff --git a/drivers/staging/tidspbridge/rmgr/dbdcd.c b/drivers/staging/tidspbridge/rmgr/dbdcd.c deleted file mode 100644 index c91d1d7d0884..000000000000 --- a/drivers/staging/tidspbridge/rmgr/dbdcd.c +++ /dev/null @@ -1,1484 +0,0 @@ -/* - * dbdcd.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * This file contains the implementation of the DSP/BIOS Bridge - * Configuration Database (DCD). - * - * Notes: - * The fxn dcd_get_objects can apply a callback fxn to each DCD object - * that is located in a specified COFF file. At the moment, - * dcd_auto_register, dcd_auto_unregister, and NLDR module all use - * dcd_get_objects. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- Platform Manager */ -#include - -/* ----------------------------------- Others */ -#include - -/* ----------------------------------- This */ -#include - -/* ----------------------------------- Global defines. */ -#define MAX_INT2CHAR_LENGTH 16 /* Max int2char len of 32 bit int */ - -/* Name of section containing dependent libraries */ -#define DEPLIBSECT ".dspbridge_deplibs" - -/* DCD specific structures. */ -struct dcd_manager { - struct cod_manager *cod_mgr; /* Handle to COD manager object. */ -}; - -/* Pointer to the registry support key */ -static struct list_head reg_key_list; -static DEFINE_SPINLOCK(dbdcd_lock); - -/* Global reference variables. */ -static u32 refs; -static u32 enum_refs; - -/* Helper function prototypes. */ -static s32 atoi(char *psz_buf); -static int get_attrs_from_buf(char *psz_buf, u32 ul_buf_size, - enum dsp_dcdobjtype obj_type, - struct dcd_genericobj *gen_obj); -static void compress_buf(char *psz_buf, u32 ul_buf_size, s32 char_size); -static char dsp_char2_gpp_char(char *word, s32 dsp_char_size); -static int get_dep_lib_info(struct dcd_manager *hdcd_mgr, - struct dsp_uuid *uuid_obj, - u16 *num_libs, - u16 *num_pers_libs, - struct dsp_uuid *dep_lib_uuids, - bool *prstnt_dep_libs, - enum nldr_phase phase); - -/* - * ======== dcd_uuid_from_string ======== - * Purpose: - * Converts an ANSI string to a dsp_uuid. - * Parameters: - * sz_uuid: Pointer to a string that represents a dsp_uuid object. - * uuid_obj: Pointer to a dsp_uuid object. - * Returns: - * 0: Success. - * -EINVAL: Coversion failed - * Requires: - * uuid_obj & sz_uuid are non-NULL values. - * Ensures: - * Details: - * We assume the string representation of a UUID has the following format: - * "12345678_1234_1234_1234_123456789abc". - */ -static int dcd_uuid_from_string(char *sz_uuid, struct dsp_uuid *uuid_obj) -{ - char c; - u64 t; - struct dsp_uuid uuid_tmp; - - /* - * sscanf implementation cannot deal with hh format modifier - * if the converted value doesn't fit in u32. So, convert the - * last six bytes to u64 and memcpy what is needed - */ - if (sscanf(sz_uuid, "%8x%c%4hx%c%4hx%c%2hhx%2hhx%c%llx", - &uuid_tmp.data1, &c, &uuid_tmp.data2, &c, - &uuid_tmp.data3, &c, &uuid_tmp.data4, - &uuid_tmp.data5, &c, &t) != 10) - return -EINVAL; - - t = cpu_to_be64(t); - memcpy(&uuid_tmp.data6[0], ((char *)&t) + 2, 6); - *uuid_obj = uuid_tmp; - - return 0; -} - -/* - * ======== dcd_auto_register ======== - * Purpose: - * Parses the supplied image and resigsters with DCD. - */ -int dcd_auto_register(struct dcd_manager *hdcd_mgr, - char *sz_coff_path) -{ - int status = 0; - - if (hdcd_mgr) - status = dcd_get_objects(hdcd_mgr, sz_coff_path, - (dcd_registerfxn) dcd_register_object, - (void *)sz_coff_path); - else - status = -EFAULT; - - return status; -} - -/* - * ======== dcd_auto_unregister ======== - * Purpose: - * Parses the supplied DSP image and unresiters from DCD. - */ -int dcd_auto_unregister(struct dcd_manager *hdcd_mgr, - char *sz_coff_path) -{ - int status = 0; - - if (hdcd_mgr) - status = dcd_get_objects(hdcd_mgr, sz_coff_path, - (dcd_registerfxn) dcd_register_object, - NULL); - else - status = -EFAULT; - - return status; -} - -/* - * ======== dcd_create_manager ======== - * Purpose: - * Creates DCD manager. - */ -int dcd_create_manager(char *sz_zl_dll_name, - struct dcd_manager **dcd_mgr) -{ - struct cod_manager *cod_mgr; /* COD manager handle */ - struct dcd_manager *dcd_mgr_obj = NULL; /* DCD Manager pointer */ - int status = 0; - - status = cod_create(&cod_mgr, sz_zl_dll_name); - if (status) - goto func_end; - - /* Create a DCD object. */ - dcd_mgr_obj = kzalloc(sizeof(struct dcd_manager), GFP_KERNEL); - if (dcd_mgr_obj != NULL) { - /* Fill out the object. */ - dcd_mgr_obj->cod_mgr = cod_mgr; - - /* Return handle to this DCD interface. */ - *dcd_mgr = dcd_mgr_obj; - } else { - status = -ENOMEM; - - /* - * If allocation of DcdManager object failed, delete the - * COD manager. - */ - cod_delete(cod_mgr); - } - -func_end: - return status; -} - -/* - * ======== dcd_destroy_manager ======== - * Purpose: - * Frees DCD Manager object. - */ -int dcd_destroy_manager(struct dcd_manager *hdcd_mgr) -{ - struct dcd_manager *dcd_mgr_obj = hdcd_mgr; - int status = -EFAULT; - - if (hdcd_mgr) { - /* Delete the COD manager. */ - cod_delete(dcd_mgr_obj->cod_mgr); - - /* Deallocate a DCD manager object. */ - kfree(dcd_mgr_obj); - - status = 0; - } - - return status; -} - -/* - * ======== dcd_enumerate_object ======== - * Purpose: - * Enumerates objects in the DCD. - */ -int dcd_enumerate_object(s32 index, enum dsp_dcdobjtype obj_type, - struct dsp_uuid *uuid_obj) -{ - int status = 0; - char sz_reg_key[DCD_MAXPATHLENGTH]; - char sz_value[DCD_MAXPATHLENGTH]; - struct dsp_uuid dsp_uuid_obj; - char sz_obj_type[MAX_INT2CHAR_LENGTH]; /* str. rep. of obj_type. */ - u32 dw_key_len = 0; - struct dcd_key_elem *dcd_key; - int len; - - if ((index != 0) && (enum_refs == 0)) { - /* - * If an enumeration is being performed on an index greater - * than zero, then the current enum_refs must have been - * incremented to greater than zero. - */ - status = -EIDRM; - } else { - /* - * Pre-determine final key length. It's length of DCD_REGKEY + - * "_\0" + length of sz_obj_type string + terminating NULL. - */ - dw_key_len = strlen(DCD_REGKEY) + 1 + sizeof(sz_obj_type) + 1; - - /* Create proper REG key; concatenate DCD_REGKEY with - * obj_type. */ - strncpy(sz_reg_key, DCD_REGKEY, strlen(DCD_REGKEY) + 1); - if ((strlen(sz_reg_key) + strlen("_\0")) < - DCD_MAXPATHLENGTH) { - strncat(sz_reg_key, "_\0", 2); - } else { - status = -EPERM; - } - - /* This snprintf is guaranteed not to exceed max size of an - * integer. */ - status = snprintf(sz_obj_type, MAX_INT2CHAR_LENGTH, "%d", - obj_type); - - if (status == -1) { - status = -EPERM; - } else { - status = 0; - if ((strlen(sz_reg_key) + strlen(sz_obj_type)) < - DCD_MAXPATHLENGTH) { - strncat(sz_reg_key, sz_obj_type, - strlen(sz_obj_type) + 1); - } else { - status = -EPERM; - } - } - - if (!status) { - len = strlen(sz_reg_key); - spin_lock(&dbdcd_lock); - list_for_each_entry(dcd_key, ®_key_list, link) { - if (!strncmp(dcd_key->name, sz_reg_key, len) - && !index--) { - strncpy(sz_value, &dcd_key->name[len], - strlen(&dcd_key->name[len]) + 1); - break; - } - } - spin_unlock(&dbdcd_lock); - - if (&dcd_key->link == ®_key_list) - status = -ENODATA; - } - - if (!status) { - /* Create UUID value using string retrieved from - * registry. */ - status = dcd_uuid_from_string(sz_value, &dsp_uuid_obj); - - if (!status) { - *uuid_obj = dsp_uuid_obj; - - /* Increment enum_refs to update reference - * count. */ - enum_refs++; - } - } else if (status == -ENODATA) { - /* At the end of enumeration. Reset enum_refs. */ - enum_refs = 0; - - /* - * TODO: Revisit, this is not an error case but code - * expects non-zero value. - */ - status = ENODATA; - } else { - status = -EPERM; - } - } - - return status; -} - -/* - * ======== dcd_exit ======== - * Purpose: - * Discontinue usage of the DCD module. - */ -void dcd_exit(void) -{ - struct dcd_key_elem *rv, *rv_tmp; - - refs--; - if (refs == 0) { - list_for_each_entry_safe(rv, rv_tmp, ®_key_list, link) { - list_del(&rv->link); - kfree(rv->path); - kfree(rv); - } - } - -} - -/* - * ======== dcd_get_dep_libs ======== - */ -int dcd_get_dep_libs(struct dcd_manager *hdcd_mgr, - struct dsp_uuid *uuid_obj, - u16 num_libs, struct dsp_uuid *dep_lib_uuids, - bool *prstnt_dep_libs, - enum nldr_phase phase) -{ - int status = 0; - - status = - get_dep_lib_info(hdcd_mgr, uuid_obj, &num_libs, NULL, dep_lib_uuids, - prstnt_dep_libs, phase); - - return status; -} - -/* - * ======== dcd_get_num_dep_libs ======== - */ -int dcd_get_num_dep_libs(struct dcd_manager *hdcd_mgr, - struct dsp_uuid *uuid_obj, - u16 *num_libs, u16 *num_pers_libs, - enum nldr_phase phase) -{ - int status = 0; - - status = get_dep_lib_info(hdcd_mgr, uuid_obj, num_libs, num_pers_libs, - NULL, NULL, phase); - - return status; -} - -/* - * ======== dcd_get_object_def ======== - * Purpose: - * Retrieves the properties of a node or processor based on the UUID and - * object type. - */ -int dcd_get_object_def(struct dcd_manager *hdcd_mgr, - struct dsp_uuid *obj_uuid, - enum dsp_dcdobjtype obj_type, - struct dcd_genericobj *obj_def) -{ - struct dcd_manager *dcd_mgr_obj = hdcd_mgr; /* ptr to DCD mgr */ - struct cod_libraryobj *lib = NULL; - int status = 0; - int len; - u32 ul_addr = 0; /* Used by cod_get_section */ - u32 ul_len = 0; /* Used by cod_get_section */ - u32 dw_buf_size; /* Used by REG functions */ - char sz_reg_key[DCD_MAXPATHLENGTH]; - char *sz_uuid; /*[MAXUUIDLEN]; */ - char *tmp; - struct dcd_key_elem *dcd_key = NULL; - char sz_sect_name[MAXUUIDLEN + 2]; /* ".[UUID]\0" */ - char *psz_coff_buf; - u32 dw_key_len; /* Len of REG key. */ - char sz_obj_type[MAX_INT2CHAR_LENGTH]; /* str. rep. of obj_type. */ - - sz_uuid = kzalloc(MAXUUIDLEN, GFP_KERNEL); - if (!sz_uuid) { - status = -ENOMEM; - goto func_end; - } - - if (!hdcd_mgr) { - status = -EFAULT; - goto func_end; - } - - /* Pre-determine final key length. It's length of DCD_REGKEY + - * "_\0" + length of sz_obj_type string + terminating NULL */ - dw_key_len = strlen(DCD_REGKEY) + 1 + sizeof(sz_obj_type) + 1; - - /* Create proper REG key; concatenate DCD_REGKEY with obj_type. */ - strncpy(sz_reg_key, DCD_REGKEY, strlen(DCD_REGKEY) + 1); - - if ((strlen(sz_reg_key) + strlen("_\0")) < DCD_MAXPATHLENGTH) - strncat(sz_reg_key, "_\0", 2); - else - status = -EPERM; - - status = snprintf(sz_obj_type, MAX_INT2CHAR_LENGTH, "%d", obj_type); - if (status == -1) { - status = -EPERM; - } else { - status = 0; - - if ((strlen(sz_reg_key) + strlen(sz_obj_type)) < - DCD_MAXPATHLENGTH) { - strncat(sz_reg_key, sz_obj_type, - strlen(sz_obj_type) + 1); - } else { - status = -EPERM; - } - - /* Create UUID value to set in registry. */ - snprintf(sz_uuid, MAXUUIDLEN, "%pUL", obj_uuid); - - if ((strlen(sz_reg_key) + MAXUUIDLEN) < DCD_MAXPATHLENGTH) - strncat(sz_reg_key, sz_uuid, MAXUUIDLEN); - else - status = -EPERM; - - /* Retrieve paths from the registry based on struct dsp_uuid */ - dw_buf_size = DCD_MAXPATHLENGTH; - } - if (!status) { - spin_lock(&dbdcd_lock); - list_for_each_entry(dcd_key, ®_key_list, link) { - if (!strncmp(dcd_key->name, sz_reg_key, - strlen(sz_reg_key) + 1)) - break; - } - spin_unlock(&dbdcd_lock); - if (&dcd_key->link == ®_key_list) { - status = -ENOKEY; - goto func_end; - } - } - - - /* Open COFF file. */ - status = cod_open(dcd_mgr_obj->cod_mgr, dcd_key->path, - COD_NOLOAD, &lib); - if (status) { - status = -EACCES; - goto func_end; - } - - /* Ensure sz_uuid + 1 is not greater than sizeof sz_sect_name. */ - len = strlen(sz_uuid); - if (len + 1 > sizeof(sz_sect_name)) { - status = -EPERM; - goto func_end; - } - - /* Create section name based on node UUID. A period is - * pre-pended to the UUID string to form the section name. - * I.e. ".24BC8D90_BB45_11d4_B756_006008BDB66F" */ - - len -= 4; /* uuid has 4 delimiters '-' */ - tmp = sz_uuid; - - strncpy(sz_sect_name, ".", 2); - do { - char *uuid = strsep(&tmp, "-"); - - if (!uuid) - break; - len -= strlen(uuid); - strncat(sz_sect_name, uuid, strlen(uuid) + 1); - } while (len && strncat(sz_sect_name, "_", 2)); - - /* Get section information. */ - status = cod_get_section(lib, sz_sect_name, &ul_addr, &ul_len); - if (status) { - status = -EACCES; - goto func_end; - } - - /* Allocate zeroed buffer. */ - psz_coff_buf = kzalloc(ul_len + 4, GFP_KERNEL); - if (psz_coff_buf == NULL) { - status = -ENOMEM; - goto func_end; - } -#ifdef _DB_TIOMAP - if (strstr(dcd_key->path, "iva") == NULL) { - /* Locate section by objectID and read its content. */ - status = - cod_read_section(lib, sz_sect_name, psz_coff_buf, ul_len); - } else { - status = - cod_read_section(lib, sz_sect_name, psz_coff_buf, ul_len); - dev_dbg(bridge, "%s: Skipped Byte swap for IVA!!\n", __func__); - } -#else - status = cod_read_section(lib, sz_sect_name, psz_coff_buf, ul_len); -#endif - if (!status) { - /* Compress DSP buffer to conform to PC format. */ - if (strstr(dcd_key->path, "iva") == NULL) { - compress_buf(psz_coff_buf, ul_len, DSPWORDSIZE); - } else { - compress_buf(psz_coff_buf, ul_len, 1); - dev_dbg(bridge, "%s: Compressing IVA COFF buffer by 1 " - "for IVA!!\n", __func__); - } - - /* Parse the content of the COFF buffer. */ - status = - get_attrs_from_buf(psz_coff_buf, ul_len, obj_type, obj_def); - if (status) - status = -EACCES; - } else { - status = -EACCES; - } - - /* Free the previously allocated dynamic buffer. */ - kfree(psz_coff_buf); -func_end: - if (lib) - cod_close(lib); - - kfree(sz_uuid); - - return status; -} - -/* - * ======== dcd_get_objects ======== - */ -int dcd_get_objects(struct dcd_manager *hdcd_mgr, - char *sz_coff_path, dcd_registerfxn register_fxn, - void *handle) -{ - struct dcd_manager *dcd_mgr_obj = hdcd_mgr; - int status = 0; - char *psz_coff_buf; - char *psz_cur; - struct cod_libraryobj *lib = NULL; - u32 ul_addr = 0; /* Used by cod_get_section */ - u32 ul_len = 0; /* Used by cod_get_section */ - char seps[] = ":, "; - char *token = NULL; - struct dsp_uuid dsp_uuid_obj; - s32 object_type; - - if (!hdcd_mgr) { - status = -EFAULT; - goto func_end; - } - - /* Open DSP coff file, don't load symbols. */ - status = cod_open(dcd_mgr_obj->cod_mgr, sz_coff_path, COD_NOLOAD, &lib); - if (status) { - status = -EACCES; - goto func_cont; - } - - /* Get DCD_RESIGER_SECTION section information. */ - status = cod_get_section(lib, DCD_REGISTER_SECTION, &ul_addr, &ul_len); - if (status || !(ul_len > 0)) { - status = -EACCES; - goto func_cont; - } - - /* Allocate zeroed buffer. */ - psz_coff_buf = kzalloc(ul_len + 4, GFP_KERNEL); - if (psz_coff_buf == NULL) { - status = -ENOMEM; - goto func_cont; - } -#ifdef _DB_TIOMAP - if (strstr(sz_coff_path, "iva") == NULL) { - /* Locate section by objectID and read its content. */ - status = cod_read_section(lib, DCD_REGISTER_SECTION, - psz_coff_buf, ul_len); - } else { - dev_dbg(bridge, "%s: Skipped Byte swap for IVA!!\n", __func__); - status = cod_read_section(lib, DCD_REGISTER_SECTION, - psz_coff_buf, ul_len); - } -#else - status = - cod_read_section(lib, DCD_REGISTER_SECTION, psz_coff_buf, ul_len); -#endif - if (!status) { - /* Compress DSP buffer to conform to PC format. */ - if (strstr(sz_coff_path, "iva") == NULL) { - compress_buf(psz_coff_buf, ul_len, DSPWORDSIZE); - } else { - compress_buf(psz_coff_buf, ul_len, 1); - dev_dbg(bridge, "%s: Compress COFF buffer with 1 word " - "for IVA!!\n", __func__); - } - - /* Read from buffer and register object in buffer. */ - psz_cur = psz_coff_buf; - while ((token = strsep(&psz_cur, seps)) && *token != '\0') { - /* Retrieve UUID string. */ - status = dcd_uuid_from_string(token, &dsp_uuid_obj); - - if (!status) { - /* Retrieve object type */ - token = strsep(&psz_cur, seps); - - /* Retrieve object type */ - object_type = atoi(token); - - /* - * Apply register_fxn to the found DCD object. - * Possible actions include: - * - * 1) Register found DCD object. - * 2) Unregister found DCD object - * (when handle == NULL) - * 3) Add overlay node. - */ - status = - register_fxn(&dsp_uuid_obj, object_type, - handle); - } - if (status) { - /* if error occurs, break from while loop. */ - break; - } - } - } else { - status = -EACCES; - } - - /* Free the previously allocated dynamic buffer. */ - kfree(psz_coff_buf); -func_cont: - if (lib) - cod_close(lib); - -func_end: - return status; -} - -/* - * ======== dcd_get_library_name ======== - * Purpose: - * Retrieves the library name for the given UUID. - * - */ -int dcd_get_library_name(struct dcd_manager *hdcd_mgr, - struct dsp_uuid *uuid_obj, - char *str_lib_name, - u32 *buff_size, - enum nldr_phase phase, bool *phase_split) -{ - char sz_reg_key[DCD_MAXPATHLENGTH]; - char sz_uuid[MAXUUIDLEN]; - u32 dw_key_len; /* Len of REG key. */ - char sz_obj_type[MAX_INT2CHAR_LENGTH]; /* str. rep. of obj_type. */ - int status = 0; - struct dcd_key_elem *dcd_key = NULL; - - dev_dbg(bridge, "%s: hdcd_mgr %p, uuid_obj %p, str_lib_name %p," - " buff_size %p\n", __func__, hdcd_mgr, uuid_obj, str_lib_name, - buff_size); - - /* - * Pre-determine final key length. It's length of DCD_REGKEY + - * "_\0" + length of sz_obj_type string + terminating NULL. - */ - dw_key_len = strlen(DCD_REGKEY) + 1 + sizeof(sz_obj_type) + 1; - - /* Create proper REG key; concatenate DCD_REGKEY with obj_type. */ - strncpy(sz_reg_key, DCD_REGKEY, strlen(DCD_REGKEY) + 1); - if ((strlen(sz_reg_key) + strlen("_\0")) < DCD_MAXPATHLENGTH) - strncat(sz_reg_key, "_\0", 2); - else - status = -EPERM; - - switch (phase) { - case NLDR_CREATE: - /* create phase type */ - sprintf(sz_obj_type, "%d", DSP_DCDCREATELIBTYPE); - break; - case NLDR_EXECUTE: - /* execute phase type */ - sprintf(sz_obj_type, "%d", DSP_DCDEXECUTELIBTYPE); - break; - case NLDR_DELETE: - /* delete phase type */ - sprintf(sz_obj_type, "%d", DSP_DCDDELETELIBTYPE); - break; - case NLDR_NOPHASE: - /* known to be a dependent library */ - sprintf(sz_obj_type, "%d", DSP_DCDLIBRARYTYPE); - break; - default: - status = -EINVAL; - } - if (!status) { - if ((strlen(sz_reg_key) + strlen(sz_obj_type)) < - DCD_MAXPATHLENGTH) { - strncat(sz_reg_key, sz_obj_type, - strlen(sz_obj_type) + 1); - } else { - status = -EPERM; - } - /* Create UUID value to find match in registry. */ - snprintf(sz_uuid, MAXUUIDLEN, "%pUL", uuid_obj); - if ((strlen(sz_reg_key) + MAXUUIDLEN) < DCD_MAXPATHLENGTH) - strncat(sz_reg_key, sz_uuid, MAXUUIDLEN); - else - status = -EPERM; - } - if (!status) { - spin_lock(&dbdcd_lock); - list_for_each_entry(dcd_key, ®_key_list, link) { - /* See if the name matches. */ - if (!strncmp(dcd_key->name, sz_reg_key, - strlen(sz_reg_key) + 1)) - break; - } - spin_unlock(&dbdcd_lock); - } - - if (&dcd_key->link == ®_key_list) - status = -ENOKEY; - - /* If can't find, phases might be registered as generic LIBRARYTYPE */ - if (status && phase != NLDR_NOPHASE) { - if (phase_split) - *phase_split = false; - - strncpy(sz_reg_key, DCD_REGKEY, strlen(DCD_REGKEY) + 1); - if ((strlen(sz_reg_key) + strlen("_\0")) < - DCD_MAXPATHLENGTH) { - strncat(sz_reg_key, "_\0", 2); - } else { - status = -EPERM; - } - sprintf(sz_obj_type, "%d", DSP_DCDLIBRARYTYPE); - if ((strlen(sz_reg_key) + strlen(sz_obj_type)) - < DCD_MAXPATHLENGTH) { - strncat(sz_reg_key, sz_obj_type, - strlen(sz_obj_type) + 1); - } else { - status = -EPERM; - } - snprintf(sz_uuid, MAXUUIDLEN, "%pUL", uuid_obj); - if ((strlen(sz_reg_key) + MAXUUIDLEN) < DCD_MAXPATHLENGTH) - strncat(sz_reg_key, sz_uuid, MAXUUIDLEN); - else - status = -EPERM; - - spin_lock(&dbdcd_lock); - list_for_each_entry(dcd_key, ®_key_list, link) { - /* See if the name matches. */ - if (!strncmp(dcd_key->name, sz_reg_key, - strlen(sz_reg_key) + 1)) - break; - } - spin_unlock(&dbdcd_lock); - - status = (&dcd_key->link != ®_key_list) ? - 0 : -ENOKEY; - } - - if (!status) - memcpy(str_lib_name, dcd_key->path, strlen(dcd_key->path) + 1); - return status; -} - -/* - * ======== dcd_init ======== - * Purpose: - * Initialize the DCD module. - */ -bool dcd_init(void) -{ - bool ret = true; - - if (refs == 0) - INIT_LIST_HEAD(®_key_list); - - if (ret) - refs++; - - return ret; -} - -/* - * ======== dcd_register_object ======== - * Purpose: - * Registers a node or a processor with the DCD. - * If psz_path_name == NULL, unregister the specified DCD object. - */ -int dcd_register_object(struct dsp_uuid *uuid_obj, - enum dsp_dcdobjtype obj_type, - char *psz_path_name) -{ - int status = 0; - char sz_reg_key[DCD_MAXPATHLENGTH]; - char sz_uuid[MAXUUIDLEN + 1]; - u32 dw_path_size = 0; - u32 dw_key_len; /* Len of REG key. */ - char sz_obj_type[MAX_INT2CHAR_LENGTH]; /* str. rep. of obj_type. */ - struct dcd_key_elem *dcd_key = NULL; - - dev_dbg(bridge, "%s: object UUID %p, obj_type %d, szPathName %s\n", - __func__, uuid_obj, obj_type, psz_path_name); - - /* - * Pre-determine final key length. It's length of DCD_REGKEY + - * "_\0" + length of sz_obj_type string + terminating NULL. - */ - dw_key_len = strlen(DCD_REGKEY) + 1 + sizeof(sz_obj_type) + 1; - - /* Create proper REG key; concatenate DCD_REGKEY with obj_type. */ - strncpy(sz_reg_key, DCD_REGKEY, strlen(DCD_REGKEY) + 1); - if ((strlen(sz_reg_key) + strlen("_\0")) < DCD_MAXPATHLENGTH) - strncat(sz_reg_key, "_\0", 2); - else { - status = -EPERM; - goto func_end; - } - - status = snprintf(sz_obj_type, MAX_INT2CHAR_LENGTH, "%d", obj_type); - if (status == -1) { - status = -EPERM; - } else { - status = 0; - if ((strlen(sz_reg_key) + strlen(sz_obj_type)) < - DCD_MAXPATHLENGTH) { - strncat(sz_reg_key, sz_obj_type, - strlen(sz_obj_type) + 1); - } else - status = -EPERM; - - /* Create UUID value to set in registry. */ - snprintf(sz_uuid, MAXUUIDLEN, "%pUL", uuid_obj); - if ((strlen(sz_reg_key) + MAXUUIDLEN) < DCD_MAXPATHLENGTH) - strncat(sz_reg_key, sz_uuid, MAXUUIDLEN); - else - status = -EPERM; - } - - if (status) - goto func_end; - - /* - * If psz_path_name != NULL, perform registration, otherwise, - * perform unregistration. - */ - - if (psz_path_name) { - dw_path_size = strlen(psz_path_name) + 1; - spin_lock(&dbdcd_lock); - list_for_each_entry(dcd_key, ®_key_list, link) { - /* See if the name matches. */ - if (!strncmp(dcd_key->name, sz_reg_key, - strlen(sz_reg_key) + 1)) - break; - } - spin_unlock(&dbdcd_lock); - if (&dcd_key->link == ®_key_list) { - /* - * Add new reg value (UUID+obj_type) - * with COFF path info - */ - - dcd_key = kmalloc(sizeof(struct dcd_key_elem), - GFP_KERNEL); - if (!dcd_key) { - status = -ENOMEM; - goto func_end; - } - - dcd_key->path = kmalloc(dw_path_size, GFP_KERNEL); - - if (!dcd_key->path) { - kfree(dcd_key); - status = -ENOMEM; - goto func_end; - } - - strncpy(dcd_key->name, sz_reg_key, - strlen(sz_reg_key) + 1); - strncpy(dcd_key->path, psz_path_name , - dw_path_size); - spin_lock(&dbdcd_lock); - list_add_tail(&dcd_key->link, ®_key_list); - spin_unlock(&dbdcd_lock); - } else { - /* Make sure the new data is the same. */ - if (strncmp(dcd_key->path, psz_path_name, - dw_path_size)) { - /* The caller needs a different data size! */ - kfree(dcd_key->path); - dcd_key->path = kmalloc(dw_path_size, - GFP_KERNEL); - if (dcd_key->path == NULL) { - status = -ENOMEM; - goto func_end; - } - } - - /* We have a match! Copy out the data. */ - memcpy(dcd_key->path, psz_path_name, dw_path_size); - } - dev_dbg(bridge, "%s: psz_path_name=%s, dw_path_size=%d\n", - __func__, psz_path_name, dw_path_size); - } else { - /* Deregister an existing object */ - spin_lock(&dbdcd_lock); - list_for_each_entry(dcd_key, ®_key_list, link) { - if (!strncmp(dcd_key->name, sz_reg_key, - strlen(sz_reg_key) + 1)) { - list_del(&dcd_key->link); - kfree(dcd_key->path); - kfree(dcd_key); - break; - } - } - spin_unlock(&dbdcd_lock); - if (&dcd_key->link == ®_key_list) - status = -EPERM; - } - - if (!status) { - /* - * Because the node database has been updated through a - * successful object registration/de-registration operation, - * we need to reset the object enumeration counter to allow - * current enumerations to reflect this update in the node - * database. - */ - enum_refs = 0; - } -func_end: - return status; -} - -/* - * ======== dcd_unregister_object ======== - * Call DCD_Register object with psz_path_name set to NULL to - * perform actual object de-registration. - */ -int dcd_unregister_object(struct dsp_uuid *uuid_obj, - enum dsp_dcdobjtype obj_type) -{ - int status = 0; - - /* - * When dcd_register_object is called with NULL as pathname, - * it indicates an unregister object operation. - */ - status = dcd_register_object(uuid_obj, obj_type, NULL); - - return status; -} - -/* - ********************************************************************** - * DCD Helper Functions - ********************************************************************** - */ - -/* - * ======== atoi ======== - * Purpose: - * This function converts strings in decimal or hex format to integers. - */ -static s32 atoi(char *psz_buf) -{ - char *pch = psz_buf; - s32 base = 0; - - while (isspace(*pch)) - pch++; - - if (*pch == '-' || *pch == '+') { - base = 10; - pch++; - } else if (*pch && tolower(pch[strlen(pch) - 1]) == 'h') { - base = 16; - } - - return simple_strtoul(pch, NULL, base); -} - -/* - * ======== get_attrs_from_buf ======== - * Purpose: - * Parse the content of a buffer filled with DSP-side data and - * retrieve an object's attributes from it. IMPORTANT: Assume the - * buffer has been converted from DSP format to GPP format. - */ -static int get_attrs_from_buf(char *psz_buf, u32 ul_buf_size, - enum dsp_dcdobjtype obj_type, - struct dcd_genericobj *gen_obj) -{ - int status = 0; - char seps[] = ", "; - char *psz_cur; - char *token; - s32 token_len = 0; - u32 i = 0; -#ifdef _DB_TIOMAP - s32 entry_id; -#endif - - switch (obj_type) { - case DSP_DCDNODETYPE: - /* - * Parse COFF sect buffer to retrieve individual tokens used - * to fill in object attrs. - */ - psz_cur = psz_buf; - token = strsep(&psz_cur, seps); - - /* u32 cb_struct */ - gen_obj->obj_data.node_obj.ndb_props.cb_struct = - (u32) atoi(token); - token = strsep(&psz_cur, seps); - - /* dsp_uuid ui_node_id */ - status = dcd_uuid_from_string(token, - &gen_obj->obj_data.node_obj. - ndb_props.ui_node_id); - if (status) - break; - - token = strsep(&psz_cur, seps); - - /* ac_name */ - token_len = strlen(token); - if (token_len > DSP_MAXNAMELEN - 1) - token_len = DSP_MAXNAMELEN - 1; - - strncpy(gen_obj->obj_data.node_obj.ndb_props.ac_name, - token, token_len); - gen_obj->obj_data.node_obj.ndb_props.ac_name[token_len] = '\0'; - token = strsep(&psz_cur, seps); - /* u32 ntype */ - gen_obj->obj_data.node_obj.ndb_props.ntype = atoi(token); - token = strsep(&psz_cur, seps); - /* u32 cache_on_gpp */ - gen_obj->obj_data.node_obj.ndb_props.cache_on_gpp = atoi(token); - token = strsep(&psz_cur, seps); - /* dsp_resourcereqmts dsp_resource_reqmts */ - gen_obj->obj_data.node_obj.ndb_props.dsp_resource_reqmts. - cb_struct = (u32) atoi(token); - token = strsep(&psz_cur, seps); - - gen_obj->obj_data.node_obj.ndb_props. - dsp_resource_reqmts.static_data_size = atoi(token); - token = strsep(&psz_cur, seps); - gen_obj->obj_data.node_obj.ndb_props. - dsp_resource_reqmts.global_data_size = atoi(token); - token = strsep(&psz_cur, seps); - gen_obj->obj_data.node_obj.ndb_props. - dsp_resource_reqmts.program_mem_size = atoi(token); - token = strsep(&psz_cur, seps); - gen_obj->obj_data.node_obj.ndb_props. - dsp_resource_reqmts.wc_execution_time = atoi(token); - token = strsep(&psz_cur, seps); - gen_obj->obj_data.node_obj.ndb_props. - dsp_resource_reqmts.wc_period = atoi(token); - token = strsep(&psz_cur, seps); - - gen_obj->obj_data.node_obj.ndb_props. - dsp_resource_reqmts.wc_deadline = atoi(token); - token = strsep(&psz_cur, seps); - - gen_obj->obj_data.node_obj.ndb_props. - dsp_resource_reqmts.avg_exection_time = atoi(token); - token = strsep(&psz_cur, seps); - - gen_obj->obj_data.node_obj.ndb_props. - dsp_resource_reqmts.minimum_period = atoi(token); - token = strsep(&psz_cur, seps); - - /* s32 prio */ - gen_obj->obj_data.node_obj.ndb_props.prio = atoi(token); - token = strsep(&psz_cur, seps); - - /* u32 stack_size */ - gen_obj->obj_data.node_obj.ndb_props.stack_size = atoi(token); - token = strsep(&psz_cur, seps); - - /* u32 sys_stack_size */ - gen_obj->obj_data.node_obj.ndb_props.sys_stack_size = - atoi(token); - token = strsep(&psz_cur, seps); - - /* u32 stack_seg */ - gen_obj->obj_data.node_obj.ndb_props.stack_seg = atoi(token); - token = strsep(&psz_cur, seps); - - /* u32 message_depth */ - gen_obj->obj_data.node_obj.ndb_props.message_depth = - atoi(token); - token = strsep(&psz_cur, seps); - - /* u32 num_input_streams */ - gen_obj->obj_data.node_obj.ndb_props.num_input_streams = - atoi(token); - token = strsep(&psz_cur, seps); - - /* u32 num_output_streams */ - gen_obj->obj_data.node_obj.ndb_props.num_output_streams = - atoi(token); - token = strsep(&psz_cur, seps); - - /* u32 timeout */ - gen_obj->obj_data.node_obj.ndb_props.timeout = atoi(token); - token = strsep(&psz_cur, seps); - - /* char *str_create_phase_fxn */ - token_len = strlen(token); - gen_obj->obj_data.node_obj.str_create_phase_fxn = - kzalloc(token_len + 1, GFP_KERNEL); - strncpy(gen_obj->obj_data.node_obj.str_create_phase_fxn, - token, token_len); - gen_obj->obj_data.node_obj.str_create_phase_fxn[token_len] = - '\0'; - token = strsep(&psz_cur, seps); - - /* char *str_execute_phase_fxn */ - token_len = strlen(token); - gen_obj->obj_data.node_obj.str_execute_phase_fxn = - kzalloc(token_len + 1, GFP_KERNEL); - strncpy(gen_obj->obj_data.node_obj.str_execute_phase_fxn, - token, token_len); - gen_obj->obj_data.node_obj.str_execute_phase_fxn[token_len] = - '\0'; - token = strsep(&psz_cur, seps); - - /* char *str_delete_phase_fxn */ - token_len = strlen(token); - gen_obj->obj_data.node_obj.str_delete_phase_fxn = - kzalloc(token_len + 1, GFP_KERNEL); - strncpy(gen_obj->obj_data.node_obj.str_delete_phase_fxn, - token, token_len); - gen_obj->obj_data.node_obj.str_delete_phase_fxn[token_len] = - '\0'; - token = strsep(&psz_cur, seps); - - /* Segment id for message buffers */ - gen_obj->obj_data.node_obj.msg_segid = atoi(token); - token = strsep(&psz_cur, seps); - - /* Message notification type */ - gen_obj->obj_data.node_obj.msg_notify_type = atoi(token); - token = strsep(&psz_cur, seps); - - /* char *str_i_alg_name */ - if (token) { - token_len = strlen(token); - gen_obj->obj_data.node_obj.str_i_alg_name = - kzalloc(token_len + 1, GFP_KERNEL); - strncpy(gen_obj->obj_data.node_obj.str_i_alg_name, - token, token_len); - gen_obj->obj_data.node_obj.str_i_alg_name[token_len] = - '\0'; - token = strsep(&psz_cur, seps); - } - - /* Load type (static, dynamic, or overlay) */ - if (token) { - gen_obj->obj_data.node_obj.load_type = atoi(token); - token = strsep(&psz_cur, seps); - } - - /* Dynamic load data requirements */ - if (token) { - gen_obj->obj_data.node_obj.data_mem_seg_mask = - atoi(token); - token = strsep(&psz_cur, seps); - } - - /* Dynamic load code requirements */ - if (token) { - gen_obj->obj_data.node_obj.code_mem_seg_mask = - atoi(token); - token = strsep(&psz_cur, seps); - } - - /* Extract node profiles into node properties */ - if (token) { - - gen_obj->obj_data.node_obj.ndb_props.count_profiles = - atoi(token); - for (i = 0; - i < - gen_obj->obj_data.node_obj. - ndb_props.count_profiles; i++) { - token = strsep(&psz_cur, seps); - if (token) { - /* Heap Size for the node */ - gen_obj->obj_data.node_obj. - ndb_props.node_profiles[i]. - heap_size = atoi(token); - } - } - } - token = strsep(&psz_cur, seps); - if (token) { - gen_obj->obj_data.node_obj.ndb_props.stack_seg_name = - (u32) (token); - } - - break; - - case DSP_DCDPROCESSORTYPE: - /* - * Parse COFF sect buffer to retrieve individual tokens used - * to fill in object attrs. - */ - psz_cur = psz_buf; - token = strsep(&psz_cur, seps); - - gen_obj->obj_data.proc_info.cb_struct = atoi(token); - token = strsep(&psz_cur, seps); - - gen_obj->obj_data.proc_info.processor_family = atoi(token); - token = strsep(&psz_cur, seps); - - gen_obj->obj_data.proc_info.processor_type = atoi(token); - token = strsep(&psz_cur, seps); - - gen_obj->obj_data.proc_info.clock_rate = atoi(token); - token = strsep(&psz_cur, seps); - - gen_obj->obj_data.proc_info.internal_mem_size = atoi(token); - token = strsep(&psz_cur, seps); - - gen_obj->obj_data.proc_info.external_mem_size = atoi(token); - token = strsep(&psz_cur, seps); - - gen_obj->obj_data.proc_info.processor_id = atoi(token); - token = strsep(&psz_cur, seps); - - gen_obj->obj_data.proc_info.ty_running_rtos = atoi(token); - token = strsep(&psz_cur, seps); - - gen_obj->obj_data.proc_info.node_min_priority = atoi(token); - token = strsep(&psz_cur, seps); - - gen_obj->obj_data.proc_info.node_max_priority = atoi(token); - -#ifdef _DB_TIOMAP - /* Proc object may contain additional(extended) attributes. */ - /* attr must match proc.hxx */ - for (entry_id = 0; entry_id < 7; entry_id++) { - token = strsep(&psz_cur, seps); - gen_obj->obj_data.ext_proc_obj.ty_tlb[entry_id]. - gpp_phys = atoi(token); - - token = strsep(&psz_cur, seps); - gen_obj->obj_data.ext_proc_obj.ty_tlb[entry_id]. - dsp_virt = atoi(token); - } -#endif - - break; - - default: - status = -EPERM; - break; - } - - return status; -} - -/* - * ======== CompressBuffer ======== - * Purpose: - * Compress the DSP buffer, if necessary, to conform to PC format. - */ -static void compress_buf(char *psz_buf, u32 ul_buf_size, s32 char_size) -{ - char *p; - char ch; - char *q; - - p = psz_buf; - if (p == NULL) - return; - - for (q = psz_buf; q < (psz_buf + ul_buf_size);) { - ch = dsp_char2_gpp_char(q, char_size); - if (ch == '\\') { - q += char_size; - ch = dsp_char2_gpp_char(q, char_size); - switch (ch) { - case 't': - *p = '\t'; - break; - - case 'n': - *p = '\n'; - break; - - case 'r': - *p = '\r'; - break; - - case '0': - *p = '\0'; - break; - - default: - *p = ch; - break; - } - } else { - *p = ch; - } - p++; - q += char_size; - } - - /* NULL out remainder of buffer. */ - while (p < q) - *p++ = '\0'; -} - -/* - * ======== dsp_char2_gpp_char ======== - * Purpose: - * Convert DSP char to host GPP char in a portable manner - */ -static char dsp_char2_gpp_char(char *word, s32 dsp_char_size) -{ - char ch = '\0'; - char *ch_src; - s32 i; - - for (ch_src = word, i = dsp_char_size; i > 0; i--) - ch |= *ch_src++; - - return ch; -} - -/* - * ======== get_dep_lib_info ======== - */ -static int get_dep_lib_info(struct dcd_manager *hdcd_mgr, - struct dsp_uuid *uuid_obj, - u16 *num_libs, - u16 *num_pers_libs, - struct dsp_uuid *dep_lib_uuids, - bool *prstnt_dep_libs, - enum nldr_phase phase) -{ - struct dcd_manager *dcd_mgr_obj = hdcd_mgr; - char *psz_coff_buf = NULL; - char *psz_cur; - char *psz_file_name = NULL; - struct cod_libraryobj *lib = NULL; - u32 ul_addr = 0; /* Used by cod_get_section */ - u32 ul_len = 0; /* Used by cod_get_section */ - u32 dw_data_size = COD_MAXPATHLENGTH; - char seps[] = ", "; - char *token = NULL; - bool get_uuids = (dep_lib_uuids != NULL); - u16 dep_libs = 0; - int status = 0; - - /* Initialize to 0 dependent libraries, if only counting number of - * dependent libraries */ - if (!get_uuids) { - *num_libs = 0; - *num_pers_libs = 0; - } - - /* Allocate a buffer for file name */ - psz_file_name = kzalloc(dw_data_size, GFP_KERNEL); - if (psz_file_name == NULL) { - status = -ENOMEM; - } else { - /* Get the name of the library */ - status = dcd_get_library_name(hdcd_mgr, uuid_obj, psz_file_name, - &dw_data_size, phase, NULL); - } - - /* Open the library */ - if (!status) { - status = cod_open(dcd_mgr_obj->cod_mgr, psz_file_name, - COD_NOLOAD, &lib); - } - if (!status) { - /* Get dependent library section information. */ - status = cod_get_section(lib, DEPLIBSECT, &ul_addr, &ul_len); - - if (status) { - /* Ok, no dependent libraries */ - ul_len = 0; - status = 0; - } - } - - if (status || !(ul_len > 0)) - goto func_cont; - - /* Allocate zeroed buffer. */ - psz_coff_buf = kzalloc(ul_len + 4, GFP_KERNEL); - if (psz_coff_buf == NULL) - status = -ENOMEM; - - /* Read section contents. */ - status = cod_read_section(lib, DEPLIBSECT, psz_coff_buf, ul_len); - if (status) - goto func_cont; - - /* Compress and format DSP buffer to conform to PC format. */ - compress_buf(psz_coff_buf, ul_len, DSPWORDSIZE); - - /* Read from buffer */ - psz_cur = psz_coff_buf; - while ((token = strsep(&psz_cur, seps)) && *token != '\0') { - if (get_uuids) { - if (dep_libs >= *num_libs) { - /* Gone beyond the limit */ - break; - } else { - /* Retrieve UUID string. */ - status = dcd_uuid_from_string(token, - &(dep_lib_uuids - [dep_libs])); - if (status) - break; - - /* Is this library persistent? */ - token = strsep(&psz_cur, seps); - prstnt_dep_libs[dep_libs] = atoi(token); - dep_libs++; - } - } else { - /* Advanc to next token */ - token = strsep(&psz_cur, seps); - if (atoi(token)) - (*num_pers_libs)++; - - /* Just counting number of dependent libraries */ - (*num_libs)++; - } - } -func_cont: - if (lib) - cod_close(lib); - - /* Free previously allocated dynamic buffers. */ - kfree(psz_file_name); - - kfree(psz_coff_buf); - - return status; -} diff --git a/drivers/staging/tidspbridge/rmgr/disp.c b/drivers/staging/tidspbridge/rmgr/disp.c deleted file mode 100644 index 4af51b75aeab..000000000000 --- a/drivers/staging/tidspbridge/rmgr/disp.c +++ /dev/null @@ -1,655 +0,0 @@ -/* - * disp.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Node Dispatcher interface. Communicates with Resource Manager Server - * (RMS) on DSP. Access to RMS is synchronized in NODE. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- OS Adaptation Layer */ -#include - -/* ----------------------------------- Link Driver */ -#include - -/* ----------------------------------- Platform Manager */ -#include -#include - -/* ----------------------------------- Resource Manager */ -#include -#include -#include - -/* ----------------------------------- This */ -#include - -/* Size of a reply from RMS */ -#define REPLYSIZE (3 * sizeof(rms_word)) - -/* Reserved channel offsets for communication with RMS */ -#define CHNLTORMSOFFSET 0 -#define CHNLFROMRMSOFFSET 1 - -#define CHNLIOREQS 1 - -/* - * ======== disp_object ======== - */ -struct disp_object { - struct dev_object *dev_obj; /* Device for this processor */ - /* Function interface to Bridge driver */ - struct bridge_drv_interface *intf_fxns; - struct chnl_mgr *chnl_mgr; /* Channel manager */ - struct chnl_object *chnl_to_dsp; /* Chnl for commands to RMS */ - struct chnl_object *chnl_from_dsp; /* Chnl for replies from RMS */ - u8 *buf; /* Buffer for commands, replies */ - u32 bufsize; /* buf size in bytes */ - u32 bufsize_rms; /* buf size in RMS words */ - u32 char_size; /* Size of DSP character */ - u32 word_size; /* Size of DSP word */ - u32 data_mau_size; /* Size of DSP Data MAU */ -}; - -static void delete_disp(struct disp_object *disp_obj); -static int fill_stream_def(rms_word *pdw_buf, u32 *ptotal, u32 offset, - struct node_strmdef strm_def, u32 max, - u32 chars_in_rms_word); -static int send_message(struct disp_object *disp_obj, u32 timeout, - u32 ul_bytes, u32 *pdw_arg); - -/* - * ======== disp_create ======== - * Create a NODE Dispatcher object. - */ -int disp_create(struct disp_object **dispatch_obj, - struct dev_object *hdev_obj, - const struct disp_attr *disp_attrs) -{ - struct disp_object *disp_obj; - struct bridge_drv_interface *intf_fxns; - u32 ul_chnl_id; - struct chnl_attr chnl_attr_obj; - int status = 0; - u8 dev_type; - - *dispatch_obj = NULL; - - /* Allocate Node Dispatcher object */ - disp_obj = kzalloc(sizeof(struct disp_object), GFP_KERNEL); - if (disp_obj == NULL) - status = -ENOMEM; - else - disp_obj->dev_obj = hdev_obj; - - /* Get Channel manager and Bridge function interface */ - if (!status) { - status = dev_get_chnl_mgr(hdev_obj, &(disp_obj->chnl_mgr)); - if (!status) { - (void)dev_get_intf_fxns(hdev_obj, &intf_fxns); - disp_obj->intf_fxns = intf_fxns; - } - } - - /* check device type and decide if streams or messag'ing is used for - * RMS/EDS */ - if (status) - goto func_cont; - - status = dev_get_dev_type(hdev_obj, &dev_type); - - if (status) - goto func_cont; - - if (dev_type != DSP_UNIT) { - status = -EPERM; - goto func_cont; - } - - disp_obj->char_size = DSPWORDSIZE; - disp_obj->word_size = DSPWORDSIZE; - disp_obj->data_mau_size = DSPWORDSIZE; - /* Open channels for communicating with the RMS */ - chnl_attr_obj.uio_reqs = CHNLIOREQS; - chnl_attr_obj.event_obj = NULL; - ul_chnl_id = disp_attrs->chnl_offset + CHNLTORMSOFFSET; - status = (*intf_fxns->chnl_open) (&(disp_obj->chnl_to_dsp), - disp_obj->chnl_mgr, - CHNL_MODETODSP, ul_chnl_id, - &chnl_attr_obj); - - if (!status) { - ul_chnl_id = disp_attrs->chnl_offset + CHNLFROMRMSOFFSET; - status = - (*intf_fxns->chnl_open) (&(disp_obj->chnl_from_dsp), - disp_obj->chnl_mgr, - CHNL_MODEFROMDSP, ul_chnl_id, - &chnl_attr_obj); - } - if (!status) { - /* Allocate buffer for commands, replies */ - disp_obj->bufsize = disp_attrs->chnl_buf_size; - disp_obj->bufsize_rms = RMS_COMMANDBUFSIZE; - disp_obj->buf = kzalloc(disp_obj->bufsize, GFP_KERNEL); - if (disp_obj->buf == NULL) - status = -ENOMEM; - } -func_cont: - if (!status) - *dispatch_obj = disp_obj; - else - delete_disp(disp_obj); - - return status; -} - -/* - * ======== disp_delete ======== - * Delete the NODE Dispatcher. - */ -void disp_delete(struct disp_object *disp_obj) -{ - delete_disp(disp_obj); -} - -/* - * ======== disp_node_change_priority ======== - * Change the priority of a node currently running on the target. - */ -int disp_node_change_priority(struct disp_object *disp_obj, - struct node_object *hnode, - u32 rms_fxn, nodeenv node_env, s32 prio) -{ - u32 dw_arg; - struct rms_command *rms_cmd; - int status = 0; - - /* Send message to RMS to change priority */ - rms_cmd = (struct rms_command *)(disp_obj->buf); - rms_cmd->fxn = (rms_word) (rms_fxn); - rms_cmd->arg1 = (rms_word) node_env; - rms_cmd->arg2 = prio; - status = send_message(disp_obj, node_get_timeout(hnode), - sizeof(struct rms_command), &dw_arg); - - return status; -} - -/* - * ======== disp_node_create ======== - * Create a node on the DSP by remotely calling the node's create function. - */ -int disp_node_create(struct disp_object *disp_obj, - struct node_object *hnode, u32 rms_fxn, - u32 ul_create_fxn, - const struct node_createargs *pargs, - nodeenv *node_env) -{ - struct node_msgargs node_msg_args; - struct node_taskargs task_arg_obj; - struct rms_command *rms_cmd; - struct rms_msg_args *pmsg_args; - struct rms_more_task_args *more_task_args; - enum node_type node_type; - u32 dw_length; - rms_word *pdw_buf = NULL; - u32 ul_bytes; - u32 i; - u32 total; - u32 chars_in_rms_word; - s32 task_args_offset; - s32 sio_in_def_offset; - s32 sio_out_def_offset; - s32 sio_defs_offset; - s32 args_offset = -1; - s32 offset; - struct node_strmdef strm_def; - u32 max; - int status = 0; - struct dsp_nodeinfo node_info; - u8 dev_type; - - status = dev_get_dev_type(disp_obj->dev_obj, &dev_type); - - if (status) - goto func_end; - - if (dev_type != DSP_UNIT) { - dev_dbg(bridge, "%s: unknown device type = 0x%x\n", - __func__, dev_type); - goto func_end; - } - node_type = node_get_type(hnode); - node_msg_args = pargs->asa.node_msg_args; - max = disp_obj->bufsize_rms; /*Max # of RMS words that can be sent */ - chars_in_rms_word = sizeof(rms_word) / disp_obj->char_size; - /* Number of RMS words needed to hold arg data */ - dw_length = - (node_msg_args.arg_length + chars_in_rms_word - - 1) / chars_in_rms_word; - /* Make sure msg args and command fit in buffer */ - total = sizeof(struct rms_command) / sizeof(rms_word) + - sizeof(struct rms_msg_args) - / sizeof(rms_word) - 1 + dw_length; - if (total >= max) { - status = -EPERM; - dev_dbg(bridge, "%s: Message args too large for buffer! size " - "= %d, max = %d\n", __func__, total, max); - } - /* - * Fill in buffer to send to RMS. - * The buffer will have the following format: - * - * RMS command: - * Address of RMS_CreateNode() - * Address of node's create function - * dummy argument - * node type - * - * Message Args: - * max number of messages - * segid for message buffer allocation - * notification type to use when message is received - * length of message arg data - * message args data - * - * Task Args (if task or socket node): - * priority - * stack size - * system stack size - * stack segment - * misc - * number of input streams - * pSTRMInDef[] - offsets of STRM definitions for input streams - * number of output streams - * pSTRMOutDef[] - offsets of STRM definitions for output - * streams - * STRMInDef[] - array of STRM definitions for input streams - * STRMOutDef[] - array of STRM definitions for output streams - * - * Socket Args (if DAIS socket node): - * - */ - if (!status) { - total = 0; /* Total number of words in buffer so far */ - pdw_buf = (rms_word *) disp_obj->buf; - rms_cmd = (struct rms_command *)pdw_buf; - rms_cmd->fxn = (rms_word) (rms_fxn); - rms_cmd->arg1 = (rms_word) (ul_create_fxn); - if (node_get_load_type(hnode) == NLDR_DYNAMICLOAD) { - /* Flush ICACHE on Load */ - rms_cmd->arg2 = 1; /* dummy argument */ - } else { - /* Do not flush ICACHE */ - rms_cmd->arg2 = 0; /* dummy argument */ - } - rms_cmd->data = node_get_type(hnode); - /* - * args_offset is the offset of the data field in struct - * rms_command structure. We need this to calculate stream - * definition offsets. - */ - args_offset = 3; - total += sizeof(struct rms_command) / sizeof(rms_word); - /* Message args */ - pmsg_args = (struct rms_msg_args *)(pdw_buf + total); - pmsg_args->max_msgs = node_msg_args.max_msgs; - pmsg_args->segid = node_msg_args.seg_id; - pmsg_args->notify_type = node_msg_args.notify_type; - pmsg_args->arg_length = node_msg_args.arg_length; - total += sizeof(struct rms_msg_args) / sizeof(rms_word) - 1; - memcpy(pdw_buf + total, node_msg_args.pdata, - node_msg_args.arg_length); - total += dw_length; - } - if (status) - goto func_end; - - /* If node is a task node, copy task create arguments into buffer */ - if (node_type == NODE_TASK || node_type == NODE_DAISSOCKET) { - task_arg_obj = pargs->asa.task_arg_obj; - task_args_offset = total; - total += sizeof(struct rms_more_task_args) / sizeof(rms_word) + - 1 + task_arg_obj.num_inputs + task_arg_obj.num_outputs; - /* Copy task arguments */ - if (total < max) { - total = task_args_offset; - more_task_args = (struct rms_more_task_args *)(pdw_buf + - total); - /* - * Get some important info about the node. Note that we - * don't just reach into the hnode struct because - * that would break the node object's abstraction. - */ - get_node_info(hnode, &node_info); - more_task_args->priority = node_info.execution_priority; - more_task_args->stack_size = task_arg_obj.stack_size; - more_task_args->sysstack_size = - task_arg_obj.sys_stack_size; - more_task_args->stack_seg = task_arg_obj.stack_seg; - more_task_args->heap_addr = task_arg_obj.dsp_heap_addr; - more_task_args->heap_size = task_arg_obj.heap_size; - more_task_args->misc = task_arg_obj.dais_arg; - more_task_args->num_input_streams = - task_arg_obj.num_inputs; - total += - sizeof(struct rms_more_task_args) / - sizeof(rms_word); - dev_dbg(bridge, "%s: dsp_heap_addr %x, heap_size %x\n", - __func__, task_arg_obj.dsp_heap_addr, - task_arg_obj.heap_size); - /* Keep track of pSIOInDef[] and pSIOOutDef[] - * positions in the buffer, since this needs to be - * filled in later. */ - sio_in_def_offset = total; - total += task_arg_obj.num_inputs; - pdw_buf[total++] = task_arg_obj.num_outputs; - sio_out_def_offset = total; - total += task_arg_obj.num_outputs; - sio_defs_offset = total; - /* Fill SIO defs and offsets */ - offset = sio_defs_offset; - for (i = 0; i < task_arg_obj.num_inputs; i++) { - if (status) - break; - - pdw_buf[sio_in_def_offset + i] = - (offset - args_offset) - * (sizeof(rms_word) / DSPWORDSIZE); - strm_def = task_arg_obj.strm_in_def[i]; - status = - fill_stream_def(pdw_buf, &total, offset, - strm_def, max, - chars_in_rms_word); - offset = total; - } - for (i = 0; (i < task_arg_obj.num_outputs) && - (!status); i++) { - pdw_buf[sio_out_def_offset + i] = - (offset - args_offset) - * (sizeof(rms_word) / DSPWORDSIZE); - strm_def = task_arg_obj.strm_out_def[i]; - status = - fill_stream_def(pdw_buf, &total, offset, - strm_def, max, - chars_in_rms_word); - offset = total; - } - } else { - /* Args won't fit */ - status = -EPERM; - } - } - if (!status) { - ul_bytes = total * sizeof(rms_word); - status = send_message(disp_obj, node_get_timeout(hnode), - ul_bytes, node_env); - } -func_end: - return status; -} - -/* - * ======== disp_node_delete ======== - * purpose: - * Delete a node on the DSP by remotely calling the node's delete function. - * - */ -int disp_node_delete(struct disp_object *disp_obj, - struct node_object *hnode, u32 rms_fxn, - u32 ul_delete_fxn, nodeenv node_env) -{ - u32 dw_arg; - struct rms_command *rms_cmd; - int status = 0; - u8 dev_type; - - status = dev_get_dev_type(disp_obj->dev_obj, &dev_type); - - if (!status) { - - if (dev_type == DSP_UNIT) { - - /* - * Fill in buffer to send to RMS - */ - rms_cmd = (struct rms_command *)disp_obj->buf; - rms_cmd->fxn = (rms_word) (rms_fxn); - rms_cmd->arg1 = (rms_word) node_env; - rms_cmd->arg2 = (rms_word) (ul_delete_fxn); - rms_cmd->data = node_get_type(hnode); - - status = send_message(disp_obj, node_get_timeout(hnode), - sizeof(struct rms_command), - &dw_arg); - } - } - return status; -} - -/* - * ======== disp_node_run ======== - * purpose: - * Start execution of a node's execute phase, or resume execution of a node - * that has been suspended (via DISP_NodePause()) on the DSP. - */ -int disp_node_run(struct disp_object *disp_obj, - struct node_object *hnode, u32 rms_fxn, - u32 ul_execute_fxn, nodeenv node_env) -{ - u32 dw_arg; - struct rms_command *rms_cmd; - int status = 0; - u8 dev_type; - - status = dev_get_dev_type(disp_obj->dev_obj, &dev_type); - - if (!status) { - - if (dev_type == DSP_UNIT) { - - /* - * Fill in buffer to send to RMS. - */ - rms_cmd = (struct rms_command *)disp_obj->buf; - rms_cmd->fxn = (rms_word) (rms_fxn); - rms_cmd->arg1 = (rms_word) node_env; - rms_cmd->arg2 = (rms_word) (ul_execute_fxn); - rms_cmd->data = node_get_type(hnode); - - status = send_message(disp_obj, node_get_timeout(hnode), - sizeof(struct rms_command), - &dw_arg); - } - } - - return status; -} - -/* - * ======== delete_disp ======== - * purpose: - * Frees the resources allocated for the dispatcher. - */ -static void delete_disp(struct disp_object *disp_obj) -{ - int status = 0; - struct bridge_drv_interface *intf_fxns; - - if (disp_obj) { - intf_fxns = disp_obj->intf_fxns; - - /* Free Node Dispatcher resources */ - if (disp_obj->chnl_from_dsp) { - /* Channel close can fail only if the channel handle - * is invalid. */ - status = (*intf_fxns->chnl_close) - (disp_obj->chnl_from_dsp); - if (status) { - dev_dbg(bridge, "%s: Failed to close channel " - "from RMS: 0x%x\n", __func__, status); - } - } - if (disp_obj->chnl_to_dsp) { - status = - (*intf_fxns->chnl_close) (disp_obj-> - chnl_to_dsp); - if (status) { - dev_dbg(bridge, "%s: Failed to close channel to" - " RMS: 0x%x\n", __func__, status); - } - } - kfree(disp_obj->buf); - - kfree(disp_obj); - } -} - -/* - * ======== fill_stream_def ======== - * purpose: - * Fills stream definitions. - */ -static int fill_stream_def(rms_word *pdw_buf, u32 *ptotal, u32 offset, - struct node_strmdef strm_def, u32 max, - u32 chars_in_rms_word) -{ - struct rms_strm_def *strm_def_obj; - u32 total = *ptotal; - u32 name_len; - u32 dw_length; - int status = 0; - - if (total + sizeof(struct rms_strm_def) / sizeof(rms_word) >= max) { - status = -EPERM; - } else { - strm_def_obj = (struct rms_strm_def *)(pdw_buf + total); - strm_def_obj->bufsize = strm_def.buf_size; - strm_def_obj->nbufs = strm_def.num_bufs; - strm_def_obj->segid = strm_def.seg_id; - strm_def_obj->align = strm_def.buf_alignment; - strm_def_obj->timeout = strm_def.timeout; - } - - if (!status) { - /* - * Since we haven't added the device name yet, subtract - * 1 from total. - */ - total += sizeof(struct rms_strm_def) / sizeof(rms_word) - 1; - dw_length = strlen(strm_def.sz_device) + 1; - - /* Number of RMS_WORDS needed to hold device name */ - name_len = - (dw_length + chars_in_rms_word - 1) / chars_in_rms_word; - - if (total + name_len >= max) { - status = -EPERM; - } else { - /* - * Zero out last word, since the device name may not - * extend to completely fill this word. - */ - pdw_buf[total + name_len - 1] = 0; - /** TODO USE SERVICES * */ - memcpy(pdw_buf + total, strm_def.sz_device, dw_length); - total += name_len; - *ptotal = total; - } - } - - return status; -} - -/* - * ======== send_message ====== - * Send command message to RMS, get reply from RMS. - */ -static int send_message(struct disp_object *disp_obj, u32 timeout, - u32 ul_bytes, u32 *pdw_arg) -{ - struct bridge_drv_interface *intf_fxns; - struct chnl_object *chnl_obj; - u32 dw_arg = 0; - u8 *pbuf; - struct chnl_ioc chnl_ioc_obj; - int status = 0; - - *pdw_arg = (u32) NULL; - intf_fxns = disp_obj->intf_fxns; - chnl_obj = disp_obj->chnl_to_dsp; - pbuf = disp_obj->buf; - - /* Send the command */ - status = (*intf_fxns->chnl_add_io_req) (chnl_obj, pbuf, ul_bytes, 0, - 0L, dw_arg); - if (status) - goto func_end; - - status = - (*intf_fxns->chnl_get_ioc) (chnl_obj, timeout, &chnl_ioc_obj); - if (!status) { - if (!CHNL_IS_IO_COMPLETE(chnl_ioc_obj)) { - if (CHNL_IS_TIMED_OUT(chnl_ioc_obj)) - status = -ETIME; - else - status = -EPERM; - } - } - /* Get the reply */ - if (status) - goto func_end; - - chnl_obj = disp_obj->chnl_from_dsp; - ul_bytes = REPLYSIZE; - status = (*intf_fxns->chnl_add_io_req) (chnl_obj, pbuf, ul_bytes, - 0, 0L, dw_arg); - if (status) - goto func_end; - - status = - (*intf_fxns->chnl_get_ioc) (chnl_obj, timeout, &chnl_ioc_obj); - if (!status) { - if (CHNL_IS_TIMED_OUT(chnl_ioc_obj)) { - status = -ETIME; - } else if (chnl_ioc_obj.byte_size < ul_bytes) { - /* Did not get all of the reply from the RMS */ - status = -EPERM; - } else { - if (CHNL_IS_IO_COMPLETE(chnl_ioc_obj)) { - if (*((int *)chnl_ioc_obj.buf) < 0) { - /* Translate DSP's to kernel error */ - status = -EREMOTEIO; - dev_dbg(bridge, "%s: DSP-side failed:" - " DSP errcode = 0x%x, Kernel " - "errcode = %d\n", __func__, - *(int *)pbuf, status); - } - *pdw_arg = - (((rms_word *) (chnl_ioc_obj.buf))[1]); - } else { - status = -EPERM; - } - } - } -func_end: - return status; -} diff --git a/drivers/staging/tidspbridge/rmgr/drv.c b/drivers/staging/tidspbridge/rmgr/drv.c deleted file mode 100644 index 757ae20b38ee..000000000000 --- a/drivers/staging/tidspbridge/rmgr/drv.c +++ /dev/null @@ -1,816 +0,0 @@ -/* - * drv.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP/BIOS Bridge resource allocation module. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include -#include - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- This */ -#include -#include - -#include -#include -#include -#include -#include -#include - -/* ----------------------------------- Defines, Data Structures, Typedefs */ -struct drv_object { - struct list_head dev_list; - struct list_head dev_node_string; -}; - -/* - * This is the Device Extension. Named with the Prefix - * DRV_ since it is living in this module - */ -struct drv_ext { - struct list_head link; - char sz_string[MAXREGPATHLENGTH]; -}; - -/* ----------------------------------- Globals */ -static bool ext_phys_mem_pool_enabled; -struct ext_phys_mem_pool { - u32 phys_mem_base; - u32 phys_mem_size; - u32 virt_mem_base; - u32 next_phys_alloc_ptr; -}; -static struct ext_phys_mem_pool ext_mem_pool; - -/* ----------------------------------- Function Prototypes */ -static int request_bridge_resources(struct cfg_hostres *res); - - -/* GPP PROCESS CLEANUP CODE */ - -static int drv_proc_free_node_res(int id, void *p, void *data); - -/* Allocate and add a node resource element -* This function is called from .Node_Allocate. */ -int drv_insert_node_res_element(void *hnode, void *node_resource, - void *process_ctxt) -{ - struct node_res_object **node_res_obj = - (struct node_res_object **)node_resource; - struct process_context *ctxt = (struct process_context *)process_ctxt; - int retval; - - *node_res_obj = kzalloc(sizeof(struct node_res_object), GFP_KERNEL); - if (!*node_res_obj) - return -ENOMEM; - - (*node_res_obj)->node = hnode; - retval = idr_alloc(ctxt->node_id, *node_res_obj, 0, 0, GFP_KERNEL); - if (retval >= 0) { - (*node_res_obj)->id = retval; - return 0; - } - - kfree(*node_res_obj); - - if (retval == -ENOSPC) { - pr_err("%s: FAILED, IDR is FULL\n", __func__); - return -EFAULT; - } else { - pr_err("%s: OUT OF MEMORY\n", __func__); - return -ENOMEM; - } -} - -/* Release all Node resources and its context - * Actual Node De-Allocation */ -static int drv_proc_free_node_res(int id, void *p, void *data) -{ - struct process_context *ctxt = data; - int status; - struct node_res_object *node_res_obj = p; - u32 node_state; - - if (node_res_obj->node_allocated) { - node_state = node_get_state(node_res_obj->node); - if (node_state <= NODE_DELETING) { - if ((node_state == NODE_RUNNING) || - (node_state == NODE_PAUSED) || - (node_state == NODE_TERMINATING)) - node_terminate - (node_res_obj->node, &status); - - node_delete(node_res_obj, ctxt); - } - } - - return 0; -} - -/* Release all Mapped and Reserved DMM resources */ -int drv_remove_all_dmm_res_elements(void *process_ctxt) -{ - struct process_context *ctxt = (struct process_context *)process_ctxt; - int status = 0; - struct dmm_map_object *temp_map, *map_obj; - struct dmm_rsv_object *temp_rsv, *rsv_obj; - - /* Free DMM mapped memory resources */ - list_for_each_entry_safe(map_obj, temp_map, &ctxt->dmm_map_list, link) { - status = proc_un_map(ctxt->processor, - (void *)map_obj->dsp_addr, ctxt); - if (status) - pr_err("%s: proc_un_map failed!" - " status = 0x%xn", __func__, status); - } - - /* Free DMM reserved memory resources */ - list_for_each_entry_safe(rsv_obj, temp_rsv, &ctxt->dmm_rsv_list, link) { - status = proc_un_reserve_memory(ctxt->processor, (void *) - rsv_obj->dsp_reserved_addr, - ctxt); - if (status) - pr_err("%s: proc_un_reserve_memory failed!" - " status = 0x%xn", __func__, status); - } - return status; -} - -/* Update Node allocation status */ -void drv_proc_node_update_status(void *node_resource, s32 status) -{ - struct node_res_object *node_res_obj = - (struct node_res_object *)node_resource; - node_res_obj->node_allocated = status; -} - -/* Update Node Heap status */ -void drv_proc_node_update_heap_status(void *node_resource, s32 status) -{ - struct node_res_object *node_res_obj = - (struct node_res_object *)node_resource; - node_res_obj->heap_allocated = status; -} - -/* Release all Node resources and its context -* This is called from .bridge_release. - */ -int drv_remove_all_node_res_elements(void *process_ctxt) -{ - struct process_context *ctxt = process_ctxt; - - idr_for_each(ctxt->node_id, drv_proc_free_node_res, ctxt); - idr_destroy(ctxt->node_id); - - return 0; -} - -/* Allocate the STRM resource element -* This is called after the actual resource is allocated - */ -int drv_proc_insert_strm_res_element(void *stream_obj, - void *strm_res, void *process_ctxt) -{ - struct strm_res_object **pstrm_res = - (struct strm_res_object **)strm_res; - struct process_context *ctxt = (struct process_context *)process_ctxt; - int retval; - - *pstrm_res = kzalloc(sizeof(struct strm_res_object), GFP_KERNEL); - if (*pstrm_res == NULL) - return -EFAULT; - - (*pstrm_res)->stream = stream_obj; - retval = idr_alloc(ctxt->stream_id, *pstrm_res, 0, 0, GFP_KERNEL); - if (retval >= 0) { - (*pstrm_res)->id = retval; - return 0; - } - - if (retval == -ENOSPC) { - pr_err("%s: FAILED, IDR is FULL\n", __func__); - return -EPERM; - } else { - pr_err("%s: OUT OF MEMORY\n", __func__); - return -ENOMEM; - } -} - -static int drv_proc_free_strm_res(int id, void *p, void *process_ctxt) -{ - struct process_context *ctxt = process_ctxt; - struct strm_res_object *strm_res = p; - struct stream_info strm_info; - struct dsp_streaminfo user; - u8 **ap_buffer = NULL; - u8 *buf_ptr; - u32 ul_bytes; - u32 dw_arg; - s32 ul_buf_size; - - if (strm_res->num_bufs) { - ap_buffer = kmalloc((strm_res->num_bufs * - sizeof(u8 *)), GFP_KERNEL); - if (ap_buffer) { - strm_free_buffer(strm_res, - ap_buffer, - strm_res->num_bufs, - ctxt); - kfree(ap_buffer); - } - } - strm_info.user_strm = &user; - user.number_bufs_in_stream = 0; - strm_get_info(strm_res->stream, &strm_info, sizeof(strm_info)); - while (user.number_bufs_in_stream--) - strm_reclaim(strm_res->stream, &buf_ptr, &ul_bytes, - (u32 *) &ul_buf_size, &dw_arg); - strm_close(strm_res, ctxt); - return 0; -} - -/* Release all Stream resources and its context -* This is called from .bridge_release. - */ -int drv_remove_all_strm_res_elements(void *process_ctxt) -{ - struct process_context *ctxt = process_ctxt; - - idr_for_each(ctxt->stream_id, drv_proc_free_strm_res, ctxt); - idr_destroy(ctxt->stream_id); - - return 0; -} - -/* Updating the stream resource element */ -int drv_proc_update_strm_res(u32 num_bufs, void *strm_resources) -{ - int status = 0; - struct strm_res_object **strm_res = - (struct strm_res_object **)strm_resources; - - (*strm_res)->num_bufs = num_bufs; - return status; -} - -/* GPP PROCESS CLEANUP CODE END */ - -/* - * ======== = drv_create ======== = - * Purpose: - * DRV Object gets created only once during Driver Loading. - */ -int drv_create(struct drv_object **drv_obj) -{ - int status = 0; - struct drv_object *pdrv_object = NULL; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - pdrv_object = kzalloc(sizeof(struct drv_object), GFP_KERNEL); - if (pdrv_object) { - /* Create and Initialize List of device objects */ - INIT_LIST_HEAD(&pdrv_object->dev_list); - INIT_LIST_HEAD(&pdrv_object->dev_node_string); - } else { - status = -ENOMEM; - } - /* Store the DRV Object in the driver data */ - if (!status) { - if (drv_datap) { - drv_datap->drv_object = (void *)pdrv_object; - } else { - status = -EPERM; - pr_err("%s: Failed to store DRV object\n", __func__); - } - } - - if (!status) { - *drv_obj = pdrv_object; - } else { - /* Free the DRV Object */ - kfree(pdrv_object); - } - - return status; -} - -/* - * ======== = drv_destroy ======== = - * purpose: - * Invoked during bridge de-initialization - */ -int drv_destroy(struct drv_object *driver_obj) -{ - int status = 0; - struct drv_object *pdrv_object = (struct drv_object *)driver_obj; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - kfree(pdrv_object); - /* Update the DRV Object in the driver data */ - if (drv_datap) { - drv_datap->drv_object = NULL; - } else { - status = -EPERM; - pr_err("%s: Failed to store DRV object\n", __func__); - } - - return status; -} - -/* - * ======== drv_get_dev_object ======== - * Purpose: - * Given a index, returns a handle to DevObject from the list. - */ -int drv_get_dev_object(u32 index, struct drv_object *hdrv_obj, - struct dev_object **device_obj) -{ - int status = 0; - struct dev_object *dev_obj; - u32 i; - - dev_obj = (struct dev_object *)drv_get_first_dev_object(); - for (i = 0; i < index; i++) { - dev_obj = - (struct dev_object *)drv_get_next_dev_object((u32) dev_obj); - } - if (dev_obj) { - *device_obj = (struct dev_object *)dev_obj; - } else { - *device_obj = NULL; - status = -EPERM; - } - - return status; -} - -/* - * ======== drv_get_first_dev_object ======== - * Purpose: - * Retrieve the first Device Object handle from an internal linked list of - * of DEV_OBJECTs maintained by DRV. - */ -u32 drv_get_first_dev_object(void) -{ - u32 dw_dev_object = 0; - struct drv_object *pdrv_obj; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - if (drv_datap && drv_datap->drv_object) { - pdrv_obj = drv_datap->drv_object; - if (!list_empty(&pdrv_obj->dev_list)) - dw_dev_object = (u32) pdrv_obj->dev_list.next; - } else { - pr_err("%s: Failed to retrieve the object handle\n", __func__); - } - - return dw_dev_object; -} - -/* - * ======== DRV_GetFirstDevNodeString ======== - * Purpose: - * Retrieve the first Device Extension from an internal linked list of - * of Pointer to dev_node Strings maintained by DRV. - */ -u32 drv_get_first_dev_extension(void) -{ - u32 dw_dev_extension = 0; - struct drv_object *pdrv_obj; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - if (drv_datap && drv_datap->drv_object) { - pdrv_obj = drv_datap->drv_object; - if (!list_empty(&pdrv_obj->dev_node_string)) { - dw_dev_extension = - (u32) pdrv_obj->dev_node_string.next; - } - } else { - pr_err("%s: Failed to retrieve the object handle\n", __func__); - } - - return dw_dev_extension; -} - -/* - * ======== drv_get_next_dev_object ======== - * Purpose: - * Retrieve the next Device Object handle from an internal linked list of - * of DEV_OBJECTs maintained by DRV, after having previously called - * drv_get_first_dev_object() and zero or more DRV_GetNext. - */ -u32 drv_get_next_dev_object(u32 hdev_obj) -{ - u32 dw_next_dev_object = 0; - struct drv_object *pdrv_obj; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - struct list_head *curr; - - if (drv_datap && drv_datap->drv_object) { - pdrv_obj = drv_datap->drv_object; - if (!list_empty(&pdrv_obj->dev_list)) { - curr = (struct list_head *)hdev_obj; - if (list_is_last(curr, &pdrv_obj->dev_list)) - return 0; - dw_next_dev_object = (u32) curr->next; - } - } else { - pr_err("%s: Failed to retrieve the object handle\n", __func__); - } - - return dw_next_dev_object; -} - -/* - * ======== drv_get_next_dev_extension ======== - * Purpose: - * Retrieve the next Device Extension from an internal linked list of - * of pointer to DevNodeString maintained by DRV, after having previously - * called drv_get_first_dev_extension() and zero or more - * drv_get_next_dev_extension(). - */ -u32 drv_get_next_dev_extension(u32 dev_extension) -{ - u32 dw_dev_extension = 0; - struct drv_object *pdrv_obj; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - struct list_head *curr; - - if (drv_datap && drv_datap->drv_object) { - pdrv_obj = drv_datap->drv_object; - if (!list_empty(&pdrv_obj->dev_node_string)) { - curr = (struct list_head *)dev_extension; - if (list_is_last(curr, &pdrv_obj->dev_node_string)) - return 0; - dw_dev_extension = (u32) curr->next; - } - } else { - pr_err("%s: Failed to retrieve the object handle\n", __func__); - } - - return dw_dev_extension; -} - -/* - * ======== drv_insert_dev_object ======== - * Purpose: - * Insert a DevObject into the list of Manager object. - */ -int drv_insert_dev_object(struct drv_object *driver_obj, - struct dev_object *hdev_obj) -{ - struct drv_object *pdrv_object = (struct drv_object *)driver_obj; - - list_add_tail((struct list_head *)hdev_obj, &pdrv_object->dev_list); - - return 0; -} - -/* - * ======== drv_remove_dev_object ======== - * Purpose: - * Search for and remove a DeviceObject from the given list of DRV - * objects. - */ -int drv_remove_dev_object(struct drv_object *driver_obj, - struct dev_object *hdev_obj) -{ - int status = -EPERM; - struct drv_object *pdrv_object = (struct drv_object *)driver_obj; - struct list_head *cur_elem; - - /* Search list for p_proc_object: */ - list_for_each(cur_elem, &pdrv_object->dev_list) { - /* If found, remove it. */ - if ((struct dev_object *)cur_elem == hdev_obj) { - list_del(cur_elem); - status = 0; - break; - } - } - - return status; -} - -/* - * ======== drv_request_resources ======== - * Purpose: - * Requests resources from the OS. - */ -int drv_request_resources(u32 dw_context, u32 *dev_node_strg) -{ - int status = 0; - struct drv_object *pdrv_object; - struct drv_ext *pszdev_node; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - /* - * Allocate memory to hold the string. This will live until - * it is freed in the Release resources. Update the driver object - * list. - */ - - if (!drv_datap || !drv_datap->drv_object) - status = -ENODATA; - else - pdrv_object = drv_datap->drv_object; - - if (!status) { - pszdev_node = kzalloc(sizeof(struct drv_ext), GFP_KERNEL); - if (pszdev_node) { - strncpy(pszdev_node->sz_string, - (char *)dw_context, MAXREGPATHLENGTH - 1); - pszdev_node->sz_string[MAXREGPATHLENGTH - 1] = '\0'; - /* Update the Driver Object List */ - *dev_node_strg = (u32) pszdev_node->sz_string; - list_add_tail(&pszdev_node->link, - &pdrv_object->dev_node_string); - } else { - status = -ENOMEM; - *dev_node_strg = 0; - } - } else { - dev_dbg(bridge, "%s: Failed to get Driver Object from Registry", - __func__); - *dev_node_strg = 0; - } - - return status; -} - -/* - * ======== drv_release_resources ======== - * Purpose: - * Releases resources from the OS. - */ -int drv_release_resources(u32 dw_context, struct drv_object *hdrv_obj) -{ - int status = 0; - struct drv_ext *pszdev_node; - - /* - * Irrespective of the status go ahead and clean it - * The following will over write the status. - */ - for (pszdev_node = (struct drv_ext *)drv_get_first_dev_extension(); - pszdev_node != NULL; pszdev_node = (struct drv_ext *) - drv_get_next_dev_extension((u32) pszdev_node)) { - if ((u32) pszdev_node == dw_context) { - /* Found it */ - /* Delete from the Driver object list */ - list_del(&pszdev_node->link); - kfree(pszdev_node); - break; - } - } - return status; -} - -/* - * ======== request_bridge_resources ======== - * Purpose: - * Reserves shared memory for bridge. - */ -static int request_bridge_resources(struct cfg_hostres *res) -{ - struct cfg_hostres *host_res = res; - - /* num_mem_windows must not be more than CFG_MAXMEMREGISTERS */ - host_res->num_mem_windows = 2; - - /* First window is for DSP internal memory */ - dev_dbg(bridge, "mem_base[0] 0x%x\n", host_res->mem_base[0]); - dev_dbg(bridge, "mem_base[3] 0x%x\n", host_res->mem_base[3]); - dev_dbg(bridge, "dmmu_base %p\n", host_res->dmmu_base); - - /* for 24xx base port is not mapping the mamory for DSP - * internal memory TODO Do a ioremap here */ - /* Second window is for DSP external memory shared with MPU */ - - /* These are hard-coded values */ - host_res->birq_registers = 0; - host_res->birq_attrib = 0; - host_res->offset_for_monitor = 0; - host_res->chnl_offset = 0; - /* CHNL_MAXCHANNELS */ - host_res->num_chnls = CHNL_MAXCHANNELS; - host_res->chnl_buf_size = 0x400; - - return 0; -} - -/* - * ======== drv_request_bridge_res_dsp ======== - * Purpose: - * Reserves shared memory for bridge. - */ -int drv_request_bridge_res_dsp(void **phost_resources) -{ - int status = 0; - struct cfg_hostres *host_res; - u32 dw_buff_size; - u32 dma_addr; - u32 shm_size; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - dw_buff_size = sizeof(struct cfg_hostres); - - host_res = kzalloc(dw_buff_size, GFP_KERNEL); - - if (host_res != NULL) { - request_bridge_resources(host_res); - /* num_mem_windows must not be more than CFG_MAXMEMREGISTERS */ - host_res->num_mem_windows = 4; - - host_res->mem_base[0] = 0; - host_res->mem_base[2] = (u32) ioremap(OMAP_DSP_MEM1_BASE, - OMAP_DSP_MEM1_SIZE); - host_res->mem_base[3] = (u32) ioremap(OMAP_DSP_MEM2_BASE, - OMAP_DSP_MEM2_SIZE); - host_res->mem_base[4] = (u32) ioremap(OMAP_DSP_MEM3_BASE, - OMAP_DSP_MEM3_SIZE); - host_res->per_base = ioremap(OMAP_PER_CM_BASE, - OMAP_PER_CM_SIZE); - host_res->per_pm_base = ioremap(OMAP_PER_PRM_BASE, - OMAP_PER_PRM_SIZE); - host_res->core_pm_base = ioremap(OMAP_CORE_PRM_BASE, - OMAP_CORE_PRM_SIZE); - host_res->dmmu_base = ioremap(OMAP_DMMU_BASE, - OMAP_DMMU_SIZE); - - dev_dbg(bridge, "mem_base[0] 0x%x\n", - host_res->mem_base[0]); - dev_dbg(bridge, "mem_base[1] 0x%x\n", - host_res->mem_base[1]); - dev_dbg(bridge, "mem_base[2] 0x%x\n", - host_res->mem_base[2]); - dev_dbg(bridge, "mem_base[3] 0x%x\n", - host_res->mem_base[3]); - dev_dbg(bridge, "mem_base[4] 0x%x\n", - host_res->mem_base[4]); - dev_dbg(bridge, "dmmu_base %p\n", host_res->dmmu_base); - - shm_size = drv_datap->shm_size; - if (shm_size >= 0x10000) { - /* Allocate Physically contiguous, - * non-cacheable memory */ - host_res->mem_base[1] = - (u32) mem_alloc_phys_mem(shm_size, 0x100000, - &dma_addr); - if (host_res->mem_base[1] == 0) { - status = -ENOMEM; - pr_err("shm reservation Failed\n"); - } else { - host_res->mem_length[1] = shm_size; - host_res->mem_phys[1] = dma_addr; - - dev_dbg(bridge, "%s: Bridge shm address 0x%x " - "dma_addr %x size %x\n", __func__, - host_res->mem_base[1], - dma_addr, shm_size); - } - } - if (!status) { - /* These are hard-coded values */ - host_res->birq_registers = 0; - host_res->birq_attrib = 0; - host_res->offset_for_monitor = 0; - host_res->chnl_offset = 0; - /* CHNL_MAXCHANNELS */ - host_res->num_chnls = CHNL_MAXCHANNELS; - host_res->chnl_buf_size = 0x400; - dw_buff_size = sizeof(struct cfg_hostres); - } - *phost_resources = host_res; - } - /* End Mem alloc */ - return status; -} - -void mem_ext_phys_pool_init(u32 pool_phys_base, u32 pool_size) -{ - u32 pool_virt_base; - - /* get the virtual address for the physical memory pool passed */ - pool_virt_base = (u32) ioremap(pool_phys_base, pool_size); - - if ((void **)pool_virt_base == NULL) { - pr_err("%s: external physical memory map failed\n", __func__); - ext_phys_mem_pool_enabled = false; - } else { - ext_mem_pool.phys_mem_base = pool_phys_base; - ext_mem_pool.phys_mem_size = pool_size; - ext_mem_pool.virt_mem_base = pool_virt_base; - ext_mem_pool.next_phys_alloc_ptr = pool_phys_base; - ext_phys_mem_pool_enabled = true; - } -} - -void mem_ext_phys_pool_release(void) -{ - if (ext_phys_mem_pool_enabled) { - iounmap((void *)(ext_mem_pool.virt_mem_base)); - ext_phys_mem_pool_enabled = false; - } -} - -/* - * ======== mem_ext_phys_mem_alloc ======== - * Purpose: - * Allocate physically contiguous, uncached memory from external memory pool - */ - -static void *mem_ext_phys_mem_alloc(u32 bytes, u32 align, u32 *phys_addr) -{ - u32 new_alloc_ptr; - u32 offset; - u32 virt_addr; - - if (align == 0) - align = 1; - - if (bytes > ((ext_mem_pool.phys_mem_base + ext_mem_pool.phys_mem_size) - - ext_mem_pool.next_phys_alloc_ptr)) { - phys_addr = NULL; - return NULL; - } else { - offset = (ext_mem_pool.next_phys_alloc_ptr & (align - 1)); - if (offset == 0) - new_alloc_ptr = ext_mem_pool.next_phys_alloc_ptr; - else - new_alloc_ptr = (ext_mem_pool.next_phys_alloc_ptr) + - (align - offset); - if ((new_alloc_ptr + bytes) <= - (ext_mem_pool.phys_mem_base + ext_mem_pool.phys_mem_size)) { - /* we can allocate */ - *phys_addr = new_alloc_ptr; - ext_mem_pool.next_phys_alloc_ptr = - new_alloc_ptr + bytes; - virt_addr = - ext_mem_pool.virt_mem_base + (new_alloc_ptr - - ext_mem_pool. - phys_mem_base); - return (void *)virt_addr; - } else { - *phys_addr = 0; - return NULL; - } - } -} - -/* - * ======== mem_alloc_phys_mem ======== - * Purpose: - * Allocate physically contiguous, uncached memory - */ -void *mem_alloc_phys_mem(u32 byte_size, u32 align_mask, - u32 *physical_address) -{ - void *va_mem = NULL; - dma_addr_t pa_mem; - - if (byte_size > 0) { - if (ext_phys_mem_pool_enabled) { - va_mem = mem_ext_phys_mem_alloc(byte_size, align_mask, - (u32 *) &pa_mem); - } else - va_mem = dma_alloc_coherent(NULL, byte_size, &pa_mem, - GFP_KERNEL); - if (va_mem == NULL) - *physical_address = 0; - else - *physical_address = pa_mem; - } - return va_mem; -} - -/* - * ======== mem_free_phys_mem ======== - * Purpose: - * Free the given block of physically contiguous memory. - */ -void mem_free_phys_mem(void *virtual_address, u32 physical_address, - u32 byte_size) -{ - if (!ext_phys_mem_pool_enabled) - dma_free_coherent(NULL, byte_size, virtual_address, - physical_address); -} diff --git a/drivers/staging/tidspbridge/rmgr/drv_interface.c b/drivers/staging/tidspbridge/rmgr/drv_interface.c deleted file mode 100644 index e3918d2efa17..000000000000 --- a/drivers/staging/tidspbridge/rmgr/drv_interface.c +++ /dev/null @@ -1,650 +0,0 @@ -/* - * drv_interface.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP/BIOS Bridge driver interface. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include - -#include -#include -#include -#include -#include -#include -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- OS Adaptation Layer */ -#include - -/* ----------------------------------- Platform Manager */ -#include -#include - -/* ----------------------------------- Resource Manager */ -#include - -#include -#include -#include - -#ifdef CONFIG_TIDSPBRIDGE_DVFS -#include -#endif - -/* ----------------------------------- Globals */ -#define DSPBRIDGE_VERSION "0.3" -s32 dsp_debug; - -struct platform_device *omap_dspbridge_dev; -struct device *bridge; - -/* This is a test variable used by Bridge to test different sleep states */ -s32 dsp_test_sleepstate; - -static struct cdev bridge_cdev; - -static struct class *bridge_class; - -static u32 driver_context; -static s32 driver_major; -static char *base_img; -static s32 shm_size = 0x500000; /* 5 MB */ -static int tc_wordswapon; /* Default value is always false */ -#ifdef CONFIG_TIDSPBRIDGE_RECOVERY -#define REC_TIMEOUT 5000 /*recovery timeout in msecs */ -static atomic_t bridge_cref; /* number of bridge open handles */ -static struct workqueue_struct *bridge_rec_queue; -static struct work_struct bridge_recovery_work; -static DECLARE_COMPLETION(bridge_comp); -static DECLARE_COMPLETION(bridge_open_comp); -static bool recover; -#endif - -#ifdef CONFIG_PM -struct omap34_xx_bridge_suspend_data { - int suspended; - wait_queue_head_t suspend_wq; -}; - -static struct omap34_xx_bridge_suspend_data bridge_suspend_data; - -static int omap34_xxbridge_suspend_lockout(struct omap34_xx_bridge_suspend_data - *s, struct file *f) -{ - if ((s)->suspended) { - if ((f)->f_flags & O_NONBLOCK) - return -EPERM; - wait_event_interruptible((s)->suspend_wq, (s)->suspended == 0); - } - return 0; -} -#endif - -module_param(dsp_debug, int, 0); -MODULE_PARM_DESC(dsp_debug, "Wait after loading DSP image. default = false"); - -module_param(dsp_test_sleepstate, int, 0); -MODULE_PARM_DESC(dsp_test_sleepstate, "DSP Sleep state = 0"); - -module_param(base_img, charp, 0); -MODULE_PARM_DESC(base_img, "DSP base image, default = NULL"); - -module_param(shm_size, int, 0); -MODULE_PARM_DESC(shm_size, "shm size, default = 4 MB, minimum = 64 KB"); - -module_param(tc_wordswapon, int, 0); -MODULE_PARM_DESC(tc_wordswapon, "TC Word Swap Option. default = 0"); - -MODULE_AUTHOR("Texas Instruments"); -MODULE_LICENSE("GPL"); -MODULE_VERSION(DSPBRIDGE_VERSION); - -/* - * This function is called when an application opens handle to the - * bridge driver. - */ -static int bridge_open(struct inode *ip, struct file *filp) -{ - int status = 0; - struct process_context *pr_ctxt = NULL; - - /* - * Allocate a new process context and insert it into global - * process context list. - */ - -#ifdef CONFIG_TIDSPBRIDGE_RECOVERY - if (recover) { - if (filp->f_flags & O_NONBLOCK || - wait_for_completion_interruptible(&bridge_open_comp)) - return -EBUSY; - } -#endif - pr_ctxt = kzalloc(sizeof(struct process_context), GFP_KERNEL); - if (!pr_ctxt) - return -ENOMEM; - - pr_ctxt->res_state = PROC_RES_ALLOCATED; - spin_lock_init(&pr_ctxt->dmm_map_lock); - INIT_LIST_HEAD(&pr_ctxt->dmm_map_list); - spin_lock_init(&pr_ctxt->dmm_rsv_lock); - INIT_LIST_HEAD(&pr_ctxt->dmm_rsv_list); - - pr_ctxt->node_id = kzalloc(sizeof(struct idr), GFP_KERNEL); - if (!pr_ctxt->node_id) { - status = -ENOMEM; - goto err1; - } - - idr_init(pr_ctxt->node_id); - - pr_ctxt->stream_id = kzalloc(sizeof(struct idr), GFP_KERNEL); - if (!pr_ctxt->stream_id) { - status = -ENOMEM; - goto err2; - } - - idr_init(pr_ctxt->stream_id); - - filp->private_data = pr_ctxt; - -#ifdef CONFIG_TIDSPBRIDGE_RECOVERY - atomic_inc(&bridge_cref); -#endif - return 0; - -err2: - kfree(pr_ctxt->node_id); -err1: - kfree(pr_ctxt); - return status; -} - -/* - * This function is called when an application closes handle to the bridge - * driver. - */ -static int bridge_release(struct inode *ip, struct file *filp) -{ - int status = 0; - struct process_context *pr_ctxt; - - if (!filp->private_data) { - status = -EIO; - goto err; - } - - pr_ctxt = filp->private_data; - flush_signals(current); - drv_remove_all_resources(pr_ctxt); - proc_detach(pr_ctxt); - kfree(pr_ctxt->node_id); - kfree(pr_ctxt->stream_id); - kfree(pr_ctxt); - - filp->private_data = NULL; - -err: -#ifdef CONFIG_TIDSPBRIDGE_RECOVERY - if (!atomic_dec_return(&bridge_cref)) - complete(&bridge_comp); -#endif - return status; -} - -/* This function provides IO interface to the bridge driver. */ -static long bridge_ioctl(struct file *filp, unsigned int code, - unsigned long args) -{ - int status; - u32 retval = 0; - union trapped_args buf_in; - -#ifdef CONFIG_TIDSPBRIDGE_RECOVERY - if (recover) { - status = -EIO; - goto err; - } -#endif -#ifdef CONFIG_PM - status = omap34_xxbridge_suspend_lockout(&bridge_suspend_data, filp); - if (status != 0) - return status; -#endif - - if (!filp->private_data) { - status = -EIO; - goto err; - } - - status = copy_from_user(&buf_in, (union trapped_args *)args, - sizeof(union trapped_args)); - - if (!status) { - status = api_call_dev_ioctl(code, &buf_in, &retval, - filp->private_data); - - if (!status) { - status = retval; - } else { - dev_dbg(bridge, "%s: IOCTL Failed, code: 0x%x " - "status 0x%x\n", __func__, code, status); - status = -1; - } - - } - -err: - return status; -} - -/* This function maps kernel space memory to user space memory. */ -static int bridge_mmap(struct file *filp, struct vm_area_struct *vma) -{ - unsigned long base_pgoff; - int status; - struct omap_dsp_platform_data *pdata = - omap_dspbridge_dev->dev.platform_data; - - /* VM_IO | VM_DONTEXPAND | VM_DONTDUMP are set by remap_pfn_range() */ - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - - dev_dbg(bridge, "%s: vm filp %p start %lx end %lx page_prot %ulx " - "flags %lx\n", __func__, filp, - vma->vm_start, vma->vm_end, vma->vm_page_prot, - vma->vm_flags); - - /* - * vm_iomap_memory() expects vma->vm_pgoff to be expressed as an offset - * from the start of the physical memory pool, but we're called with - * a pfn (physical page number) stored there instead. - * - * To avoid duplicating lots of tricky overflow checking logic, - * temporarily convert vma->vm_pgoff to the offset vm_iomap_memory() - * expects, but restore the original value once the mapping has been - * created. - */ - base_pgoff = pdata->phys_mempool_base >> PAGE_SHIFT; - - if (vma->vm_pgoff < base_pgoff) - return -EINVAL; - - vma->vm_pgoff -= base_pgoff; - - status = vm_iomap_memory(vma, - pdata->phys_mempool_base, - pdata->phys_mempool_size); - - /* Restore the original value of vma->vm_pgoff */ - vma->vm_pgoff += base_pgoff; - - return status; -} - -static const struct file_operations bridge_fops = { - .open = bridge_open, - .release = bridge_release, - .unlocked_ioctl = bridge_ioctl, - .mmap = bridge_mmap, - .llseek = noop_llseek, -}; - -#ifdef CONFIG_PM -static u32 time_out = 1000; -#ifdef CONFIG_TIDSPBRIDGE_DVFS -s32 dsp_max_opps = VDD1_OPP5; -#endif - -/* Maximum Opps that can be requested by IVA */ -/*vdd1 rate table */ -#ifdef CONFIG_TIDSPBRIDGE_DVFS -const struct omap_opp vdd1_rate_table_bridge[] = { - {0, 0, 0}, - /*OPP1 */ - {S125M, VDD1_OPP1, 0}, - /*OPP2 */ - {S250M, VDD1_OPP2, 0}, - /*OPP3 */ - {S500M, VDD1_OPP3, 0}, - /*OPP4 */ - {S550M, VDD1_OPP4, 0}, - /*OPP5 */ - {S600M, VDD1_OPP5, 0}, -}; -#endif -#endif - -struct omap_dsp_platform_data *omap_dspbridge_pdata; - -u32 vdd1_dsp_freq[6][4] = { - {0, 0, 0, 0}, - /*OPP1 */ - {0, 90000, 0, 86000}, - /*OPP2 */ - {0, 180000, 80000, 170000}, - /*OPP3 */ - {0, 360000, 160000, 340000}, - /*OPP4 */ - {0, 396000, 325000, 376000}, - /*OPP5 */ - {0, 430000, 355000, 430000}, -}; - -#ifdef CONFIG_TIDSPBRIDGE_RECOVERY -static void bridge_recover(struct work_struct *work) -{ - struct dev_object *dev; - struct cfg_devnode *dev_node; - - if (atomic_read(&bridge_cref)) { - reinit_completion(&bridge_comp); - while (!wait_for_completion_timeout(&bridge_comp, - msecs_to_jiffies(REC_TIMEOUT))) - pr_info("%s:%d handle(s) still opened\n", - __func__, atomic_read(&bridge_cref)); - } - dev = dev_get_first(); - dev_get_dev_node(dev, &dev_node); - if (!dev_node || proc_auto_start(dev_node, dev)) - pr_err("DSP could not be restarted\n"); - recover = false; - complete_all(&bridge_open_comp); -} - -void bridge_recover_schedule(void) -{ - reinit_completion(&bridge_open_comp); - recover = true; - queue_work(bridge_rec_queue, &bridge_recovery_work); -} -#endif -#ifdef CONFIG_TIDSPBRIDGE_DVFS -static int dspbridge_scale_notification(struct notifier_block *op, - unsigned long val, void *ptr) -{ - struct omap_dsp_platform_data *pdata = - omap_dspbridge_dev->dev.platform_data; - - if (CPUFREQ_POSTCHANGE == val && pdata->dsp_get_opp) - pwr_pm_post_scale(PRCM_VDD1, pdata->dsp_get_opp()); - - return 0; -} - -static struct notifier_block iva_clk_notifier = { - .notifier_call = dspbridge_scale_notification, - NULL, -}; -#endif - -/** - * omap3_bridge_startup() - perform low lever initializations - * @pdev: pointer to platform device - * - * Initializes recovery, PM and DVFS required data, before calling - * clk and memory init routines. - */ -static int omap3_bridge_startup(struct platform_device *pdev) -{ - struct omap_dsp_platform_data *pdata = pdev->dev.platform_data; - struct drv_data *drv_datap = NULL; - u32 phys_membase, phys_memsize; - int err; - -#ifdef CONFIG_TIDSPBRIDGE_RECOVERY - bridge_rec_queue = create_workqueue("bridge_rec_queue"); - INIT_WORK(&bridge_recovery_work, bridge_recover); - reinit_completion(&bridge_comp); -#endif - -#ifdef CONFIG_PM - /* Initialize the wait queue */ - bridge_suspend_data.suspended = 0; - init_waitqueue_head(&bridge_suspend_data.suspend_wq); - -#ifdef CONFIG_TIDSPBRIDGE_DVFS - for (i = 0; i < 6; i++) - pdata->mpu_speed[i] = vdd1_rate_table_bridge[i].rate; - - err = cpufreq_register_notifier(&iva_clk_notifier, - CPUFREQ_TRANSITION_NOTIFIER); - if (err) - pr_err("%s: clk_notifier_register failed for iva2_ck\n", - __func__); -#endif -#endif - - dsp_clk_init(); - - drv_datap = kzalloc(sizeof(struct drv_data), GFP_KERNEL); - if (!drv_datap) { - err = -ENOMEM; - goto err1; - } - - drv_datap->shm_size = shm_size; - drv_datap->tc_wordswapon = tc_wordswapon; - - if (base_img) { - drv_datap->base_img = kstrdup(base_img, GFP_KERNEL); - if (!drv_datap->base_img) { - err = -ENOMEM; - goto err2; - } - } - - dev_set_drvdata(bridge, drv_datap); - - if (shm_size < 0x10000) { /* 64 KB */ - err = -EINVAL; - pr_err("%s: shm size must be at least 64 KB\n", __func__); - goto err3; - } - dev_dbg(bridge, "%s: requested shm_size = 0x%x\n", __func__, shm_size); - - phys_membase = pdata->phys_mempool_base; - phys_memsize = pdata->phys_mempool_size; - if (phys_membase > 0 && phys_memsize > 0) - mem_ext_phys_pool_init(phys_membase, phys_memsize); - - if (tc_wordswapon) - dev_dbg(bridge, "%s: TC Word Swap is enabled\n", __func__); - - driver_context = dsp_init(&err); - if (err) { - pr_err("DSP Bridge driver initialization failed\n"); - goto err4; - } - - return 0; - -err4: - mem_ext_phys_pool_release(); -err3: - kfree(drv_datap->base_img); -err2: - kfree(drv_datap); -err1: -#ifdef CONFIG_TIDSPBRIDGE_DVFS - cpufreq_unregister_notifier(&iva_clk_notifier, - CPUFREQ_TRANSITION_NOTIFIER); -#endif - dsp_clk_exit(); - - return err; -} - -static int omap34_xx_bridge_probe(struct platform_device *pdev) -{ - int err; - dev_t dev = 0; -#ifdef CONFIG_TIDSPBRIDGE_DVFS - int i = 0; -#endif - - omap_dspbridge_dev = pdev; - - /* Global bridge device */ - bridge = &omap_dspbridge_dev->dev; - - /* Bridge low level initializations */ - err = omap3_bridge_startup(pdev); - if (err) - goto err1; - - /* use 2.6 device model */ - err = alloc_chrdev_region(&dev, 0, 1, "DspBridge"); - if (err) { - pr_err("%s: Can't get major %d\n", __func__, driver_major); - goto err1; - } - - cdev_init(&bridge_cdev, &bridge_fops); - bridge_cdev.owner = THIS_MODULE; - - err = cdev_add(&bridge_cdev, dev, 1); - if (err) { - pr_err("%s: Failed to add bridge device\n", __func__); - goto err2; - } - - /* udev support */ - bridge_class = class_create(THIS_MODULE, "ti_bridge"); - if (IS_ERR(bridge_class)) { - pr_err("%s: Error creating bridge class\n", __func__); - err = PTR_ERR(bridge_class); - goto err3; - } - - driver_major = MAJOR(dev); - device_create(bridge_class, NULL, MKDEV(driver_major, 0), - NULL, "DspBridge"); - pr_info("DSP Bridge driver loaded\n"); - - return 0; - -err3: - cdev_del(&bridge_cdev); -err2: - unregister_chrdev_region(dev, 1); -err1: - return err; -} - -static int omap34_xx_bridge_remove(struct platform_device *pdev) -{ - dev_t devno; - int status = 0; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - /* Retrieve the Object handle from the driver data */ - if (!drv_datap || !drv_datap->drv_object) { - status = -ENODATA; - pr_err("%s: Failed to retrieve the object handle\n", __func__); - goto func_cont; - } - -#ifdef CONFIG_TIDSPBRIDGE_DVFS - if (cpufreq_unregister_notifier(&iva_clk_notifier, - CPUFREQ_TRANSITION_NOTIFIER)) - pr_err("%s: cpufreq_unregister_notifier failed for iva2_ck\n", - __func__); -#endif /* #ifdef CONFIG_TIDSPBRIDGE_DVFS */ - - if (driver_context) { - /* Put the DSP in reset state */ - dsp_deinit(driver_context); - driver_context = 0; - } - - kfree(drv_datap); - dev_set_drvdata(bridge, NULL); - -func_cont: - mem_ext_phys_pool_release(); - - dsp_clk_exit(); - - devno = MKDEV(driver_major, 0); - cdev_del(&bridge_cdev); - unregister_chrdev_region(devno, 1); - if (bridge_class) { - /* remove the device from sysfs */ - device_destroy(bridge_class, MKDEV(driver_major, 0)); - class_destroy(bridge_class); - - } - return status; -} - -#ifdef CONFIG_PM -static int bridge_suspend(struct platform_device *pdev, pm_message_t state) -{ - u32 status; - u32 command = PWR_EMERGENCYDEEPSLEEP; - - status = pwr_sleep_dsp(command, time_out); - if (status) - return -1; - - bridge_suspend_data.suspended = 1; - return 0; -} - -static int bridge_resume(struct platform_device *pdev) -{ - u32 status; - - status = pwr_wake_dsp(time_out); - if (status) - return -1; - - bridge_suspend_data.suspended = 0; - wake_up(&bridge_suspend_data.suspend_wq); - return 0; -} -#endif - -static struct platform_driver bridge_driver = { - .driver = { - .name = "omap-dsp", - }, - .probe = omap34_xx_bridge_probe, - .remove = omap34_xx_bridge_remove, -#ifdef CONFIG_PM - .suspend = bridge_suspend, - .resume = bridge_resume, -#endif -}; - -/* To remove all process resources before removing the process from the - * process context list */ -int drv_remove_all_resources(void *process_ctxt) -{ - int status = 0; - struct process_context *ctxt = (struct process_context *)process_ctxt; - - drv_remove_all_strm_res_elements(ctxt); - drv_remove_all_node_res_elements(ctxt); - drv_remove_all_dmm_res_elements(ctxt); - ctxt->res_state = PROC_RES_FREED; - return status; -} - -module_platform_driver(bridge_driver); diff --git a/drivers/staging/tidspbridge/rmgr/dspdrv.c b/drivers/staging/tidspbridge/rmgr/dspdrv.c deleted file mode 100644 index 012e4a38d2db..000000000000 --- a/drivers/staging/tidspbridge/rmgr/dspdrv.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * dspdrv.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Interface to allocate and free bridge resources. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* ----------------------------------- Host OS */ -#include -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- Platform Manager */ -#include -#include -#include - -/* ----------------------------------- Resource Manager */ -#include - -/* ----------------------------------- This */ -#include - -/* - * ======== dsp_init ======== - * Allocates bridge resources. Loads a base image onto DSP, if specified. - */ -u32 dsp_init(u32 *init_status) -{ - char dev_node[MAXREGPATHLENGTH] = "TIOMAP1510"; - int status = -EPERM; - struct drv_object *drv_obj = NULL; - u32 device_node; - u32 device_node_string; - - if (!api_init()) - goto func_cont; - - status = drv_create(&drv_obj); - if (status) { - api_exit(); - goto func_cont; - } - - /* End drv_create */ - /* Request Resources */ - status = drv_request_resources((u32) &dev_node, &device_node_string); - if (!status) { - /* Attempt to Start the Device */ - status = dev_start_device((struct cfg_devnode *) - device_node_string); - if (status) - (void)drv_release_resources - ((u32) device_node_string, drv_obj); - } else { - dev_dbg(bridge, "%s: drv_request_resources Failed\n", __func__); - status = -EPERM; - } - - /* Unwind whatever was loaded */ - if (status) { - /* irrespective of the status of dev_remove_device we continue - * unloading. Get the Driver Object iterate through and remove. - * Reset the status to E_FAIL to avoid going through - * api_init_complete2. */ - for (device_node = drv_get_first_dev_extension(); - device_node != 0; - device_node = drv_get_next_dev_extension(device_node)) { - (void)dev_remove_device((struct cfg_devnode *) - device_node); - (void)drv_release_resources((u32) device_node, drv_obj); - } - /* Remove the Driver Object */ - (void)drv_destroy(drv_obj); - drv_obj = NULL; - api_exit(); - dev_dbg(bridge, "%s: Logical device failed init\n", __func__); - } /* Unwinding the loaded drivers */ -func_cont: - /* Attempt to Start the Board */ - if (!status) { - /* BRD_AutoStart could fail if the dsp executable is not the - * correct one. We should not propagate that error - * into the device loader. */ - (void)api_init_complete2(); - } else { - dev_dbg(bridge, "%s: Failed\n", __func__); - } /* End api_init_complete2 */ - *init_status = status; - /* Return the Driver Object */ - return (u32) drv_obj; -} - -/* - * ======== dsp_deinit ======== - * Frees the resources allocated for bridge. - */ -bool dsp_deinit(u32 device_context) -{ - bool ret = true; - u32 device_node; - struct mgr_object *mgr_obj = NULL; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - while ((device_node = drv_get_first_dev_extension()) != 0) { - (void)dev_remove_device((struct cfg_devnode *)device_node); - - (void)drv_release_resources((u32) device_node, - (struct drv_object *)device_context); - } - - (void)drv_destroy((struct drv_object *)device_context); - - /* Get the Manager Object from driver data - * MGR Destroy will unload the DCD dll */ - if (drv_datap && drv_datap->mgr_object) { - mgr_obj = drv_datap->mgr_object; - (void)mgr_destroy(mgr_obj); - } else { - pr_err("%s: Failed to retrieve the object handle\n", __func__); - } - - api_exit(); - - return ret; -} diff --git a/drivers/staging/tidspbridge/rmgr/mgr.c b/drivers/staging/tidspbridge/rmgr/mgr.c deleted file mode 100644 index 93e6282f122b..000000000000 --- a/drivers/staging/tidspbridge/rmgr/mgr.c +++ /dev/null @@ -1,352 +0,0 @@ -/* - * mgr.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Implementation of Manager interface to the device object at the - * driver level. This queries the NDB data base and retrieves the - * data about Node and Processor. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- OS Adaptation Layer */ -#include - -/* ----------------------------------- Others */ -#include -#include -#include - -/* ----------------------------------- This */ -#include - -/* ----------------------------------- Defines, Data Structures, Typedefs */ -#define ZLDLLNAME "" - -struct mgr_object { - struct dcd_manager *dcd_mgr; /* Proc/Node data manager */ -}; - -/* ----------------------------------- Globals */ -static u32 refs; - -/* - * ========= mgr_create ========= - * Purpose: - * MGR Object gets created only once during driver Loading. - */ -int mgr_create(struct mgr_object **mgr_obj, - struct cfg_devnode *dev_node_obj) -{ - int status = 0; - struct mgr_object *pmgr_obj = NULL; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - pmgr_obj = kzalloc(sizeof(struct mgr_object), GFP_KERNEL); - if (pmgr_obj) { - status = dcd_create_manager(ZLDLLNAME, &pmgr_obj->dcd_mgr); - if (!status) { - /* If succeeded store the handle in the MGR Object */ - if (drv_datap) { - drv_datap->mgr_object = (void *)pmgr_obj; - } else { - status = -EPERM; - pr_err("%s: Failed to store MGR object\n", - __func__); - } - - if (!status) { - *mgr_obj = pmgr_obj; - } else { - dcd_destroy_manager(pmgr_obj->dcd_mgr); - kfree(pmgr_obj); - } - } else { - /* failed to Create DCD Manager */ - kfree(pmgr_obj); - } - } else { - status = -ENOMEM; - } - - return status; -} - -/* - * ========= mgr_destroy ========= - * This function is invoked during bridge driver unloading.Frees MGR object. - */ -int mgr_destroy(struct mgr_object *hmgr_obj) -{ - int status = 0; - struct mgr_object *pmgr_obj = (struct mgr_object *)hmgr_obj; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - /* Free resources */ - if (hmgr_obj->dcd_mgr) - dcd_destroy_manager(hmgr_obj->dcd_mgr); - - kfree(pmgr_obj); - /* Update the driver data with NULL for MGR Object */ - if (drv_datap) { - drv_datap->mgr_object = NULL; - } else { - status = -EPERM; - pr_err("%s: Failed to store MGR object\n", __func__); - } - - return status; -} - -/* - * ======== mgr_enum_node_info ======== - * Enumerate and get configuration information about nodes configured - * in the node database. - */ -int mgr_enum_node_info(u32 node_id, struct dsp_ndbprops *pndb_props, - u32 undb_props_size, u32 *pu_num_nodes) -{ - int status = 0; - struct dsp_uuid node_uuid; - u32 node_index = 0; - struct dcd_genericobj gen_obj; - struct mgr_object *pmgr_obj = NULL; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - *pu_num_nodes = 0; - /* Get the Manager Object from the driver data */ - if (!drv_datap || !drv_datap->mgr_object) { - pr_err("%s: Failed to retrieve the object handle\n", __func__); - return -ENODATA; - } - pmgr_obj = drv_datap->mgr_object; - - /* Forever loop till we hit failed or no more items in the - * Enumeration. We will exit the loop other than 0; */ - while (!status) { - status = dcd_enumerate_object(node_index++, DSP_DCDNODETYPE, - &node_uuid); - if (status) - break; - *pu_num_nodes = node_index; - if (node_id == (node_index - 1)) { - status = dcd_get_object_def(pmgr_obj->dcd_mgr, - &node_uuid, DSP_DCDNODETYPE, &gen_obj); - if (status) - break; - /* Get the Obj def */ - *pndb_props = gen_obj.obj_data.node_obj.ndb_props; - } - } - - /* the last status is not 0, but neither an error */ - if (status > 0) - status = 0; - - return status; -} - -/* - * ======== mgr_enum_processor_info ======== - * Enumerate and get configuration information about available - * DSP processors. - */ -int mgr_enum_processor_info(u32 processor_id, - struct dsp_processorinfo * - processor_info, u32 processor_info_size, - u8 *pu_num_procs) -{ - int status = 0; - int status1 = 0; - int status2 = 0; - struct dsp_uuid temp_uuid; - u32 temp_index = 0; - u32 proc_index = 0; - struct dcd_genericobj gen_obj; - struct mgr_object *pmgr_obj = NULL; - struct mgr_processorextinfo *ext_info; - struct dev_object *hdev_obj; - struct drv_object *hdrv_obj; - u8 dev_type; - struct cfg_devnode *dev_node; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - bool proc_detect = false; - - *pu_num_procs = 0; - - /* Retrieve the Object handle from the driver data */ - if (!drv_datap || !drv_datap->drv_object) { - status = -ENODATA; - pr_err("%s: Failed to retrieve the object handle\n", __func__); - } else { - hdrv_obj = drv_datap->drv_object; - } - - if (!status) { - status = drv_get_dev_object(processor_id, hdrv_obj, &hdev_obj); - if (!status) { - status = dev_get_dev_type(hdev_obj, (u8 *) &dev_type); - status = dev_get_dev_node(hdev_obj, &dev_node); - if (dev_type != DSP_UNIT) - status = -EPERM; - - if (!status) - processor_info->processor_type = DSPTYPE64; - } - } - if (status) - goto func_end; - - /* Get The Manager Object from the driver data */ - if (drv_datap && drv_datap->mgr_object) { - pmgr_obj = drv_datap->mgr_object; - } else { - dev_dbg(bridge, "%s: Failed to get MGR Object\n", __func__); - goto func_end; - } - /* Forever loop till we hit no more items in the - * Enumeration. We will exit the loop other than 0; */ - while (status1 == 0) { - status1 = dcd_enumerate_object(temp_index++, - DSP_DCDPROCESSORTYPE, - &temp_uuid); - if (status1 != 0) - break; - - proc_index++; - /* Get the Object properties to find the Device/Processor - * Type */ - if (proc_detect != false) - continue; - - status2 = dcd_get_object_def(pmgr_obj->dcd_mgr, - (struct dsp_uuid *)&temp_uuid, - DSP_DCDPROCESSORTYPE, &gen_obj); - if (!status2) { - /* Get the Obj def */ - if (processor_info_size < - sizeof(struct mgr_processorextinfo)) { - *processor_info = gen_obj.obj_data.proc_info; - } else { - /* extended info */ - ext_info = (struct mgr_processorextinfo *) - processor_info; - *ext_info = gen_obj.obj_data.ext_proc_obj; - } - dev_dbg(bridge, "%s: Got proctype from DCD %x\n", - __func__, processor_info->processor_type); - /* See if we got the needed processor */ - if (dev_type == DSP_UNIT) { - if (processor_info->processor_type == - DSPPROCTYPE_C64) - proc_detect = true; - } else if (dev_type == IVA_UNIT) { - if (processor_info->processor_type == - IVAPROCTYPE_ARM7) - proc_detect = true; - } - /* User applications only check for chip type, so - * this is a clumsy overwrite */ - processor_info->processor_type = DSPTYPE64; - } else { - dev_dbg(bridge, "%s: Failed to get DCD processor info %x\n", - __func__, status2); - status = -EPERM; - } - } - *pu_num_procs = proc_index; - if (proc_detect == false) { - dev_dbg(bridge, "%s: Failed to get proc info from DCD, so use CFG registry\n", - __func__); - processor_info->processor_type = DSPTYPE64; - } -func_end: - return status; -} - -/* - * ======== mgr_exit ======== - * Decrement reference count, and free resources when reference count is - * 0. - */ -void mgr_exit(void) -{ - refs--; - if (refs == 0) - dcd_exit(); -} - -/* - * ======== mgr_get_dcd_handle ======== - * Retrieves the MGR handle. Accessor Function. - */ -int mgr_get_dcd_handle(struct mgr_object *mgr_handle, - u32 *dcd_handle) -{ - int status = -EPERM; - struct mgr_object *pmgr_obj = (struct mgr_object *)mgr_handle; - - *dcd_handle = (u32) NULL; - if (pmgr_obj) { - *dcd_handle = (u32) pmgr_obj->dcd_mgr; - status = 0; - } - - return status; -} - -/* - * ======== mgr_init ======== - * Initialize MGR's private state, keeping a reference count on each call. - */ -bool mgr_init(void) -{ - bool ret = true; - - if (refs == 0) - ret = dcd_init(); /* DCD Module */ - - if (ret) - refs++; - - return ret; -} - -/* - * ======== mgr_wait_for_bridge_events ======== - * Block on any Bridge event(s) - */ -int mgr_wait_for_bridge_events(struct dsp_notification **anotifications, - u32 count, u32 *pu_index, - u32 utimeout) -{ - int status; - struct sync_object *sync_events[MAX_EVENTS]; - u32 i; - - for (i = 0; i < count; i++) - sync_events[i] = anotifications[i]->handle; - - status = sync_wait_on_multiple_events(sync_events, count, utimeout, - pu_index); - - return status; - -} diff --git a/drivers/staging/tidspbridge/rmgr/nldr.c b/drivers/staging/tidspbridge/rmgr/nldr.c deleted file mode 100644 index 900585ab059a..000000000000 --- a/drivers/staging/tidspbridge/rmgr/nldr.c +++ /dev/null @@ -1,1861 +0,0 @@ -/* - * nldr.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP/BIOS Bridge dynamic + overlay Node loader. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include - -#include - -#include - -/* Platform manager */ -#include -#include - -/* Resource manager */ -#include -#include -#include -#include - -#include -#include - -/* Name of section containing dynamic load mem */ -#define DYNMEMSECT ".dspbridge_mem" - -/* Name of section containing dependent library information */ -#define DEPLIBSECT ".dspbridge_deplibs" - -/* Max depth of recursion for loading node's dependent libraries */ -#define MAXDEPTH 5 - -/* Max number of persistent libraries kept by a node */ -#define MAXLIBS 5 - -/* - * Defines for extracting packed dynamic load memory requirements from two - * masks. - * These defines must match node.cdb and dynm.cdb - * Format of data/code mask is: - * uuuuuuuu|fueeeeee|fudddddd|fucccccc| - * where - * u = unused - * cccccc = preferred/required dynamic mem segid for create phase data/code - * dddddd = preferred/required dynamic mem segid for delete phase data/code - * eeeeee = preferred/req. dynamic mem segid for execute phase data/code - * f = flag indicating if memory is preferred or required: - * f = 1 if required, f = 0 if preferred. - * - * The 6 bits of the segid are interpreted as follows: - * - * If the 6th bit (bit 5) is not set, then this specifies a memory segment - * between 0 and 31 (a maximum of 32 dynamic loading memory segments). - * If the 6th bit (bit 5) is set, segid has the following interpretation: - * segid = 32 - Any internal memory segment can be used. - * segid = 33 - Any external memory segment can be used. - * segid = 63 - Any memory segment can be used (in this case the - * required/preferred flag is irrelevant). - * - */ -/* Maximum allowed dynamic loading memory segments */ -#define MAXMEMSEGS 32 - -#define MAXSEGID 3 /* Largest possible (real) segid */ -#define MEMINTERNALID 32 /* Segid meaning use internal mem */ -#define MEMEXTERNALID 33 /* Segid meaning use external mem */ -#define NULLID 63 /* Segid meaning no memory req/pref */ -#define FLAGBIT 7 /* 7th bit is pref./req. flag */ -#define SEGMASK 0x3f /* Bits 0 - 5 */ - -#define CREATEBIT 0 /* Create segid starts at bit 0 */ -#define DELETEBIT 8 /* Delete segid starts at bit 8 */ -#define EXECUTEBIT 16 /* Execute segid starts at bit 16 */ - -/* - * Masks that define memory type. Must match defines in dynm.cdb. - */ -#define DYNM_CODE 0x2 -#define DYNM_DATA 0x4 -#define DYNM_CODEDATA (DYNM_CODE | DYNM_DATA) -#define DYNM_INTERNAL 0x8 -#define DYNM_EXTERNAL 0x10 - -/* - * Defines for packing memory requirement/preference flags for code and - * data of each of the node's phases into one mask. - * The bit is set if the segid is required for loading code/data of the - * given phase. The bit is not set, if the segid is preferred only. - * - * These defines are also used as indeces into a segid array for the node. - * eg node's segid[CREATEDATAFLAGBIT] is the memory segment id that the - * create phase data is required or preferred to be loaded into. - */ -#define CREATEDATAFLAGBIT 0 -#define CREATECODEFLAGBIT 1 -#define EXECUTEDATAFLAGBIT 2 -#define EXECUTECODEFLAGBIT 3 -#define DELETEDATAFLAGBIT 4 -#define DELETECODEFLAGBIT 5 -#define MAXFLAGS 6 - - /* - * These names may be embedded in overlay sections to identify which - * node phase the section should be overlayed. - */ -#define PCREATE "create" -#define PDELETE "delete" -#define PEXECUTE "execute" - -static inline bool is_equal_uuid(struct dsp_uuid *uuid1, - struct dsp_uuid *uuid2) -{ - return !memcmp(uuid1, uuid2, sizeof(struct dsp_uuid)); -} - - /* - * ======== mem_seg_info ======== - * Format of dynamic loading memory segment info in coff file. - * Must match dynm.h55. - */ -struct mem_seg_info { - u32 segid; /* Dynamic loading memory segment number */ - u32 base; - u32 len; - u32 type; /* Mask of DYNM_CODE, DYNM_INTERNAL, etc. */ -}; - -/* - * ======== lib_node ======== - * For maintaining a tree of library dependencies. - */ -struct lib_node { - struct dbll_library_obj *lib; /* The library */ - u16 dep_libs; /* Number of dependent libraries */ - struct lib_node *dep_libs_tree; /* Dependent libraries of lib */ -}; - -/* - * ======== ovly_sect ======== - * Information needed to overlay a section. - */ -struct ovly_sect { - struct ovly_sect *next_sect; - u32 sect_load_addr; /* Load address of section */ - u32 sect_run_addr; /* Run address of section */ - u32 size; /* Size of section */ - u16 page; /* DBL_CODE, DBL_DATA */ -}; - -/* - * ======== ovly_node ======== - * For maintaining a list of overlay nodes, with sections that need to be - * overlayed for each of the nodes phases. - */ -struct ovly_node { - struct dsp_uuid uuid; - char *node_name; - struct ovly_sect *create_sects_list; - struct ovly_sect *delete_sects_list; - struct ovly_sect *execute_sects_list; - struct ovly_sect *other_sects_list; - u16 create_sects; - u16 delete_sects; - u16 execute_sects; - u16 other_sects; - u16 create_ref; - u16 delete_ref; - u16 execute_ref; - u16 other_ref; -}; - -/* - * ======== nldr_object ======== - * Overlay loader object. - */ -struct nldr_object { - struct dev_object *dev_obj; /* Device object */ - struct dcd_manager *dcd_mgr; /* Proc/Node data manager */ - struct dbll_tar_obj *dbll; /* The DBL loader */ - struct dbll_library_obj *base_lib; /* Base image library */ - struct rmm_target_obj *rmm; /* Remote memory manager for DSP */ - struct dbll_fxns ldr_fxns; /* Loader function table */ - struct dbll_attrs ldr_attrs; /* attrs to pass to loader functions */ - nldr_ovlyfxn ovly_fxn; /* "write" for overlay nodes */ - nldr_writefxn write_fxn; /* "write" for dynamic nodes */ - struct ovly_node *ovly_table; /* Table of overlay nodes */ - u16 ovly_nodes; /* Number of overlay nodes in base */ - u16 ovly_nid; /* Index for tracking overlay nodes */ - u16 dload_segs; /* Number of dynamic load mem segs */ - u32 *seg_table; /* memtypes of dynamic memory segs - * indexed by segid - */ - u16 dsp_mau_size; /* Size of DSP MAU */ - u16 dsp_word_size; /* Size of DSP word */ -}; - -/* - * ======== nldr_nodeobject ======== - * Dynamic node object. This object is created when a node is allocated. - */ -struct nldr_nodeobject { - struct nldr_object *nldr_obj; /* Dynamic loader handle */ - void *priv_ref; /* Handle to pass to dbl_write_fxn */ - struct dsp_uuid uuid; /* Node's UUID */ - bool dynamic; /* Dynamically loaded node? */ - bool overlay; /* Overlay node? */ - bool *phase_split; /* Multiple phase libraries? */ - struct lib_node root; /* Library containing node phase */ - struct lib_node create_lib; /* Library with create phase lib */ - struct lib_node execute_lib; /* Library with execute phase lib */ - struct lib_node delete_lib; /* Library with delete phase lib */ - /* libs remain loaded until Delete */ - struct lib_node pers_lib_table[MAXLIBS]; - s32 pers_libs; /* Number of persistent libraries */ - /* Path in lib dependency tree */ - struct dbll_library_obj *lib_path[MAXDEPTH + 1]; - enum nldr_phase phase; /* Node phase currently being loaded */ - - /* - * Dynamic loading memory segments for data and code of each phase. - */ - u16 seg_id[MAXFLAGS]; - - /* - * Mask indicating whether each mem segment specified in seg_id[] - * is preferred or required. - * For example - * if (code_data_flag_mask & (1 << EXECUTEDATAFLAGBIT)) != 0, - * then it is required to load execute phase data into the memory - * specified by seg_id[EXECUTEDATAFLAGBIT]. - */ - u32 code_data_flag_mask; -}; - -/* Dynamic loader function table */ -static struct dbll_fxns ldr_fxns = { - (dbll_close_fxn) dbll_close, - (dbll_create_fxn) dbll_create, - (dbll_delete_fxn) dbll_delete, - (dbll_exit_fxn) dbll_exit, - (dbll_get_attrs_fxn) dbll_get_attrs, - (dbll_get_addr_fxn) dbll_get_addr, - (dbll_get_c_addr_fxn) dbll_get_c_addr, - (dbll_get_sect_fxn) dbll_get_sect, - (dbll_init_fxn) dbll_init, - (dbll_load_fxn) dbll_load, - (dbll_open_fxn) dbll_open, - (dbll_read_sect_fxn) dbll_read_sect, - (dbll_unload_fxn) dbll_unload, -}; - -static int add_ovly_info(void *handle, struct dbll_sect_info *sect_info, - u32 addr, u32 bytes); -static int add_ovly_node(struct dsp_uuid *uuid_obj, - enum dsp_dcdobjtype obj_type, void *handle); -static int add_ovly_sect(struct nldr_object *nldr_obj, - struct ovly_sect **lst, - struct dbll_sect_info *sect_inf, - bool *exists, u32 addr, u32 bytes); -static s32 fake_ovly_write(void *handle, u32 dsp_address, void *buf, u32 bytes, - s32 mtype); -static void free_sects(struct nldr_object *nldr_obj, - struct ovly_sect *phase_sects, u16 alloc_num); -static bool get_symbol_value(void *handle, void *parg, void *rmm_handle, - char *sym_name, struct dbll_sym_val **sym); -static int load_lib(struct nldr_nodeobject *nldr_node_obj, - struct lib_node *root, struct dsp_uuid uuid, - bool root_prstnt, - struct dbll_library_obj **lib_path, - enum nldr_phase phase, u16 depth); -static int load_ovly(struct nldr_nodeobject *nldr_node_obj, - enum nldr_phase phase); -static int remote_alloc(void **ref, u16 mem_sect, u32 size, - u32 align, u32 *dsp_address, - s32 segmnt_id, - s32 req, bool reserve); -static int remote_free(void **ref, u16 space, u32 dsp_address, u32 size, - bool reserve); - -static void unload_lib(struct nldr_nodeobject *nldr_node_obj, - struct lib_node *root); -static void unload_ovly(struct nldr_nodeobject *nldr_node_obj, - enum nldr_phase phase); -static bool find_in_persistent_lib_array(struct nldr_nodeobject *nldr_node_obj, - struct dbll_library_obj *lib); - -/* - * ======== nldr_allocate ======== - */ -int nldr_allocate(struct nldr_object *nldr_obj, void *priv_ref, - const struct dcd_nodeprops *node_props, - struct nldr_nodeobject **nldr_nodeobj, - bool *pf_phase_split) -{ - struct nldr_nodeobject *nldr_node_obj = NULL; - int status = 0; - - /* Initialize handle in case of failure */ - *nldr_nodeobj = NULL; - /* Allocate node object */ - nldr_node_obj = kzalloc(sizeof(struct nldr_nodeobject), GFP_KERNEL); - - if (nldr_node_obj == NULL) { - status = -ENOMEM; - } else { - nldr_node_obj->phase_split = pf_phase_split; - nldr_node_obj->pers_libs = 0; - nldr_node_obj->nldr_obj = nldr_obj; - nldr_node_obj->priv_ref = priv_ref; - /* Save node's UUID. */ - nldr_node_obj->uuid = node_props->ndb_props.ui_node_id; - /* - * Determine if node is a dynamically loaded node from - * ndb_props. - */ - if (node_props->load_type == NLDR_DYNAMICLOAD) { - /* Dynamic node */ - nldr_node_obj->dynamic = true; - /* - * Extract memory requirements from ndb_props masks - */ - /* Create phase */ - nldr_node_obj->seg_id[CREATEDATAFLAGBIT] = (u16) - (node_props->data_mem_seg_mask >> CREATEBIT) & - SEGMASK; - nldr_node_obj->code_data_flag_mask |= - ((node_props->data_mem_seg_mask >> - (CREATEBIT + FLAGBIT)) & 1) << CREATEDATAFLAGBIT; - nldr_node_obj->seg_id[CREATECODEFLAGBIT] = (u16) - (node_props->code_mem_seg_mask >> - CREATEBIT) & SEGMASK; - nldr_node_obj->code_data_flag_mask |= - ((node_props->code_mem_seg_mask >> - (CREATEBIT + FLAGBIT)) & 1) << CREATECODEFLAGBIT; - /* Execute phase */ - nldr_node_obj->seg_id[EXECUTEDATAFLAGBIT] = (u16) - (node_props->data_mem_seg_mask >> - EXECUTEBIT) & SEGMASK; - nldr_node_obj->code_data_flag_mask |= - ((node_props->data_mem_seg_mask >> - (EXECUTEBIT + FLAGBIT)) & 1) << - EXECUTEDATAFLAGBIT; - nldr_node_obj->seg_id[EXECUTECODEFLAGBIT] = (u16) - (node_props->code_mem_seg_mask >> - EXECUTEBIT) & SEGMASK; - nldr_node_obj->code_data_flag_mask |= - ((node_props->code_mem_seg_mask >> - (EXECUTEBIT + FLAGBIT)) & 1) << - EXECUTECODEFLAGBIT; - /* Delete phase */ - nldr_node_obj->seg_id[DELETEDATAFLAGBIT] = (u16) - (node_props->data_mem_seg_mask >> DELETEBIT) & - SEGMASK; - nldr_node_obj->code_data_flag_mask |= - ((node_props->data_mem_seg_mask >> - (DELETEBIT + FLAGBIT)) & 1) << DELETEDATAFLAGBIT; - nldr_node_obj->seg_id[DELETECODEFLAGBIT] = (u16) - (node_props->code_mem_seg_mask >> - DELETEBIT) & SEGMASK; - nldr_node_obj->code_data_flag_mask |= - ((node_props->code_mem_seg_mask >> - (DELETEBIT + FLAGBIT)) & 1) << DELETECODEFLAGBIT; - } else { - /* Non-dynamically loaded nodes are part of the - * base image */ - nldr_node_obj->root.lib = nldr_obj->base_lib; - /* Check for overlay node */ - if (node_props->load_type == NLDR_OVLYLOAD) - nldr_node_obj->overlay = true; - - } - *nldr_nodeobj = (struct nldr_nodeobject *)nldr_node_obj; - } - /* Cleanup on failure */ - if (status && nldr_node_obj) - kfree(nldr_node_obj); - - return status; -} - -/* - * ======== nldr_create ======== - */ -int nldr_create(struct nldr_object **nldr, - struct dev_object *hdev_obj, - const struct nldr_attrs *pattrs) -{ - struct cod_manager *cod_mgr; /* COD manager */ - char *psz_coff_buf = NULL; - char sz_zl_file[COD_MAXPATHLENGTH]; - struct nldr_object *nldr_obj = NULL; - struct dbll_attrs save_attrs; - struct dbll_attrs new_attrs; - dbll_flags flags; - u32 ul_entry; - u16 dload_segs = 0; - struct mem_seg_info *mem_info_obj; - u32 ul_len = 0; - u32 ul_addr; - struct rmm_segment *rmm_segs = NULL; - u16 i; - int status = 0; - - /* Allocate dynamic loader object */ - nldr_obj = kzalloc(sizeof(struct nldr_object), GFP_KERNEL); - if (nldr_obj) { - nldr_obj->dev_obj = hdev_obj; - /* warning, lazy status checking alert! */ - dev_get_cod_mgr(hdev_obj, &cod_mgr); - if (cod_mgr) { - status = cod_get_loader(cod_mgr, &nldr_obj->dbll); - status = cod_get_base_lib(cod_mgr, &nldr_obj->base_lib); - status = - cod_get_base_name(cod_mgr, sz_zl_file, - COD_MAXPATHLENGTH); - } - status = 0; - /* end lazy status checking */ - nldr_obj->dsp_mau_size = pattrs->dsp_mau_size; - nldr_obj->dsp_word_size = pattrs->dsp_word_size; - nldr_obj->ldr_fxns = ldr_fxns; - if (!(nldr_obj->ldr_fxns.init_fxn())) - status = -ENOMEM; - - } else { - status = -ENOMEM; - } - /* Create the DCD Manager */ - if (!status) - status = dcd_create_manager(NULL, &nldr_obj->dcd_mgr); - - /* Get dynamic loading memory sections from base lib */ - if (!status) { - status = - nldr_obj->ldr_fxns.get_sect_fxn(nldr_obj->base_lib, - DYNMEMSECT, &ul_addr, - &ul_len); - if (!status) { - psz_coff_buf = - kzalloc(ul_len * nldr_obj->dsp_mau_size, - GFP_KERNEL); - if (!psz_coff_buf) - status = -ENOMEM; - } else { - /* Ok to not have dynamic loading memory */ - status = 0; - ul_len = 0; - dev_dbg(bridge, "%s: failed - no dynamic loading mem " - "segments: 0x%x\n", __func__, status); - } - } - if (!status && ul_len > 0) { - /* Read section containing dynamic load mem segments */ - status = - nldr_obj->ldr_fxns.read_sect_fxn(nldr_obj->base_lib, - DYNMEMSECT, psz_coff_buf, - ul_len); - } - if (!status && ul_len > 0) { - /* Parse memory segment data */ - dload_segs = (u16) (*((u32 *) psz_coff_buf)); - if (dload_segs > MAXMEMSEGS) - status = -EBADF; - } - /* Parse dynamic load memory segments */ - if (!status && dload_segs > 0) { - rmm_segs = kzalloc(sizeof(struct rmm_segment) * dload_segs, - GFP_KERNEL); - nldr_obj->seg_table = - kzalloc(sizeof(u32) * dload_segs, GFP_KERNEL); - if (rmm_segs == NULL || nldr_obj->seg_table == NULL) { - status = -ENOMEM; - } else { - nldr_obj->dload_segs = dload_segs; - mem_info_obj = (struct mem_seg_info *)(psz_coff_buf + - sizeof(u32)); - for (i = 0; i < dload_segs; i++) { - rmm_segs[i].base = (mem_info_obj + i)->base; - rmm_segs[i].length = (mem_info_obj + i)->len; - rmm_segs[i].space = 0; - nldr_obj->seg_table[i] = - (mem_info_obj + i)->type; - dev_dbg(bridge, - "(proc) DLL MEMSEGMENT: %d, " - "Base: 0x%x, Length: 0x%x\n", i, - rmm_segs[i].base, rmm_segs[i].length); - } - } - } - /* Create Remote memory manager */ - if (!status) - status = rmm_create(&nldr_obj->rmm, rmm_segs, dload_segs); - - if (!status) { - /* set the alloc, free, write functions for loader */ - nldr_obj->ldr_fxns.get_attrs_fxn(nldr_obj->dbll, &save_attrs); - new_attrs = save_attrs; - new_attrs.alloc = (dbll_alloc_fxn) remote_alloc; - new_attrs.free = (dbll_free_fxn) remote_free; - new_attrs.sym_lookup = (dbll_sym_lookup) get_symbol_value; - new_attrs.sym_handle = nldr_obj; - new_attrs.write = (dbll_write_fxn) pattrs->write; - nldr_obj->ovly_fxn = pattrs->ovly; - nldr_obj->write_fxn = pattrs->write; - nldr_obj->ldr_attrs = new_attrs; - } - kfree(rmm_segs); - - kfree(psz_coff_buf); - - /* Get overlay nodes */ - if (!status) { - status = - cod_get_base_name(cod_mgr, sz_zl_file, COD_MAXPATHLENGTH); - /* lazy check */ - /* First count number of overlay nodes */ - status = - dcd_get_objects(nldr_obj->dcd_mgr, sz_zl_file, - add_ovly_node, (void *)nldr_obj); - /* Now build table of overlay nodes */ - if (!status && nldr_obj->ovly_nodes > 0) { - /* Allocate table for overlay nodes */ - nldr_obj->ovly_table = - kzalloc(sizeof(struct ovly_node) * - nldr_obj->ovly_nodes, GFP_KERNEL); - /* Put overlay nodes in the table */ - nldr_obj->ovly_nid = 0; - status = dcd_get_objects(nldr_obj->dcd_mgr, sz_zl_file, - add_ovly_node, - (void *)nldr_obj); - } - } - /* Do a fake reload of the base image to get overlay section info */ - if (!status && nldr_obj->ovly_nodes > 0) { - save_attrs.write = fake_ovly_write; - save_attrs.log_write = add_ovly_info; - save_attrs.log_write_handle = nldr_obj; - flags = DBLL_CODE | DBLL_DATA | DBLL_SYMB; - status = nldr_obj->ldr_fxns.load_fxn(nldr_obj->base_lib, flags, - &save_attrs, &ul_entry); - } - if (!status) { - *nldr = (struct nldr_object *)nldr_obj; - } else { - if (nldr_obj) - nldr_delete((struct nldr_object *)nldr_obj); - - *nldr = NULL; - } - /* FIXME:Temp. Fix. Must be removed */ - return status; -} - -/* - * ======== nldr_delete ======== - */ -void nldr_delete(struct nldr_object *nldr_obj) -{ - struct ovly_sect *ovly_section; - struct ovly_sect *next; - u16 i; - - nldr_obj->ldr_fxns.exit_fxn(); - if (nldr_obj->rmm) - rmm_delete(nldr_obj->rmm); - - kfree(nldr_obj->seg_table); - - if (nldr_obj->dcd_mgr) - dcd_destroy_manager(nldr_obj->dcd_mgr); - - /* Free overlay node information */ - if (nldr_obj->ovly_table) { - for (i = 0; i < nldr_obj->ovly_nodes; i++) { - ovly_section = - nldr_obj->ovly_table[i].create_sects_list; - while (ovly_section) { - next = ovly_section->next_sect; - kfree(ovly_section); - ovly_section = next; - } - ovly_section = - nldr_obj->ovly_table[i].delete_sects_list; - while (ovly_section) { - next = ovly_section->next_sect; - kfree(ovly_section); - ovly_section = next; - } - ovly_section = - nldr_obj->ovly_table[i].execute_sects_list; - while (ovly_section) { - next = ovly_section->next_sect; - kfree(ovly_section); - ovly_section = next; - } - ovly_section = nldr_obj->ovly_table[i].other_sects_list; - while (ovly_section) { - next = ovly_section->next_sect; - kfree(ovly_section); - ovly_section = next; - } - } - kfree(nldr_obj->ovly_table); - } - kfree(nldr_obj); -} - -/* - * ======== nldr_get_fxn_addr ======== - */ -int nldr_get_fxn_addr(struct nldr_nodeobject *nldr_node_obj, - char *str_fxn, u32 *addr) -{ - struct dbll_sym_val *dbll_sym; - struct nldr_object *nldr_obj; - int status = 0; - bool status1 = false; - s32 i = 0; - struct lib_node root = { NULL, 0, NULL }; - - nldr_obj = nldr_node_obj->nldr_obj; - /* Called from node_create(), node_delete(), or node_run(). */ - if (nldr_node_obj->dynamic && *nldr_node_obj->phase_split) { - switch (nldr_node_obj->phase) { - case NLDR_CREATE: - root = nldr_node_obj->create_lib; - break; - case NLDR_EXECUTE: - root = nldr_node_obj->execute_lib; - break; - case NLDR_DELETE: - root = nldr_node_obj->delete_lib; - break; - default: - break; - } - } else { - /* for Overlay nodes or non-split Dynamic nodes */ - root = nldr_node_obj->root; - } - status1 = - nldr_obj->ldr_fxns.get_c_addr_fxn(root.lib, str_fxn, &dbll_sym); - if (!status1) - status1 = - nldr_obj->ldr_fxns.get_addr_fxn(root.lib, str_fxn, - &dbll_sym); - - /* If symbol not found, check dependent libraries */ - if (!status1) { - for (i = 0; i < root.dep_libs; i++) { - status1 = - nldr_obj->ldr_fxns.get_addr_fxn(root.dep_libs_tree - [i].lib, str_fxn, - &dbll_sym); - if (!status1) { - status1 = - nldr_obj->ldr_fxns. - get_c_addr_fxn(root.dep_libs_tree[i].lib, - str_fxn, &dbll_sym); - } - if (status1) { - /* Symbol found */ - break; - } - } - } - /* Check persistent libraries */ - if (!status1) { - for (i = 0; i < nldr_node_obj->pers_libs; i++) { - status1 = - nldr_obj->ldr_fxns. - get_addr_fxn(nldr_node_obj->pers_lib_table[i].lib, - str_fxn, &dbll_sym); - if (!status1) { - status1 = - nldr_obj->ldr_fxns. - get_c_addr_fxn(nldr_node_obj->pers_lib_table - [i].lib, str_fxn, &dbll_sym); - } - if (status1) { - /* Symbol found */ - break; - } - } - } - - if (status1) - *addr = dbll_sym->value; - else - status = -ESPIPE; - - return status; -} - -/* - * ======== nldr_get_rmm_manager ======== - * Given a NLDR object, retrieve RMM Manager Handle - */ -int nldr_get_rmm_manager(struct nldr_object *nldr, - struct rmm_target_obj **rmm_mgr) -{ - int status = 0; - struct nldr_object *nldr_obj = nldr; - - if (nldr) { - *rmm_mgr = nldr_obj->rmm; - } else { - *rmm_mgr = NULL; - status = -EFAULT; - } - - return status; -} - -/* - * ======== nldr_load ======== - */ -int nldr_load(struct nldr_nodeobject *nldr_node_obj, - enum nldr_phase phase) -{ - struct nldr_object *nldr_obj; - struct dsp_uuid lib_uuid; - int status = 0; - - nldr_obj = nldr_node_obj->nldr_obj; - - if (nldr_node_obj->dynamic) { - nldr_node_obj->phase = phase; - - lib_uuid = nldr_node_obj->uuid; - - /* At this point, we may not know if node is split into - * different libraries. So we'll go ahead and load the - * library, and then save the pointer to the appropriate - * location after we know. */ - - status = - load_lib(nldr_node_obj, &nldr_node_obj->root, lib_uuid, - false, nldr_node_obj->lib_path, phase, 0); - - if (!status) { - if (*nldr_node_obj->phase_split) { - switch (phase) { - case NLDR_CREATE: - nldr_node_obj->create_lib = - nldr_node_obj->root; - break; - - case NLDR_EXECUTE: - nldr_node_obj->execute_lib = - nldr_node_obj->root; - break; - - case NLDR_DELETE: - nldr_node_obj->delete_lib = - nldr_node_obj->root; - break; - - default: - break; - } - } - } - } else { - if (nldr_node_obj->overlay) - status = load_ovly(nldr_node_obj, phase); - - } - - return status; -} - -/* - * ======== nldr_unload ======== - */ -int nldr_unload(struct nldr_nodeobject *nldr_node_obj, - enum nldr_phase phase) -{ - int status = 0; - struct lib_node *root_lib = NULL; - s32 i = 0; - - if (nldr_node_obj != NULL) { - if (nldr_node_obj->dynamic) { - if (*nldr_node_obj->phase_split) { - switch (phase) { - case NLDR_CREATE: - root_lib = &nldr_node_obj->create_lib; - break; - case NLDR_EXECUTE: - root_lib = &nldr_node_obj->execute_lib; - break; - case NLDR_DELETE: - root_lib = &nldr_node_obj->delete_lib; - /* Unload persistent libraries */ - for (i = 0; - i < nldr_node_obj->pers_libs; - i++) { - unload_lib(nldr_node_obj, - &nldr_node_obj-> - pers_lib_table[i]); - } - nldr_node_obj->pers_libs = 0; - break; - default: - break; - } - } else { - /* Unload main library */ - root_lib = &nldr_node_obj->root; - } - if (root_lib) - unload_lib(nldr_node_obj, root_lib); - } else { - if (nldr_node_obj->overlay) - unload_ovly(nldr_node_obj, phase); - - } - } - return status; -} - -/* - * ======== add_ovly_info ======== - */ -static int add_ovly_info(void *handle, struct dbll_sect_info *sect_info, - u32 addr, u32 bytes) -{ - char *node_name; - char *sect_name = (char *)sect_info->name; - bool sect_exists = false; - char seps = ':'; - char *pch; - u16 i; - struct nldr_object *nldr_obj = (struct nldr_object *)handle; - int status = 0; - - /* Is this an overlay section (load address != run address)? */ - if (sect_info->sect_load_addr == sect_info->sect_run_addr) - goto func_end; - - /* Find the node it belongs to */ - for (i = 0; i < nldr_obj->ovly_nodes; i++) { - node_name = nldr_obj->ovly_table[i].node_name; - if (strncmp(node_name, sect_name + 1, strlen(node_name)) == 0) { - /* Found the node */ - break; - } - } - if (!(i < nldr_obj->ovly_nodes)) - goto func_end; - - /* Determine which phase this section belongs to */ - for (pch = sect_name + 1; *pch && *pch != seps; pch++) - ; - - if (*pch) { - pch++; /* Skip over the ':' */ - if (strncmp(pch, PCREATE, strlen(PCREATE)) == 0) { - status = - add_ovly_sect(nldr_obj, - &nldr_obj-> - ovly_table[i].create_sects_list, - sect_info, §_exists, addr, bytes); - if (!status && !sect_exists) - nldr_obj->ovly_table[i].create_sects++; - - } else if (strncmp(pch, PDELETE, strlen(PDELETE)) == 0) { - status = - add_ovly_sect(nldr_obj, - &nldr_obj-> - ovly_table[i].delete_sects_list, - sect_info, §_exists, addr, bytes); - if (!status && !sect_exists) - nldr_obj->ovly_table[i].delete_sects++; - - } else if (strncmp(pch, PEXECUTE, strlen(PEXECUTE)) == 0) { - status = - add_ovly_sect(nldr_obj, - &nldr_obj-> - ovly_table[i].execute_sects_list, - sect_info, §_exists, addr, bytes); - if (!status && !sect_exists) - nldr_obj->ovly_table[i].execute_sects++; - - } else { - /* Put in "other" sections */ - status = - add_ovly_sect(nldr_obj, - &nldr_obj-> - ovly_table[i].other_sects_list, - sect_info, §_exists, addr, bytes); - if (!status && !sect_exists) - nldr_obj->ovly_table[i].other_sects++; - - } - } -func_end: - return status; -} - -/* - * ======== add_ovly_node ========= - * Callback function passed to dcd_get_objects. - */ -static int add_ovly_node(struct dsp_uuid *uuid_obj, - enum dsp_dcdobjtype obj_type, void *handle) -{ - struct nldr_object *nldr_obj = (struct nldr_object *)handle; - char *node_name = NULL; - char *pbuf = NULL; - u32 len; - struct dcd_genericobj obj_def; - int status = 0; - - if (obj_type != DSP_DCDNODETYPE) - goto func_end; - - status = - dcd_get_object_def(nldr_obj->dcd_mgr, uuid_obj, obj_type, - &obj_def); - if (status) - goto func_end; - - /* If overlay node, add to the list */ - if (obj_def.obj_data.node_obj.load_type == NLDR_OVLYLOAD) { - if (nldr_obj->ovly_table == NULL) { - nldr_obj->ovly_nodes++; - } else { - /* Add node to table */ - nldr_obj->ovly_table[nldr_obj->ovly_nid].uuid = - *uuid_obj; - len = - strlen(obj_def.obj_data.node_obj.ndb_props.ac_name); - node_name = obj_def.obj_data.node_obj.ndb_props.ac_name; - pbuf = kzalloc(len + 1, GFP_KERNEL); - if (pbuf == NULL) { - status = -ENOMEM; - } else { - strncpy(pbuf, node_name, len); - nldr_obj->ovly_table[nldr_obj->ovly_nid]. - node_name = pbuf; - nldr_obj->ovly_nid++; - } - } - } - /* These were allocated in dcd_get_object_def */ - kfree(obj_def.obj_data.node_obj.str_create_phase_fxn); - - kfree(obj_def.obj_data.node_obj.str_execute_phase_fxn); - - kfree(obj_def.obj_data.node_obj.str_delete_phase_fxn); - - kfree(obj_def.obj_data.node_obj.str_i_alg_name); - -func_end: - return status; -} - -/* - * ======== add_ovly_sect ======== - */ -static int add_ovly_sect(struct nldr_object *nldr_obj, - struct ovly_sect **lst, - struct dbll_sect_info *sect_inf, - bool *exists, u32 addr, u32 bytes) -{ - struct ovly_sect *new_sect = NULL; - struct ovly_sect *last_sect; - struct ovly_sect *ovly_section; - int status = 0; - - ovly_section = last_sect = *lst; - *exists = false; - while (ovly_section) { - /* - * Make sure section has not already been added. Multiple - * 'write' calls may be made to load the section. - */ - if (ovly_section->sect_load_addr == addr) { - /* Already added */ - *exists = true; - break; - } - last_sect = ovly_section; - ovly_section = ovly_section->next_sect; - } - - if (!ovly_section) { - /* New section */ - new_sect = kzalloc(sizeof(struct ovly_sect), GFP_KERNEL); - if (new_sect == NULL) { - status = -ENOMEM; - } else { - new_sect->sect_load_addr = addr; - new_sect->sect_run_addr = sect_inf->sect_run_addr + - (addr - sect_inf->sect_load_addr); - new_sect->size = bytes; - new_sect->page = sect_inf->type; - } - - /* Add to the list */ - if (!status) { - if (*lst == NULL) { - /* First in the list */ - *lst = new_sect; - } else { - last_sect->next_sect = new_sect; - } - } - } - - return status; -} - -/* - * ======== fake_ovly_write ======== - */ -static s32 fake_ovly_write(void *handle, u32 dsp_address, void *buf, u32 bytes, - s32 mtype) -{ - return (s32) bytes; -} - -/* - * ======== free_sects ======== - */ -static void free_sects(struct nldr_object *nldr_obj, - struct ovly_sect *phase_sects, u16 alloc_num) -{ - struct ovly_sect *ovly_section = phase_sects; - u16 i = 0; - bool ret; - - while (ovly_section && i < alloc_num) { - /* 'Deallocate' */ - /* segid - page not supported yet */ - /* Reserved memory */ - ret = - rmm_free(nldr_obj->rmm, 0, ovly_section->sect_run_addr, - ovly_section->size, true); - ovly_section = ovly_section->next_sect; - i++; - } -} - -/* - * ======== get_symbol_value ======== - * Find symbol in library's base image. If not there, check dependent - * libraries. - */ -static bool get_symbol_value(void *handle, void *parg, void *rmm_handle, - char *sym_name, struct dbll_sym_val **sym) -{ - struct nldr_object *nldr_obj = (struct nldr_object *)handle; - struct nldr_nodeobject *nldr_node_obj = - (struct nldr_nodeobject *)rmm_handle; - struct lib_node *root = (struct lib_node *)parg; - u16 i; - bool status = false; - - /* check the base image */ - status = nldr_obj->ldr_fxns.get_addr_fxn(nldr_obj->base_lib, - sym_name, sym); - if (!status) - status = - nldr_obj->ldr_fxns.get_c_addr_fxn(nldr_obj->base_lib, - sym_name, sym); - - /* - * Check in root lib itself. If the library consists of - * multiple object files linked together, some symbols in the - * library may need to be resolved. - */ - if (!status) { - status = nldr_obj->ldr_fxns.get_addr_fxn(root->lib, sym_name, - sym); - if (!status) { - status = - nldr_obj->ldr_fxns.get_c_addr_fxn(root->lib, - sym_name, sym); - } - } - - /* - * Check in root lib's dependent libraries, but not dependent - * libraries' dependents. - */ - if (!status) { - for (i = 0; i < root->dep_libs; i++) { - status = - nldr_obj->ldr_fxns.get_addr_fxn(root-> - dep_libs_tree - [i].lib, - sym_name, sym); - if (!status) { - status = - nldr_obj->ldr_fxns. - get_c_addr_fxn(root->dep_libs_tree[i].lib, - sym_name, sym); - } - if (status) { - /* Symbol found */ - break; - } - } - } - /* - * Check in persistent libraries - */ - if (!status) { - for (i = 0; i < nldr_node_obj->pers_libs; i++) { - status = - nldr_obj->ldr_fxns. - get_addr_fxn(nldr_node_obj->pers_lib_table[i].lib, - sym_name, sym); - if (!status) { - status = nldr_obj->ldr_fxns.get_c_addr_fxn - (nldr_node_obj->pers_lib_table[i].lib, - sym_name, sym); - } - if (status) { - /* Symbol found */ - break; - } - } - } - - return status; -} - -/* - * ======== load_lib ======== - * Recursively load library and all its dependent libraries. The library - * we're loading is specified by a uuid. - */ -static int load_lib(struct nldr_nodeobject *nldr_node_obj, - struct lib_node *root, struct dsp_uuid uuid, - bool root_prstnt, - struct dbll_library_obj **lib_path, - enum nldr_phase phase, u16 depth) -{ - struct nldr_object *nldr_obj = nldr_node_obj->nldr_obj; - u16 nd_libs = 0; /* Number of dependent libraries */ - u16 np_libs = 0; /* Number of persistent libraries */ - u16 nd_libs_loaded = 0; /* Number of dep. libraries loaded */ - u16 i; - u32 entry; - u32 dw_buf_size = NLDR_MAXPATHLENGTH; - dbll_flags flags = DBLL_SYMB | DBLL_CODE | DBLL_DATA | DBLL_DYNAMIC; - struct dbll_attrs new_attrs; - char *psz_file_name = NULL; - struct dsp_uuid *dep_lib_uui_ds = NULL; - bool *persistent_dep_libs = NULL; - int status = 0; - bool lib_status = false; - struct lib_node *dep_lib; - - if (depth > MAXDEPTH) { - /* Error */ - } - root->lib = NULL; - /* Allocate a buffer for library file name of size DBL_MAXPATHLENGTH */ - psz_file_name = kzalloc(DBLL_MAXPATHLENGTH, GFP_KERNEL); - if (psz_file_name == NULL) - status = -ENOMEM; - - if (!status) { - /* Get the name of the library */ - if (depth == 0) { - status = - dcd_get_library_name(nldr_node_obj->nldr_obj-> - dcd_mgr, &uuid, psz_file_name, - &dw_buf_size, phase, - nldr_node_obj->phase_split); - } else { - /* Dependent libraries are registered with a phase */ - status = - dcd_get_library_name(nldr_node_obj->nldr_obj-> - dcd_mgr, &uuid, psz_file_name, - &dw_buf_size, NLDR_NOPHASE, - NULL); - } - } - if (!status) { - /* Open the library, don't load symbols */ - status = - nldr_obj->ldr_fxns.open_fxn(nldr_obj->dbll, psz_file_name, - DBLL_NOLOAD, &root->lib); - } - /* Done with file name */ - kfree(psz_file_name); - - /* Check to see if library not already loaded */ - if (!status && root_prstnt) { - lib_status = - find_in_persistent_lib_array(nldr_node_obj, root->lib); - /* Close library */ - if (lib_status) { - nldr_obj->ldr_fxns.close_fxn(root->lib); - return 0; - } - } - if (!status) { - /* Check for circular dependencies. */ - for (i = 0; i < depth; i++) { - if (root->lib == lib_path[i]) { - /* This condition could be checked by a - * tool at build time. */ - status = -EILSEQ; - } - } - } - if (!status) { - /* Add library to current path in dependency tree */ - lib_path[depth] = root->lib; - depth++; - /* Get number of dependent libraries */ - status = - dcd_get_num_dep_libs(nldr_node_obj->nldr_obj->dcd_mgr, - &uuid, &nd_libs, &np_libs, phase); - } - if (!status) { - if (!(*nldr_node_obj->phase_split)) - np_libs = 0; - - /* nd_libs = #of dependent libraries */ - root->dep_libs = nd_libs - np_libs; - if (nd_libs > 0) { - dep_lib_uui_ds = kzalloc(sizeof(struct dsp_uuid) * - nd_libs, GFP_KERNEL); - persistent_dep_libs = - kzalloc(sizeof(bool) * nd_libs, GFP_KERNEL); - if (!dep_lib_uui_ds || !persistent_dep_libs) - status = -ENOMEM; - - if (root->dep_libs > 0) { - /* Allocate arrays for dependent lib UUIDs, - * lib nodes */ - root->dep_libs_tree = kzalloc - (sizeof(struct lib_node) * - (root->dep_libs), GFP_KERNEL); - if (!(root->dep_libs_tree)) - status = -ENOMEM; - - } - - if (!status) { - /* Get the dependent library UUIDs */ - status = - dcd_get_dep_libs(nldr_node_obj-> - nldr_obj->dcd_mgr, &uuid, - nd_libs, dep_lib_uui_ds, - persistent_dep_libs, - phase); - } - } - } - - /* - * Recursively load dependent libraries. - */ - if (!status) { - for (i = 0; i < nd_libs; i++) { - /* If root library is NOT persistent, and dep library - * is, then record it. If root library IS persistent, - * the deplib is already included */ - if (!root_prstnt && persistent_dep_libs[i] && - *nldr_node_obj->phase_split) { - if ((nldr_node_obj->pers_libs) >= MAXLIBS) { - status = -EILSEQ; - break; - } - - /* Allocate library outside of phase */ - dep_lib = - &nldr_node_obj->pers_lib_table - [nldr_node_obj->pers_libs]; - } else { - if (root_prstnt) - persistent_dep_libs[i] = true; - - /* Allocate library within phase */ - dep_lib = &root->dep_libs_tree[nd_libs_loaded]; - } - - status = load_lib(nldr_node_obj, dep_lib, - dep_lib_uui_ds[i], - persistent_dep_libs[i], lib_path, - phase, depth); - - if (!status) { - if ((status != 0) && - !root_prstnt && persistent_dep_libs[i] && - *nldr_node_obj->phase_split) { - (nldr_node_obj->pers_libs)++; - } else { - if (!persistent_dep_libs[i] || - !(*nldr_node_obj->phase_split)) { - nd_libs_loaded++; - } - } - } else { - break; - } - } - } - - /* Now we can load the root library */ - if (!status) { - new_attrs = nldr_obj->ldr_attrs; - new_attrs.sym_arg = root; - new_attrs.rmm_handle = nldr_node_obj; - new_attrs.input_params = nldr_node_obj->priv_ref; - new_attrs.base_image = false; - - status = - nldr_obj->ldr_fxns.load_fxn(root->lib, flags, &new_attrs, - &entry); - } - - /* - * In case of failure, unload any dependent libraries that - * were loaded, and close the root library. - * (Persistent libraries are unloaded from the very top) - */ - if (status) { - if (phase != NLDR_EXECUTE) { - for (i = 0; i < nldr_node_obj->pers_libs; i++) - unload_lib(nldr_node_obj, - &nldr_node_obj->pers_lib_table[i]); - - nldr_node_obj->pers_libs = 0; - } - for (i = 0; i < nd_libs_loaded; i++) - unload_lib(nldr_node_obj, &root->dep_libs_tree[i]); - - if (root->lib) - nldr_obj->ldr_fxns.close_fxn(root->lib); - - } - - /* Going up one node in the dependency tree */ - depth--; - - kfree(dep_lib_uui_ds); - dep_lib_uui_ds = NULL; - - kfree(persistent_dep_libs); - persistent_dep_libs = NULL; - - return status; -} - -/* - * ======== load_ovly ======== - */ -static int load_ovly(struct nldr_nodeobject *nldr_node_obj, - enum nldr_phase phase) -{ - struct nldr_object *nldr_obj = nldr_node_obj->nldr_obj; - struct ovly_node *po_node = NULL; - struct ovly_sect *phase_sects = NULL; - struct ovly_sect *other_sects_list = NULL; - u16 i; - u16 alloc_num = 0; - u16 other_alloc = 0; - u16 *ref_count = NULL; - u16 *other_ref = NULL; - u32 bytes; - struct ovly_sect *ovly_section; - int status = 0; - - /* Find the node in the table */ - for (i = 0; i < nldr_obj->ovly_nodes; i++) { - if (is_equal_uuid - (&nldr_node_obj->uuid, &nldr_obj->ovly_table[i].uuid)) { - /* Found it */ - po_node = &(nldr_obj->ovly_table[i]); - break; - } - } - - - if (!po_node) { - status = -ENOENT; - goto func_end; - } - - switch (phase) { - case NLDR_CREATE: - ref_count = &(po_node->create_ref); - other_ref = &(po_node->other_ref); - phase_sects = po_node->create_sects_list; - other_sects_list = po_node->other_sects_list; - break; - - case NLDR_EXECUTE: - ref_count = &(po_node->execute_ref); - phase_sects = po_node->execute_sects_list; - break; - - case NLDR_DELETE: - ref_count = &(po_node->delete_ref); - phase_sects = po_node->delete_sects_list; - break; - - default: - break; - } - - if (ref_count == NULL) - goto func_end; - - if (*ref_count != 0) - goto func_end; - - /* 'Allocate' memory for overlay sections of this phase */ - ovly_section = phase_sects; - while (ovly_section) { - /* allocate *//* page not supported yet */ - /* reserve *//* align */ - status = rmm_alloc(nldr_obj->rmm, 0, ovly_section->size, 0, - &(ovly_section->sect_run_addr), true); - if (!status) { - ovly_section = ovly_section->next_sect; - alloc_num++; - } else { - break; - } - } - if (other_ref && *other_ref == 0) { - /* 'Allocate' memory for other overlay sections - * (create phase) */ - if (!status) { - ovly_section = other_sects_list; - while (ovly_section) { - /* page not supported *//* align */ - /* reserve */ - status = - rmm_alloc(nldr_obj->rmm, 0, - ovly_section->size, 0, - &(ovly_section->sect_run_addr), - true); - if (!status) { - ovly_section = ovly_section->next_sect; - other_alloc++; - } else { - break; - } - } - } - } - if (*ref_count == 0) { - if (!status) { - /* Load sections for this phase */ - ovly_section = phase_sects; - while (ovly_section && !status) { - bytes = - (*nldr_obj->ovly_fxn) (nldr_node_obj-> - priv_ref, - ovly_section-> - sect_run_addr, - ovly_section-> - sect_load_addr, - ovly_section->size, - ovly_section->page); - if (bytes != ovly_section->size) - status = -EPERM; - - ovly_section = ovly_section->next_sect; - } - } - } - if (other_ref && *other_ref == 0) { - if (!status) { - /* Load other sections (create phase) */ - ovly_section = other_sects_list; - while (ovly_section && !status) { - bytes = - (*nldr_obj->ovly_fxn) (nldr_node_obj-> - priv_ref, - ovly_section-> - sect_run_addr, - ovly_section-> - sect_load_addr, - ovly_section->size, - ovly_section->page); - if (bytes != ovly_section->size) - status = -EPERM; - - ovly_section = ovly_section->next_sect; - } - } - } - if (status) { - /* 'Deallocate' memory */ - free_sects(nldr_obj, phase_sects, alloc_num); - free_sects(nldr_obj, other_sects_list, other_alloc); - } -func_end: - if (!status && (ref_count != NULL)) { - *ref_count += 1; - if (other_ref) - *other_ref += 1; - - } - - return status; -} - -/* - * ======== remote_alloc ======== - */ -static int remote_alloc(void **ref, u16 mem_sect, u32 size, - u32 align, u32 *dsp_address, - s32 segmnt_id, s32 req, - bool reserve) -{ - struct nldr_nodeobject *hnode = (struct nldr_nodeobject *)ref; - struct nldr_object *nldr_obj; - struct rmm_target_obj *rmm; - u16 mem_phase_bit = MAXFLAGS; - u16 segid = 0; - u16 i; - u16 mem_sect_type; - u32 word_size; - struct rmm_addr *rmm_addr_obj = (struct rmm_addr *)dsp_address; - bool mem_load_req = false; - int status = -ENOMEM; /* Set to fail */ - - nldr_obj = hnode->nldr_obj; - rmm = nldr_obj->rmm; - /* Convert size to DSP words */ - word_size = - (size + nldr_obj->dsp_word_size - - 1) / nldr_obj->dsp_word_size; - /* Modify memory 'align' to account for DSP cache line size */ - align = lcm(GEM_CACHE_LINE_SIZE, align); - dev_dbg(bridge, "%s: memory align to 0x%x\n", __func__, align); - if (segmnt_id != -1) { - rmm_addr_obj->segid = segmnt_id; - segid = segmnt_id; - mem_load_req = req; - } else { - switch (hnode->phase) { - case NLDR_CREATE: - mem_phase_bit = CREATEDATAFLAGBIT; - break; - case NLDR_DELETE: - mem_phase_bit = DELETEDATAFLAGBIT; - break; - case NLDR_EXECUTE: - mem_phase_bit = EXECUTEDATAFLAGBIT; - break; - default: - break; - } - if (mem_sect == DBLL_CODE) - mem_phase_bit++; - - if (mem_phase_bit < MAXFLAGS) - segid = hnode->seg_id[mem_phase_bit]; - - /* Determine if there is a memory loading requirement */ - if ((hnode->code_data_flag_mask >> mem_phase_bit) & 0x1) - mem_load_req = true; - - } - mem_sect_type = (mem_sect == DBLL_CODE) ? DYNM_CODE : DYNM_DATA; - - /* Find an appropriate segment based on mem_sect */ - if (segid == NULLID) { - /* No memory requirements of preferences */ - goto func_cont; - } - if (segid <= MAXSEGID) { - /* Attempt to allocate from segid first. */ - rmm_addr_obj->segid = segid; - status = - rmm_alloc(rmm, segid, word_size, align, dsp_address, false); - if (status) { - dev_dbg(bridge, "%s: Unable allocate from segment %d\n", - __func__, segid); - } - } else { - /* segid > MAXSEGID ==> Internal or external memory */ - /* Check for any internal or external memory segment, - * depending on segid. */ - mem_sect_type |= segid == MEMINTERNALID ? - DYNM_INTERNAL : DYNM_EXTERNAL; - for (i = 0; i < nldr_obj->dload_segs; i++) { - if ((nldr_obj->seg_table[i] & mem_sect_type) != - mem_sect_type) - continue; - - status = rmm_alloc(rmm, i, word_size, align, - dsp_address, false); - if (!status) { - /* Save segid for freeing later */ - rmm_addr_obj->segid = i; - break; - } - } - } -func_cont: - /* Haven't found memory yet, attempt to find any segment that works */ - if (status == -ENOMEM && !mem_load_req) { - dev_dbg(bridge, "%s: Preferred segment unavailable, trying " - "another\n", __func__); - for (i = 0; i < nldr_obj->dload_segs; i++) { - /* All bits of mem_sect_type must be set */ - if ((nldr_obj->seg_table[i] & mem_sect_type) != - mem_sect_type) - continue; - - status = rmm_alloc(rmm, i, word_size, align, - dsp_address, false); - if (!status) { - /* Save segid */ - rmm_addr_obj->segid = i; - break; - } - } - } - - return status; -} - -static int remote_free(void **ref, u16 space, u32 dsp_address, - u32 size, bool reserve) -{ - struct nldr_object *nldr_obj = (struct nldr_object *)ref; - struct rmm_target_obj *rmm; - u32 word_size; - int status = -ENOMEM; /* Set to fail */ - - rmm = nldr_obj->rmm; - - /* Convert size to DSP words */ - word_size = - (size + nldr_obj->dsp_word_size - - 1) / nldr_obj->dsp_word_size; - - if (rmm_free(rmm, space, dsp_address, word_size, reserve)) - status = 0; - - return status; -} - -/* - * ======== unload_lib ======== - */ -static void unload_lib(struct nldr_nodeobject *nldr_node_obj, - struct lib_node *root) -{ - struct dbll_attrs new_attrs; - struct nldr_object *nldr_obj = nldr_node_obj->nldr_obj; - u16 i; - - - /* Unload dependent libraries */ - for (i = 0; i < root->dep_libs; i++) - unload_lib(nldr_node_obj, &root->dep_libs_tree[i]); - - root->dep_libs = 0; - - new_attrs = nldr_obj->ldr_attrs; - new_attrs.rmm_handle = nldr_obj->rmm; - new_attrs.input_params = nldr_node_obj->priv_ref; - new_attrs.base_image = false; - new_attrs.sym_arg = root; - - if (root->lib) { - /* Unload the root library */ - nldr_obj->ldr_fxns.unload_fxn(root->lib, &new_attrs); - nldr_obj->ldr_fxns.close_fxn(root->lib); - } - - /* Free dependent library list */ - kfree(root->dep_libs_tree); - root->dep_libs_tree = NULL; -} - -/* - * ======== unload_ovly ======== - */ -static void unload_ovly(struct nldr_nodeobject *nldr_node_obj, - enum nldr_phase phase) -{ - struct nldr_object *nldr_obj = nldr_node_obj->nldr_obj; - struct ovly_node *po_node = NULL; - struct ovly_sect *phase_sects = NULL; - struct ovly_sect *other_sects_list = NULL; - u16 i; - u16 alloc_num = 0; - u16 other_alloc = 0; - u16 *ref_count = NULL; - u16 *other_ref = NULL; - - /* Find the node in the table */ - for (i = 0; i < nldr_obj->ovly_nodes; i++) { - if (is_equal_uuid - (&nldr_node_obj->uuid, &nldr_obj->ovly_table[i].uuid)) { - /* Found it */ - po_node = &(nldr_obj->ovly_table[i]); - break; - } - } - - - if (!po_node) - /* TODO: Should we print warning here? */ - return; - - switch (phase) { - case NLDR_CREATE: - ref_count = &(po_node->create_ref); - phase_sects = po_node->create_sects_list; - alloc_num = po_node->create_sects; - break; - case NLDR_EXECUTE: - ref_count = &(po_node->execute_ref); - phase_sects = po_node->execute_sects_list; - alloc_num = po_node->execute_sects; - break; - case NLDR_DELETE: - ref_count = &(po_node->delete_ref); - other_ref = &(po_node->other_ref); - phase_sects = po_node->delete_sects_list; - /* 'Other' overlay sections are unloaded in the delete phase */ - other_sects_list = po_node->other_sects_list; - alloc_num = po_node->delete_sects; - other_alloc = po_node->other_sects; - break; - default: - break; - } - if (ref_count && (*ref_count > 0)) { - *ref_count -= 1; - if (other_ref) - *other_ref -= 1; - } - - if (ref_count && *ref_count == 0) { - /* 'Deallocate' memory */ - free_sects(nldr_obj, phase_sects, alloc_num); - } - if (other_ref && *other_ref == 0) - free_sects(nldr_obj, other_sects_list, other_alloc); -} - -/* - * ======== find_in_persistent_lib_array ======== - */ -static bool find_in_persistent_lib_array(struct nldr_nodeobject *nldr_node_obj, - struct dbll_library_obj *lib) -{ - s32 i = 0; - - for (i = 0; i < nldr_node_obj->pers_libs; i++) { - if (lib == nldr_node_obj->pers_lib_table[i].lib) - return true; - - } - - return false; -} - -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE -/** - * nldr_find_addr() - Find the closest symbol to the given address based on - * dynamic node object. - * - * @nldr_node: Dynamic node object - * @sym_addr: Given address to find the dsp symbol - * @offset_range: offset range to look for dsp symbol - * @offset_output: Symbol Output address - * @sym_name: String with the dsp symbol - * - * This function finds the node library for a given address and - * retrieves the dsp symbol by calling dbll_find_dsp_symbol. - */ -int nldr_find_addr(struct nldr_nodeobject *nldr_node, u32 sym_addr, - u32 offset_range, void *offset_output, char *sym_name) -{ - int status = 0; - bool status1 = false; - s32 i = 0; - struct lib_node root = { NULL, 0, NULL }; - - if (nldr_node->dynamic && *nldr_node->phase_split) { - switch (nldr_node->phase) { - case NLDR_CREATE: - root = nldr_node->create_lib; - break; - case NLDR_EXECUTE: - root = nldr_node->execute_lib; - break; - case NLDR_DELETE: - root = nldr_node->delete_lib; - break; - default: - break; - } - } else { - /* for Overlay nodes or non-split Dynamic nodes */ - root = nldr_node->root; - } - - status1 = dbll_find_dsp_symbol(root.lib, sym_addr, - offset_range, offset_output, sym_name); - - /* If symbol not found, check dependent libraries */ - if (!status1) - for (i = 0; i < root.dep_libs; i++) { - status1 = dbll_find_dsp_symbol( - root.dep_libs_tree[i].lib, sym_addr, - offset_range, offset_output, sym_name); - if (status1) - /* Symbol found */ - break; - } - /* Check persistent libraries */ - if (!status1) - for (i = 0; i < nldr_node->pers_libs; i++) { - status1 = dbll_find_dsp_symbol( - nldr_node->pers_lib_table[i].lib, sym_addr, - offset_range, offset_output, sym_name); - if (status1) - /* Symbol found */ - break; - } - - if (!status1) { - pr_debug("%s: Address 0x%x not found in range %d.\n", - __func__, sym_addr, offset_range); - status = -ESPIPE; - } else { - pr_debug("%s(0x%x, 0x%x, 0x%x, 0x%x, %s)\n", - __func__, (u32) nldr_node, sym_addr, offset_range, - (u32) offset_output, sym_name); - } - - return status; -} -#endif diff --git a/drivers/staging/tidspbridge/rmgr/node.c b/drivers/staging/tidspbridge/rmgr/node.c deleted file mode 100644 index 133f2dbc3762..000000000000 --- a/drivers/staging/tidspbridge/rmgr/node.c +++ /dev/null @@ -1,3031 +0,0 @@ -/* - * node.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP/BIOS Bridge Node Manager. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -#include -#include - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- OS Adaptation Layer */ -#include -#include -#include -#include -#include - -/* ----------------------------------- Platform Manager */ -#include -#include -#include -#include - -/* ----------------------------------- Resource Manager */ -#include -#include -#include - -/* ----------------------------------- Link Driver */ -#include -#include - -/* ----------------------------------- Others */ -#include - -/* ----------------------------------- This */ -#include -#include -#include - -/* Static/Dynamic Loader includes */ -#include -#include - -#include -#include -#include <_tiomap.h> - -#include - -#define HOSTPREFIX "/host" -#define PIPEPREFIX "/dbpipe" - -#define MAX_INPUTS(h) \ - ((h)->dcd_props.obj_data.node_obj.ndb_props.num_input_streams) -#define MAX_OUTPUTS(h) \ - ((h)->dcd_props.obj_data.node_obj.ndb_props.num_output_streams) - -#define NODE_GET_PRIORITY(h) ((h)->prio) -#define NODE_SET_PRIORITY(hnode, prio) ((hnode)->prio = prio) -#define NODE_SET_STATE(hnode, state) ((hnode)->node_state = state) - -#define MAXPIPES 100 /* Max # of /pipe connections (CSL limit) */ -#define MAXDEVSUFFIXLEN 2 /* Max(Log base 10 of MAXPIPES, MAXSTREAMS) */ - -#define PIPENAMELEN (sizeof(PIPEPREFIX) + MAXDEVSUFFIXLEN) -#define HOSTNAMELEN (sizeof(HOSTPREFIX) + MAXDEVSUFFIXLEN) - -#define MAXDEVNAMELEN 32 /* dsp_ndbprops.ac_name size */ -#define CREATEPHASE 1 -#define EXECUTEPHASE 2 -#define DELETEPHASE 3 - -/* Define default STRM parameters */ -/* - * TBD: Put in header file, make global DSP_STRMATTRS with defaults, - * or make defaults configurable. - */ -#define DEFAULTBUFSIZE 32 -#define DEFAULTNBUFS 2 -#define DEFAULTSEGID 0 -#define DEFAULTALIGNMENT 0 -#define DEFAULTTIMEOUT 10000 - -#define RMSQUERYSERVER 0 -#define RMSCONFIGURESERVER 1 -#define RMSCREATENODE 2 -#define RMSEXECUTENODE 3 -#define RMSDELETENODE 4 -#define RMSCHANGENODEPRIORITY 5 -#define RMSREADMEMORY 6 -#define RMSWRITEMEMORY 7 -#define RMSCOPY 8 -#define MAXTIMEOUT 2000 - -#define NUMRMSFXNS 9 - -#define PWR_TIMEOUT 500 /* default PWR timeout in msec */ - -#define STACKSEGLABEL "L1DSRAM_HEAP" /* Label for DSP Stack Segment Addr */ - -/* - * ======== node_mgr ======== - */ -struct node_mgr { - struct dev_object *dev_obj; /* Device object */ - /* Function interface to Bridge driver */ - struct bridge_drv_interface *intf_fxns; - struct dcd_manager *dcd_mgr; /* Proc/Node data manager */ - struct disp_object *disp_obj; /* Node dispatcher */ - struct list_head node_list; /* List of all allocated nodes */ - u32 num_nodes; /* Number of nodes in node_list */ - u32 num_created; /* Number of nodes *created* on DSP */ - DECLARE_BITMAP(pipe_map, MAXPIPES); /* Pipe connection bitmap */ - DECLARE_BITMAP(pipe_done_map, MAXPIPES); /* Pipes that are half free */ - /* Channel allocation bitmap */ - DECLARE_BITMAP(chnl_map, CHNL_MAXCHANNELS); - /* DMA Channel allocation bitmap */ - DECLARE_BITMAP(dma_chnl_map, CHNL_MAXCHANNELS); - /* Zero-Copy Channel alloc bitmap */ - DECLARE_BITMAP(zc_chnl_map, CHNL_MAXCHANNELS); - struct ntfy_object *ntfy_obj; /* Manages registered notifications */ - struct mutex node_mgr_lock; /* For critical sections */ - u32 fxn_addrs[NUMRMSFXNS]; /* RMS function addresses */ - struct msg_mgr *msg_mgr_obj; - - /* Processor properties needed by Node Dispatcher */ - u32 num_chnls; /* Total number of channels */ - u32 chnl_offset; /* Offset of chnl ids rsvd for RMS */ - u32 chnl_buf_size; /* Buffer size for data to RMS */ - int proc_family; /* eg, 5000 */ - int proc_type; /* eg, 5510 */ - u32 dsp_word_size; /* Size of DSP word on host bytes */ - u32 dsp_data_mau_size; /* Size of DSP data MAU */ - u32 dsp_mau_size; /* Size of MAU */ - s32 min_pri; /* Minimum runtime priority for node */ - s32 max_pri; /* Maximum runtime priority for node */ - - struct strm_mgr *strm_mgr_obj; /* STRM manager */ - - /* Loader properties */ - struct nldr_object *nldr_obj; /* Handle to loader */ - struct node_ldr_fxns nldr_fxns; /* Handle to loader functions */ -}; - -/* - * ======== connecttype ======== - */ -enum connecttype { - NOTCONNECTED = 0, - NODECONNECT, - HOSTCONNECT, - DEVICECONNECT, -}; - -/* - * ======== stream_chnl ======== - */ -struct stream_chnl { - enum connecttype type; /* Type of stream connection */ - u32 dev_id; /* pipe or channel id */ -}; - -/* - * ======== node_object ======== - */ -struct node_object { - struct list_head list_elem; - struct node_mgr *node_mgr; /* The manager of this node */ - struct proc_object *processor; /* Back pointer to processor */ - struct dsp_uuid node_uuid; /* Node's ID */ - s32 prio; /* Node's current priority */ - u32 timeout; /* Timeout for blocking NODE calls */ - u32 heap_size; /* Heap Size */ - u32 dsp_heap_virt_addr; /* Heap Size */ - u32 gpp_heap_virt_addr; /* Heap Size */ - enum node_type ntype; /* Type of node: message, task, etc */ - enum node_state node_state; /* NODE_ALLOCATED, NODE_CREATED, ... */ - u32 num_inputs; /* Current number of inputs */ - u32 num_outputs; /* Current number of outputs */ - u32 max_input_index; /* Current max input stream index */ - u32 max_output_index; /* Current max output stream index */ - struct stream_chnl *inputs; /* Node's input streams */ - struct stream_chnl *outputs; /* Node's output streams */ - struct node_createargs create_args; /* Args for node create func */ - nodeenv node_env; /* Environment returned by RMS */ - struct dcd_genericobj dcd_props; /* Node properties from DCD */ - struct dsp_cbdata *args; /* Optional args to pass to node */ - struct ntfy_object *ntfy_obj; /* Manages registered notifications */ - char *str_dev_name; /* device name, if device node */ - struct sync_object *sync_done; /* Synchronize node_terminate */ - s32 exit_status; /* execute function return status */ - - /* Information needed for node_get_attr() */ - void *device_owner; /* If dev node, task that owns it */ - u32 num_gpp_inputs; /* Current # of from GPP streams */ - u32 num_gpp_outputs; /* Current # of to GPP streams */ - /* Current stream connections */ - struct dsp_streamconnect *stream_connect; - - /* Message queue */ - struct msg_queue *msg_queue_obj; - - /* These fields used for SM messaging */ - struct cmm_xlatorobject *xlator; /* Node's SM addr translator */ - - /* Handle to pass to dynamic loader */ - struct nldr_nodeobject *nldr_node_obj; - bool loaded; /* Code is (dynamically) loaded */ - bool phase_split; /* Phases split in many libs or ovly */ - -}; - -/* Default buffer attributes */ -static struct dsp_bufferattr node_dfltbufattrs = { - .cb_struct = 0, - .segment_id = 1, - .buf_alignment = 0, -}; - -static void delete_node(struct node_object *hnode, - struct process_context *pr_ctxt); -static void delete_node_mgr(struct node_mgr *hnode_mgr); -static void fill_stream_connect(struct node_object *node1, - struct node_object *node2, u32 stream1, - u32 stream2); -static void fill_stream_def(struct node_object *hnode, - struct node_strmdef *pstrm_def, - struct dsp_strmattr *pattrs); -static void free_stream(struct node_mgr *hnode_mgr, struct stream_chnl stream); -static int get_fxn_address(struct node_object *hnode, u32 *fxn_addr, - u32 phase); -static int get_node_props(struct dcd_manager *hdcd_mgr, - struct node_object *hnode, - const struct dsp_uuid *node_uuid, - struct dcd_genericobj *dcd_prop); -static int get_proc_props(struct node_mgr *hnode_mgr, - struct dev_object *hdev_obj); -static int get_rms_fxns(struct node_mgr *hnode_mgr); -static u32 ovly(void *priv_ref, u32 dsp_run_addr, u32 dsp_load_addr, - u32 ul_num_bytes, u32 mem_space); -static u32 mem_write(void *priv_ref, u32 dsp_add, void *pbuf, - u32 ul_num_bytes, u32 mem_space); - -/* Dynamic loader functions. */ -static struct node_ldr_fxns nldr_fxns = { - nldr_allocate, - nldr_create, - nldr_delete, - nldr_get_fxn_addr, - nldr_load, - nldr_unload, -}; - -enum node_state node_get_state(void *hnode) -{ - struct node_object *pnode = (struct node_object *)hnode; - - if (!pnode) - return -1; - return pnode->node_state; -} - -/* - * ======== node_allocate ======== - * Purpose: - * Allocate GPP resources to manage a node on the DSP. - */ -int node_allocate(struct proc_object *hprocessor, - const struct dsp_uuid *node_uuid, - const struct dsp_cbdata *pargs, - const struct dsp_nodeattrin *attr_in, - struct node_res_object **noderes, - struct process_context *pr_ctxt) -{ - struct node_mgr *hnode_mgr; - struct dev_object *hdev_obj; - struct node_object *pnode = NULL; - enum node_type node_type = NODE_TASK; - struct node_msgargs *pmsg_args; - struct node_taskargs *ptask_args; - u32 num_streams; - struct bridge_drv_interface *intf_fxns; - int status = 0; - struct cmm_object *hcmm_mgr = NULL; /* Shared memory manager hndl */ - u32 proc_id; - u32 pul_value; - u32 dynext_base; - u32 off_set = 0; - u32 ul_stack_seg_val; - struct cfg_hostres *host_res; - struct bridge_dev_context *pbridge_context; - u32 mapped_addr = 0; - u32 map_attrs = 0x0; - struct dsp_processorstate proc_state; -#ifdef DSP_DMM_DEBUG - struct dmm_object *dmm_mgr; - struct proc_object *p_proc_object = (struct proc_object *)hprocessor; -#endif - - void *node_res; - - *noderes = NULL; - - status = proc_get_processor_id(hprocessor, &proc_id); - - if (proc_id != DSP_UNIT) - goto func_end; - - status = proc_get_dev_object(hprocessor, &hdev_obj); - if (!status) { - status = dev_get_node_manager(hdev_obj, &hnode_mgr); - if (hnode_mgr == NULL) - status = -EPERM; - - } - - if (status) - goto func_end; - - status = dev_get_bridge_context(hdev_obj, &pbridge_context); - if (!pbridge_context) { - status = -EFAULT; - goto func_end; - } - - status = proc_get_state(hprocessor, &proc_state, - sizeof(struct dsp_processorstate)); - if (status) - goto func_end; - /* If processor is in error state then don't attempt - to send the message */ - if (proc_state.proc_state == PROC_ERROR) { - status = -EPERM; - goto func_end; - } - - /* Assuming that 0 is not a valid function address */ - if (hnode_mgr->fxn_addrs[0] == 0) { - /* No RMS on target - we currently can't handle this */ - pr_err("%s: Failed, no RMS in base image\n", __func__); - status = -EPERM; - } else { - /* Validate attr_in fields, if non-NULL */ - if (attr_in) { - /* Check if attr_in->prio is within range */ - if (attr_in->prio < hnode_mgr->min_pri || - attr_in->prio > hnode_mgr->max_pri) - status = -EDOM; - } - } - /* Allocate node object and fill in */ - if (status) - goto func_end; - - pnode = kzalloc(sizeof(struct node_object), GFP_KERNEL); - if (pnode == NULL) { - status = -ENOMEM; - goto func_end; - } - pnode->node_mgr = hnode_mgr; - /* This critical section protects get_node_props */ - mutex_lock(&hnode_mgr->node_mgr_lock); - - /* Get dsp_ndbprops from node database */ - status = get_node_props(hnode_mgr->dcd_mgr, pnode, node_uuid, - &(pnode->dcd_props)); - if (status) - goto func_cont; - - pnode->node_uuid = *node_uuid; - pnode->processor = hprocessor; - pnode->ntype = pnode->dcd_props.obj_data.node_obj.ndb_props.ntype; - pnode->timeout = pnode->dcd_props.obj_data.node_obj.ndb_props.timeout; - pnode->prio = pnode->dcd_props.obj_data.node_obj.ndb_props.prio; - - /* Currently only C64 DSP builds support Node Dynamic * heaps */ - /* Allocate memory for node heap */ - pnode->create_args.asa.task_arg_obj.heap_size = 0; - pnode->create_args.asa.task_arg_obj.dsp_heap_addr = 0; - pnode->create_args.asa.task_arg_obj.dsp_heap_res_addr = 0; - pnode->create_args.asa.task_arg_obj.gpp_heap_addr = 0; - if (!attr_in) - goto func_cont; - - /* Check if we have a user allocated node heap */ - if (!(attr_in->pgpp_virt_addr)) - goto func_cont; - - /* check for page aligned Heap size */ - if (((attr_in->heap_size) & (PG_SIZE4K - 1))) { - pr_err("%s: node heap size not aligned to 4K, size = 0x%x\n", - __func__, attr_in->heap_size); - status = -EINVAL; - } else { - pnode->create_args.asa.task_arg_obj.heap_size = - attr_in->heap_size; - pnode->create_args.asa.task_arg_obj.gpp_heap_addr = - (u32) attr_in->pgpp_virt_addr; - } - if (status) - goto func_cont; - - status = proc_reserve_memory(hprocessor, - pnode->create_args.asa.task_arg_obj. - heap_size + PAGE_SIZE, - (void **)&(pnode->create_args.asa. - task_arg_obj.dsp_heap_res_addr), - pr_ctxt); - if (status) { - pr_err("%s: Failed to reserve memory for heap: 0x%x\n", - __func__, status); - goto func_cont; - } -#ifdef DSP_DMM_DEBUG - status = dmm_get_handle(p_proc_object, &dmm_mgr); - if (!dmm_mgr) { - status = DSP_EHANDLE; - goto func_cont; - } - - dmm_mem_map_dump(dmm_mgr); -#endif - - map_attrs |= DSP_MAPLITTLEENDIAN; - map_attrs |= DSP_MAPELEMSIZE32; - map_attrs |= DSP_MAPVIRTUALADDR; - status = proc_map(hprocessor, (void *)attr_in->pgpp_virt_addr, - pnode->create_args.asa.task_arg_obj.heap_size, - (void *)pnode->create_args.asa.task_arg_obj. - dsp_heap_res_addr, (void **)&mapped_addr, map_attrs, - pr_ctxt); - if (status) - pr_err("%s: Failed to map memory for Heap: 0x%x\n", - __func__, status); - else - pnode->create_args.asa.task_arg_obj.dsp_heap_addr = - (u32) mapped_addr; - -func_cont: - mutex_unlock(&hnode_mgr->node_mgr_lock); - if (attr_in != NULL) { - /* Overrides of NBD properties */ - pnode->timeout = attr_in->timeout; - pnode->prio = attr_in->prio; - } - /* Create object to manage notifications */ - if (!status) { - pnode->ntfy_obj = kmalloc(sizeof(struct ntfy_object), - GFP_KERNEL); - if (pnode->ntfy_obj) - ntfy_init(pnode->ntfy_obj); - else - status = -ENOMEM; - } - - if (!status) { - node_type = node_get_type(pnode); - /* Allocate dsp_streamconnect array for device, task, and - * dais socket nodes. */ - if (node_type != NODE_MESSAGE) { - num_streams = MAX_INPUTS(pnode) + MAX_OUTPUTS(pnode); - pnode->stream_connect = kzalloc(num_streams * - sizeof(struct dsp_streamconnect), - GFP_KERNEL); - if (num_streams > 0 && pnode->stream_connect == NULL) - status = -ENOMEM; - - } - if (!status && (node_type == NODE_TASK || - node_type == NODE_DAISSOCKET)) { - /* Allocate arrays for maintainig stream connections */ - pnode->inputs = kzalloc(MAX_INPUTS(pnode) * - sizeof(struct stream_chnl), GFP_KERNEL); - pnode->outputs = kzalloc(MAX_OUTPUTS(pnode) * - sizeof(struct stream_chnl), GFP_KERNEL); - ptask_args = &(pnode->create_args.asa.task_arg_obj); - ptask_args->strm_in_def = kzalloc(MAX_INPUTS(pnode) * - sizeof(struct node_strmdef), - GFP_KERNEL); - ptask_args->strm_out_def = kzalloc(MAX_OUTPUTS(pnode) * - sizeof(struct node_strmdef), - GFP_KERNEL); - if ((MAX_INPUTS(pnode) > 0 && (pnode->inputs == NULL || - ptask_args->strm_in_def - == NULL)) - || (MAX_OUTPUTS(pnode) > 0 - && (pnode->outputs == NULL - || ptask_args->strm_out_def == NULL))) - status = -ENOMEM; - } - } - if (!status && (node_type != NODE_DEVICE)) { - /* Create an event that will be posted when RMS_EXIT is - * received. */ - pnode->sync_done = kzalloc(sizeof(struct sync_object), - GFP_KERNEL); - if (pnode->sync_done) - sync_init_event(pnode->sync_done); - else - status = -ENOMEM; - - if (!status) { - /*Get the shared mem mgr for this nodes dev object */ - status = cmm_get_handle(hprocessor, &hcmm_mgr); - if (!status) { - /* Allocate a SM addr translator for this node - * w/ deflt attr */ - status = cmm_xlator_create(&pnode->xlator, - hcmm_mgr, NULL); - } - } - if (!status) { - /* Fill in message args */ - if ((pargs != NULL) && (pargs->cb_data > 0)) { - pmsg_args = - &(pnode->create_args.asa.node_msg_args); - pmsg_args->pdata = kzalloc(pargs->cb_data, - GFP_KERNEL); - if (pmsg_args->pdata == NULL) { - status = -ENOMEM; - } else { - pmsg_args->arg_length = pargs->cb_data; - memcpy(pmsg_args->pdata, - pargs->node_data, - pargs->cb_data); - } - } - } - } - - if (!status && node_type != NODE_DEVICE) { - /* Create a message queue for this node */ - intf_fxns = hnode_mgr->intf_fxns; - status = - (*intf_fxns->msg_create_queue) (hnode_mgr->msg_mgr_obj, - &pnode->msg_queue_obj, - 0, - pnode->create_args.asa. - node_msg_args.max_msgs, - pnode); - } - - if (!status) { - /* Create object for dynamic loading */ - - status = hnode_mgr->nldr_fxns.allocate(hnode_mgr->nldr_obj, - (void *)pnode, - &pnode->dcd_props. - obj_data.node_obj, - &pnode-> - nldr_node_obj, - &pnode->phase_split); - } - - /* Compare value read from Node Properties and check if it is same as - * STACKSEGLABEL, if yes read the Address of STACKSEGLABEL, calculate - * GPP Address, Read the value in that address and override the - * stack_seg value in task args */ - if (!status && - (char *)pnode->dcd_props.obj_data.node_obj.ndb_props. - stack_seg_name != NULL) { - if (strcmp((char *) - pnode->dcd_props.obj_data.node_obj.ndb_props. - stack_seg_name, STACKSEGLABEL) == 0) { - void __iomem *stack_seg; - u32 stack_seg_pa; - - status = - hnode_mgr->nldr_fxns. - get_fxn_addr(pnode->nldr_node_obj, "DYNEXT_BEG", - &dynext_base); - if (status) - pr_err("%s: Failed to get addr for DYNEXT_BEG" - " status = 0x%x\n", __func__, status); - - status = - hnode_mgr->nldr_fxns. - get_fxn_addr(pnode->nldr_node_obj, - "L1DSRAM_HEAP", &pul_value); - - if (status) - pr_err("%s: Failed to get addr for L1DSRAM_HEAP" - " status = 0x%x\n", __func__, status); - - host_res = pbridge_context->resources; - if (!host_res) - status = -EPERM; - - if (status) { - pr_err("%s: Failed to get host resource, status" - " = 0x%x\n", __func__, status); - goto func_end; - } - - off_set = pul_value - dynext_base; - stack_seg_pa = host_res->mem_phys[1] + off_set; - stack_seg = ioremap(stack_seg_pa, SZ_32); - if (!stack_seg) { - status = -ENOMEM; - goto func_end; - } - - ul_stack_seg_val = readl(stack_seg); - - iounmap(stack_seg); - - dev_dbg(bridge, "%s: StackSegVal = 0x%x, StackSegAddr =" - " 0x%x\n", __func__, ul_stack_seg_val, - host_res->mem_base[1] + off_set); - - pnode->create_args.asa.task_arg_obj.stack_seg = - ul_stack_seg_val; - - } - } - - if (!status) { - /* Add the node to the node manager's list of allocated - * nodes. */ - NODE_SET_STATE(pnode, NODE_ALLOCATED); - - mutex_lock(&hnode_mgr->node_mgr_lock); - - list_add_tail(&pnode->list_elem, &hnode_mgr->node_list); - ++(hnode_mgr->num_nodes); - - /* Exit critical section */ - mutex_unlock(&hnode_mgr->node_mgr_lock); - - /* Preset this to assume phases are split - * (for overlay and dll) */ - pnode->phase_split = true; - - /* Notify all clients registered for DSP_NODESTATECHANGE. */ - proc_notify_all_clients(hprocessor, DSP_NODESTATECHANGE); - } else { - /* Cleanup */ - if (pnode) - delete_node(pnode, pr_ctxt); - - } - - if (!status) { - status = drv_insert_node_res_element(pnode, &node_res, pr_ctxt); - if (status) { - delete_node(pnode, pr_ctxt); - goto func_end; - } - - *noderes = (struct node_res_object *)node_res; - drv_proc_node_update_heap_status(node_res, true); - drv_proc_node_update_status(node_res, true); - } -func_end: - dev_dbg(bridge, "%s: hprocessor: %p pNodeId: %p pargs: %p attr_in: %p " - "node_res: %p status: 0x%x\n", __func__, hprocessor, - node_uuid, pargs, attr_in, noderes, status); - return status; -} - -/* - * ======== node_alloc_msg_buf ======== - * Purpose: - * Allocates buffer for zero copy messaging. - */ -DBAPI node_alloc_msg_buf(struct node_object *hnode, u32 usize, - struct dsp_bufferattr *pattr, - u8 **pbuffer) -{ - struct node_object *pnode = (struct node_object *)hnode; - int status = 0; - bool va_flag = false; - bool set_info; - u32 proc_id; - - if (!pnode) - status = -EFAULT; - else if (node_get_type(pnode) == NODE_DEVICE) - status = -EPERM; - - if (status) - goto func_end; - - if (pattr == NULL) - pattr = &node_dfltbufattrs; /* set defaults */ - - status = proc_get_processor_id(pnode->processor, &proc_id); - if (proc_id != DSP_UNIT) - goto func_end; - - /* If segment ID includes MEM_SETVIRTUALSEGID then pbuffer is a - * virt address, so set this info in this node's translator - * object for future ref. If MEM_GETVIRTUALSEGID then retrieve - * virtual address from node's translator. */ - if ((pattr->segment_id & MEM_SETVIRTUALSEGID) || - (pattr->segment_id & MEM_GETVIRTUALSEGID)) { - va_flag = true; - set_info = (pattr->segment_id & MEM_SETVIRTUALSEGID) ? - true : false; - /* Clear mask bits */ - pattr->segment_id &= ~MEM_MASKVIRTUALSEGID; - /* Set/get this node's translators virtual address base/size */ - status = cmm_xlator_info(pnode->xlator, pbuffer, usize, - pattr->segment_id, set_info); - } - if (!status && (!va_flag)) { - if (pattr->segment_id != 1) { - /* Node supports single SM segment only. */ - status = -EBADR; - } - /* Arbitrary SM buffer alignment not supported for host side - * allocs, but guaranteed for the following alignment - * values. */ - switch (pattr->buf_alignment) { - case 0: - case 1: - case 2: - case 4: - break; - default: - /* alignment value not supportted */ - status = -EPERM; - break; - } - if (!status) { - /* allocate physical buffer from seg_id in node's - * translator */ - (void)cmm_xlator_alloc_buf(pnode->xlator, pbuffer, - usize); - if (*pbuffer == NULL) { - pr_err("%s: error - Out of shared memory\n", - __func__); - status = -ENOMEM; - } - } - } -func_end: - return status; -} - -/* - * ======== node_change_priority ======== - * Purpose: - * Change the priority of a node in the allocated state, or that is - * currently running or paused on the target. - */ -int node_change_priority(struct node_object *hnode, s32 prio) -{ - struct node_object *pnode = (struct node_object *)hnode; - struct node_mgr *hnode_mgr = NULL; - enum node_type node_type; - enum node_state state; - int status = 0; - u32 proc_id; - - if (!hnode || !hnode->node_mgr) { - status = -EFAULT; - } else { - hnode_mgr = hnode->node_mgr; - node_type = node_get_type(hnode); - if (node_type != NODE_TASK && node_type != NODE_DAISSOCKET) - status = -EPERM; - else if (prio < hnode_mgr->min_pri || prio > hnode_mgr->max_pri) - status = -EDOM; - } - if (status) - goto func_end; - - /* Enter critical section */ - mutex_lock(&hnode_mgr->node_mgr_lock); - - state = node_get_state(hnode); - if (state == NODE_ALLOCATED || state == NODE_PAUSED) { - NODE_SET_PRIORITY(hnode, prio); - } else { - if (state != NODE_RUNNING) { - status = -EBADR; - goto func_cont; - } - status = proc_get_processor_id(pnode->processor, &proc_id); - if (proc_id == DSP_UNIT) { - status = - disp_node_change_priority(hnode_mgr->disp_obj, - hnode, - hnode_mgr->fxn_addrs - [RMSCHANGENODEPRIORITY], - hnode->node_env, prio); - } - if (status >= 0) - NODE_SET_PRIORITY(hnode, prio); - - } -func_cont: - /* Leave critical section */ - mutex_unlock(&hnode_mgr->node_mgr_lock); -func_end: - return status; -} - -/* - * ======== node_connect ======== - * Purpose: - * Connect two nodes on the DSP, or a node on the DSP to the GPP. - */ -int node_connect(struct node_object *node1, u32 stream1, - struct node_object *node2, - u32 stream2, struct dsp_strmattr *pattrs, - struct dsp_cbdata *conn_param) -{ - struct node_mgr *hnode_mgr; - char *pstr_dev_name = NULL; - enum node_type node1_type = NODE_TASK; - enum node_type node2_type = NODE_TASK; - enum dsp_strmmode strm_mode; - struct node_strmdef *pstrm_def; - struct node_strmdef *input = NULL; - struct node_strmdef *output = NULL; - struct node_object *dev_node_obj; - struct node_object *hnode; - struct stream_chnl *pstream; - u32 pipe_id; - u32 chnl_id; - s8 chnl_mode; - u32 dw_length; - int status = 0; - - if (!node1 || !node2) - return -EFAULT; - - /* The two nodes must be on the same processor */ - if (node1 != (struct node_object *)DSP_HGPPNODE && - node2 != (struct node_object *)DSP_HGPPNODE && - node1->node_mgr != node2->node_mgr) - return -EPERM; - - /* Cannot connect a node to itself */ - if (node1 == node2) - return -EPERM; - - /* node_get_type() will return NODE_GPP if hnode = DSP_HGPPNODE. */ - node1_type = node_get_type(node1); - node2_type = node_get_type(node2); - /* Check stream indices ranges */ - if ((node1_type != NODE_GPP && node1_type != NODE_DEVICE && - stream1 >= MAX_OUTPUTS(node1)) || - (node2_type != NODE_GPP && node2_type != NODE_DEVICE && - stream2 >= MAX_INPUTS(node2))) - return -EINVAL; - - /* - * Only the following types of connections are allowed: - * task/dais socket < == > task/dais socket - * task/dais socket < == > device - * task/dais socket < == > GPP - * - * ie, no message nodes, and at least one task or dais - * socket node. - */ - if (node1_type == NODE_MESSAGE || node2_type == NODE_MESSAGE || - (node1_type != NODE_TASK && - node1_type != NODE_DAISSOCKET && - node2_type != NODE_TASK && - node2_type != NODE_DAISSOCKET)) - return -EPERM; - /* - * Check stream mode. Default is STRMMODE_PROCCOPY. - */ - if (pattrs && pattrs->strm_mode != STRMMODE_PROCCOPY) - return -EPERM; /* illegal stream mode */ - - if (node1_type != NODE_GPP) - hnode_mgr = node1->node_mgr; - else - hnode_mgr = node2->node_mgr; - - /* Enter critical section */ - mutex_lock(&hnode_mgr->node_mgr_lock); - - /* Nodes must be in the allocated state */ - if (node1_type != NODE_GPP && - node_get_state(node1) != NODE_ALLOCATED) { - status = -EBADR; - goto out_unlock; - } - - if (node2_type != NODE_GPP && - node_get_state(node2) != NODE_ALLOCATED) { - status = -EBADR; - goto out_unlock; - } - - /* - * Check that stream indices for task and dais socket nodes - * are not already be used. (Device nodes checked later) - */ - if (node1_type == NODE_TASK || node1_type == NODE_DAISSOCKET) { - output = &(node1->create_args.asa. - task_arg_obj.strm_out_def[stream1]); - if (output->sz_device) { - status = -EISCONN; - goto out_unlock; - } - - } - if (node2_type == NODE_TASK || node2_type == NODE_DAISSOCKET) { - input = &(node2->create_args.asa. - task_arg_obj.strm_in_def[stream2]); - if (input->sz_device) { - status = -EISCONN; - goto out_unlock; - } - - } - /* Connecting two task nodes? */ - if ((node1_type == NODE_TASK || node1_type == NODE_DAISSOCKET) && - (node2_type == NODE_TASK || - node2_type == NODE_DAISSOCKET)) { - /* Find available pipe */ - pipe_id = find_first_zero_bit(hnode_mgr->pipe_map, MAXPIPES); - if (pipe_id == MAXPIPES) { - status = -ECONNREFUSED; - goto out_unlock; - } - set_bit(pipe_id, hnode_mgr->pipe_map); - node1->outputs[stream1].type = NODECONNECT; - node2->inputs[stream2].type = NODECONNECT; - node1->outputs[stream1].dev_id = pipe_id; - node2->inputs[stream2].dev_id = pipe_id; - output->sz_device = kzalloc(PIPENAMELEN + 1, GFP_KERNEL); - input->sz_device = kzalloc(PIPENAMELEN + 1, GFP_KERNEL); - if (!output->sz_device || !input->sz_device) { - /* Undo the connection */ - kfree(output->sz_device); - kfree(input->sz_device); - clear_bit(pipe_id, hnode_mgr->pipe_map); - status = -ENOMEM; - goto out_unlock; - } - /* Copy "/dbpipe" name to device names */ - sprintf(output->sz_device, "%s%d", PIPEPREFIX, pipe_id); - strcpy(input->sz_device, output->sz_device); - } - /* Connecting task node to host? */ - if (node1_type == NODE_GPP || node2_type == NODE_GPP) { - pstr_dev_name = kzalloc(HOSTNAMELEN + 1, GFP_KERNEL); - if (!pstr_dev_name) { - status = -ENOMEM; - goto out_unlock; - } - - chnl_mode = (node1_type == NODE_GPP) ? - CHNL_MODETODSP : CHNL_MODEFROMDSP; - - /* - * Reserve a channel id. We need to put the name "/host" - * in the node's create_args, but the host - * side channel will not be opened until DSPStream_Open is - * called for this node. - */ - strm_mode = pattrs ? pattrs->strm_mode : STRMMODE_PROCCOPY; - switch (strm_mode) { - case STRMMODE_RDMA: - chnl_id = find_first_zero_bit(hnode_mgr->dma_chnl_map, - CHNL_MAXCHANNELS); - if (chnl_id < CHNL_MAXCHANNELS) { - set_bit(chnl_id, hnode_mgr->dma_chnl_map); - /* dma chans are 2nd transport chnl set - * ids(e.g. 16-31) */ - chnl_id = chnl_id + hnode_mgr->num_chnls; - } - break; - case STRMMODE_ZEROCOPY: - chnl_id = find_first_zero_bit(hnode_mgr->zc_chnl_map, - CHNL_MAXCHANNELS); - if (chnl_id < CHNL_MAXCHANNELS) { - set_bit(chnl_id, hnode_mgr->zc_chnl_map); - /* zero-copy chans are 3nd transport set - * (e.g. 32-47) */ - chnl_id = chnl_id + - (2 * hnode_mgr->num_chnls); - } - break; - case STRMMODE_PROCCOPY: - chnl_id = find_first_zero_bit(hnode_mgr->chnl_map, - CHNL_MAXCHANNELS); - if (chnl_id < CHNL_MAXCHANNELS) - set_bit(chnl_id, hnode_mgr->chnl_map); - break; - default: - status = -EINVAL; - goto out_unlock; - } - if (chnl_id == CHNL_MAXCHANNELS) { - status = -ECONNREFUSED; - goto out_unlock; - } - - if (node1 == (struct node_object *)DSP_HGPPNODE) { - node2->inputs[stream2].type = HOSTCONNECT; - node2->inputs[stream2].dev_id = chnl_id; - input->sz_device = pstr_dev_name; - } else { - node1->outputs[stream1].type = HOSTCONNECT; - node1->outputs[stream1].dev_id = chnl_id; - output->sz_device = pstr_dev_name; - } - sprintf(pstr_dev_name, "%s%d", HOSTPREFIX, chnl_id); - } - /* Connecting task node to device node? */ - if ((node1_type == NODE_DEVICE) || (node2_type == NODE_DEVICE)) { - if (node2_type == NODE_DEVICE) { - /* node1 == > device */ - dev_node_obj = node2; - hnode = node1; - pstream = &(node1->outputs[stream1]); - pstrm_def = output; - } else { - /* device == > node2 */ - dev_node_obj = node1; - hnode = node2; - pstream = &(node2->inputs[stream2]); - pstrm_def = input; - } - /* Set up create args */ - pstream->type = DEVICECONNECT; - dw_length = strlen(dev_node_obj->str_dev_name); - if (conn_param) - pstrm_def->sz_device = kzalloc(dw_length + 1 + - conn_param->cb_data, - GFP_KERNEL); - else - pstrm_def->sz_device = kzalloc(dw_length + 1, - GFP_KERNEL); - if (!pstrm_def->sz_device) { - status = -ENOMEM; - goto out_unlock; - } - /* Copy device name */ - strncpy(pstrm_def->sz_device, - dev_node_obj->str_dev_name, dw_length); - if (conn_param) - strncat(pstrm_def->sz_device, - (char *)conn_param->node_data, - (u32) conn_param->cb_data); - dev_node_obj->device_owner = hnode; - } - /* Fill in create args */ - if (node1_type == NODE_TASK || node1_type == NODE_DAISSOCKET) { - node1->create_args.asa.task_arg_obj.num_outputs++; - fill_stream_def(node1, output, pattrs); - } - if (node2_type == NODE_TASK || node2_type == NODE_DAISSOCKET) { - node2->create_args.asa.task_arg_obj.num_inputs++; - fill_stream_def(node2, input, pattrs); - } - /* Update node1 and node2 stream_connect */ - if (node1_type != NODE_GPP && node1_type != NODE_DEVICE) { - node1->num_outputs++; - if (stream1 > node1->max_output_index) - node1->max_output_index = stream1; - - } - if (node2_type != NODE_GPP && node2_type != NODE_DEVICE) { - node2->num_inputs++; - if (stream2 > node2->max_input_index) - node2->max_input_index = stream2; - - } - fill_stream_connect(node1, node2, stream1, stream2); - /* end of sync_enter_cs */ - /* Exit critical section */ -out_unlock: - if (status && pstr_dev_name) - kfree(pstr_dev_name); - mutex_unlock(&hnode_mgr->node_mgr_lock); - dev_dbg(bridge, "%s: node1: %p stream1: %d node2: %p stream2: %d" - "pattrs: %p status: 0x%x\n", __func__, node1, - stream1, node2, stream2, pattrs, status); - return status; -} - -/* - * ======== node_create ======== - * Purpose: - * Create a node on the DSP by remotely calling the node's create function. - */ -int node_create(struct node_object *hnode) -{ - struct node_object *pnode = (struct node_object *)hnode; - struct node_mgr *hnode_mgr; - struct bridge_drv_interface *intf_fxns; - u32 ul_create_fxn; - enum node_type node_type; - int status = 0; - int status1 = 0; - struct dsp_cbdata cb_data; - u32 proc_id = 255; - struct dsp_processorstate proc_state; - struct proc_object *hprocessor; -#if defined(CONFIG_TIDSPBRIDGE_DVFS) && !defined(CONFIG_CPU_FREQ) - struct dspbridge_platform_data *pdata = - omap_dspbridge_dev->dev.platform_data; -#endif - - if (!pnode) { - status = -EFAULT; - goto func_end; - } - hprocessor = hnode->processor; - status = proc_get_state(hprocessor, &proc_state, - sizeof(struct dsp_processorstate)); - if (status) - goto func_end; - /* If processor is in error state then don't attempt to create - new node */ - if (proc_state.proc_state == PROC_ERROR) { - status = -EPERM; - goto func_end; - } - /* create struct dsp_cbdata struct for PWR calls */ - cb_data.cb_data = PWR_TIMEOUT; - node_type = node_get_type(hnode); - hnode_mgr = hnode->node_mgr; - intf_fxns = hnode_mgr->intf_fxns; - /* Get access to node dispatcher */ - mutex_lock(&hnode_mgr->node_mgr_lock); - - /* Check node state */ - if (node_get_state(hnode) != NODE_ALLOCATED) - status = -EBADR; - - if (!status) - status = proc_get_processor_id(pnode->processor, &proc_id); - - if (status) - goto func_cont2; - - if (proc_id != DSP_UNIT) - goto func_cont2; - - /* Make sure streams are properly connected */ - if ((hnode->num_inputs && hnode->max_input_index > - hnode->num_inputs - 1) || - (hnode->num_outputs && hnode->max_output_index > - hnode->num_outputs - 1)) - status = -ENOTCONN; - - if (!status) { - /* If node's create function is not loaded, load it */ - /* Boost the OPP level to max level that DSP can be requested */ -#if defined(CONFIG_TIDSPBRIDGE_DVFS) && !defined(CONFIG_CPU_FREQ) - if (pdata->cpu_set_freq) - (*pdata->cpu_set_freq) (pdata->mpu_speed[VDD1_OPP3]); -#endif - status = hnode_mgr->nldr_fxns.load(hnode->nldr_node_obj, - NLDR_CREATE); - /* Get address of node's create function */ - if (!status) { - hnode->loaded = true; - if (node_type != NODE_DEVICE) { - status = get_fxn_address(hnode, &ul_create_fxn, - CREATEPHASE); - } - } else { - pr_err("%s: failed to load create code: 0x%x\n", - __func__, status); - } - /* Request the lowest OPP level */ -#if defined(CONFIG_TIDSPBRIDGE_DVFS) && !defined(CONFIG_CPU_FREQ) - if (pdata->cpu_set_freq) - (*pdata->cpu_set_freq) (pdata->mpu_speed[VDD1_OPP1]); -#endif - /* Get address of iAlg functions, if socket node */ - if (!status) { - if (node_type == NODE_DAISSOCKET) { - status = hnode_mgr->nldr_fxns.get_fxn_addr - (hnode->nldr_node_obj, - hnode->dcd_props.obj_data.node_obj. - str_i_alg_name, - &hnode->create_args.asa. - task_arg_obj.dais_arg); - } - } - } - if (!status) { - if (node_type != NODE_DEVICE) { - status = disp_node_create(hnode_mgr->disp_obj, hnode, - hnode_mgr->fxn_addrs - [RMSCREATENODE], - ul_create_fxn, - &(hnode->create_args), - &(hnode->node_env)); - if (status >= 0) { - /* Set the message queue id to the node env - * pointer */ - intf_fxns = hnode_mgr->intf_fxns; - (*intf_fxns->msg_set_queue_id) (hnode-> - msg_queue_obj, - hnode->node_env); - } - } - } - /* Phase II/Overlays: Create, execute, delete phases possibly in - * different files/sections. */ - if (hnode->loaded && hnode->phase_split) { - /* If create code was dynamically loaded, we can now unload - * it. */ - status1 = hnode_mgr->nldr_fxns.unload(hnode->nldr_node_obj, - NLDR_CREATE); - hnode->loaded = false; - } - if (status1) - pr_err("%s: Failed to unload create code: 0x%x\n", - __func__, status1); -func_cont2: - /* Update node state and node manager state */ - if (status >= 0) { - NODE_SET_STATE(hnode, NODE_CREATED); - hnode_mgr->num_created++; - goto func_cont; - } - if (status != -EBADR) { - /* Put back in NODE_ALLOCATED state if error occurred */ - NODE_SET_STATE(hnode, NODE_ALLOCATED); - } -func_cont: - /* Free access to node dispatcher */ - mutex_unlock(&hnode_mgr->node_mgr_lock); -func_end: - if (status >= 0) { - proc_notify_clients(hnode->processor, DSP_NODESTATECHANGE); - ntfy_notify(hnode->ntfy_obj, DSP_NODESTATECHANGE); - } - - dev_dbg(bridge, "%s: hnode: %p status: 0x%x\n", __func__, - hnode, status); - return status; -} - -/* - * ======== node_create_mgr ======== - * Purpose: - * Create a NODE Manager object. - */ -int node_create_mgr(struct node_mgr **node_man, - struct dev_object *hdev_obj) -{ - u32 i; - struct node_mgr *node_mgr_obj = NULL; - struct disp_attr disp_attr_obj; - char *sz_zl_file = ""; - struct nldr_attrs nldr_attrs_obj; - int status = 0; - u8 dev_type; - - *node_man = NULL; - /* Allocate Node manager object */ - node_mgr_obj = kzalloc(sizeof(struct node_mgr), GFP_KERNEL); - if (!node_mgr_obj) - return -ENOMEM; - - node_mgr_obj->dev_obj = hdev_obj; - - node_mgr_obj->ntfy_obj = kmalloc(sizeof(struct ntfy_object), - GFP_KERNEL); - if (!node_mgr_obj->ntfy_obj) { - status = -ENOMEM; - goto out_err; - } - ntfy_init(node_mgr_obj->ntfy_obj); - - INIT_LIST_HEAD(&node_mgr_obj->node_list); - - dev_get_dev_type(hdev_obj, &dev_type); - - status = dcd_create_manager(sz_zl_file, &node_mgr_obj->dcd_mgr); - if (status) - goto out_err; - - status = get_proc_props(node_mgr_obj, hdev_obj); - if (status) - goto out_err; - - /* Create NODE Dispatcher */ - disp_attr_obj.chnl_offset = node_mgr_obj->chnl_offset; - disp_attr_obj.chnl_buf_size = node_mgr_obj->chnl_buf_size; - disp_attr_obj.proc_family = node_mgr_obj->proc_family; - disp_attr_obj.proc_type = node_mgr_obj->proc_type; - - status = disp_create(&node_mgr_obj->disp_obj, hdev_obj, &disp_attr_obj); - if (status) - goto out_err; - - /* Create a STRM Manager */ - status = strm_create(&node_mgr_obj->strm_mgr_obj, hdev_obj); - if (status) - goto out_err; - - dev_get_intf_fxns(hdev_obj, &node_mgr_obj->intf_fxns); - /* Get msg_ctrl queue manager */ - dev_get_msg_mgr(hdev_obj, &node_mgr_obj->msg_mgr_obj); - mutex_init(&node_mgr_obj->node_mgr_lock); - - /* Block out reserved channels */ - for (i = 0; i < node_mgr_obj->chnl_offset; i++) - set_bit(i, node_mgr_obj->chnl_map); - - /* Block out channels reserved for RMS */ - set_bit(node_mgr_obj->chnl_offset, node_mgr_obj->chnl_map); - set_bit(node_mgr_obj->chnl_offset + 1, node_mgr_obj->chnl_map); - - /* NO RM Server on the IVA */ - if (dev_type != IVA_UNIT) { - /* Get addresses of any RMS functions loaded */ - status = get_rms_fxns(node_mgr_obj); - if (status) - goto out_err; - } - - /* Get loader functions and create loader */ - node_mgr_obj->nldr_fxns = nldr_fxns; /* Dyn loader funcs */ - - nldr_attrs_obj.ovly = ovly; - nldr_attrs_obj.write = mem_write; - nldr_attrs_obj.dsp_word_size = node_mgr_obj->dsp_word_size; - nldr_attrs_obj.dsp_mau_size = node_mgr_obj->dsp_mau_size; - status = node_mgr_obj->nldr_fxns.create(&node_mgr_obj->nldr_obj, - hdev_obj, - &nldr_attrs_obj); - if (status) - goto out_err; - - *node_man = node_mgr_obj; - - return status; -out_err: - delete_node_mgr(node_mgr_obj); - return status; -} - -/* - * ======== node_delete ======== - * Purpose: - * Delete a node on the DSP by remotely calling the node's delete function. - * Loads the node's delete function if necessary. Free GPP side resources - * after node's delete function returns. - */ -int node_delete(struct node_res_object *noderes, - struct process_context *pr_ctxt) -{ - struct node_object *pnode = noderes->node; - struct node_mgr *hnode_mgr; - struct proc_object *hprocessor; - struct disp_object *disp_obj; - u32 ul_delete_fxn; - enum node_type node_type; - enum node_state state; - int status = 0; - int status1 = 0; - struct dsp_cbdata cb_data; - u32 proc_id; - struct bridge_drv_interface *intf_fxns; - - void *node_res = noderes; - - struct dsp_processorstate proc_state; - - if (!pnode) { - status = -EFAULT; - goto func_end; - } - /* create struct dsp_cbdata struct for PWR call */ - cb_data.cb_data = PWR_TIMEOUT; - hnode_mgr = pnode->node_mgr; - hprocessor = pnode->processor; - disp_obj = hnode_mgr->disp_obj; - node_type = node_get_type(pnode); - intf_fxns = hnode_mgr->intf_fxns; - /* Enter critical section */ - mutex_lock(&hnode_mgr->node_mgr_lock); - - state = node_get_state(pnode); - /* Execute delete phase code for non-device node in all cases - * except when the node was only allocated. Delete phase must be - * executed even if create phase was executed, but failed. - * If the node environment pointer is non-NULL, the delete phase - * code must be executed. */ - if (!(state == NODE_ALLOCATED && pnode->node_env == (u32) NULL) && - node_type != NODE_DEVICE) { - status = proc_get_processor_id(pnode->processor, &proc_id); - if (status) - goto func_cont1; - - if (proc_id == DSP_UNIT || proc_id == IVA_UNIT) { - /* If node has terminated, execute phase code will - * have already been unloaded in node_on_exit(). If the - * node is PAUSED, the execute phase is loaded, and it - * is now ok to unload it. If the node is running, we - * will unload the execute phase only after deleting - * the node. */ - if (state == NODE_PAUSED && pnode->loaded && - pnode->phase_split) { - /* Ok to unload execute code as long as node - * is not * running */ - status1 = - hnode_mgr->nldr_fxns. - unload(pnode->nldr_node_obj, - NLDR_EXECUTE); - pnode->loaded = false; - NODE_SET_STATE(pnode, NODE_DONE); - } - /* Load delete phase code if not loaded or if haven't - * * unloaded EXECUTE phase */ - if ((!(pnode->loaded) || (state == NODE_RUNNING)) && - pnode->phase_split) { - status = - hnode_mgr->nldr_fxns. - load(pnode->nldr_node_obj, NLDR_DELETE); - if (!status) - pnode->loaded = true; - else - pr_err("%s: fail - load delete code:" - " 0x%x\n", __func__, status); - } - } -func_cont1: - if (!status) { - /* Unblock a thread trying to terminate the node */ - (void)sync_set_event(pnode->sync_done); - if (proc_id == DSP_UNIT) { - /* ul_delete_fxn = address of node's delete - * function */ - status = get_fxn_address(pnode, &ul_delete_fxn, - DELETEPHASE); - } else if (proc_id == IVA_UNIT) - ul_delete_fxn = (u32) pnode->node_env; - if (!status) { - status = proc_get_state(hprocessor, - &proc_state, - sizeof(struct - dsp_processorstate)); - if (proc_state.proc_state != PROC_ERROR) { - status = - disp_node_delete(disp_obj, pnode, - hnode_mgr-> - fxn_addrs - [RMSDELETENODE], - ul_delete_fxn, - pnode->node_env); - } else - NODE_SET_STATE(pnode, NODE_DONE); - - /* Unload execute, if not unloaded, and delete - * function */ - if (state == NODE_RUNNING && - pnode->phase_split) { - status1 = - hnode_mgr->nldr_fxns. - unload(pnode->nldr_node_obj, - NLDR_EXECUTE); - } - if (status1) - pr_err("%s: fail - unload execute code:" - " 0x%x\n", __func__, status1); - - status1 = - hnode_mgr->nldr_fxns.unload(pnode-> - nldr_node_obj, - NLDR_DELETE); - pnode->loaded = false; - if (status1) - pr_err("%s: fail - unload delete code: " - "0x%x\n", __func__, status1); - } - } - } - /* Free host side resources even if a failure occurred */ - /* Remove node from hnode_mgr->node_list */ - list_del(&pnode->list_elem); - hnode_mgr->num_nodes--; - /* Decrement count of nodes created on DSP */ - if ((state != NODE_ALLOCATED) || ((state == NODE_ALLOCATED) && - (pnode->node_env != (u32) NULL))) - hnode_mgr->num_created--; - /* Free host-side resources allocated by node_create() - * delete_node() fails if SM buffers not freed by client! */ - drv_proc_node_update_status(node_res, false); - delete_node(pnode, pr_ctxt); - - /* - * Release all Node resources and its context - */ - idr_remove(pr_ctxt->node_id, ((struct node_res_object *)node_res)->id); - kfree(node_res); - - /* Exit critical section */ - mutex_unlock(&hnode_mgr->node_mgr_lock); - proc_notify_clients(hprocessor, DSP_NODESTATECHANGE); -func_end: - dev_dbg(bridge, "%s: pnode: %p status 0x%x\n", __func__, pnode, status); - return status; -} - -/* - * ======== node_delete_mgr ======== - * Purpose: - * Delete the NODE Manager. - */ -int node_delete_mgr(struct node_mgr *hnode_mgr) -{ - if (!hnode_mgr) - return -EFAULT; - - delete_node_mgr(hnode_mgr); - - return 0; -} - -/* - * ======== node_enum_nodes ======== - * Purpose: - * Enumerate currently allocated nodes. - */ -int node_enum_nodes(struct node_mgr *hnode_mgr, void **node_tab, - u32 node_tab_size, u32 *pu_num_nodes, - u32 *pu_allocated) -{ - struct node_object *hnode; - u32 i = 0; - int status = 0; - - if (!hnode_mgr) { - status = -EFAULT; - goto func_end; - } - /* Enter critical section */ - mutex_lock(&hnode_mgr->node_mgr_lock); - - if (hnode_mgr->num_nodes > node_tab_size) { - *pu_allocated = hnode_mgr->num_nodes; - *pu_num_nodes = 0; - status = -EINVAL; - } else { - list_for_each_entry(hnode, &hnode_mgr->node_list, list_elem) - node_tab[i++] = hnode; - *pu_allocated = *pu_num_nodes = hnode_mgr->num_nodes; - } - /* end of sync_enter_cs */ - /* Exit critical section */ - mutex_unlock(&hnode_mgr->node_mgr_lock); -func_end: - return status; -} - -/* - * ======== node_free_msg_buf ======== - * Purpose: - * Frees the message buffer. - */ -int node_free_msg_buf(struct node_object *hnode, u8 *pbuffer, - struct dsp_bufferattr *pattr) -{ - struct node_object *pnode = (struct node_object *)hnode; - int status = 0; - u32 proc_id; - - if (!hnode) { - status = -EFAULT; - goto func_end; - } - status = proc_get_processor_id(pnode->processor, &proc_id); - if (proc_id == DSP_UNIT) { - if (!status) { - if (pattr == NULL) { - /* set defaults */ - pattr = &node_dfltbufattrs; - } - /* Node supports single SM segment only */ - if (pattr->segment_id != 1) - status = -EBADR; - - /* pbuffer is clients Va. */ - status = cmm_xlator_free_buf(pnode->xlator, pbuffer); - } - } else { - } -func_end: - return status; -} - -/* - * ======== node_get_attr ======== - * Purpose: - * Copy the current attributes of the specified node into a dsp_nodeattr - * structure. - */ -int node_get_attr(struct node_object *hnode, - struct dsp_nodeattr *pattr, u32 attr_size) -{ - struct node_mgr *hnode_mgr; - - if (!hnode) - return -EFAULT; - - hnode_mgr = hnode->node_mgr; - /* Enter hnode_mgr critical section since we're accessing - * data that could be changed by node_change_priority() and - * node_connect(). */ - mutex_lock(&hnode_mgr->node_mgr_lock); - pattr->cb_struct = sizeof(struct dsp_nodeattr); - /* dsp_nodeattrin */ - pattr->in_node_attr_in.cb_struct = - sizeof(struct dsp_nodeattrin); - pattr->in_node_attr_in.prio = hnode->prio; - pattr->in_node_attr_in.timeout = hnode->timeout; - pattr->in_node_attr_in.heap_size = - hnode->create_args.asa.task_arg_obj.heap_size; - pattr->in_node_attr_in.pgpp_virt_addr = (void *) - hnode->create_args.asa.task_arg_obj.gpp_heap_addr; - pattr->node_attr_inputs = hnode->num_gpp_inputs; - pattr->node_attr_outputs = hnode->num_gpp_outputs; - /* dsp_nodeinfo */ - get_node_info(hnode, &(pattr->node_info)); - /* end of sync_enter_cs */ - /* Exit critical section */ - mutex_unlock(&hnode_mgr->node_mgr_lock); - - return 0; -} - -/* - * ======== node_get_channel_id ======== - * Purpose: - * Get the channel index reserved for a stream connection between the - * host and a node. - */ -int node_get_channel_id(struct node_object *hnode, u32 dir, u32 index, - u32 *chan_id) -{ - enum node_type node_type; - int status = -EINVAL; - - if (!hnode) { - status = -EFAULT; - return status; - } - node_type = node_get_type(hnode); - if (node_type != NODE_TASK && node_type != NODE_DAISSOCKET) { - status = -EPERM; - return status; - } - if (dir == DSP_TONODE) { - if (index < MAX_INPUTS(hnode)) { - if (hnode->inputs[index].type == HOSTCONNECT) { - *chan_id = hnode->inputs[index].dev_id; - status = 0; - } - } - } else { - if (index < MAX_OUTPUTS(hnode)) { - if (hnode->outputs[index].type == HOSTCONNECT) { - *chan_id = hnode->outputs[index].dev_id; - status = 0; - } - } - } - return status; -} - -/* - * ======== node_get_message ======== - * Purpose: - * Retrieve a message from a node on the DSP. - */ -int node_get_message(struct node_object *hnode, - struct dsp_msg *message, u32 utimeout) -{ - struct node_mgr *hnode_mgr; - enum node_type node_type; - struct bridge_drv_interface *intf_fxns; - int status = 0; - void *tmp_buf; - struct dsp_processorstate proc_state; - struct proc_object *hprocessor; - - if (!hnode) { - status = -EFAULT; - goto func_end; - } - hprocessor = hnode->processor; - status = proc_get_state(hprocessor, &proc_state, - sizeof(struct dsp_processorstate)); - if (status) - goto func_end; - /* If processor is in error state then don't attempt to get the - message */ - if (proc_state.proc_state == PROC_ERROR) { - status = -EPERM; - goto func_end; - } - hnode_mgr = hnode->node_mgr; - node_type = node_get_type(hnode); - if (node_type != NODE_MESSAGE && node_type != NODE_TASK && - node_type != NODE_DAISSOCKET) { - status = -EPERM; - goto func_end; - } - /* This function will block unless a message is available. Since - * DSPNode_RegisterNotify() allows notification when a message - * is available, the system can be designed so that - * DSPNode_GetMessage() is only called when a message is - * available. */ - intf_fxns = hnode_mgr->intf_fxns; - status = - (*intf_fxns->msg_get) (hnode->msg_queue_obj, message, utimeout); - /* Check if message contains SM descriptor */ - if (status || !(message->cmd & DSP_RMSBUFDESC)) - goto func_end; - - /* Translate DSP byte addr to GPP Va. */ - tmp_buf = cmm_xlator_translate(hnode->xlator, - (void *)(message->arg1 * - hnode->node_mgr-> - dsp_word_size), CMM_DSPPA2PA); - if (tmp_buf != NULL) { - /* now convert this GPP Pa to Va */ - tmp_buf = cmm_xlator_translate(hnode->xlator, tmp_buf, - CMM_PA2VA); - if (tmp_buf != NULL) { - /* Adjust SM size in msg */ - message->arg1 = (u32) tmp_buf; - message->arg2 *= hnode->node_mgr->dsp_word_size; - } else { - status = -ESRCH; - } - } else { - status = -ESRCH; - } -func_end: - dev_dbg(bridge, "%s: hnode: %p message: %p utimeout: 0x%x\n", __func__, - hnode, message, utimeout); - return status; -} - -/* - * ======== node_get_nldr_obj ======== - */ -int node_get_nldr_obj(struct node_mgr *hnode_mgr, - struct nldr_object **nldr_ovlyobj) -{ - int status = 0; - struct node_mgr *node_mgr_obj = hnode_mgr; - - if (!hnode_mgr) - status = -EFAULT; - else - *nldr_ovlyobj = node_mgr_obj->nldr_obj; - - return status; -} - -/* - * ======== node_get_strm_mgr ======== - * Purpose: - * Returns the Stream manager. - */ -int node_get_strm_mgr(struct node_object *hnode, - struct strm_mgr **strm_man) -{ - int status = 0; - - if (!hnode) - status = -EFAULT; - else - *strm_man = hnode->node_mgr->strm_mgr_obj; - - return status; -} - -/* - * ======== node_get_load_type ======== - */ -enum nldr_loadtype node_get_load_type(struct node_object *hnode) -{ - if (!hnode) { - dev_dbg(bridge, "%s: Failed. hnode: %p\n", __func__, hnode); - return -1; - } else { - return hnode->dcd_props.obj_data.node_obj.load_type; - } -} - -/* - * ======== node_get_timeout ======== - * Purpose: - * Returns the timeout value for this node. - */ -u32 node_get_timeout(struct node_object *hnode) -{ - if (!hnode) { - dev_dbg(bridge, "%s: failed. hnode: %p\n", __func__, hnode); - return 0; - } else { - return hnode->timeout; - } -} - -/* - * ======== node_get_type ======== - * Purpose: - * Returns the node type. - */ -enum node_type node_get_type(struct node_object *hnode) -{ - enum node_type node_type; - - if (hnode == (struct node_object *)DSP_HGPPNODE) - node_type = NODE_GPP; - else { - if (!hnode) - node_type = -1; - else - node_type = hnode->ntype; - } - return node_type; -} - -/* - * ======== node_on_exit ======== - * Purpose: - * Gets called when RMS_EXIT is received for a node. - */ -void node_on_exit(struct node_object *hnode, s32 node_status) -{ - if (!hnode) - return; - - /* Set node state to done */ - NODE_SET_STATE(hnode, NODE_DONE); - hnode->exit_status = node_status; - if (hnode->loaded && hnode->phase_split) { - (void)hnode->node_mgr->nldr_fxns.unload(hnode-> - nldr_node_obj, - NLDR_EXECUTE); - hnode->loaded = false; - } - /* Unblock call to node_terminate */ - (void)sync_set_event(hnode->sync_done); - /* Notify clients */ - proc_notify_clients(hnode->processor, DSP_NODESTATECHANGE); - ntfy_notify(hnode->ntfy_obj, DSP_NODESTATECHANGE); -} - -/* - * ======== node_pause ======== - * Purpose: - * Suspend execution of a node currently running on the DSP. - */ -int node_pause(struct node_object *hnode) -{ - struct node_object *pnode = (struct node_object *)hnode; - enum node_type node_type; - enum node_state state; - struct node_mgr *hnode_mgr; - int status = 0; - u32 proc_id; - struct dsp_processorstate proc_state; - struct proc_object *hprocessor; - - if (!hnode) { - status = -EFAULT; - } else { - node_type = node_get_type(hnode); - if (node_type != NODE_TASK && node_type != NODE_DAISSOCKET) - status = -EPERM; - } - if (status) - goto func_end; - - status = proc_get_processor_id(pnode->processor, &proc_id); - - if (proc_id == IVA_UNIT) - status = -ENOSYS; - - if (!status) { - hnode_mgr = hnode->node_mgr; - - /* Enter critical section */ - mutex_lock(&hnode_mgr->node_mgr_lock); - state = node_get_state(hnode); - /* Check node state */ - if (state != NODE_RUNNING) - status = -EBADR; - - if (status) - goto func_cont; - hprocessor = hnode->processor; - status = proc_get_state(hprocessor, &proc_state, - sizeof(struct dsp_processorstate)); - if (status) - goto func_cont; - /* If processor is in error state then don't attempt - to send the message */ - if (proc_state.proc_state == PROC_ERROR) { - status = -EPERM; - goto func_cont; - } - - status = disp_node_change_priority(hnode_mgr->disp_obj, hnode, - hnode_mgr->fxn_addrs[RMSCHANGENODEPRIORITY], - hnode->node_env, NODE_SUSPENDEDPRI); - - /* Update state */ - if (status >= 0) - NODE_SET_STATE(hnode, NODE_PAUSED); - -func_cont: - /* End of sync_enter_cs */ - /* Leave critical section */ - mutex_unlock(&hnode_mgr->node_mgr_lock); - if (status >= 0) { - proc_notify_clients(hnode->processor, - DSP_NODESTATECHANGE); - ntfy_notify(hnode->ntfy_obj, DSP_NODESTATECHANGE); - } - } -func_end: - dev_dbg(bridge, "%s: hnode: %p status 0x%x\n", __func__, hnode, status); - return status; -} - -/* - * ======== node_put_message ======== - * Purpose: - * Send a message to a message node, task node, or XDAIS socket node. This - * function will block until the message stream can accommodate the - * message, or a timeout occurs. - */ -int node_put_message(struct node_object *hnode, - const struct dsp_msg *pmsg, u32 utimeout) -{ - struct node_mgr *hnode_mgr = NULL; - enum node_type node_type; - struct bridge_drv_interface *intf_fxns; - enum node_state state; - int status = 0; - void *tmp_buf; - struct dsp_msg new_msg; - struct dsp_processorstate proc_state; - struct proc_object *hprocessor; - - if (!hnode) { - status = -EFAULT; - goto func_end; - } - hprocessor = hnode->processor; - status = proc_get_state(hprocessor, &proc_state, - sizeof(struct dsp_processorstate)); - if (status) - goto func_end; - /* If processor is in bad state then don't attempt sending the - message */ - if (proc_state.proc_state == PROC_ERROR) { - status = -EPERM; - goto func_end; - } - hnode_mgr = hnode->node_mgr; - node_type = node_get_type(hnode); - if (node_type != NODE_MESSAGE && node_type != NODE_TASK && - node_type != NODE_DAISSOCKET) - status = -EPERM; - - if (!status) { - /* Check node state. Can't send messages to a node after - * we've sent the RMS_EXIT command. There is still the - * possibility that node_terminate can be called after we've - * checked the state. Could add another SYNC object to - * prevent this (can't use node_mgr_lock, since we don't - * want to block other NODE functions). However, the node may - * still exit on its own, before this message is sent. */ - mutex_lock(&hnode_mgr->node_mgr_lock); - state = node_get_state(hnode); - if (state == NODE_TERMINATING || state == NODE_DONE) - status = -EBADR; - - /* end of sync_enter_cs */ - mutex_unlock(&hnode_mgr->node_mgr_lock); - } - if (status) - goto func_end; - - /* assign pmsg values to new msg */ - new_msg = *pmsg; - /* Now, check if message contains a SM buffer descriptor */ - if (pmsg->cmd & DSP_RMSBUFDESC) { - /* Translate GPP Va to DSP physical buf Ptr. */ - tmp_buf = cmm_xlator_translate(hnode->xlator, - (void *)new_msg.arg1, - CMM_VA2DSPPA); - if (tmp_buf != NULL) { - /* got translation, convert to MAUs in msg */ - if (hnode->node_mgr->dsp_word_size != 0) { - new_msg.arg1 = - (u32) tmp_buf / - hnode->node_mgr->dsp_word_size; - /* MAUs */ - new_msg.arg2 /= hnode->node_mgr-> - dsp_word_size; - } else { - pr_err("%s: dsp_word_size is zero!\n", - __func__); - status = -EPERM; /* bad DSPWordSize */ - } - } else { /* failed to translate buffer address */ - status = -ESRCH; - } - } - if (!status) { - intf_fxns = hnode_mgr->intf_fxns; - status = (*intf_fxns->msg_put) (hnode->msg_queue_obj, - &new_msg, utimeout); - } -func_end: - dev_dbg(bridge, "%s: hnode: %p pmsg: %p utimeout: 0x%x, " - "status 0x%x\n", __func__, hnode, pmsg, utimeout, status); - return status; -} - -/* - * ======== node_register_notify ======== - * Purpose: - * Register to be notified on specific events for this node. - */ -int node_register_notify(struct node_object *hnode, u32 event_mask, - u32 notify_type, - struct dsp_notification *hnotification) -{ - struct bridge_drv_interface *intf_fxns; - int status = 0; - - if (!hnode) { - status = -EFAULT; - } else { - /* Check if event mask is a valid node related event */ - if (event_mask & ~(DSP_NODESTATECHANGE | DSP_NODEMESSAGEREADY)) - status = -EINVAL; - - /* Check if notify type is valid */ - if (notify_type != DSP_SIGNALEVENT) - status = -EINVAL; - - /* Only one Notification can be registered at a - * time - Limitation */ - if (event_mask == (DSP_NODESTATECHANGE | DSP_NODEMESSAGEREADY)) - status = -EINVAL; - } - if (!status) { - if (event_mask == DSP_NODESTATECHANGE) { - status = ntfy_register(hnode->ntfy_obj, hnotification, - event_mask & DSP_NODESTATECHANGE, - notify_type); - } else { - /* Send Message part of event mask to msg_ctrl */ - intf_fxns = hnode->node_mgr->intf_fxns; - status = (*intf_fxns->msg_register_notify) - (hnode->msg_queue_obj, - event_mask & DSP_NODEMESSAGEREADY, notify_type, - hnotification); - } - - } - dev_dbg(bridge, "%s: hnode: %p event_mask: 0x%x notify_type: 0x%x " - "hnotification: %p status 0x%x\n", __func__, hnode, - event_mask, notify_type, hnotification, status); - return status; -} - -/* - * ======== node_run ======== - * Purpose: - * Start execution of a node's execute phase, or resume execution of a node - * that has been suspended (via NODE_NodePause()) on the DSP. Load the - * node's execute function if necessary. - */ -int node_run(struct node_object *hnode) -{ - struct node_object *pnode = (struct node_object *)hnode; - struct node_mgr *hnode_mgr; - enum node_type node_type; - enum node_state state; - u32 ul_execute_fxn; - u32 ul_fxn_addr; - int status = 0; - u32 proc_id; - struct bridge_drv_interface *intf_fxns; - struct dsp_processorstate proc_state; - struct proc_object *hprocessor; - - if (!hnode) { - status = -EFAULT; - goto func_end; - } - hprocessor = hnode->processor; - status = proc_get_state(hprocessor, &proc_state, - sizeof(struct dsp_processorstate)); - if (status) - goto func_end; - /* If processor is in error state then don't attempt to run the node */ - if (proc_state.proc_state == PROC_ERROR) { - status = -EPERM; - goto func_end; - } - node_type = node_get_type(hnode); - if (node_type == NODE_DEVICE) - status = -EPERM; - if (status) - goto func_end; - - hnode_mgr = hnode->node_mgr; - if (!hnode_mgr) { - status = -EFAULT; - goto func_end; - } - intf_fxns = hnode_mgr->intf_fxns; - /* Enter critical section */ - mutex_lock(&hnode_mgr->node_mgr_lock); - - state = node_get_state(hnode); - if (state != NODE_CREATED && state != NODE_PAUSED) - status = -EBADR; - - if (!status) - status = proc_get_processor_id(pnode->processor, &proc_id); - - if (status) - goto func_cont1; - - if ((proc_id != DSP_UNIT) && (proc_id != IVA_UNIT)) - goto func_cont1; - - if (state == NODE_CREATED) { - /* If node's execute function is not loaded, load it */ - if (!(hnode->loaded) && hnode->phase_split) { - status = - hnode_mgr->nldr_fxns.load(hnode->nldr_node_obj, - NLDR_EXECUTE); - if (!status) { - hnode->loaded = true; - } else { - pr_err("%s: fail - load execute code: 0x%x\n", - __func__, status); - } - } - if (!status) { - /* Get address of node's execute function */ - if (proc_id == IVA_UNIT) - ul_execute_fxn = (u32) hnode->node_env; - else { - status = get_fxn_address(hnode, &ul_execute_fxn, - EXECUTEPHASE); - } - } - if (!status) { - ul_fxn_addr = hnode_mgr->fxn_addrs[RMSEXECUTENODE]; - status = - disp_node_run(hnode_mgr->disp_obj, hnode, - ul_fxn_addr, ul_execute_fxn, - hnode->node_env); - } - } else if (state == NODE_PAUSED) { - ul_fxn_addr = hnode_mgr->fxn_addrs[RMSCHANGENODEPRIORITY]; - status = disp_node_change_priority(hnode_mgr->disp_obj, hnode, - ul_fxn_addr, hnode->node_env, - NODE_GET_PRIORITY(hnode)); - } else { - /* We should never get here */ - } -func_cont1: - /* Update node state. */ - if (status >= 0) - NODE_SET_STATE(hnode, NODE_RUNNING); - else /* Set state back to previous value */ - NODE_SET_STATE(hnode, state); - /*End of sync_enter_cs */ - /* Exit critical section */ - mutex_unlock(&hnode_mgr->node_mgr_lock); - if (status >= 0) { - proc_notify_clients(hnode->processor, DSP_NODESTATECHANGE); - ntfy_notify(hnode->ntfy_obj, DSP_NODESTATECHANGE); - } -func_end: - dev_dbg(bridge, "%s: hnode: %p status 0x%x\n", __func__, hnode, status); - return status; -} - -/* - * ======== node_terminate ======== - * Purpose: - * Signal a node running on the DSP that it should exit its execute phase - * function. - */ -int node_terminate(struct node_object *hnode, int *pstatus) -{ - struct node_object *pnode = (struct node_object *)hnode; - struct node_mgr *hnode_mgr = NULL; - enum node_type node_type; - struct bridge_drv_interface *intf_fxns; - enum node_state state; - struct dsp_msg msg, killmsg; - int status = 0; - u32 proc_id, kill_time_out; - struct deh_mgr *hdeh_mgr; - struct dsp_processorstate proc_state; - - if (!hnode || !hnode->node_mgr) { - status = -EFAULT; - goto func_end; - } - if (pnode->processor == NULL) { - status = -EFAULT; - goto func_end; - } - status = proc_get_processor_id(pnode->processor, &proc_id); - - if (!status) { - hnode_mgr = hnode->node_mgr; - node_type = node_get_type(hnode); - if (node_type != NODE_TASK && node_type != NODE_DAISSOCKET) - status = -EPERM; - } - if (!status) { - /* Check node state */ - mutex_lock(&hnode_mgr->node_mgr_lock); - state = node_get_state(hnode); - if (state != NODE_RUNNING) { - status = -EBADR; - /* Set the exit status if node terminated on - * its own. */ - if (state == NODE_DONE) - *pstatus = hnode->exit_status; - - } else { - NODE_SET_STATE(hnode, NODE_TERMINATING); - } - /* end of sync_enter_cs */ - mutex_unlock(&hnode_mgr->node_mgr_lock); - } - if (!status) { - /* - * Send exit message. Do not change state to NODE_DONE - * here. That will be done in callback. - */ - status = proc_get_state(pnode->processor, &proc_state, - sizeof(struct dsp_processorstate)); - if (status) - goto func_cont; - /* If processor is in error state then don't attempt to send - * A kill task command */ - if (proc_state.proc_state == PROC_ERROR) { - status = -EPERM; - goto func_cont; - } - - msg.cmd = RMS_EXIT; - msg.arg1 = hnode->node_env; - killmsg.cmd = RMS_KILLTASK; - killmsg.arg1 = hnode->node_env; - intf_fxns = hnode_mgr->intf_fxns; - - if (hnode->timeout > MAXTIMEOUT) - kill_time_out = MAXTIMEOUT; - else - kill_time_out = (hnode->timeout) * 2; - - status = (*intf_fxns->msg_put) (hnode->msg_queue_obj, &msg, - hnode->timeout); - if (status) - goto func_cont; - - /* - * Wait on synchronization object that will be - * posted in the callback on receiving RMS_EXIT - * message, or by node_delete. Check for valid hnode, - * in case posted by node_delete(). - */ - status = sync_wait_on_event(hnode->sync_done, - kill_time_out / 2); - if (status != ETIME) - goto func_cont; - - status = (*intf_fxns->msg_put)(hnode->msg_queue_obj, - &killmsg, hnode->timeout); - if (status) - goto func_cont; - status = sync_wait_on_event(hnode->sync_done, - kill_time_out / 2); - if (status) { - /* - * Here it goes the part of the simulation of - * the DSP exception. - */ - dev_get_deh_mgr(hnode_mgr->dev_obj, &hdeh_mgr); - if (!hdeh_mgr) - goto func_cont; - - bridge_deh_notify(hdeh_mgr, DSP_SYSERROR, - DSP_EXCEPTIONABORT); - } - } -func_cont: - if (!status) { - /* Enter CS before getting exit status, in case node was - * deleted. */ - mutex_lock(&hnode_mgr->node_mgr_lock); - /* Make sure node wasn't deleted while we blocked */ - if (!hnode) { - status = -EPERM; - } else { - *pstatus = hnode->exit_status; - dev_dbg(bridge, "%s: hnode: %p env 0x%x status 0x%x\n", - __func__, hnode, hnode->node_env, status); - } - mutex_unlock(&hnode_mgr->node_mgr_lock); - } /*End of sync_enter_cs */ -func_end: - return status; -} - -/* - * ======== delete_node ======== - * Purpose: - * Free GPP resources allocated in node_allocate() or node_connect(). - */ -static void delete_node(struct node_object *hnode, - struct process_context *pr_ctxt) -{ - struct node_mgr *hnode_mgr; - struct bridge_drv_interface *intf_fxns; - u32 i; - enum node_type node_type; - struct stream_chnl stream; - struct node_msgargs node_msg_args; - struct node_taskargs task_arg_obj; -#ifdef DSP_DMM_DEBUG - struct dmm_object *dmm_mgr; - struct proc_object *p_proc_object = - (struct proc_object *)hnode->processor; -#endif - int status; - - if (!hnode) - goto func_end; - hnode_mgr = hnode->node_mgr; - if (!hnode_mgr) - goto func_end; - - node_type = node_get_type(hnode); - if (node_type != NODE_DEVICE) { - node_msg_args = hnode->create_args.asa.node_msg_args; - kfree(node_msg_args.pdata); - - /* Free msg_ctrl queue */ - if (hnode->msg_queue_obj) { - intf_fxns = hnode_mgr->intf_fxns; - (*intf_fxns->msg_delete_queue) (hnode-> - msg_queue_obj); - hnode->msg_queue_obj = NULL; - } - - kfree(hnode->sync_done); - - /* Free all stream info */ - if (hnode->inputs) { - for (i = 0; i < MAX_INPUTS(hnode); i++) { - stream = hnode->inputs[i]; - free_stream(hnode_mgr, stream); - } - kfree(hnode->inputs); - hnode->inputs = NULL; - } - if (hnode->outputs) { - for (i = 0; i < MAX_OUTPUTS(hnode); i++) { - stream = hnode->outputs[i]; - free_stream(hnode_mgr, stream); - } - kfree(hnode->outputs); - hnode->outputs = NULL; - } - task_arg_obj = hnode->create_args.asa.task_arg_obj; - if (task_arg_obj.strm_in_def) { - for (i = 0; i < MAX_INPUTS(hnode); i++) { - kfree(task_arg_obj.strm_in_def[i].sz_device); - task_arg_obj.strm_in_def[i].sz_device = NULL; - } - kfree(task_arg_obj.strm_in_def); - task_arg_obj.strm_in_def = NULL; - } - if (task_arg_obj.strm_out_def) { - for (i = 0; i < MAX_OUTPUTS(hnode); i++) { - kfree(task_arg_obj.strm_out_def[i].sz_device); - task_arg_obj.strm_out_def[i].sz_device = NULL; - } - kfree(task_arg_obj.strm_out_def); - task_arg_obj.strm_out_def = NULL; - } - if (task_arg_obj.dsp_heap_res_addr) { - status = proc_un_map(hnode->processor, (void *) - task_arg_obj.dsp_heap_addr, - pr_ctxt); - - status = proc_un_reserve_memory(hnode->processor, - (void *) - task_arg_obj. - dsp_heap_res_addr, - pr_ctxt); -#ifdef DSP_DMM_DEBUG - status = dmm_get_handle(p_proc_object, &dmm_mgr); - if (dmm_mgr) - dmm_mem_map_dump(dmm_mgr); - else - status = DSP_EHANDLE; -#endif - } - } - if (node_type != NODE_MESSAGE) { - kfree(hnode->stream_connect); - hnode->stream_connect = NULL; - } - kfree(hnode->str_dev_name); - hnode->str_dev_name = NULL; - - if (hnode->ntfy_obj) { - ntfy_delete(hnode->ntfy_obj); - kfree(hnode->ntfy_obj); - hnode->ntfy_obj = NULL; - } - - /* These were allocated in dcd_get_object_def (via node_allocate) */ - kfree(hnode->dcd_props.obj_data.node_obj.str_create_phase_fxn); - hnode->dcd_props.obj_data.node_obj.str_create_phase_fxn = NULL; - - kfree(hnode->dcd_props.obj_data.node_obj.str_execute_phase_fxn); - hnode->dcd_props.obj_data.node_obj.str_execute_phase_fxn = NULL; - - kfree(hnode->dcd_props.obj_data.node_obj.str_delete_phase_fxn); - hnode->dcd_props.obj_data.node_obj.str_delete_phase_fxn = NULL; - - kfree(hnode->dcd_props.obj_data.node_obj.str_i_alg_name); - hnode->dcd_props.obj_data.node_obj.str_i_alg_name = NULL; - - /* Free all SM address translator resources */ - kfree(hnode->xlator); - kfree(hnode->nldr_node_obj); - hnode->nldr_node_obj = NULL; - hnode->node_mgr = NULL; - kfree(hnode); - hnode = NULL; -func_end: - return; -} - -/* - * ======== delete_node_mgr ======== - * Purpose: - * Frees the node manager. - */ -static void delete_node_mgr(struct node_mgr *hnode_mgr) -{ - struct node_object *hnode, *tmp; - - if (hnode_mgr) { - /* Free resources */ - if (hnode_mgr->dcd_mgr) - dcd_destroy_manager(hnode_mgr->dcd_mgr); - - /* Remove any elements remaining in lists */ - list_for_each_entry_safe(hnode, tmp, &hnode_mgr->node_list, - list_elem) { - list_del(&hnode->list_elem); - delete_node(hnode, NULL); - } - mutex_destroy(&hnode_mgr->node_mgr_lock); - if (hnode_mgr->ntfy_obj) { - ntfy_delete(hnode_mgr->ntfy_obj); - kfree(hnode_mgr->ntfy_obj); - } - - if (hnode_mgr->disp_obj) - disp_delete(hnode_mgr->disp_obj); - - if (hnode_mgr->strm_mgr_obj) - strm_delete(hnode_mgr->strm_mgr_obj); - - /* Delete the loader */ - if (hnode_mgr->nldr_obj) - hnode_mgr->nldr_fxns.delete(hnode_mgr->nldr_obj); - - kfree(hnode_mgr); - } -} - -/* - * ======== fill_stream_connect ======== - * Purpose: - * Fills stream information. - */ -static void fill_stream_connect(struct node_object *node1, - struct node_object *node2, - u32 stream1, u32 stream2) -{ - u32 strm_index; - struct dsp_streamconnect *strm1 = NULL; - struct dsp_streamconnect *strm2 = NULL; - enum node_type node1_type = NODE_TASK; - enum node_type node2_type = NODE_TASK; - - node1_type = node_get_type(node1); - node2_type = node_get_type(node2); - if (node1 != (struct node_object *)DSP_HGPPNODE) { - - if (node1_type != NODE_DEVICE) { - strm_index = node1->num_inputs + - node1->num_outputs - 1; - strm1 = &(node1->stream_connect[strm_index]); - strm1->cb_struct = sizeof(struct dsp_streamconnect); - strm1->this_node_stream_index = stream1; - } - - if (node2 != (struct node_object *)DSP_HGPPNODE) { - /* NODE == > NODE */ - if (node1_type != NODE_DEVICE) { - strm1->connected_node = node2; - strm1->ui_connected_node_id = node2->node_uuid; - strm1->connected_node_stream_index = stream2; - strm1->connect_type = CONNECTTYPE_NODEOUTPUT; - } - if (node2_type != NODE_DEVICE) { - strm_index = node2->num_inputs + - node2->num_outputs - 1; - strm2 = &(node2->stream_connect[strm_index]); - strm2->cb_struct = - sizeof(struct dsp_streamconnect); - strm2->this_node_stream_index = stream2; - strm2->connected_node = node1; - strm2->ui_connected_node_id = node1->node_uuid; - strm2->connected_node_stream_index = stream1; - strm2->connect_type = CONNECTTYPE_NODEINPUT; - } - } else if (node1_type != NODE_DEVICE) - strm1->connect_type = CONNECTTYPE_GPPOUTPUT; - } else { - /* GPP == > NODE */ - strm_index = node2->num_inputs + node2->num_outputs - 1; - strm2 = &(node2->stream_connect[strm_index]); - strm2->cb_struct = sizeof(struct dsp_streamconnect); - strm2->this_node_stream_index = stream2; - strm2->connect_type = CONNECTTYPE_GPPINPUT; - } -} - -/* - * ======== fill_stream_def ======== - * Purpose: - * Fills Stream attributes. - */ -static void fill_stream_def(struct node_object *hnode, - struct node_strmdef *pstrm_def, - struct dsp_strmattr *pattrs) -{ - struct node_mgr *hnode_mgr = hnode->node_mgr; - - if (pattrs != NULL) { - pstrm_def->num_bufs = pattrs->num_bufs; - pstrm_def->buf_size = - pattrs->buf_size / hnode_mgr->dsp_data_mau_size; - pstrm_def->seg_id = pattrs->seg_id; - pstrm_def->buf_alignment = pattrs->buf_alignment; - pstrm_def->timeout = pattrs->timeout; - } else { - pstrm_def->num_bufs = DEFAULTNBUFS; - pstrm_def->buf_size = - DEFAULTBUFSIZE / hnode_mgr->dsp_data_mau_size; - pstrm_def->seg_id = DEFAULTSEGID; - pstrm_def->buf_alignment = DEFAULTALIGNMENT; - pstrm_def->timeout = DEFAULTTIMEOUT; - } -} - -/* - * ======== free_stream ======== - * Purpose: - * Updates the channel mask and frees the pipe id. - */ -static void free_stream(struct node_mgr *hnode_mgr, struct stream_chnl stream) -{ - /* Free up the pipe id unless other node has not yet been deleted. */ - if (stream.type == NODECONNECT) { - if (test_bit(stream.dev_id, hnode_mgr->pipe_done_map)) { - /* The other node has already been deleted */ - clear_bit(stream.dev_id, hnode_mgr->pipe_done_map); - clear_bit(stream.dev_id, hnode_mgr->pipe_map); - } else { - /* The other node has not been deleted yet */ - set_bit(stream.dev_id, hnode_mgr->pipe_done_map); - } - } else if (stream.type == HOSTCONNECT) { - if (stream.dev_id < hnode_mgr->num_chnls) { - clear_bit(stream.dev_id, hnode_mgr->chnl_map); - } else if (stream.dev_id < (2 * hnode_mgr->num_chnls)) { - /* dsp-dma */ - clear_bit(stream.dev_id - (1 * hnode_mgr->num_chnls), - hnode_mgr->dma_chnl_map); - } else if (stream.dev_id < (3 * hnode_mgr->num_chnls)) { - /* zero-copy */ - clear_bit(stream.dev_id - (2 * hnode_mgr->num_chnls), - hnode_mgr->zc_chnl_map); - } - } -} - -/* - * ======== get_fxn_address ======== - * Purpose: - * Retrieves the address for create, execute or delete phase for a node. - */ -static int get_fxn_address(struct node_object *hnode, u32 *fxn_addr, - u32 phase) -{ - char *pstr_fxn_name = NULL; - struct node_mgr *hnode_mgr = hnode->node_mgr; - int status = 0; - - switch (phase) { - case CREATEPHASE: - pstr_fxn_name = - hnode->dcd_props.obj_data.node_obj.str_create_phase_fxn; - break; - case EXECUTEPHASE: - pstr_fxn_name = - hnode->dcd_props.obj_data.node_obj.str_execute_phase_fxn; - break; - case DELETEPHASE: - pstr_fxn_name = - hnode->dcd_props.obj_data.node_obj.str_delete_phase_fxn; - break; - default: - /* Should never get here */ - break; - } - - status = - hnode_mgr->nldr_fxns.get_fxn_addr(hnode->nldr_node_obj, - pstr_fxn_name, fxn_addr); - - return status; -} - -/* - * ======== get_node_info ======== - * Purpose: - * Retrieves the node information. - */ -void get_node_info(struct node_object *hnode, struct dsp_nodeinfo *node_info) -{ - u32 i; - - node_info->cb_struct = sizeof(struct dsp_nodeinfo); - node_info->nb_node_database_props = - hnode->dcd_props.obj_data.node_obj.ndb_props; - node_info->execution_priority = hnode->prio; - node_info->device_owner = hnode->device_owner; - node_info->number_streams = hnode->num_inputs + hnode->num_outputs; - node_info->node_env = hnode->node_env; - - node_info->ns_execution_state = node_get_state(hnode); - - /* Copy stream connect data */ - for (i = 0; i < hnode->num_inputs + hnode->num_outputs; i++) - node_info->sc_stream_connection[i] = hnode->stream_connect[i]; - -} - -/* - * ======== get_node_props ======== - * Purpose: - * Retrieve node properties. - */ -static int get_node_props(struct dcd_manager *hdcd_mgr, - struct node_object *hnode, - const struct dsp_uuid *node_uuid, - struct dcd_genericobj *dcd_prop) -{ - u32 len; - struct node_msgargs *pmsg_args; - struct node_taskargs *task_arg_obj; - enum node_type node_type = NODE_TASK; - struct dsp_ndbprops *pndb_props = - &(dcd_prop->obj_data.node_obj.ndb_props); - int status = 0; - char sz_uuid[MAXUUIDLEN]; - - status = dcd_get_object_def(hdcd_mgr, (struct dsp_uuid *)node_uuid, - DSP_DCDNODETYPE, dcd_prop); - - if (!status) { - hnode->ntype = node_type = pndb_props->ntype; - - /* Create UUID value to set in registry. */ - snprintf(sz_uuid, MAXUUIDLEN, "%pUL", node_uuid); - dev_dbg(bridge, "(node) UUID: %s\n", sz_uuid); - - /* Fill in message args that come from NDB */ - if (node_type != NODE_DEVICE) { - pmsg_args = &(hnode->create_args.asa.node_msg_args); - pmsg_args->seg_id = - dcd_prop->obj_data.node_obj.msg_segid; - pmsg_args->notify_type = - dcd_prop->obj_data.node_obj.msg_notify_type; - pmsg_args->max_msgs = pndb_props->message_depth; - dev_dbg(bridge, "(node) Max Number of Messages: 0x%x\n", - pmsg_args->max_msgs); - } else { - /* Copy device name */ - len = strlen(pndb_props->ac_name); - hnode->str_dev_name = kzalloc(len + 1, GFP_KERNEL); - if (hnode->str_dev_name == NULL) { - status = -ENOMEM; - } else { - strncpy(hnode->str_dev_name, - pndb_props->ac_name, len); - } - } - } - if (!status) { - /* Fill in create args that come from NDB */ - if (node_type == NODE_TASK || node_type == NODE_DAISSOCKET) { - task_arg_obj = &(hnode->create_args.asa.task_arg_obj); - task_arg_obj->prio = pndb_props->prio; - task_arg_obj->stack_size = pndb_props->stack_size; - task_arg_obj->sys_stack_size = - pndb_props->sys_stack_size; - task_arg_obj->stack_seg = pndb_props->stack_seg; - dev_dbg(bridge, "(node) Priority: 0x%x Stack Size: " - "0x%x words System Stack Size: 0x%x words " - "Stack Segment: 0x%x profile count : 0x%x\n", - task_arg_obj->prio, task_arg_obj->stack_size, - task_arg_obj->sys_stack_size, - task_arg_obj->stack_seg, - pndb_props->count_profiles); - } - } - - return status; -} - -/* - * ======== get_proc_props ======== - * Purpose: - * Retrieve the processor properties. - */ -static int get_proc_props(struct node_mgr *hnode_mgr, - struct dev_object *hdev_obj) -{ - struct cfg_hostres *host_res; - struct bridge_dev_context *pbridge_context; - int status = 0; - - status = dev_get_bridge_context(hdev_obj, &pbridge_context); - if (!pbridge_context) - status = -EFAULT; - - if (!status) { - host_res = pbridge_context->resources; - if (!host_res) - return -EPERM; - hnode_mgr->chnl_offset = host_res->chnl_offset; - hnode_mgr->chnl_buf_size = host_res->chnl_buf_size; - hnode_mgr->num_chnls = host_res->num_chnls; - - /* - * PROC will add an API to get dsp_processorinfo. - * Fill in default values for now. - */ - /* TODO -- Instead of hard coding, take from registry */ - hnode_mgr->proc_family = 6000; - hnode_mgr->proc_type = 6410; - hnode_mgr->min_pri = DSP_NODE_MIN_PRIORITY; - hnode_mgr->max_pri = DSP_NODE_MAX_PRIORITY; - hnode_mgr->dsp_word_size = DSPWORDSIZE; - hnode_mgr->dsp_data_mau_size = DSPWORDSIZE; - hnode_mgr->dsp_mau_size = 1; - - } - return status; -} - -/* - * ======== node_get_uuid_props ======== - * Purpose: - * Fetch Node UUID properties from DCD/DOF file. - */ -int node_get_uuid_props(void *hprocessor, - const struct dsp_uuid *node_uuid, - struct dsp_ndbprops *node_props) -{ - struct node_mgr *hnode_mgr = NULL; - struct dev_object *hdev_obj; - int status = 0; - struct dcd_nodeprops dcd_node_props; - struct dsp_processorstate proc_state; - - if (hprocessor == NULL || node_uuid == NULL) { - status = -EFAULT; - goto func_end; - } - status = proc_get_state(hprocessor, &proc_state, - sizeof(struct dsp_processorstate)); - if (status) - goto func_end; - /* If processor is in error state then don't attempt - to send the message */ - if (proc_state.proc_state == PROC_ERROR) { - status = -EPERM; - goto func_end; - } - - status = proc_get_dev_object(hprocessor, &hdev_obj); - if (hdev_obj) { - status = dev_get_node_manager(hdev_obj, &hnode_mgr); - if (hnode_mgr == NULL) { - status = -EFAULT; - goto func_end; - } - } - - /* - * Enter the critical section. This is needed because - * dcd_get_object_def will ultimately end up calling dbll_open/close, - * which needs to be protected in order to not corrupt the zlib manager - * (COD). - */ - mutex_lock(&hnode_mgr->node_mgr_lock); - - dcd_node_props.str_create_phase_fxn = NULL; - dcd_node_props.str_execute_phase_fxn = NULL; - dcd_node_props.str_delete_phase_fxn = NULL; - dcd_node_props.str_i_alg_name = NULL; - - status = dcd_get_object_def(hnode_mgr->dcd_mgr, - (struct dsp_uuid *)node_uuid, DSP_DCDNODETYPE, - (struct dcd_genericobj *)&dcd_node_props); - - if (!status) { - *node_props = dcd_node_props.ndb_props; - kfree(dcd_node_props.str_create_phase_fxn); - - kfree(dcd_node_props.str_execute_phase_fxn); - - kfree(dcd_node_props.str_delete_phase_fxn); - - kfree(dcd_node_props.str_i_alg_name); - } - /* Leave the critical section, we're done. */ - mutex_unlock(&hnode_mgr->node_mgr_lock); -func_end: - return status; -} - -/* - * ======== get_rms_fxns ======== - * Purpose: - * Retrieve the RMS functions. - */ -static int get_rms_fxns(struct node_mgr *hnode_mgr) -{ - s32 i; - struct dev_object *dev_obj = hnode_mgr->dev_obj; - int status = 0; - - static char *psz_fxns[NUMRMSFXNS] = { - "RMS_queryServer", /* RMSQUERYSERVER */ - "RMS_configureServer", /* RMSCONFIGURESERVER */ - "RMS_createNode", /* RMSCREATENODE */ - "RMS_executeNode", /* RMSEXECUTENODE */ - "RMS_deleteNode", /* RMSDELETENODE */ - "RMS_changeNodePriority", /* RMSCHANGENODEPRIORITY */ - "RMS_readMemory", /* RMSREADMEMORY */ - "RMS_writeMemory", /* RMSWRITEMEMORY */ - "RMS_copy", /* RMSCOPY */ - }; - - for (i = 0; i < NUMRMSFXNS; i++) { - status = dev_get_symbol(dev_obj, psz_fxns[i], - &(hnode_mgr->fxn_addrs[i])); - if (status) { - if (status == -ESPIPE) { - /* - * May be loaded dynamically (in the future), - * but return an error for now. - */ - dev_dbg(bridge, "%s: RMS function: %s currently" - " not loaded\n", __func__, psz_fxns[i]); - } else { - dev_dbg(bridge, "%s: Symbol not found: %s " - "status = 0x%x\n", __func__, - psz_fxns[i], status); - break; - } - } - } - - return status; -} - -/* - * ======== ovly ======== - * Purpose: - * Called during overlay.Sends command to RMS to copy a block of data. - */ -static u32 ovly(void *priv_ref, u32 dsp_run_addr, u32 dsp_load_addr, - u32 ul_num_bytes, u32 mem_space) -{ - struct node_object *hnode = (struct node_object *)priv_ref; - struct node_mgr *hnode_mgr; - u32 ul_bytes = 0; - u32 ul_size; - u32 ul_timeout; - int status = 0; - struct bridge_dev_context *hbridge_context; - /* Function interface to Bridge driver*/ - struct bridge_drv_interface *intf_fxns; - - hnode_mgr = hnode->node_mgr; - - ul_size = ul_num_bytes / hnode_mgr->dsp_word_size; - ul_timeout = hnode->timeout; - - /* Call new MemCopy function */ - intf_fxns = hnode_mgr->intf_fxns; - status = dev_get_bridge_context(hnode_mgr->dev_obj, &hbridge_context); - if (!status) { - status = - (*intf_fxns->brd_mem_copy) (hbridge_context, - dsp_run_addr, dsp_load_addr, - ul_num_bytes, (u32) mem_space); - if (!status) - ul_bytes = ul_num_bytes; - else - pr_debug("%s: failed to copy brd memory, status 0x%x\n", - __func__, status); - } else { - pr_debug("%s: failed to get Bridge context, status 0x%x\n", - __func__, status); - } - - return ul_bytes; -} - -/* - * ======== mem_write ======== - */ -static u32 mem_write(void *priv_ref, u32 dsp_add, void *pbuf, - u32 ul_num_bytes, u32 mem_space) -{ - struct node_object *hnode = (struct node_object *)priv_ref; - struct node_mgr *hnode_mgr; - u16 mem_sect_type; - u32 ul_timeout; - int status = 0; - struct bridge_dev_context *hbridge_context; - /* Function interface to Bridge driver */ - struct bridge_drv_interface *intf_fxns; - - hnode_mgr = hnode->node_mgr; - - ul_timeout = hnode->timeout; - mem_sect_type = (mem_space & DBLL_CODE) ? RMS_CODE : RMS_DATA; - - /* Call new MemWrite function */ - intf_fxns = hnode_mgr->intf_fxns; - status = dev_get_bridge_context(hnode_mgr->dev_obj, &hbridge_context); - status = (*intf_fxns->brd_mem_write) (hbridge_context, pbuf, - dsp_add, ul_num_bytes, mem_sect_type); - - return ul_num_bytes; -} - -#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE -/* - * ======== node_find_addr ======== - */ -int node_find_addr(struct node_mgr *node_mgr, u32 sym_addr, - u32 offset_range, void *sym_addr_output, char *sym_name) -{ - struct node_object *node_obj; - int status = -ENOENT; - - list_for_each_entry(node_obj, &node_mgr->node_list, list_elem) { - status = nldr_find_addr(node_obj->nldr_node_obj, sym_addr, - offset_range, sym_addr_output, sym_name); - if (!status) { - pr_debug("%s(0x%x, 0x%x, 0x%x, 0x%x, %s)\n", __func__, - (unsigned int) node_mgr, - sym_addr, offset_range, - (unsigned int) sym_addr_output, sym_name); - break; - } - } - - return status; -} -#endif diff --git a/drivers/staging/tidspbridge/rmgr/proc.c b/drivers/staging/tidspbridge/rmgr/proc.c deleted file mode 100644 index 23e5146989b1..000000000000 --- a/drivers/staging/tidspbridge/rmgr/proc.c +++ /dev/null @@ -1,1836 +0,0 @@ -/* - * proc.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Processor interface at the driver level. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include -/* ------------------------------------ Host OS */ -#include -#include -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- OS Adaptation Layer */ -#include -#include -/* ----------------------------------- Bridge Driver */ -#include -#include -/* ----------------------------------- Platform Manager */ -#include -#include -#include -#include - -/* ----------------------------------- Resource Manager */ -#include -#include -#include -#include - -/* ----------------------------------- Others */ -#include -#include -#include -#include - -/* ----------------------------------- This */ -#include -#include - -#include -/* ----------------------------------- Defines, Data Structures, Typedefs */ -#define MAXCMDLINELEN 255 -#define PROC_ENVPROCID "PROC_ID=%d" -#define MAXPROCIDLEN (8 + 5) -#define PROC_DFLT_TIMEOUT 10000 /* Time out in milliseconds */ -#define PWR_TIMEOUT 500 /* Sleep/wake timout in msec */ -#define EXTEND "_EXT_END" /* Extmem end addr in DSP binary */ - -#define DSP_CACHE_LINE 128 - -#define BUFMODE_MASK (3 << 14) - -/* Buffer modes from DSP perspective */ -#define RBUF 0x4000 /* Input buffer */ -#define WBUF 0x8000 /* Output Buffer */ - -extern struct device *bridge; - -/* ----------------------------------- Globals */ - -/* The proc_object structure. */ -struct proc_object { - struct list_head link; /* Link to next proc_object */ - struct dev_object *dev_obj; /* Device this PROC represents */ - u32 process; /* Process owning this Processor */ - struct mgr_object *mgr_obj; /* Manager Object Handle */ - u32 attach_count; /* Processor attach count */ - u32 processor_id; /* Processor number */ - u32 timeout; /* Time out count */ - enum dsp_procstate proc_state; /* Processor state */ - u32 unit; /* DDSP unit number */ - bool is_already_attached; /* - * True if the Device below has - * GPP Client attached - */ - struct ntfy_object *ntfy_obj; /* Manages notifications */ - /* Bridge Context Handle */ - struct bridge_dev_context *bridge_context; - /* Function interface to Bridge driver */ - struct bridge_drv_interface *intf_fxns; - char *last_coff; - struct list_head proc_list; -}; - -DEFINE_MUTEX(proc_lock); /* For critical sections */ - -/* ----------------------------------- Function Prototypes */ -static int proc_monitor(struct proc_object *proc_obj); -static s32 get_envp_count(char **envp); -static char **prepend_envp(char **new_envp, char **envp, s32 envp_elems, - s32 cnew_envp, char *sz_var); - -/* remember mapping information */ -static struct dmm_map_object *add_mapping_info(struct process_context *pr_ctxt, - u32 mpu_addr, u32 dsp_addr, u32 size) -{ - struct dmm_map_object *map_obj; - - u32 num_usr_pgs = size / PG_SIZE4K; - - pr_debug("%s: adding map info: mpu_addr 0x%x virt 0x%x size 0x%x\n", - __func__, mpu_addr, - dsp_addr, size); - - map_obj = kzalloc(sizeof(struct dmm_map_object), GFP_KERNEL); - if (!map_obj) - return NULL; - - INIT_LIST_HEAD(&map_obj->link); - - map_obj->pages = kcalloc(num_usr_pgs, sizeof(struct page *), - GFP_KERNEL); - if (!map_obj->pages) { - kfree(map_obj); - return NULL; - } - - map_obj->mpu_addr = mpu_addr; - map_obj->dsp_addr = dsp_addr; - map_obj->size = size; - map_obj->num_usr_pgs = num_usr_pgs; - - spin_lock(&pr_ctxt->dmm_map_lock); - list_add(&map_obj->link, &pr_ctxt->dmm_map_list); - spin_unlock(&pr_ctxt->dmm_map_lock); - - return map_obj; -} - -static int match_exact_map_obj(struct dmm_map_object *map_obj, - u32 dsp_addr, u32 size) -{ - if (map_obj->dsp_addr == dsp_addr && map_obj->size != size) - pr_err("%s: addr match (0x%x), size don't (0x%x != 0x%x)\n", - __func__, dsp_addr, map_obj->size, size); - - return map_obj->dsp_addr == dsp_addr && - map_obj->size == size; -} - -static void remove_mapping_information(struct process_context *pr_ctxt, - u32 dsp_addr, u32 size) -{ - struct dmm_map_object *map_obj; - - pr_debug("%s: looking for virt 0x%x size 0x%x\n", __func__, - dsp_addr, size); - - spin_lock(&pr_ctxt->dmm_map_lock); - list_for_each_entry(map_obj, &pr_ctxt->dmm_map_list, link) { - pr_debug("%s: candidate: mpu_addr 0x%x virt 0x%x size 0x%x\n", - __func__, - map_obj->mpu_addr, - map_obj->dsp_addr, - map_obj->size); - - if (match_exact_map_obj(map_obj, dsp_addr, size)) { - pr_debug("%s: match, deleting map info\n", __func__); - list_del(&map_obj->link); - kfree(map_obj->dma_info.sg); - kfree(map_obj->pages); - kfree(map_obj); - goto out; - } - pr_debug("%s: candidate didn't match\n", __func__); - } - - pr_err("%s: failed to find given map info\n", __func__); -out: - spin_unlock(&pr_ctxt->dmm_map_lock); -} - -static int match_containing_map_obj(struct dmm_map_object *map_obj, - u32 mpu_addr, u32 size) -{ - u32 map_obj_end = map_obj->mpu_addr + map_obj->size; - - return mpu_addr >= map_obj->mpu_addr && - mpu_addr + size <= map_obj_end; -} - -static struct dmm_map_object *find_containing_mapping( - struct process_context *pr_ctxt, - u32 mpu_addr, u32 size) -{ - struct dmm_map_object *map_obj; - - pr_debug("%s: looking for mpu_addr 0x%x size 0x%x\n", __func__, - mpu_addr, size); - - spin_lock(&pr_ctxt->dmm_map_lock); - list_for_each_entry(map_obj, &pr_ctxt->dmm_map_list, link) { - pr_debug("%s: candidate: mpu_addr 0x%x virt 0x%x size 0x%x\n", - __func__, - map_obj->mpu_addr, - map_obj->dsp_addr, - map_obj->size); - if (match_containing_map_obj(map_obj, mpu_addr, size)) { - pr_debug("%s: match!\n", __func__); - goto out; - } - - pr_debug("%s: no match!\n", __func__); - } - - map_obj = NULL; -out: - spin_unlock(&pr_ctxt->dmm_map_lock); - return map_obj; -} - -static int find_first_page_in_cache(struct dmm_map_object *map_obj, - unsigned long mpu_addr) -{ - u32 mapped_base_page = map_obj->mpu_addr >> PAGE_SHIFT; - u32 requested_base_page = mpu_addr >> PAGE_SHIFT; - int pg_index = requested_base_page - mapped_base_page; - - if (pg_index < 0 || pg_index >= map_obj->num_usr_pgs) { - pr_err("%s: failed (got %d)\n", __func__, pg_index); - return -1; - } - - pr_debug("%s: first page is %d\n", __func__, pg_index); - return pg_index; -} - -static inline struct page *get_mapping_page(struct dmm_map_object *map_obj, - int pg_i) -{ - pr_debug("%s: looking for pg_i %d, num_usr_pgs: %d\n", __func__, - pg_i, map_obj->num_usr_pgs); - - if (pg_i < 0 || pg_i >= map_obj->num_usr_pgs) { - pr_err("%s: requested pg_i %d is out of mapped range\n", - __func__, pg_i); - return NULL; - } - - return map_obj->pages[pg_i]; -} - -/* - * ======== proc_attach ======== - * Purpose: - * Prepare for communication with a particular DSP processor, and return - * a handle to the processor object. - */ -int -proc_attach(u32 processor_id, - const struct dsp_processorattrin *attr_in, - void **ph_processor, struct process_context *pr_ctxt) -{ - int status = 0; - struct dev_object *hdev_obj; - struct proc_object *p_proc_object = NULL; - struct mgr_object *hmgr_obj = NULL; - struct drv_object *hdrv_obj = NULL; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - u8 dev_type; - - if (pr_ctxt->processor) { - *ph_processor = pr_ctxt->processor; - return status; - } - - /* Get the Driver and Manager Object Handles */ - if (!drv_datap || !drv_datap->drv_object || !drv_datap->mgr_object) { - status = -ENODATA; - pr_err("%s: Failed to get object handles\n", __func__); - } else { - hdrv_obj = drv_datap->drv_object; - hmgr_obj = drv_datap->mgr_object; - } - - if (!status) { - /* Get the Device Object */ - status = drv_get_dev_object(processor_id, hdrv_obj, &hdev_obj); - } - if (!status) - status = dev_get_dev_type(hdev_obj, &dev_type); - - if (status) - goto func_end; - - /* If we made it this far, create the Processor object: */ - p_proc_object = kzalloc(sizeof(struct proc_object), GFP_KERNEL); - /* Fill out the Processor Object: */ - if (p_proc_object == NULL) { - status = -ENOMEM; - goto func_end; - } - p_proc_object->dev_obj = hdev_obj; - p_proc_object->mgr_obj = hmgr_obj; - p_proc_object->processor_id = dev_type; - /* Store TGID instead of process handle */ - p_proc_object->process = current->tgid; - - INIT_LIST_HEAD(&p_proc_object->proc_list); - - if (attr_in) - p_proc_object->timeout = attr_in->timeout; - else - p_proc_object->timeout = PROC_DFLT_TIMEOUT; - - status = dev_get_intf_fxns(hdev_obj, &p_proc_object->intf_fxns); - if (!status) { - status = dev_get_bridge_context(hdev_obj, - &p_proc_object->bridge_context); - if (status) - kfree(p_proc_object); - } else - kfree(p_proc_object); - - if (status) - goto func_end; - - /* Create the Notification Object */ - /* This is created with no event mask, no notify mask - * and no valid handle to the notification. They all get - * filled up when proc_register_notify is called */ - p_proc_object->ntfy_obj = kmalloc(sizeof(struct ntfy_object), - GFP_KERNEL); - if (p_proc_object->ntfy_obj) - ntfy_init(p_proc_object->ntfy_obj); - else - status = -ENOMEM; - - if (!status) { - /* Insert the Processor Object into the DEV List. - * Return handle to this Processor Object: - * Find out if the Device is already attached to a - * Processor. If so, return AlreadyAttached status */ - status = dev_insert_proc_object(p_proc_object->dev_obj, - (u32) p_proc_object, - &p_proc_object-> - is_already_attached); - if (!status) { - if (p_proc_object->is_already_attached) - status = 0; - } else { - if (p_proc_object->ntfy_obj) { - ntfy_delete(p_proc_object->ntfy_obj); - kfree(p_proc_object->ntfy_obj); - } - - kfree(p_proc_object); - } - if (!status) { - *ph_processor = (void *)p_proc_object; - pr_ctxt->processor = *ph_processor; - (void)proc_notify_clients(p_proc_object, - DSP_PROCESSORATTACH); - } - } else { - /* Don't leak memory if status is failed */ - kfree(p_proc_object); - } -func_end: - return status; -} - -static int get_exec_file(struct cfg_devnode *dev_node_obj, - struct dev_object *hdev_obj, - u32 size, char *exec_file) -{ - u8 dev_type; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - - dev_get_dev_type(hdev_obj, (u8 *) &dev_type); - - if (!exec_file) - return -EFAULT; - - if (dev_type == DSP_UNIT) { - if (!drv_datap || !drv_datap->base_img) - return -EFAULT; - - if (strlen(drv_datap->base_img) >= size) - return -EINVAL; - - strcpy(exec_file, drv_datap->base_img); - } else { - return -ENOENT; - } - - return 0; -} - -/* - * ======== proc_auto_start ======== = - * Purpose: - * A Particular device gets loaded with the default image - * if the AutoStart flag is set. - * Parameters: - * hdev_obj: Handle to the Device - * Returns: - * 0: On Successful Loading - * -EPERM General Failure - * Requires: - * hdev_obj != NULL - * Ensures: - */ -int proc_auto_start(struct cfg_devnode *dev_node_obj, - struct dev_object *hdev_obj) -{ - int status = -EPERM; - struct proc_object *p_proc_object; - char sz_exec_file[MAXCMDLINELEN]; - char *argv[2]; - struct mgr_object *hmgr_obj = NULL; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - u8 dev_type; - - /* Create a Dummy PROC Object */ - if (!drv_datap || !drv_datap->mgr_object) { - status = -ENODATA; - pr_err("%s: Failed to retrieve the object handle\n", __func__); - goto func_end; - } else { - hmgr_obj = drv_datap->mgr_object; - } - - p_proc_object = kzalloc(sizeof(struct proc_object), GFP_KERNEL); - if (p_proc_object == NULL) { - status = -ENOMEM; - goto func_end; - } - p_proc_object->dev_obj = hdev_obj; - p_proc_object->mgr_obj = hmgr_obj; - status = dev_get_intf_fxns(hdev_obj, &p_proc_object->intf_fxns); - if (!status) - status = dev_get_bridge_context(hdev_obj, - &p_proc_object->bridge_context); - if (status) - goto func_cont; - - /* Stop the Device, put it into standby mode */ - status = proc_stop(p_proc_object); - - if (status) - goto func_cont; - - /* Get the default executable for this board... */ - dev_get_dev_type(hdev_obj, (u8 *) &dev_type); - p_proc_object->processor_id = dev_type; - status = get_exec_file(dev_node_obj, hdev_obj, sizeof(sz_exec_file), - sz_exec_file); - if (!status) { - argv[0] = sz_exec_file; - argv[1] = NULL; - /* ...and try to load it: */ - status = proc_load(p_proc_object, 1, (const char **)argv, NULL); - if (!status) - status = proc_start(p_proc_object); - } - kfree(p_proc_object->last_coff); - p_proc_object->last_coff = NULL; -func_cont: - kfree(p_proc_object); -func_end: - return status; -} - -/* - * ======== proc_ctrl ======== - * Purpose: - * Pass control information to the GPP device driver managing the - * DSP processor. - * - * This will be an OEM-only function, and not part of the DSP/BIOS Bridge - * application developer's API. - * Call the bridge_dev_ctrl fxn with the Argument. This is a Synchronous - * Operation. arg can be null. - */ -int proc_ctrl(void *hprocessor, u32 dw_cmd, struct dsp_cbdata *arg) -{ - int status = 0; - struct proc_object *p_proc_object = hprocessor; - u32 timeout = 0; - - if (p_proc_object) { - /* intercept PWR deep sleep command */ - if (dw_cmd == BRDIOCTL_DEEPSLEEP) { - timeout = arg->cb_data; - status = pwr_sleep_dsp(PWR_DEEPSLEEP, timeout); - } - /* intercept PWR emergency sleep command */ - else if (dw_cmd == BRDIOCTL_EMERGENCYSLEEP) { - timeout = arg->cb_data; - status = pwr_sleep_dsp(PWR_EMERGENCYDEEPSLEEP, timeout); - } else if (dw_cmd == PWR_DEEPSLEEP) { - /* timeout = arg->cb_data; */ - status = pwr_sleep_dsp(PWR_DEEPSLEEP, timeout); - } - /* intercept PWR wake commands */ - else if (dw_cmd == BRDIOCTL_WAKEUP) { - timeout = arg->cb_data; - status = pwr_wake_dsp(timeout); - } else if (dw_cmd == PWR_WAKEUP) { - /* timeout = arg->cb_data; */ - status = pwr_wake_dsp(timeout); - } else - if (!((*p_proc_object->intf_fxns->dev_cntrl) - (p_proc_object->bridge_context, dw_cmd, - arg))) { - status = 0; - } else { - status = -EPERM; - } - } else { - status = -EFAULT; - } - - return status; -} - -/* - * ======== proc_detach ======== - * Purpose: - * Destroys the Processor Object. Removes the notification from the Dev - * List. - */ -int proc_detach(struct process_context *pr_ctxt) -{ - int status = 0; - struct proc_object *p_proc_object = NULL; - - p_proc_object = (struct proc_object *)pr_ctxt->processor; - - if (p_proc_object) { - /* Notify the Client */ - ntfy_notify(p_proc_object->ntfy_obj, DSP_PROCESSORDETACH); - /* Remove the notification memory */ - if (p_proc_object->ntfy_obj) { - ntfy_delete(p_proc_object->ntfy_obj); - kfree(p_proc_object->ntfy_obj); - } - - kfree(p_proc_object->last_coff); - p_proc_object->last_coff = NULL; - /* Remove the Proc from the DEV List */ - (void)dev_remove_proc_object(p_proc_object->dev_obj, - (u32) p_proc_object); - /* Free the Processor Object */ - kfree(p_proc_object); - pr_ctxt->processor = NULL; - } else { - status = -EFAULT; - } - - return status; -} - -/* - * ======== proc_enum_nodes ======== - * Purpose: - * Enumerate and get configuration information about nodes allocated - * on a DSP processor. - */ -int proc_enum_nodes(void *hprocessor, void **node_tab, - u32 node_tab_size, u32 *pu_num_nodes, - u32 *pu_allocated) -{ - int status = -EPERM; - struct proc_object *p_proc_object = (struct proc_object *)hprocessor; - struct node_mgr *hnode_mgr = NULL; - - if (p_proc_object) { - if (!(dev_get_node_manager(p_proc_object->dev_obj, - &hnode_mgr))) { - if (hnode_mgr) { - status = node_enum_nodes(hnode_mgr, node_tab, - node_tab_size, - pu_num_nodes, - pu_allocated); - } - } - } else { - status = -EFAULT; - } - - return status; -} - -/* Cache operation against kernel address instead of users */ -static int build_dma_sg(struct dmm_map_object *map_obj, unsigned long start, - ssize_t len, int pg_i) -{ - struct page *page; - unsigned long offset; - ssize_t rest; - int ret = 0, i = 0; - struct scatterlist *sg = map_obj->dma_info.sg; - - while (len) { - page = get_mapping_page(map_obj, pg_i); - if (!page) { - pr_err("%s: no page for %08lx\n", __func__, start); - ret = -EINVAL; - goto out; - } else if (IS_ERR(page)) { - pr_err("%s: err page for %08lx(%lu)\n", __func__, start, - PTR_ERR(page)); - ret = PTR_ERR(page); - goto out; - } - - offset = start & ~PAGE_MASK; - rest = min_t(ssize_t, PAGE_SIZE - offset, len); - - sg_set_page(&sg[i], page, rest, offset); - - len -= rest; - start += rest; - pg_i++, i++; - } - - if (i != map_obj->dma_info.num_pages) { - pr_err("%s: bad number of sg iterations\n", __func__); - ret = -EFAULT; - goto out; - } - -out: - return ret; -} - -static int memory_regain_ownership(struct dmm_map_object *map_obj, - unsigned long start, ssize_t len, enum dma_data_direction dir) -{ - int ret = 0; - unsigned long first_data_page = start >> PAGE_SHIFT; - unsigned long last_data_page = ((u32)(start + len - 1) >> PAGE_SHIFT); - /* calculating the number of pages this area spans */ - unsigned long num_pages = last_data_page - first_data_page + 1; - struct bridge_dma_map_info *dma_info = &map_obj->dma_info; - - if (!dma_info->sg) - goto out; - - if (dma_info->dir != dir || dma_info->num_pages != num_pages) { - pr_err("%s: dma info doesn't match given params\n", __func__); - return -EINVAL; - } - - dma_unmap_sg(bridge, dma_info->sg, num_pages, dma_info->dir); - - pr_debug("%s: dma_map_sg unmapped\n", __func__); - - kfree(dma_info->sg); - - map_obj->dma_info.sg = NULL; - -out: - return ret; -} - -/* Cache operation against kernel address instead of users */ -static int memory_give_ownership(struct dmm_map_object *map_obj, - unsigned long start, ssize_t len, enum dma_data_direction dir) -{ - int pg_i, ret, sg_num; - struct scatterlist *sg; - unsigned long first_data_page = start >> PAGE_SHIFT; - unsigned long last_data_page = ((u32)(start + len - 1) >> PAGE_SHIFT); - /* calculating the number of pages this area spans */ - unsigned long num_pages = last_data_page - first_data_page + 1; - - pg_i = find_first_page_in_cache(map_obj, start); - if (pg_i < 0) { - pr_err("%s: failed to find first page in cache\n", __func__); - ret = -EINVAL; - goto out; - } - - sg = kcalloc(num_pages, sizeof(*sg), GFP_KERNEL); - if (!sg) { - ret = -ENOMEM; - goto out; - } - - sg_init_table(sg, num_pages); - - /* cleanup a previous sg allocation */ - /* this may happen if application doesn't signal for e/o DMA */ - kfree(map_obj->dma_info.sg); - - map_obj->dma_info.sg = sg; - map_obj->dma_info.dir = dir; - map_obj->dma_info.num_pages = num_pages; - - ret = build_dma_sg(map_obj, start, len, pg_i); - if (ret) - goto kfree_sg; - - sg_num = dma_map_sg(bridge, sg, num_pages, dir); - if (sg_num < 1) { - pr_err("%s: dma_map_sg failed: %d\n", __func__, sg_num); - ret = -EFAULT; - goto kfree_sg; - } - - pr_debug("%s: dma_map_sg mapped %d elements\n", __func__, sg_num); - map_obj->dma_info.sg_num = sg_num; - - return 0; - -kfree_sg: - kfree(sg); - map_obj->dma_info.sg = NULL; -out: - return ret; -} - -int proc_begin_dma(void *hprocessor, void *pmpu_addr, u32 ul_size, - enum dma_data_direction dir) -{ - /* Keep STATUS here for future additions to this function */ - int status = 0; - struct process_context *pr_ctxt = (struct process_context *) hprocessor; - struct dmm_map_object *map_obj; - - if (!pr_ctxt) { - status = -EFAULT; - goto err_out; - } - - pr_debug("%s: addr 0x%x, size 0x%x, type %d\n", __func__, - (u32)pmpu_addr, - ul_size, dir); - - mutex_lock(&proc_lock); - - /* find requested memory are in cached mapping information */ - map_obj = find_containing_mapping(pr_ctxt, (u32) pmpu_addr, ul_size); - if (!map_obj) { - pr_err("%s: find_containing_mapping failed\n", __func__); - status = -EFAULT; - goto no_map; - } - - if (memory_give_ownership(map_obj, (u32) pmpu_addr, ul_size, dir)) { - pr_err("%s: InValid address parameters %p %x\n", - __func__, pmpu_addr, ul_size); - status = -EFAULT; - } - -no_map: - mutex_unlock(&proc_lock); -err_out: - - return status; -} - -int proc_end_dma(void *hprocessor, void *pmpu_addr, u32 ul_size, - enum dma_data_direction dir) -{ - /* Keep STATUS here for future additions to this function */ - int status = 0; - struct process_context *pr_ctxt = (struct process_context *) hprocessor; - struct dmm_map_object *map_obj; - - if (!pr_ctxt) { - status = -EFAULT; - goto err_out; - } - - pr_debug("%s: addr 0x%x, size 0x%x, type %d\n", __func__, - (u32)pmpu_addr, - ul_size, dir); - - mutex_lock(&proc_lock); - - /* find requested memory are in cached mapping information */ - map_obj = find_containing_mapping(pr_ctxt, (u32) pmpu_addr, ul_size); - if (!map_obj) { - pr_err("%s: find_containing_mapping failed\n", __func__); - status = -EFAULT; - goto no_map; - } - - if (memory_regain_ownership(map_obj, (u32) pmpu_addr, ul_size, dir)) { - pr_err("%s: InValid address parameters %p %x\n", - __func__, pmpu_addr, ul_size); - status = -EFAULT; - } - -no_map: - mutex_unlock(&proc_lock); -err_out: - return status; -} - -/* - * ======== proc_flush_memory ======== - * Purpose: - * Flush cache - */ -int proc_flush_memory(void *hprocessor, void *pmpu_addr, - u32 ul_size, u32 ul_flags) -{ - enum dma_data_direction dir = DMA_BIDIRECTIONAL; - - return proc_begin_dma(hprocessor, pmpu_addr, ul_size, dir); -} - -/* - * ======== proc_invalidate_memory ======== - * Purpose: - * Invalidates the memory specified - */ -int proc_invalidate_memory(void *hprocessor, void *pmpu_addr, u32 size) -{ - enum dma_data_direction dir = DMA_FROM_DEVICE; - - return proc_begin_dma(hprocessor, pmpu_addr, size, dir); -} - -/* - * ======== proc_get_resource_info ======== - * Purpose: - * Enumerate the resources currently available on a processor. - */ -int proc_get_resource_info(void *hprocessor, u32 resource_type, - struct dsp_resourceinfo *resource_info, - u32 resource_info_size) -{ - int status = -EPERM; - struct proc_object *p_proc_object = (struct proc_object *)hprocessor; - struct node_mgr *hnode_mgr = NULL; - struct nldr_object *nldr_obj = NULL; - struct rmm_target_obj *rmm = NULL; - struct io_mgr *hio_mgr = NULL; /* IO manager handle */ - - if (!p_proc_object) { - status = -EFAULT; - goto func_end; - } - switch (resource_type) { - case DSP_RESOURCE_DYNDARAM: - case DSP_RESOURCE_DYNSARAM: - case DSP_RESOURCE_DYNEXTERNAL: - case DSP_RESOURCE_DYNSRAM: - status = dev_get_node_manager(p_proc_object->dev_obj, - &hnode_mgr); - if (!hnode_mgr) { - status = -EFAULT; - goto func_end; - } - - status = node_get_nldr_obj(hnode_mgr, &nldr_obj); - if (!status) { - status = nldr_get_rmm_manager(nldr_obj, &rmm); - if (rmm) { - if (!rmm_stat(rmm, - (enum dsp_memtype)resource_type, - (struct dsp_memstat *) - &(resource_info->result. - mem_stat))) - status = -EINVAL; - } else { - status = -EFAULT; - } - } - break; - case DSP_RESOURCE_PROCLOAD: - status = dev_get_io_mgr(p_proc_object->dev_obj, &hio_mgr); - if (hio_mgr) - status = - p_proc_object->intf_fxns-> - io_get_proc_load(hio_mgr, - (struct dsp_procloadstat *) - &(resource_info->result. - proc_load_stat)); - else - status = -EFAULT; - break; - default: - status = -EPERM; - break; - } -func_end: - return status; -} - -/* - * ======== proc_get_dev_object ======== - * Purpose: - * Return the Dev Object handle for a given Processor. - * - */ -int proc_get_dev_object(void *hprocessor, - struct dev_object **device_obj) -{ - int status = -EPERM; - struct proc_object *p_proc_object = (struct proc_object *)hprocessor; - - if (p_proc_object) { - *device_obj = p_proc_object->dev_obj; - status = 0; - } else { - *device_obj = NULL; - status = -EFAULT; - } - - return status; -} - -/* - * ======== proc_get_state ======== - * Purpose: - * Report the state of the specified DSP processor. - */ -int proc_get_state(void *hprocessor, - struct dsp_processorstate *proc_state_obj, - u32 state_info_size) -{ - int status = 0; - struct proc_object *p_proc_object = (struct proc_object *)hprocessor; - int brd_status; - - if (p_proc_object) { - /* First, retrieve BRD state information */ - status = (*p_proc_object->intf_fxns->brd_status) - (p_proc_object->bridge_context, &brd_status); - if (!status) { - switch (brd_status) { - case BRD_STOPPED: - proc_state_obj->proc_state = PROC_STOPPED; - break; - case BRD_SLEEP_TRANSITION: - case BRD_DSP_HIBERNATION: - /* Fall through */ - case BRD_RUNNING: - proc_state_obj->proc_state = PROC_RUNNING; - break; - case BRD_LOADED: - proc_state_obj->proc_state = PROC_LOADED; - break; - case BRD_ERROR: - proc_state_obj->proc_state = PROC_ERROR; - break; - default: - proc_state_obj->proc_state = 0xFF; - status = -EPERM; - break; - } - } - } else { - status = -EFAULT; - } - dev_dbg(bridge, "%s, results: status: 0x%x proc_state_obj: 0x%x\n", - __func__, status, proc_state_obj->proc_state); - return status; -} - -/* - * ======== proc_get_trace ======== - * Purpose: - * Retrieve the current contents of the trace buffer, located on the - * Processor. Predefined symbols for the trace buffer must have been - * configured into the DSP executable. - * Details: - * We support using the symbols SYS_PUTCBEG and SYS_PUTCEND to define a - * trace buffer, only. Treat it as an undocumented feature. - * This call is destructive, meaning the processor is placed in the monitor - * state as a result of this function. - */ -int proc_get_trace(void *hprocessor, u8 *pbuf, u32 max_size) -{ - int status; - - status = -ENOSYS; - return status; -} - -/* - * ======== proc_load ======== - * Purpose: - * Reset a processor and load a new base program image. - * This will be an OEM-only function, and not part of the DSP/BIOS Bridge - * application developer's API. - */ -int proc_load(void *hprocessor, const s32 argc_index, - const char **user_args, const char **user_envp) -{ - int status = 0; - struct proc_object *p_proc_object = (struct proc_object *)hprocessor; - struct io_mgr *hio_mgr; /* IO manager handle */ - struct msg_mgr *hmsg_mgr; - struct cod_manager *cod_mgr; /* Code manager handle */ - char *pargv0; /* temp argv[0] ptr */ - char **new_envp; /* Updated envp[] array. */ - char sz_proc_id[MAXPROCIDLEN]; /* Size of "PROC_ID=" */ - s32 envp_elems; /* Num elements in envp[]. */ - s32 cnew_envp; /* " " in new_envp[] */ - s32 nproc_id = 0; /* Anticipate MP version. */ - struct dcd_manager *hdcd_handle; - struct dmm_object *dmm_mgr; - u32 dw_ext_end; - u32 proc_id; - int brd_state; - struct drv_data *drv_datap = dev_get_drvdata(bridge); - -#ifdef OPT_LOAD_TIME_INSTRUMENTATION - struct timeval tv1; - struct timeval tv2; -#endif - -#if defined(CONFIG_TIDSPBRIDGE_DVFS) && !defined(CONFIG_CPU_FREQ) - struct dspbridge_platform_data *pdata = - omap_dspbridge_dev->dev.platform_data; -#endif - -#ifdef OPT_LOAD_TIME_INSTRUMENTATION - do_gettimeofday(&tv1); -#endif - if (!p_proc_object) { - status = -EFAULT; - goto func_end; - } - dev_get_cod_mgr(p_proc_object->dev_obj, &cod_mgr); - if (!cod_mgr) { - status = -EPERM; - goto func_end; - } - status = proc_stop(hprocessor); - if (status) - goto func_end; - - /* Place the board in the monitor state. */ - status = proc_monitor(hprocessor); - if (status) - goto func_end; - - /* Save ptr to original argv[0]. */ - pargv0 = (char *)user_args[0]; - /*Prepend "PROC_ID="to envp array for target. */ - envp_elems = get_envp_count((char **)user_envp); - cnew_envp = (envp_elems ? (envp_elems + 1) : (envp_elems + 2)); - new_envp = kzalloc(cnew_envp * sizeof(char **), GFP_KERNEL); - if (new_envp) { - status = snprintf(sz_proc_id, MAXPROCIDLEN, PROC_ENVPROCID, - nproc_id); - if (status == -1) { - dev_dbg(bridge, "%s: Proc ID string overflow\n", - __func__); - status = -EPERM; - } else { - new_envp = - prepend_envp(new_envp, (char **)user_envp, - envp_elems, cnew_envp, sz_proc_id); - /* Get the DCD Handle */ - status = mgr_get_dcd_handle(p_proc_object->mgr_obj, - (u32 *) &hdcd_handle); - if (!status) { - /* Before proceeding with new load, - * check if a previously registered COFF - * exists. - * If yes, unregister nodes in previously - * registered COFF. If any error occurred, - * set previously registered COFF to NULL. */ - if (p_proc_object->last_coff != NULL) { - status = - dcd_auto_unregister(hdcd_handle, - p_proc_object-> - last_coff); - /* Regardless of auto unregister status, - * free previously allocated - * memory. */ - kfree(p_proc_object->last_coff); - p_proc_object->last_coff = NULL; - } - } - /* On success, do cod_open_base() */ - status = cod_open_base(cod_mgr, (char *)user_args[0], - COD_SYMB); - } - } else { - status = -ENOMEM; - } - if (!status) { - /* Auto-register data base */ - /* Get the DCD Handle */ - status = mgr_get_dcd_handle(p_proc_object->mgr_obj, - (u32 *) &hdcd_handle); - if (!status) { - /* Auto register nodes in specified COFF - * file. If registration did not fail, - * (status = 0 or -EACCES) - * save the name of the COFF file for - * de-registration in the future. */ - status = - dcd_auto_register(hdcd_handle, - (char *)user_args[0]); - if (status == -EACCES) - status = 0; - - if (status) { - status = -EPERM; - } else { - /* Allocate memory for pszLastCoff */ - p_proc_object->last_coff = - kzalloc((strlen(user_args[0]) + - 1), GFP_KERNEL); - /* If memory allocated, save COFF file name */ - if (p_proc_object->last_coff) { - strncpy(p_proc_object->last_coff, - (char *)user_args[0], - (strlen((char *)user_args[0]) + - 1)); - } - } - } - } - /* Update shared memory address and size */ - if (!status) { - /* Create the message manager. This must be done - * before calling the IOOnLoaded function. */ - dev_get_msg_mgr(p_proc_object->dev_obj, &hmsg_mgr); - if (!hmsg_mgr) { - status = msg_create(&hmsg_mgr, p_proc_object->dev_obj, - (msg_onexit) node_on_exit); - dev_set_msg_mgr(p_proc_object->dev_obj, hmsg_mgr); - } - } - if (!status) { - /* Set the Device object's message manager */ - status = dev_get_io_mgr(p_proc_object->dev_obj, &hio_mgr); - if (hio_mgr) - status = (*p_proc_object->intf_fxns->io_on_loaded) - (hio_mgr); - else - status = -EFAULT; - } - if (!status) { - /* Now, attempt to load an exec: */ - - /* Boost the OPP level to Maximum level supported by baseport */ -#if defined(CONFIG_TIDSPBRIDGE_DVFS) && !defined(CONFIG_CPU_FREQ) - if (pdata->cpu_set_freq) - (*pdata->cpu_set_freq) (pdata->mpu_speed[VDD1_OPP5]); -#endif - status = cod_load_base(cod_mgr, argc_index, (char **)user_args, - dev_brd_write_fxn, - p_proc_object->dev_obj, NULL); - if (status) { - if (status == -EBADF) { - dev_dbg(bridge, "%s: Failure to Load the EXE\n", - __func__); - } - if (status == -ESPIPE) { - pr_err("%s: Couldn't parse the file\n", - __func__); - } - } - /* Requesting the lowest opp supported */ -#if defined(CONFIG_TIDSPBRIDGE_DVFS) && !defined(CONFIG_CPU_FREQ) - if (pdata->cpu_set_freq) - (*pdata->cpu_set_freq) (pdata->mpu_speed[VDD1_OPP1]); -#endif - - } - if (!status) { - /* Update the Processor status to loaded */ - status = (*p_proc_object->intf_fxns->brd_set_state) - (p_proc_object->bridge_context, BRD_LOADED); - if (!status) { - p_proc_object->proc_state = PROC_LOADED; - if (p_proc_object->ntfy_obj) - proc_notify_clients(p_proc_object, - DSP_PROCESSORSTATECHANGE); - } - } - if (!status) { - status = proc_get_processor_id(hprocessor, &proc_id); - if (proc_id == DSP_UNIT) { - /* Use all available DSP address space after EXTMEM - * for DMM */ - if (!status) - status = cod_get_sym_value(cod_mgr, EXTEND, - &dw_ext_end); - - /* Reset DMM structs and add an initial free chunk */ - if (!status) { - status = - dev_get_dmm_mgr(p_proc_object->dev_obj, - &dmm_mgr); - if (dmm_mgr) { - /* Set dw_ext_end to DMM START u8 - * address */ - dw_ext_end = - (dw_ext_end + 1) * DSPWORDSIZE; - /* DMM memory is from EXT_END */ - status = dmm_create_tables(dmm_mgr, - dw_ext_end, - DMMPOOLSIZE); - } else { - status = -EFAULT; - } - } - } - } - /* Restore the original argv[0] */ - kfree(new_envp); - user_args[0] = pargv0; - if (!status) { - if (!((*p_proc_object->intf_fxns->brd_status) - (p_proc_object->bridge_context, &brd_state))) { - pr_info("%s: Processor Loaded %s\n", __func__, pargv0); - kfree(drv_datap->base_img); - drv_datap->base_img = kstrdup(pargv0, GFP_KERNEL); - if (!drv_datap->base_img) - status = -ENOMEM; - } - } - -func_end: - if (status) { - pr_err("%s: Processor failed to load\n", __func__); - proc_stop(p_proc_object); - } -#ifdef OPT_LOAD_TIME_INSTRUMENTATION - do_gettimeofday(&tv2); - if (tv2.tv_usec < tv1.tv_usec) { - tv2.tv_usec += 1000000; - tv2.tv_sec--; - } - dev_dbg(bridge, "%s: time to load %d sec and %d usec\n", __func__, - tv2.tv_sec - tv1.tv_sec, tv2.tv_usec - tv1.tv_usec); -#endif - return status; -} - -/* - * ======== proc_map ======== - * Purpose: - * Maps a MPU buffer to DSP address space. - */ -int proc_map(void *hprocessor, void *pmpu_addr, u32 ul_size, - void *req_addr, void **pp_map_addr, u32 ul_map_attr, - struct process_context *pr_ctxt) -{ - u32 va_align; - u32 pa_align; - struct dmm_object *dmm_mgr; - u32 size_align; - int status = 0; - struct proc_object *p_proc_object = (struct proc_object *)hprocessor; - struct dmm_map_object *map_obj; - u32 tmp_addr = 0; - -#ifdef CONFIG_TIDSPBRIDGE_CACHE_LINE_CHECK - if ((ul_map_attr & BUFMODE_MASK) != RBUF) { - if (!IS_ALIGNED((u32)pmpu_addr, DSP_CACHE_LINE) || - !IS_ALIGNED(ul_size, DSP_CACHE_LINE)) { - pr_err("%s: not aligned: 0x%x (%d)\n", __func__, - (u32)pmpu_addr, ul_size); - return -EFAULT; - } - } -#endif - - /* Calculate the page-aligned PA, VA and size */ - va_align = PG_ALIGN_LOW((u32) req_addr, PG_SIZE4K); - pa_align = PG_ALIGN_LOW((u32) pmpu_addr, PG_SIZE4K); - size_align = PG_ALIGN_HIGH(ul_size + (u32) pmpu_addr - pa_align, - PG_SIZE4K); - - if (!p_proc_object) { - status = -EFAULT; - goto func_end; - } - /* Critical section */ - mutex_lock(&proc_lock); - dmm_get_handle(p_proc_object, &dmm_mgr); - if (dmm_mgr) - status = dmm_map_memory(dmm_mgr, va_align, size_align); - else - status = -EFAULT; - - /* Add mapping to the page tables. */ - if (!status) { - - /* Mapped address = MSB of VA | LSB of PA */ - tmp_addr = (va_align | ((u32) pmpu_addr & (PG_SIZE4K - 1))); - /* mapped memory resource tracking */ - map_obj = add_mapping_info(pr_ctxt, pa_align, tmp_addr, - size_align); - if (!map_obj) - status = -ENOMEM; - else - status = (*p_proc_object->intf_fxns->brd_mem_map) - (p_proc_object->bridge_context, pa_align, va_align, - size_align, ul_map_attr, map_obj->pages); - } - if (!status) { - /* Mapped address = MSB of VA | LSB of PA */ - *pp_map_addr = (void *) tmp_addr; - } else { - remove_mapping_information(pr_ctxt, tmp_addr, size_align); - dmm_un_map_memory(dmm_mgr, va_align, &size_align); - } - mutex_unlock(&proc_lock); - - if (status) - goto func_end; - -func_end: - dev_dbg(bridge, "%s: hprocessor %p, pmpu_addr %p, ul_size %x, " - "req_addr %p, ul_map_attr %x, pp_map_addr %p, va_align %x, " - "pa_align %x, size_align %x status 0x%x\n", __func__, - hprocessor, pmpu_addr, ul_size, req_addr, ul_map_attr, - pp_map_addr, va_align, pa_align, size_align, status); - - return status; -} - -/* - * ======== proc_register_notify ======== - * Purpose: - * Register to be notified of specific processor events. - */ -int proc_register_notify(void *hprocessor, u32 event_mask, - u32 notify_type, struct dsp_notification - *hnotification) -{ - int status = 0; - struct proc_object *p_proc_object = (struct proc_object *)hprocessor; - struct deh_mgr *hdeh_mgr; - - /* Check processor handle */ - if (!p_proc_object) { - status = -EFAULT; - goto func_end; - } - /* Check if event mask is a valid processor related event */ - if (event_mask & ~(DSP_PROCESSORSTATECHANGE | DSP_PROCESSORATTACH | - DSP_PROCESSORDETACH | DSP_PROCESSORRESTART | - DSP_MMUFAULT | DSP_SYSERROR | DSP_PWRERROR | - DSP_WDTOVERFLOW)) - status = -EINVAL; - - /* Check if notify type is valid */ - if (notify_type != DSP_SIGNALEVENT) - status = -EINVAL; - - if (!status) { - /* If event mask is not DSP_SYSERROR, DSP_MMUFAULT, - * or DSP_PWRERROR then register event immediately. */ - if (event_mask & - ~(DSP_SYSERROR | DSP_MMUFAULT | DSP_PWRERROR | - DSP_WDTOVERFLOW)) { - status = ntfy_register(p_proc_object->ntfy_obj, - hnotification, event_mask, - notify_type); - /* Special case alert, special case alert! - * If we're trying to *deregister* (i.e. event_mask - * is 0), a DSP_SYSERROR or DSP_MMUFAULT notification, - * we have to deregister with the DEH manager. - * There's no way to know, based on event_mask which - * manager the notification event was registered with, - * so if we're trying to deregister and ntfy_register - * failed, we'll give the deh manager a shot. - */ - if ((event_mask == 0) && status) { - status = - dev_get_deh_mgr(p_proc_object->dev_obj, - &hdeh_mgr); - status = - bridge_deh_register_notify(hdeh_mgr, - event_mask, - notify_type, - hnotification); - } - } else { - status = dev_get_deh_mgr(p_proc_object->dev_obj, - &hdeh_mgr); - status = - bridge_deh_register_notify(hdeh_mgr, - event_mask, - notify_type, - hnotification); - - } - } -func_end: - return status; -} - -/* - * ======== proc_reserve_memory ======== - * Purpose: - * Reserve a virtually contiguous region of DSP address space. - */ -int proc_reserve_memory(void *hprocessor, u32 ul_size, - void **pp_rsv_addr, - struct process_context *pr_ctxt) -{ - struct dmm_object *dmm_mgr; - int status = 0; - struct proc_object *p_proc_object = (struct proc_object *)hprocessor; - struct dmm_rsv_object *rsv_obj; - - if (!p_proc_object) { - status = -EFAULT; - goto func_end; - } - - status = dmm_get_handle(p_proc_object, &dmm_mgr); - if (!dmm_mgr) { - status = -EFAULT; - goto func_end; - } - - status = dmm_reserve_memory(dmm_mgr, ul_size, (u32 *) pp_rsv_addr); - if (status != 0) - goto func_end; - - /* - * A successful reserve should be followed by insertion of rsv_obj - * into dmm_rsv_list, so that reserved memory resource tracking - * remains uptodate - */ - rsv_obj = kmalloc(sizeof(struct dmm_rsv_object), GFP_KERNEL); - if (rsv_obj) { - rsv_obj->dsp_reserved_addr = (u32) *pp_rsv_addr; - spin_lock(&pr_ctxt->dmm_rsv_lock); - list_add(&rsv_obj->link, &pr_ctxt->dmm_rsv_list); - spin_unlock(&pr_ctxt->dmm_rsv_lock); - } - -func_end: - dev_dbg(bridge, "%s: hprocessor: 0x%p ul_size: 0x%x pp_rsv_addr: 0x%p " - "status 0x%x\n", __func__, hprocessor, - ul_size, pp_rsv_addr, status); - return status; -} - -/* - * ======== proc_start ======== - * Purpose: - * Start a processor running. - */ -int proc_start(void *hprocessor) -{ - int status = 0; - struct proc_object *p_proc_object = (struct proc_object *)hprocessor; - struct cod_manager *cod_mgr; /* Code manager handle */ - u32 dw_dsp_addr; /* Loaded code's entry point. */ - int brd_state; - - if (!p_proc_object) { - status = -EFAULT; - goto func_end; - } - /* Call the bridge_brd_start */ - if (p_proc_object->proc_state != PROC_LOADED) { - status = -EBADR; - goto func_end; - } - status = dev_get_cod_mgr(p_proc_object->dev_obj, &cod_mgr); - if (!cod_mgr) { - status = -EFAULT; - goto func_cont; - } - - status = cod_get_entry(cod_mgr, &dw_dsp_addr); - if (status) - goto func_cont; - - status = (*p_proc_object->intf_fxns->brd_start) - (p_proc_object->bridge_context, dw_dsp_addr); - if (status) - goto func_cont; - - /* Call dev_create2 */ - status = dev_create2(p_proc_object->dev_obj); - if (!status) { - p_proc_object->proc_state = PROC_RUNNING; - /* Deep sleep switces off the peripheral clocks. - * we just put the DSP CPU in idle in the idle loop. - * so there is no need to send a command to DSP */ - - if (p_proc_object->ntfy_obj) { - proc_notify_clients(p_proc_object, - DSP_PROCESSORSTATECHANGE); - } - } else { - /* Failed to Create Node Manager and DISP Object - * Stop the Processor from running. Put it in STOPPED State */ - (void)(*p_proc_object->intf_fxns-> - brd_stop) (p_proc_object->bridge_context); - p_proc_object->proc_state = PROC_STOPPED; - } -func_cont: - if (!status) { - if (!((*p_proc_object->intf_fxns->brd_status) - (p_proc_object->bridge_context, &brd_state))) { - pr_info("%s: dsp in running state\n", __func__); - } - } else { - pr_err("%s: Failed to start the dsp\n", __func__); - proc_stop(p_proc_object); - } - -func_end: - return status; -} - -/* - * ======== proc_stop ======== - * Purpose: - * Stop a processor running. - */ -int proc_stop(void *hprocessor) -{ - int status = 0; - struct proc_object *p_proc_object = (struct proc_object *)hprocessor; - struct msg_mgr *hmsg_mgr; - struct node_mgr *hnode_mgr; - void *hnode; - u32 node_tab_size = 1; - u32 num_nodes = 0; - u32 nodes_allocated = 0; - - if (!p_proc_object) { - status = -EFAULT; - goto func_end; - } - /* check if there are any running nodes */ - status = dev_get_node_manager(p_proc_object->dev_obj, &hnode_mgr); - if (!status && hnode_mgr) { - status = node_enum_nodes(hnode_mgr, &hnode, node_tab_size, - &num_nodes, &nodes_allocated); - if ((status == -EINVAL) || (nodes_allocated > 0)) { - pr_err("%s: Can't stop device, active nodes = %d\n", - __func__, nodes_allocated); - return -EBADR; - } - } - /* Call the bridge_brd_stop */ - /* It is OK to stop a device that does n't have nodes OR not started */ - status = - (*p_proc_object->intf_fxns-> - brd_stop) (p_proc_object->bridge_context); - if (!status) { - dev_dbg(bridge, "%s: processor in standby mode\n", __func__); - p_proc_object->proc_state = PROC_STOPPED; - /* Destroy the Node Manager, msg_ctrl Manager */ - if (!(dev_destroy2(p_proc_object->dev_obj))) { - /* Destroy the msg_ctrl by calling msg_delete */ - dev_get_msg_mgr(p_proc_object->dev_obj, &hmsg_mgr); - if (hmsg_mgr) { - msg_delete(hmsg_mgr); - dev_set_msg_mgr(p_proc_object->dev_obj, NULL); - } - } - } else { - pr_err("%s: Failed to stop the processor\n", __func__); - } -func_end: - - return status; -} - -/* - * ======== proc_un_map ======== - * Purpose: - * Removes a MPU buffer mapping from the DSP address space. - */ -int proc_un_map(void *hprocessor, void *map_addr, - struct process_context *pr_ctxt) -{ - int status = 0; - struct proc_object *p_proc_object = (struct proc_object *)hprocessor; - struct dmm_object *dmm_mgr; - u32 va_align; - u32 size_align; - - va_align = PG_ALIGN_LOW((u32) map_addr, PG_SIZE4K); - if (!p_proc_object) { - status = -EFAULT; - goto func_end; - } - - status = dmm_get_handle(hprocessor, &dmm_mgr); - if (!dmm_mgr) { - status = -EFAULT; - goto func_end; - } - - /* Critical section */ - mutex_lock(&proc_lock); - /* - * Update DMM structures. Get the size to unmap. - * This function returns error if the VA is not mapped - */ - status = dmm_un_map_memory(dmm_mgr, (u32) va_align, &size_align); - /* Remove mapping from the page tables. */ - if (!status) { - status = (*p_proc_object->intf_fxns->brd_mem_un_map) - (p_proc_object->bridge_context, va_align, size_align); - } - - if (status) - goto unmap_failed; - - /* - * A successful unmap should be followed by removal of map_obj - * from dmm_map_list, so that mapped memory resource tracking - * remains uptodate - */ - remove_mapping_information(pr_ctxt, (u32) map_addr, size_align); - -unmap_failed: - mutex_unlock(&proc_lock); - -func_end: - dev_dbg(bridge, "%s: hprocessor: 0x%p map_addr: 0x%p status: 0x%x\n", - __func__, hprocessor, map_addr, status); - return status; -} - -/* - * ======== proc_un_reserve_memory ======== - * Purpose: - * Frees a previously reserved region of DSP address space. - */ -int proc_un_reserve_memory(void *hprocessor, void *prsv_addr, - struct process_context *pr_ctxt) -{ - struct dmm_object *dmm_mgr; - int status = 0; - struct proc_object *p_proc_object = (struct proc_object *)hprocessor; - struct dmm_rsv_object *rsv_obj; - - if (!p_proc_object) { - status = -EFAULT; - goto func_end; - } - - status = dmm_get_handle(p_proc_object, &dmm_mgr); - if (!dmm_mgr) { - status = -EFAULT; - goto func_end; - } - - status = dmm_un_reserve_memory(dmm_mgr, (u32) prsv_addr); - if (status != 0) - goto func_end; - - /* - * A successful unreserve should be followed by removal of rsv_obj - * from dmm_rsv_list, so that reserved memory resource tracking - * remains uptodate - */ - spin_lock(&pr_ctxt->dmm_rsv_lock); - list_for_each_entry(rsv_obj, &pr_ctxt->dmm_rsv_list, link) { - if (rsv_obj->dsp_reserved_addr == (u32) prsv_addr) { - list_del(&rsv_obj->link); - kfree(rsv_obj); - break; - } - } - spin_unlock(&pr_ctxt->dmm_rsv_lock); - -func_end: - dev_dbg(bridge, "%s: hprocessor: 0x%p prsv_addr: 0x%p status: 0x%x\n", - __func__, hprocessor, prsv_addr, status); - return status; -} - -/* - * ======== = proc_monitor ======== == - * Purpose: - * Place the Processor in Monitor State. This is an internal - * function and a requirement before Processor is loaded. - * This does a bridge_brd_stop, dev_destroy2 and bridge_brd_monitor. - * In dev_destroy2 we delete the node manager. - * Parameters: - * p_proc_object: Pointer to Processor Object - * Returns: - * 0: Processor placed in monitor mode. - * !0: Failed to place processor in monitor mode. - * Requires: - * Valid Processor Handle - * Ensures: - * Success: ProcObject state is PROC_IDLE - */ -static int proc_monitor(struct proc_object *proc_obj) -{ - int status = -EPERM; - struct msg_mgr *hmsg_mgr; - - /* This is needed only when Device is loaded when it is - * already 'ACTIVE' */ - /* Destroy the Node Manager, msg_ctrl Manager */ - if (!dev_destroy2(proc_obj->dev_obj)) { - /* Destroy the msg_ctrl by calling msg_delete */ - dev_get_msg_mgr(proc_obj->dev_obj, &hmsg_mgr); - if (hmsg_mgr) { - msg_delete(hmsg_mgr); - dev_set_msg_mgr(proc_obj->dev_obj, NULL); - } - } - /* Place the Board in the Monitor State */ - if (!((*proc_obj->intf_fxns->brd_monitor) - (proc_obj->bridge_context))) { - status = 0; - } - - return status; -} - -/* - * ======== get_envp_count ======== - * Purpose: - * Return the number of elements in the envp array, including the - * terminating NULL element. - */ -static s32 get_envp_count(char **envp) -{ - s32 ret = 0; - - if (envp) { - while (*envp++) - ret++; - - ret += 1; /* Include the terminating NULL in the count. */ - } - - return ret; -} - -/* - * ======== prepend_envp ======== - * Purpose: - * Prepend an environment variable=value pair to the new envp array, and - * copy in the existing var=value pairs in the old envp array. - */ -static char **prepend_envp(char **new_envp, char **envp, s32 envp_elems, - s32 cnew_envp, char *sz_var) -{ - char **pp_envp = new_envp; - - /* Prepend new environ var=value string */ - *new_envp++ = sz_var; - - /* Copy user's environment into our own. */ - while (envp_elems--) - *new_envp++ = *envp++; - - /* Ensure NULL terminates the new environment strings array. */ - if (envp_elems == 0) - *new_envp = NULL; - - return pp_envp; -} - -/* - * ======== proc_notify_clients ======== - * Purpose: - * Notify the processor the events. - */ -int proc_notify_clients(void *proc, u32 events) -{ - int status = 0; - struct proc_object *p_proc_object = (struct proc_object *)proc; - - if (!p_proc_object) { - status = -EFAULT; - goto func_end; - } - - ntfy_notify(p_proc_object->ntfy_obj, events); -func_end: - return status; -} - -/* - * ======== proc_notify_all_clients ======== - * Purpose: - * Notify the processor the events. This includes notifying all clients - * attached to a particulat DSP. - */ -int proc_notify_all_clients(void *proc, u32 events) -{ - int status = 0; - struct proc_object *p_proc_object = (struct proc_object *)proc; - - if (!p_proc_object) { - status = -EFAULT; - goto func_end; - } - - dev_notify_clients(p_proc_object->dev_obj, events); - -func_end: - return status; -} - -/* - * ======== proc_get_processor_id ======== - * Purpose: - * Retrieves the processor ID. - */ -int proc_get_processor_id(void *proc, u32 *proc_id) -{ - int status = 0; - struct proc_object *p_proc_object = (struct proc_object *)proc; - - if (p_proc_object) - *proc_id = p_proc_object->processor_id; - else - status = -EFAULT; - - return status; -} diff --git a/drivers/staging/tidspbridge/rmgr/pwr.c b/drivers/staging/tidspbridge/rmgr/pwr.c deleted file mode 100644 index 17748df351b9..000000000000 --- a/drivers/staging/tidspbridge/rmgr/pwr.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * pwr.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * PWR API for controlling DSP power states. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- This */ -#include - -/* ----------------------------------- Resource Manager */ -#include -#include - -/* ----------------------------------- Platform Manager */ -#include - -/* ----------------------------------- Link Driver */ -#include - -/* - * ======== pwr_sleep_dsp ======== - * Send command to DSP to enter sleep state. - */ -int pwr_sleep_dsp(const u32 sleep_code, const u32 timeout) -{ - struct bridge_drv_interface *intf_fxns; - struct bridge_dev_context *dw_context; - int status = -EPERM; - struct dev_object *hdev_obj = NULL; - u32 ioctlcode = 0; - u32 arg = timeout; - - for (hdev_obj = (struct dev_object *)drv_get_first_dev_object(); - hdev_obj != NULL; - hdev_obj = - (struct dev_object *)drv_get_next_dev_object((u32) hdev_obj)) { - if (dev_get_bridge_context(hdev_obj, - (struct bridge_dev_context **) - &dw_context)) { - continue; - } - if (dev_get_intf_fxns(hdev_obj, - (struct bridge_drv_interface **) - &intf_fxns)) { - continue; - } - if (sleep_code == PWR_DEEPSLEEP) - ioctlcode = BRDIOCTL_DEEPSLEEP; - else if (sleep_code == PWR_EMERGENCYDEEPSLEEP) - ioctlcode = BRDIOCTL_EMERGENCYSLEEP; - else - status = -EINVAL; - - if (status != -EINVAL) { - status = (*intf_fxns->dev_cntrl) (dw_context, - ioctlcode, - (void *)&arg); - } - } - return status; -} - -/* - * ======== pwr_wake_dsp ======== - * Send command to DSP to wake it from sleep. - */ -int pwr_wake_dsp(const u32 timeout) -{ - struct bridge_drv_interface *intf_fxns; - struct bridge_dev_context *dw_context; - int status = -EPERM; - struct dev_object *hdev_obj = NULL; - u32 arg = timeout; - - for (hdev_obj = (struct dev_object *)drv_get_first_dev_object(); - hdev_obj != NULL; - hdev_obj = (struct dev_object *)drv_get_next_dev_object - ((u32) hdev_obj)) { - if (!(dev_get_bridge_context(hdev_obj, - (struct bridge_dev_context - **)&dw_context))) { - if (!(dev_get_intf_fxns(hdev_obj, - (struct bridge_drv_interface **)&intf_fxns))) { - status = - (*intf_fxns->dev_cntrl) (dw_context, - BRDIOCTL_WAKEUP, - (void *)&arg); - } - } - } - return status; -} - -/* - * ======== pwr_pm_pre_scale======== - * Sends pre-notification message to DSP. - */ -int pwr_pm_pre_scale(u16 voltage_domain, u32 level) -{ - struct bridge_drv_interface *intf_fxns; - struct bridge_dev_context *dw_context; - int status = -EPERM; - struct dev_object *hdev_obj = NULL; - u32 arg[2]; - - arg[0] = voltage_domain; - arg[1] = level; - - for (hdev_obj = (struct dev_object *)drv_get_first_dev_object(); - hdev_obj != NULL; - hdev_obj = (struct dev_object *)drv_get_next_dev_object - ((u32) hdev_obj)) { - if (!(dev_get_bridge_context(hdev_obj, - (struct bridge_dev_context - **)&dw_context))) { - if (!(dev_get_intf_fxns(hdev_obj, - (struct bridge_drv_interface **)&intf_fxns))) { - status = - (*intf_fxns->dev_cntrl) (dw_context, - BRDIOCTL_PRESCALE_NOTIFY, - (void *)&arg); - } - } - } - return status; -} - -/* - * ======== pwr_pm_post_scale======== - * Sends post-notification message to DSP. - */ -int pwr_pm_post_scale(u16 voltage_domain, u32 level) -{ - struct bridge_drv_interface *intf_fxns; - struct bridge_dev_context *dw_context; - int status = -EPERM; - struct dev_object *hdev_obj = NULL; - u32 arg[2]; - - arg[0] = voltage_domain; - arg[1] = level; - - for (hdev_obj = (struct dev_object *)drv_get_first_dev_object(); - hdev_obj != NULL; - hdev_obj = (struct dev_object *)drv_get_next_dev_object - ((u32) hdev_obj)) { - if (!(dev_get_bridge_context(hdev_obj, - (struct bridge_dev_context - **)&dw_context))) { - if (!(dev_get_intf_fxns(hdev_obj, - (struct bridge_drv_interface **)&intf_fxns))) { - status = - (*intf_fxns->dev_cntrl) (dw_context, - BRDIOCTL_POSTSCALE_NOTIFY, - (void *)&arg); - } - } - } - return status; - -} diff --git a/drivers/staging/tidspbridge/rmgr/rmm.c b/drivers/staging/tidspbridge/rmgr/rmm.c deleted file mode 100644 index 52187bd97729..000000000000 --- a/drivers/staging/tidspbridge/rmgr/rmm.c +++ /dev/null @@ -1,456 +0,0 @@ -/* - * rmm.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* - * This memory manager provides general heap management and arbitrary - * alignment for any number of memory segments. - * - * Notes: - * - * Memory blocks are allocated from the end of the first free memory - * block large enough to satisfy the request. Alignment requirements - * are satisfied by "sliding" the block forward until its base satisfies - * the alignment specification; if this is not possible then the next - * free block large enough to hold the request is tried. - * - * Since alignment can cause the creation of a new free block - the - * unused memory formed between the start of the original free block - * and the start of the allocated block - the memory manager must free - * this memory to prevent a memory leak. - * - * Overlay memory is managed by reserving through rmm_alloc, and freeing - * it through rmm_free. The memory manager prevents DSP code/data that is - * overlayed from being overwritten as long as the memory it runs at has - * been allocated, and not yet freed. - */ - -#include -#include - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- This */ -#include - -/* - * ======== rmm_header ======== - * This header is used to maintain a list of free memory blocks. - */ -struct rmm_header { - struct rmm_header *next; /* form a free memory link list */ - u32 size; /* size of the free memory */ - u32 addr; /* DSP address of memory block */ -}; - -/* - * ======== rmm_ovly_sect ======== - * Keeps track of memory occupied by overlay section. - */ -struct rmm_ovly_sect { - struct list_head list_elem; - u32 addr; /* Start of memory section */ - u32 size; /* Length (target MAUs) of section */ - s32 page; /* Memory page */ -}; - -/* - * ======== rmm_target_obj ======== - */ -struct rmm_target_obj { - struct rmm_segment *seg_tab; - struct rmm_header **free_list; - u32 num_segs; - struct list_head ovly_list; /* List of overlay memory in use */ -}; - -static bool alloc_block(struct rmm_target_obj *target, u32 segid, u32 size, - u32 align, u32 *dsp_address); -static bool free_block(struct rmm_target_obj *target, u32 segid, u32 addr, - u32 size); - -/* - * ======== rmm_alloc ======== - */ -int rmm_alloc(struct rmm_target_obj *target, u32 segid, u32 size, - u32 align, u32 *dsp_address, bool reserve) -{ - struct rmm_ovly_sect *sect, *prev_sect = NULL; - struct rmm_ovly_sect *new_sect; - u32 addr; - int status = 0; - - if (!reserve) { - if (!alloc_block(target, segid, size, align, dsp_address)) { - status = -ENOMEM; - } else { - /* Increment the number of allocated blocks in this - * segment */ - target->seg_tab[segid].number++; - } - goto func_end; - } - /* An overlay section - See if block is already in use. If not, - * insert into the list in ascending address size. */ - addr = *dsp_address; - /* Find place to insert new list element. List is sorted from - * smallest to largest address. */ - list_for_each_entry(sect, &target->ovly_list, list_elem) { - if (addr <= sect->addr) { - /* Check for overlap with sect */ - if ((addr + size > sect->addr) || (prev_sect && - (prev_sect->addr + - prev_sect->size > - addr))) { - status = -ENXIO; - } - break; - } - prev_sect = sect; - } - if (!status) { - /* No overlap - allocate list element for new section. */ - new_sect = kzalloc(sizeof(struct rmm_ovly_sect), GFP_KERNEL); - if (new_sect == NULL) { - status = -ENOMEM; - } else { - new_sect->addr = addr; - new_sect->size = size; - new_sect->page = segid; - if (list_is_last(§->list_elem, &target->ovly_list)) - /* Put new section at the end of the list */ - list_add_tail(&new_sect->list_elem, - &target->ovly_list); - else - /* Put new section just before sect */ - list_add_tail(&new_sect->list_elem, - §->list_elem); - } - } -func_end: - return status; -} - -/* - * ======== rmm_create ======== - */ -int rmm_create(struct rmm_target_obj **target_obj, - struct rmm_segment seg_tab[], u32 num_segs) -{ - struct rmm_header *hptr; - struct rmm_segment *sptr, *tmp; - struct rmm_target_obj *target; - s32 i; - int status = 0; - - /* Allocate DBL target object */ - target = kzalloc(sizeof(struct rmm_target_obj), GFP_KERNEL); - - if (target == NULL) - status = -ENOMEM; - - if (status) - goto func_cont; - - target->num_segs = num_segs; - if (!(num_segs > 0)) - goto func_cont; - - /* Allocate the memory for freelist from host's memory */ - target->free_list = kzalloc(num_segs * sizeof(struct rmm_header *), - GFP_KERNEL); - if (target->free_list == NULL) { - status = -ENOMEM; - } else { - /* Allocate headers for each element on the free list */ - for (i = 0; i < (s32) num_segs; i++) { - target->free_list[i] = - kzalloc(sizeof(struct rmm_header), GFP_KERNEL); - if (target->free_list[i] == NULL) { - status = -ENOMEM; - break; - } - } - /* Allocate memory for initial segment table */ - target->seg_tab = kzalloc(num_segs * sizeof(struct rmm_segment), - GFP_KERNEL); - if (target->seg_tab == NULL) { - status = -ENOMEM; - } else { - /* Initialize segment table and free list */ - sptr = target->seg_tab; - for (i = 0, tmp = seg_tab; num_segs > 0; - num_segs--, i++) { - *sptr = *tmp; - hptr = target->free_list[i]; - hptr->addr = tmp->base; - hptr->size = tmp->length; - hptr->next = NULL; - tmp++; - sptr++; - } - } - } -func_cont: - /* Initialize overlay memory list */ - if (!status) - INIT_LIST_HEAD(&target->ovly_list); - - if (!status) { - *target_obj = target; - } else { - *target_obj = NULL; - if (target) - rmm_delete(target); - - } - - return status; -} - -/* - * ======== rmm_delete ======== - */ -void rmm_delete(struct rmm_target_obj *target) -{ - struct rmm_ovly_sect *sect, *tmp; - struct rmm_header *hptr; - struct rmm_header *next; - u32 i; - - kfree(target->seg_tab); - - list_for_each_entry_safe(sect, tmp, &target->ovly_list, list_elem) { - list_del(§->list_elem); - kfree(sect); - } - - if (target->free_list != NULL) { - /* Free elements on freelist */ - for (i = 0; i < target->num_segs; i++) { - hptr = next = target->free_list[i]; - while (next) { - hptr = next; - next = hptr->next; - kfree(hptr); - } - } - kfree(target->free_list); - } - - kfree(target); -} - -/* - * ======== rmm_free ======== - */ -bool rmm_free(struct rmm_target_obj *target, u32 segid, u32 dsp_addr, u32 size, - bool reserved) -{ - struct rmm_ovly_sect *sect, *tmp; - bool ret = false; - - /* - * Free or unreserve memory. - */ - if (!reserved) { - ret = free_block(target, segid, dsp_addr, size); - if (ret) - target->seg_tab[segid].number--; - - } else { - /* Unreserve memory */ - list_for_each_entry_safe(sect, tmp, &target->ovly_list, - list_elem) { - if (dsp_addr == sect->addr) { - /* Remove from list */ - list_del(§->list_elem); - kfree(sect); - return true; - } - } - } - return ret; -} - -/* - * ======== rmm_stat ======== - */ -bool rmm_stat(struct rmm_target_obj *target, enum dsp_memtype segid, - struct dsp_memstat *mem_stat_buf) -{ - struct rmm_header *head; - bool ret = false; - u32 max_free_size = 0; - u32 total_free_size = 0; - u32 free_blocks = 0; - - if ((u32) segid < target->num_segs) { - head = target->free_list[segid]; - - /* Collect data from free_list */ - while (head != NULL) { - max_free_size = max(max_free_size, head->size); - total_free_size += head->size; - free_blocks++; - head = head->next; - } - - /* ul_size */ - mem_stat_buf->size = target->seg_tab[segid].length; - - /* num_free_blocks */ - mem_stat_buf->num_free_blocks = free_blocks; - - /* total_free_size */ - mem_stat_buf->total_free_size = total_free_size; - - /* len_max_free_block */ - mem_stat_buf->len_max_free_block = max_free_size; - - /* num_alloc_blocks */ - mem_stat_buf->num_alloc_blocks = - target->seg_tab[segid].number; - - ret = true; - } - - return ret; -} - -/* - * ======== balloc ======== - * This allocation function allocates memory from the lowest addresses - * first. - */ -static bool alloc_block(struct rmm_target_obj *target, u32 segid, u32 size, - u32 align, u32 *dsp_address) -{ - struct rmm_header *head; - struct rmm_header *prevhead = NULL; - struct rmm_header *next; - u32 tmpalign; - u32 alignbytes; - u32 hsize; - u32 allocsize; - u32 addr; - - alignbytes = (align == 0) ? 1 : align; - prevhead = NULL; - head = target->free_list[segid]; - - do { - hsize = head->size; - next = head->next; - - addr = head->addr; /* alloc from the bottom */ - - /* align allocation */ - (tmpalign = (u32) addr % alignbytes); - if (tmpalign != 0) - tmpalign = alignbytes - tmpalign; - - allocsize = size + tmpalign; - - if (hsize >= allocsize) { /* big enough */ - if (hsize == allocsize && prevhead != NULL) { - prevhead->next = next; - kfree(head); - } else { - head->size = hsize - allocsize; - head->addr += allocsize; - } - - /* free up any hole created by alignment */ - if (tmpalign) - free_block(target, segid, addr, tmpalign); - - *dsp_address = addr + tmpalign; - return true; - } - - prevhead = head; - head = next; - - } while (head != NULL); - - return false; -} - -/* - * ======== free_block ======== - * TO DO: free_block() allocates memory, which could result in failure. - * Could allocate an rmm_header in rmm_alloc(), to be kept in a pool. - * free_block() could use an rmm_header from the pool, freeing as blocks - * are coalesced. - */ -static bool free_block(struct rmm_target_obj *target, u32 segid, u32 addr, - u32 size) -{ - struct rmm_header *head; - struct rmm_header *thead; - struct rmm_header *rhead; - bool ret = true; - - /* Create a memory header to hold the newly free'd block. */ - rhead = kzalloc(sizeof(struct rmm_header), GFP_KERNEL); - if (rhead == NULL) { - ret = false; - } else { - /* search down the free list to find the right place for addr */ - head = target->free_list[segid]; - - if (addr >= head->addr) { - while (head->next != NULL && addr > head->next->addr) - head = head->next; - - thead = head->next; - - head->next = rhead; - rhead->next = thead; - rhead->addr = addr; - rhead->size = size; - } else { - *rhead = *head; - head->next = rhead; - head->addr = addr; - head->size = size; - thead = rhead->next; - } - - /* join with upper block, if possible */ - if (thead != NULL && (rhead->addr + rhead->size) == - thead->addr) { - head->next = rhead->next; - thead->size = size + thead->size; - thead->addr = addr; - kfree(rhead); - rhead = thead; - } - - /* join with the lower block, if possible */ - if ((head->addr + head->size) == rhead->addr) { - head->next = rhead->next; - head->size = head->size + rhead->size; - kfree(rhead); - } - } - - return ret; -} diff --git a/drivers/staging/tidspbridge/rmgr/strm.c b/drivers/staging/tidspbridge/rmgr/strm.c deleted file mode 100644 index b88b27bbe2e7..000000000000 --- a/drivers/staging/tidspbridge/rmgr/strm.c +++ /dev/null @@ -1,733 +0,0 @@ -/* - * strm.c - * - * DSP-BIOS Bridge driver support functions for TI OMAP processors. - * - * DSP/BIOS Bridge Stream Manager. - * - * Copyright (C) 2005-2006 Texas Instruments, Inc. - * - * This package is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include - -/* ----------------------------------- Host OS */ -#include - -/* ----------------------------------- DSP/BIOS Bridge */ -#include - -/* ----------------------------------- OS Adaptation Layer */ -#include - -/* ----------------------------------- Bridge Driver */ -#include - -/* ----------------------------------- Resource Manager */ -#include - -/* ----------------------------------- Others */ -#include - -/* ----------------------------------- This */ -#include - -#include - -/* ----------------------------------- Defines, Data Structures, Typedefs */ -#define DEFAULTTIMEOUT 10000 -#define DEFAULTNUMBUFS 2 - -/* - * ======== strm_mgr ======== - * The strm_mgr contains device information needed to open the underlying - * channels of a stream. - */ -struct strm_mgr { - struct dev_object *dev_obj; /* Device for this processor */ - struct chnl_mgr *chnl_mgr; /* Channel manager */ - /* Function interface to Bridge driver */ - struct bridge_drv_interface *intf_fxns; -}; - -/* - * ======== strm_object ======== - * This object is allocated in strm_open(). - */ -struct strm_object { - struct strm_mgr *strm_mgr_obj; - struct chnl_object *chnl_obj; - u32 dir; /* DSP_TONODE or DSP_FROMNODE */ - u32 timeout; - u32 num_bufs; /* Max # of bufs allowed in stream */ - u32 bufs_in_strm; /* Current # of bufs in stream */ - u32 bytes; /* bytes transferred since idled */ - /* STREAM_IDLE, STREAM_READY, ... */ - enum dsp_streamstate strm_state; - void *user_event; /* Saved for strm_get_info() */ - enum dsp_strmmode strm_mode; /* STRMMODE_[PROCCOPY][ZEROCOPY]... */ - u32 dma_chnl_id; /* DMA chnl id */ - u32 dma_priority; /* DMA priority:DMAPRI_[LOW][HIGH] */ - u32 segment_id; /* >0 is SM segment.=0 is local heap */ - u32 buf_alignment; /* Alignment for stream bufs */ - /* Stream's SM address translator */ - struct cmm_xlatorobject *xlator; -}; - -/* ----------------------------------- Function Prototypes */ -static int delete_strm(struct strm_object *stream_obj); - -/* - * ======== strm_allocate_buffer ======== - * Purpose: - * Allocates buffers for a stream. - */ -int strm_allocate_buffer(struct strm_res_object *strmres, u32 usize, - u8 **ap_buffer, u32 num_bufs, - struct process_context *pr_ctxt) -{ - int status = 0; - u32 alloc_cnt = 0; - u32 i; - struct strm_object *stream_obj = strmres->stream; - - if (stream_obj) { - /* - * Allocate from segment specified at time of stream open. - */ - if (usize == 0) - status = -EINVAL; - - } else { - status = -EFAULT; - } - - if (status) - goto func_end; - - for (i = 0; i < num_bufs; i++) { - (void)cmm_xlator_alloc_buf(stream_obj->xlator, &ap_buffer[i], - usize); - if (ap_buffer[i] == NULL) { - status = -ENOMEM; - alloc_cnt = i; - break; - } - } - if (status) - strm_free_buffer(strmres, ap_buffer, alloc_cnt, pr_ctxt); - - if (status) - goto func_end; - - drv_proc_update_strm_res(num_bufs, strmres); - -func_end: - return status; -} - -/* - * ======== strm_close ======== - * Purpose: - * Close a stream opened with strm_open(). - */ -int strm_close(struct strm_res_object *strmres, - struct process_context *pr_ctxt) -{ - struct bridge_drv_interface *intf_fxns; - struct chnl_info chnl_info_obj; - int status = 0; - struct strm_object *stream_obj = strmres->stream; - - if (!stream_obj) { - status = -EFAULT; - } else { - /* Have all buffers been reclaimed? If not, return - * -EPIPE */ - intf_fxns = stream_obj->strm_mgr_obj->intf_fxns; - status = - (*intf_fxns->chnl_get_info) (stream_obj->chnl_obj, - &chnl_info_obj); - - if (chnl_info_obj.cio_cs > 0 || chnl_info_obj.cio_reqs > 0) - status = -EPIPE; - else - status = delete_strm(stream_obj); - } - - if (status) - goto func_end; - - idr_remove(pr_ctxt->stream_id, strmres->id); -func_end: - dev_dbg(bridge, "%s: stream_obj: %p, status 0x%x\n", __func__, - stream_obj, status); - return status; -} - -/* - * ======== strm_create ======== - * Purpose: - * Create a STRM manager object. - */ -int strm_create(struct strm_mgr **strm_man, - struct dev_object *dev_obj) -{ - struct strm_mgr *strm_mgr_obj; - int status = 0; - - *strm_man = NULL; - /* Allocate STRM manager object */ - strm_mgr_obj = kzalloc(sizeof(struct strm_mgr), GFP_KERNEL); - if (strm_mgr_obj == NULL) - status = -ENOMEM; - else - strm_mgr_obj->dev_obj = dev_obj; - - /* Get Channel manager and Bridge function interface */ - if (!status) { - status = dev_get_chnl_mgr(dev_obj, &(strm_mgr_obj->chnl_mgr)); - if (!status) { - (void)dev_get_intf_fxns(dev_obj, - &(strm_mgr_obj->intf_fxns)); - } - } - - if (!status) - *strm_man = strm_mgr_obj; - else - kfree(strm_mgr_obj); - - return status; -} - -/* - * ======== strm_delete ======== - * Purpose: - * Delete the STRM Manager Object. - */ -void strm_delete(struct strm_mgr *strm_mgr_obj) -{ - kfree(strm_mgr_obj); -} - -/* - * ======== strm_free_buffer ======== - * Purpose: - * Frees the buffers allocated for a stream. - */ -int strm_free_buffer(struct strm_res_object *strmres, u8 **ap_buffer, - u32 num_bufs, struct process_context *pr_ctxt) -{ - int status = 0; - u32 i = 0; - struct strm_object *stream_obj = strmres->stream; - - if (!stream_obj) - status = -EFAULT; - - if (!status) { - for (i = 0; i < num_bufs; i++) { - status = - cmm_xlator_free_buf(stream_obj->xlator, - ap_buffer[i]); - if (status) - break; - ap_buffer[i] = NULL; - } - } - drv_proc_update_strm_res(num_bufs - i, strmres); - - return status; -} - -/* - * ======== strm_get_info ======== - * Purpose: - * Retrieves information about a stream. - */ -int strm_get_info(struct strm_object *stream_obj, - struct stream_info *stream_info, - u32 stream_info_size) -{ - struct bridge_drv_interface *intf_fxns; - struct chnl_info chnl_info_obj; - int status = 0; - void *virt_base = NULL; /* NULL if no SM used */ - - if (!stream_obj) { - status = -EFAULT; - } else { - if (stream_info_size < sizeof(struct stream_info)) { - /* size of users info */ - status = -EINVAL; - } - } - if (status) - goto func_end; - - intf_fxns = stream_obj->strm_mgr_obj->intf_fxns; - status = - (*intf_fxns->chnl_get_info) (stream_obj->chnl_obj, - &chnl_info_obj); - if (status) - goto func_end; - - if (stream_obj->xlator) { - /* We have a translator */ - cmm_xlator_info(stream_obj->xlator, (u8 **) &virt_base, 0, - stream_obj->segment_id, false); - } - stream_info->segment_id = stream_obj->segment_id; - stream_info->strm_mode = stream_obj->strm_mode; - stream_info->virt_base = virt_base; - stream_info->user_strm->number_bufs_allowed = stream_obj->num_bufs; - stream_info->user_strm->number_bufs_in_stream = chnl_info_obj.cio_cs + - chnl_info_obj.cio_reqs; - /* # of bytes transferred since last call to DSPStream_Idle() */ - stream_info->user_strm->number_bytes = chnl_info_obj.bytes_tx; - stream_info->user_strm->sync_object_handle = chnl_info_obj.event_obj; - /* Determine stream state based on channel state and info */ - if (chnl_info_obj.state & CHNL_STATEEOS) { - stream_info->user_strm->ss_stream_state = STREAM_DONE; - } else { - if (chnl_info_obj.cio_cs > 0) - stream_info->user_strm->ss_stream_state = STREAM_READY; - else if (chnl_info_obj.cio_reqs > 0) - stream_info->user_strm->ss_stream_state = - STREAM_PENDING; - else - stream_info->user_strm->ss_stream_state = STREAM_IDLE; - - } -func_end: - return status; -} - -/* - * ======== strm_idle ======== - * Purpose: - * Idles a particular stream. - */ -int strm_idle(struct strm_object *stream_obj, bool flush_data) -{ - struct bridge_drv_interface *intf_fxns; - int status = 0; - - if (!stream_obj) { - status = -EFAULT; - } else { - intf_fxns = stream_obj->strm_mgr_obj->intf_fxns; - - status = (*intf_fxns->chnl_idle) (stream_obj->chnl_obj, - stream_obj->timeout, - flush_data); - } - - dev_dbg(bridge, "%s: stream_obj: %p flush_data: 0x%x status: 0x%x\n", - __func__, stream_obj, flush_data, status); - return status; -} - -/* - * ======== strm_issue ======== - * Purpose: - * Issues a buffer on a stream - */ -int strm_issue(struct strm_object *stream_obj, u8 *pbuf, u32 ul_bytes, - u32 ul_buf_size, u32 dw_arg) -{ - struct bridge_drv_interface *intf_fxns; - int status = 0; - void *tmp_buf = NULL; - - if (!stream_obj) { - status = -EFAULT; - } else { - intf_fxns = stream_obj->strm_mgr_obj->intf_fxns; - - if (stream_obj->segment_id != 0) { - tmp_buf = cmm_xlator_translate(stream_obj->xlator, - (void *)pbuf, - CMM_VA2DSPPA); - if (tmp_buf == NULL) - status = -ESRCH; - - } - if (!status) { - status = (*intf_fxns->chnl_add_io_req) - (stream_obj->chnl_obj, pbuf, ul_bytes, ul_buf_size, - (u32) tmp_buf, dw_arg); - } - if (status == -EIO) - status = -ENOSR; - } - - dev_dbg(bridge, "%s: stream_obj: %p pbuf: %p ul_bytes: 0x%x dw_arg:" - " 0x%x status: 0x%x\n", __func__, stream_obj, pbuf, - ul_bytes, dw_arg, status); - return status; -} - -/* - * ======== strm_open ======== - * Purpose: - * Open a stream for sending/receiving data buffers to/from a task or - * XDAIS socket node on the DSP. - */ -int strm_open(struct node_object *hnode, u32 dir, u32 index, - struct strm_attr *pattr, - struct strm_res_object **strmres, - struct process_context *pr_ctxt) -{ - struct strm_mgr *strm_mgr_obj; - struct bridge_drv_interface *intf_fxns; - u32 ul_chnl_id; - struct strm_object *strm_obj = NULL; - s8 chnl_mode; - struct chnl_attr chnl_attr_obj; - int status = 0; - struct cmm_object *hcmm_mgr = NULL; /* Shared memory manager hndl */ - - void *stream_res; - - *strmres = NULL; - if (dir != DSP_TONODE && dir != DSP_FROMNODE) { - status = -EPERM; - } else { - /* Get the channel id from the node (set in node_connect()) */ - status = node_get_channel_id(hnode, dir, index, &ul_chnl_id); - } - if (!status) - status = node_get_strm_mgr(hnode, &strm_mgr_obj); - - if (!status) { - strm_obj = kzalloc(sizeof(struct strm_object), GFP_KERNEL); - if (strm_obj == NULL) { - status = -ENOMEM; - } else { - strm_obj->strm_mgr_obj = strm_mgr_obj; - strm_obj->dir = dir; - strm_obj->strm_state = STREAM_IDLE; - strm_obj->user_event = pattr->user_event; - if (pattr->stream_attr_in != NULL) { - strm_obj->timeout = - pattr->stream_attr_in->timeout; - strm_obj->num_bufs = - pattr->stream_attr_in->num_bufs; - strm_obj->strm_mode = - pattr->stream_attr_in->strm_mode; - strm_obj->segment_id = - pattr->stream_attr_in->segment_id; - strm_obj->buf_alignment = - pattr->stream_attr_in->buf_alignment; - strm_obj->dma_chnl_id = - pattr->stream_attr_in->dma_chnl_id; - strm_obj->dma_priority = - pattr->stream_attr_in->dma_priority; - chnl_attr_obj.uio_reqs = - pattr->stream_attr_in->num_bufs; - } else { - strm_obj->timeout = DEFAULTTIMEOUT; - strm_obj->num_bufs = DEFAULTNUMBUFS; - strm_obj->strm_mode = STRMMODE_PROCCOPY; - strm_obj->segment_id = 0; /* local mem */ - strm_obj->buf_alignment = 0; - strm_obj->dma_chnl_id = 0; - strm_obj->dma_priority = 0; - chnl_attr_obj.uio_reqs = DEFAULTNUMBUFS; - } - chnl_attr_obj.reserved1 = NULL; - /* DMA chnl flush timeout */ - chnl_attr_obj.reserved2 = strm_obj->timeout; - chnl_attr_obj.event_obj = NULL; - if (pattr->user_event != NULL) - chnl_attr_obj.event_obj = pattr->user_event; - - } - } - if (status) - goto func_cont; - - if ((pattr->virt_base == NULL) || !(pattr->virt_size > 0)) - goto func_cont; - - /* No System DMA */ - /* Get the shared mem mgr for this streams dev object */ - status = dev_get_cmm_mgr(strm_mgr_obj->dev_obj, &hcmm_mgr); - if (!status) { - /*Allocate a SM addr translator for this strm. */ - status = cmm_xlator_create(&strm_obj->xlator, hcmm_mgr, NULL); - if (!status) { - /* Set translators Virt Addr attributes */ - status = cmm_xlator_info(strm_obj->xlator, - (u8 **) &pattr->virt_base, - pattr->virt_size, - strm_obj->segment_id, true); - } - } -func_cont: - if (!status) { - /* Open channel */ - chnl_mode = (dir == DSP_TONODE) ? - CHNL_MODETODSP : CHNL_MODEFROMDSP; - intf_fxns = strm_mgr_obj->intf_fxns; - status = (*intf_fxns->chnl_open) (&(strm_obj->chnl_obj), - strm_mgr_obj->chnl_mgr, - chnl_mode, ul_chnl_id, - &chnl_attr_obj); - if (status) { - /* - * over-ride non-returnable status codes so we return - * something documented - */ - if (status != -ENOMEM && status != - -EINVAL && status != -EPERM) { - /* - * We got a status that's not return-able. - * Assert that we got something we were - * expecting (-EFAULT isn't acceptable, - * strm_mgr_obj->chnl_mgr better be valid or we - * assert here), and then return -EPERM. - */ - status = -EPERM; - } - } - } - if (!status) { - status = drv_proc_insert_strm_res_element(strm_obj, - &stream_res, pr_ctxt); - if (status) - delete_strm(strm_obj); - else - *strmres = (struct strm_res_object *)stream_res; - } else { - (void)delete_strm(strm_obj); - } - - dev_dbg(bridge, "%s: hnode: %p dir: 0x%x index: 0x%x pattr: %p " - "strmres: %p status: 0x%x\n", __func__, - hnode, dir, index, pattr, strmres, status); - return status; -} - -/* - * ======== strm_reclaim ======== - * Purpose: - * Relcaims a buffer from a stream. - */ -int strm_reclaim(struct strm_object *stream_obj, u8 **buf_ptr, - u32 *nbytes, u32 *buff_size, u32 *pdw_arg) -{ - struct bridge_drv_interface *intf_fxns; - struct chnl_ioc chnl_ioc_obj; - int status = 0; - void *tmp_buf = NULL; - - if (!stream_obj) { - status = -EFAULT; - goto func_end; - } - intf_fxns = stream_obj->strm_mgr_obj->intf_fxns; - - status = - (*intf_fxns->chnl_get_ioc) (stream_obj->chnl_obj, - stream_obj->timeout, - &chnl_ioc_obj); - if (!status) { - *nbytes = chnl_ioc_obj.byte_size; - if (buff_size) - *buff_size = chnl_ioc_obj.buf_size; - - *pdw_arg = chnl_ioc_obj.arg; - if (!CHNL_IS_IO_COMPLETE(chnl_ioc_obj)) { - if (CHNL_IS_TIMED_OUT(chnl_ioc_obj)) { - status = -ETIME; - } else { - /* Allow reclaims after idle to succeed */ - if (!CHNL_IS_IO_CANCELLED(chnl_ioc_obj)) - status = -EPERM; - - } - } - /* Translate zerocopy buffer if channel not canceled. */ - if (!status - && (!CHNL_IS_IO_CANCELLED(chnl_ioc_obj)) - && (stream_obj->strm_mode == STRMMODE_ZEROCOPY)) { - /* - * This is a zero-copy channel so chnl_ioc_obj.buf - * contains the DSP address of SM. We need to - * translate it to a virtual address for the user - * thread to access. - * Note: Could add CMM_DSPPA2VA to CMM in the future. - */ - tmp_buf = cmm_xlator_translate(stream_obj->xlator, - chnl_ioc_obj.buf, - CMM_DSPPA2PA); - if (tmp_buf != NULL) { - /* now convert this GPP Pa to Va */ - tmp_buf = cmm_xlator_translate(stream_obj-> - xlator, - tmp_buf, - CMM_PA2VA); - } - if (tmp_buf == NULL) - status = -ESRCH; - - chnl_ioc_obj.buf = tmp_buf; - } - *buf_ptr = chnl_ioc_obj.buf; - } -func_end: - dev_dbg(bridge, "%s: stream_obj: %p buf_ptr: %p nbytes: %p " - "pdw_arg: %p status 0x%x\n", __func__, stream_obj, - buf_ptr, nbytes, pdw_arg, status); - return status; -} - -/* - * ======== strm_register_notify ======== - * Purpose: - * Register to be notified on specific events for this stream. - */ -int strm_register_notify(struct strm_object *stream_obj, u32 event_mask, - u32 notify_type, struct dsp_notification - *hnotification) -{ - struct bridge_drv_interface *intf_fxns; - int status = 0; - - if (!stream_obj) { - status = -EFAULT; - } else if ((event_mask & ~((DSP_STREAMIOCOMPLETION) | - DSP_STREAMDONE)) != 0) { - status = -EINVAL; - } else { - if (notify_type != DSP_SIGNALEVENT) - status = -ENOSYS; - - } - if (!status) { - intf_fxns = stream_obj->strm_mgr_obj->intf_fxns; - - status = - (*intf_fxns->chnl_register_notify) (stream_obj-> - chnl_obj, - event_mask, - notify_type, - hnotification); - } - - return status; -} - -/* - * ======== strm_select ======== - * Purpose: - * Selects a ready stream. - */ -int strm_select(struct strm_object **strm_tab, u32 strms, - u32 *pmask, u32 utimeout) -{ - u32 index; - struct chnl_info chnl_info_obj; - struct bridge_drv_interface *intf_fxns; - struct sync_object **sync_events = NULL; - u32 i; - int status = 0; - - *pmask = 0; - for (i = 0; i < strms; i++) { - if (!strm_tab[i]) { - status = -EFAULT; - break; - } - } - if (status) - goto func_end; - - /* Determine which channels have IO ready */ - for (i = 0; i < strms; i++) { - intf_fxns = strm_tab[i]->strm_mgr_obj->intf_fxns; - status = (*intf_fxns->chnl_get_info) (strm_tab[i]->chnl_obj, - &chnl_info_obj); - if (status) { - break; - } else { - if (chnl_info_obj.cio_cs > 0) - *pmask |= (1 << i); - - } - } - if (!status && utimeout > 0 && *pmask == 0) { - /* Non-zero timeout */ - sync_events = kmalloc(strms * sizeof(struct sync_object *), - GFP_KERNEL); - - if (sync_events == NULL) { - status = -ENOMEM; - } else { - for (i = 0; i < strms; i++) { - intf_fxns = - strm_tab[i]->strm_mgr_obj->intf_fxns; - status = (*intf_fxns->chnl_get_info) - (strm_tab[i]->chnl_obj, &chnl_info_obj); - if (status) - break; - else - sync_events[i] = - chnl_info_obj.sync_event; - - } - } - if (!status) { - status = - sync_wait_on_multiple_events(sync_events, strms, - utimeout, &index); - if (!status) { - /* Since we waited on the event, we have to - * reset it */ - sync_set_event(sync_events[index]); - *pmask = 1 << index; - } - } - } -func_end: - kfree(sync_events); - - return status; -} - -/* - * ======== delete_strm ======== - * Purpose: - * Frees the resources allocated for a stream. - */ -static int delete_strm(struct strm_object *stream_obj) -{ - struct bridge_drv_interface *intf_fxns; - int status = 0; - - if (stream_obj) { - if (stream_obj->chnl_obj) { - intf_fxns = stream_obj->strm_mgr_obj->intf_fxns; - /* Channel close can fail only if the channel handle - * is invalid. */ - status = (*intf_fxns->chnl_close) - (stream_obj->chnl_obj); - } - /* Free all SM address translator resources */ - kfree(stream_obj->xlator); - kfree(stream_obj); - } else { - status = -EFAULT; - } - return status; -} -- cgit v1.2.3 From e6a152efae0576fb1dd91c3abcbd95e2c7196e58 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Thu, 17 Jul 2014 23:34:58 +0200 Subject: Update speakup mailing list address The speakup mailing list only works on the linux-speakup.org domain now. Signed-off-by: Samuel Thibault Signed-off-by: Greg Kroah-Hartman --- MAINTAINERS | 2 +- drivers/staging/speakup/TODO | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'MAINTAINERS') diff --git a/MAINTAINERS b/MAINTAINERS index 5ca5b5638495..0a2c776339db 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8619,7 +8619,7 @@ M: William Hubbs M: Chris Brannon M: Kirk Reiser M: Samuel Thibault -L: speakup@braille.uwo.ca +L: speakup@linux-speakup.org W: http://www.linux-speakup.org/ S: Odd Fixes F: drivers/staging/speakup/ diff --git a/drivers/staging/speakup/TODO b/drivers/staging/speakup/TODO index c3612e4b8ac8..3094799cf6a0 100644 --- a/drivers/staging/speakup/TODO +++ b/drivers/staging/speakup/TODO @@ -1,6 +1,6 @@ Speakup project home: http://www.linux-speakup.org -Mailing List: speakup@braille.uwo.ca +Mailing List: speakup@linux-speakup.org Speakup is a kernel based screen review package for the linux operating system. It allows blind users to interact with applications on the -- cgit v1.2.3 From 0d317b91d6d8f0ddb24623228e921e40f3d42265 Mon Sep 17 00:00:00 2001 From: Kristina Martšenko Date: Thu, 24 Jul 2014 01:35:00 +0300 Subject: staging: frontier: remove driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The driver hasn't been cleaned up and it doesn't look like anyone is working on it anymore (including the original author). So remove the driver from the kernel. If someone wants to work on cleaning it up and moving it out of staging, this commit can be reverted. Signed-off-by: Kristina Martšenko Cc: David Täht Signed-off-by: Greg Kroah-Hartman --- MAINTAINERS | 5 - drivers/staging/Kconfig | 2 - drivers/staging/Makefile | 1 - drivers/staging/frontier/Kconfig | 5 - drivers/staging/frontier/Makefile | 2 - drivers/staging/frontier/README | 47 -- drivers/staging/frontier/TODO | 9 - drivers/staging/frontier/alphatrack.c | 849 ----------------------------- drivers/staging/frontier/alphatrack.h | 78 --- drivers/staging/frontier/tranzport.c | 973 ---------------------------------- 10 files changed, 1971 deletions(-) delete mode 100644 drivers/staging/frontier/Kconfig delete mode 100644 drivers/staging/frontier/Makefile delete mode 100644 drivers/staging/frontier/README delete mode 100644 drivers/staging/frontier/TODO delete mode 100644 drivers/staging/frontier/alphatrack.c delete mode 100644 drivers/staging/frontier/alphatrack.h delete mode 100644 drivers/staging/frontier/tranzport.c (limited to 'MAINTAINERS') diff --git a/MAINTAINERS b/MAINTAINERS index 0a2c776339db..c6b4fa413b3b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8542,11 +8542,6 @@ M: Marek Belisko S: Odd Fixes F: drivers/staging/ft1000/ -STAGING - FRONTIER TRANZPORT AND ALPHATRACK -M: David Täht -S: Odd Fixes -F: drivers/staging/frontier/ - STAGING - GO7007 MPEG CODEC M: Hans Verkuil S: Maintained diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index 0a92dc6ab77c..d6a10c013a7f 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -54,8 +54,6 @@ source "drivers/staging/rtl8821ae/Kconfig" source "drivers/staging/rts5208/Kconfig" -source "drivers/staging/frontier/Kconfig" - source "drivers/staging/phison/Kconfig" source "drivers/staging/line6/Kconfig" diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index fe5e76cd4cde..4a708e95d307 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -19,7 +19,6 @@ obj-$(CONFIG_R8192EE) += rtl8192ee/ obj-$(CONFIG_R8723AU) += rtl8723au/ obj-$(CONFIG_R8821AE) += rtl8821ae/ obj-$(CONFIG_RTS5208) += rts5208/ -obj-$(CONFIG_TRANZPORT) += frontier/ obj-$(CONFIG_IDE_PHISON) += phison/ obj-$(CONFIG_LINE6_USB) += line6/ obj-$(CONFIG_NETLOGIC_XLR_NET) += netlogic/ diff --git a/drivers/staging/frontier/Kconfig b/drivers/staging/frontier/Kconfig deleted file mode 100644 index 4da290b2f5bd..000000000000 --- a/drivers/staging/frontier/Kconfig +++ /dev/null @@ -1,5 +0,0 @@ -config TRANZPORT - tristate "Frontier Tranzport and Alphatrack support" - depends on USB - ---help--- - Enable support for the Frontier Tranzport and Alphatrack devices. diff --git a/drivers/staging/frontier/Makefile b/drivers/staging/frontier/Makefile deleted file mode 100644 index 2d2ac97492dd..000000000000 --- a/drivers/staging/frontier/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -obj-$(CONFIG_TRANZPORT) += tranzport.o -obj-$(CONFIG_TRANZPORT) += alphatrack.o diff --git a/drivers/staging/frontier/README b/drivers/staging/frontier/README deleted file mode 100644 index cd07af22406a..000000000000 --- a/drivers/staging/frontier/README +++ /dev/null @@ -1,47 +0,0 @@ -This directory contains the Linux USB Tranzport and Alphatrack Kernel drivers. - -See http://www.frontierdesign.com for details on these devices. - -Userspace test code is available from - -git://toutatis.isc.org/home/d/src/git/frontier.git - -At present the tranzport does reads/writes of 8 byte cmds to -/dev/tranzport0 to control the lights, screen, and wheel. - -At present the alphatrack accepts reads/writes of 12 byte cmds to -/dev/tranzport0 to control the lights, screen, fader and touchpad. - -The tranzport driver provides a rudimentary sysfs interface for the status of -the device and a writable parameter for turning wheel compression on and off. - -The API is nothing more than the USB commands issued to the device. Why? - -The control wheel/fader can generate events far too quickly for -a typical userspace application to keep up with them via libusb. Input -needs to be 100% accurate and fast in order for the alphatrack or tranzport -to be useful. - -UIO would be useful except that usb disconnect events need -to be handled correctly. - -A sysfs interface is perfect for simple userspace apps to do fun things with -the lights and screen. But it's fairly lousy for handling input events and -very lousy for watching the state of the shuttle wheel. - -A linux input events interface is great for the input events and shuttle wheel. -* It's theoretically OK on LEDs. -* A fader can be mapped to an absolute mouse device. -* But there is no LCD support at all, or fader feedback support in that API - -So, thus, these stubby drivers exist. - -In the end this could be driven by a midi layer, which handles all those -cases via a well defined API, but - among other things - is slow, doesn't do -flow control, and is a LOT of extra work, none of which is required at -the kernel level (probably). Frankly, I'd like to keep the -core driver simple because the only realtime work really required is -the bottom half interrupt handler and the output overlapping. - -Exposing some sort of clean api to userspace would be perfect. What that -API looks like? Gah. beats me. diff --git a/drivers/staging/frontier/TODO b/drivers/staging/frontier/TODO deleted file mode 100644 index 3620ad2df3ee..000000000000 --- a/drivers/staging/frontier/TODO +++ /dev/null @@ -1,9 +0,0 @@ -TODO: - - checkpatch.pl clean - - sparse clean - - fix userspace interface to be sane - - possibly just port to userspace with libusb - - review by the USB developer community - -Please send any patches for this driver to Greg Kroah-Hartman -and David Taht . diff --git a/drivers/staging/frontier/alphatrack.c b/drivers/staging/frontier/alphatrack.c deleted file mode 100644 index 226b23163109..000000000000 --- a/drivers/staging/frontier/alphatrack.c +++ /dev/null @@ -1,849 +0,0 @@ -/* - * Frontier Designs Alphatrack driver - * - * Copyright (C) 2007 Michael Taht (m@taht.net) - * - * Based on the usbled driver and ldusb drivers by - * - * Copyright (C) 2004 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (C) 2005 Michael Hund - * - * The ldusb driver was, in turn, derived from Lego USB Tower driver - * Copyright (C) 2003 David Glance - * 2001-2004 Juergen Stuber - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation, version 2. - * - */ - -/** - * This driver uses a ring buffer for time critical reading of - * interrupt in reports and provides read and write methods for - * raw interrupt reports. - */ - -/* - * Note: this currently uses a dumb ringbuffer for reads and writes. - * A more optimal driver would cache and kill off outstanding urbs that are - * now invalid, and ignore ones that already were in the queue but valid - * as we only have 30 commands for the alphatrack. In particular this is - * key for getting lights to flash in time as otherwise many commands - * can be buffered up before the light change makes it to the interface. - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "alphatrack.h" - -#define VENDOR_ID 0x165b -#define PRODUCT_ID 0xfad1 - -#ifdef CONFIG_USB_DYNAMIC_MINORS -#define USB_ALPHATRACK_MINOR_BASE 0 -#else -/* FIXME 176 - is another driver's minor - apply for that */ -#define USB_ALPHATRACK_MINOR_BASE 176 -#endif - -/* table of devices that work with this driver */ -static const struct usb_device_id usb_alphatrack_table[] = { - {USB_DEVICE(VENDOR_ID, PRODUCT_ID)}, - {} /* Terminating entry */ -}; - -MODULE_DEVICE_TABLE(usb, usb_alphatrack_table); -MODULE_VERSION("0.41"); -MODULE_AUTHOR("Mike Taht "); -MODULE_DESCRIPTION("Alphatrack USB Driver"); -MODULE_LICENSE("GPL"); -MODULE_SUPPORTED_DEVICE("Frontier Designs Alphatrack Control Surface"); - -/* These aren't done yet */ - -#define SUPPRESS_EXTRA_ONLINE_EVENTS 0 -#define BUFFERED_WRITES 0 -#define SUPPRESS_EXTRA_OFFLINE_EVENTS 0 -#define COMPRESS_FADER_EVENTS 0 - -#define BUFFERED_READS 1 -#define RING_BUFFER_SIZE 512 -#define WRITE_BUFFER_SIZE 34 -#define ALPHATRACK_USB_TIMEOUT 10 -#define OUTPUT_CMD_SIZE 8 -#define INPUT_CMD_SIZE 12 -#define ALPHATRACK_DEBUG 0 - -static int debug = ALPHATRACK_DEBUG; - -/* Use our own dbg macro */ -#define dbg_info(dev, format, arg...) do \ - { if (debug) dev_info(dev , format , ## arg); } while (0) - -#define alphatrack_ocmd_info(dev, cmd, format, arg...) - -#define alphatrack_icmd_info(dev, cmd, format, arg...) - -/* Module parameters */ - -module_param(debug, int, S_IRUGO | S_IWUSR); -MODULE_PARM_DESC(debug, "Debug enabled or not"); - -/* - * All interrupt in transfers are collected in a ring buffer to - * avoid racing conditions and get better performance of the driver. - */ - -static int ring_buffer_size = RING_BUFFER_SIZE; - -module_param(ring_buffer_size, int, S_IRUGO); -MODULE_PARM_DESC(ring_buffer_size, "Read ring buffer size"); - -/* The write_buffer can one day contain more than one interrupt out transfer.*/ - -static int write_buffer_size = WRITE_BUFFER_SIZE; -module_param(write_buffer_size, int, S_IRUGO); -MODULE_PARM_DESC(write_buffer_size, "Write buffer size"); - -/* - * Increase the interval for debugging purposes. - * or set to 1 to use the standard interval from the endpoint descriptors. - */ - -static int min_interrupt_in_interval = ALPHATRACK_USB_TIMEOUT; -module_param(min_interrupt_in_interval, int, 0); -MODULE_PARM_DESC(min_interrupt_in_interval, - "Minimum interrupt in interval in ms"); - -static int min_interrupt_out_interval = ALPHATRACK_USB_TIMEOUT; -module_param(min_interrupt_out_interval, int, 0); -MODULE_PARM_DESC(min_interrupt_out_interval, - "Minimum interrupt out interval in ms"); - -/* Structure to hold all of our device specific stuff */ - -struct usb_alphatrack { - struct mutex mtx; /* locks this structure */ - struct usb_interface *intf; /* save off the usb interface pointer */ - int open_count; /* number of times this port has been opened */ - - /* make gcc happy */ - struct alphatrack_icmd (*ring_buffer)[RING_BUFFER_SIZE]; - struct alphatrack_ocmd (*write_buffer)[WRITE_BUFFER_SIZE]; - unsigned int ring_head; - unsigned int ring_tail; - - wait_queue_head_t read_wait; - wait_queue_head_t write_wait; - - unsigned char *interrupt_in_buffer; - unsigned char *oldi_buffer; - struct usb_endpoint_descriptor *interrupt_in_endpoint; - struct urb *interrupt_in_urb; - int interrupt_in_interval; - size_t interrupt_in_endpoint_size; - int interrupt_in_running; - int interrupt_in_done; - - char *interrupt_out_buffer; - struct usb_endpoint_descriptor *interrupt_out_endpoint; - struct urb *interrupt_out_urb; - int interrupt_out_interval; - size_t interrupt_out_endpoint_size; - int interrupt_out_busy; - - atomic_t writes_pending; - int event; /* alternate interface to events */ - int fader; /* 10 bits */ - int lights; /* 23 bits */ - unsigned char dump_state; /* 0 if disabled 1 if enabled */ - unsigned char enable; /* 0 if disabled 1 if enabled */ - unsigned char offline; /* if the device is out of range or asleep */ - unsigned char verbose; /* be verbose in error reporting */ - unsigned char last_cmd[OUTPUT_CMD_SIZE]; - unsigned char screen[32]; -}; - -/* prevent races between open() and disconnect() */ -static DEFINE_MUTEX(disconnect_mutex); - -/* forward declaration */ - -static struct usb_driver usb_alphatrack_driver; - -/** - * usb_alphatrack_abort_transfers - * aborts transfers and frees associated data structures - */ -static void usb_alphatrack_abort_transfers(struct usb_alphatrack *dev) -{ - /* shutdown transfer */ - if (dev->interrupt_in_running) { - dev->interrupt_in_running = 0; - if (dev->intf) - usb_kill_urb(dev->interrupt_in_urb); - } - if (dev->interrupt_out_busy) - if (dev->intf) - usb_kill_urb(dev->interrupt_out_urb); -} - -/** usb_alphatrack_delete */ -static void usb_alphatrack_delete(struct usb_alphatrack *dev) -{ - usb_alphatrack_abort_transfers(dev); - usb_free_urb(dev->interrupt_in_urb); - usb_free_urb(dev->interrupt_out_urb); - kfree(dev->ring_buffer); - kfree(dev->interrupt_in_buffer); - kfree(dev->interrupt_out_buffer); - kfree(dev->oldi_buffer); - kfree(dev->write_buffer); - kfree(dev); -} - -/** usb_alphatrack_interrupt_in_callback */ - -static void usb_alphatrack_interrupt_in_callback(struct urb *urb) -{ - struct usb_alphatrack *dev = urb->context; - unsigned int next_ring_head; - int retval = -1; - - if (urb->status) { - if (urb->status == -ENOENT || - urb->status == -ECONNRESET || urb->status == -ESHUTDOWN) { - goto exit; - } else { - dbg_info(&dev->intf->dev, - "%s: nonzero status received: %d\n", __func__, - urb->status); - goto resubmit; /* maybe we can recover */ - } - } - - if (urb->actual_length != INPUT_CMD_SIZE) { - dev_warn(&dev->intf->dev, - "Urb length was %d bytes!! Do something intelligent\n", - urb->actual_length); - } else { - alphatrack_ocmd_info(&dev->intf->dev, - &(*dev->ring_buffer)[dev->ring_tail].cmd, - "%s", "bla"); - if (memcmp - (dev->interrupt_in_buffer, dev->oldi_buffer, - INPUT_CMD_SIZE) == 0) { - goto resubmit; - } - memcpy(dev->oldi_buffer, dev->interrupt_in_buffer, - INPUT_CMD_SIZE); - -#if SUPPRESS_EXTRA_OFFLINE_EVENTS - if (dev->offline == 2 && dev->interrupt_in_buffer[1] == 0xff) - goto resubmit; - if (dev->offline == 1 && dev->interrupt_in_buffer[1] == 0xff) { - dev->offline = 2; - goto resubmit; - } -/* Always pass one offline event up the stack */ - if (dev->offline > 0 && dev->interrupt_in_buffer[1] != 0xff) - dev->offline = 0; - if (dev->offline == 0 && dev->interrupt_in_buffer[1] == 0xff) - dev->offline = 1; -#endif - dbg_info(&dev->intf->dev, "%s: head, tail are %x, %x\n", - __func__, dev->ring_head, dev->ring_tail); - next_ring_head = (dev->ring_head + 1) % ring_buffer_size; - - if (next_ring_head != dev->ring_tail) { - memcpy(&((*dev->ring_buffer)[dev->ring_head]), - dev->interrupt_in_buffer, urb->actual_length); - dev->ring_head = next_ring_head; - retval = 0; - memset(dev->interrupt_in_buffer, 0, urb->actual_length); - } else { - dev_warn(&dev->intf->dev, - "Ring buffer overflow, %d bytes dropped\n", - urb->actual_length); - memset(dev->interrupt_in_buffer, 0, urb->actual_length); - } - } - -resubmit: - /* resubmit if we're still running */ - if (dev->interrupt_in_running && dev->intf) { - retval = usb_submit_urb(dev->interrupt_in_urb, GFP_ATOMIC); - if (retval) - dev_err(&dev->intf->dev, - "usb_submit_urb failed (%d)\n", retval); - } - -exit: - dev->interrupt_in_done = 1; - wake_up_interruptible(&dev->read_wait); -} - -/** usb_alphatrack_interrupt_out_callback */ -static void usb_alphatrack_interrupt_out_callback(struct urb *urb) -{ - struct usb_alphatrack *dev = urb->context; - - /* sync/async unlink faults aren't errors */ - if (urb->status && !(urb->status == -ENOENT || - urb->status == -ECONNRESET || - urb->status == -ESHUTDOWN)) - dbg_info(&dev->intf->dev, - "%s - nonzero write interrupt status received: %d\n", - __func__, urb->status); - atomic_dec(&dev->writes_pending); - dev->interrupt_out_busy = 0; - wake_up_interruptible(&dev->write_wait); -} - -/** usb_alphatrack_open */ -static int usb_alphatrack_open(struct inode *inode, struct file *file) -{ - struct usb_alphatrack *dev; - int subminor; - int retval = 0; - struct usb_interface *interface; - - nonseekable_open(inode, file); - subminor = iminor(inode); - - mutex_lock(&disconnect_mutex); - - interface = usb_find_interface(&usb_alphatrack_driver, subminor); - - if (!interface) { - pr_err("%s - error, can't find device for minor %d\n", - __func__, subminor); - retval = -ENODEV; - goto unlock_disconnect_exit; - } - - dev = usb_get_intfdata(interface); - - if (!dev) { - retval = -ENODEV; - goto unlock_disconnect_exit; - } - - /* lock this device */ - if (mutex_lock_interruptible(&dev->mtx)) { - retval = -ERESTARTSYS; - goto unlock_disconnect_exit; - } - - /* allow opening only once */ - if (dev->open_count) { - retval = -EBUSY; - goto unlock_exit; - } - dev->open_count = 1; - - /* initialize in direction */ - dev->ring_head = 0; - dev->ring_tail = 0; - usb_fill_int_urb(dev->interrupt_in_urb, - interface_to_usbdev(interface), - usb_rcvintpipe(interface_to_usbdev(interface), - dev->interrupt_in_endpoint-> - bEndpointAddress), - dev->interrupt_in_buffer, - dev->interrupt_in_endpoint_size, - usb_alphatrack_interrupt_in_callback, dev, - dev->interrupt_in_interval); - - dev->interrupt_in_running = 1; - dev->interrupt_in_done = 0; - dev->enable = 1; - dev->offline = 0; - - retval = usb_submit_urb(dev->interrupt_in_urb, GFP_KERNEL); - if (retval) { - dev_err(&interface->dev, - "Couldn't submit interrupt_in_urb %d\n", retval); - dev->interrupt_in_running = 0; - dev->open_count = 0; - goto unlock_exit; - } - - /* save device in the file's private structure */ - file->private_data = dev; - -unlock_exit: - mutex_unlock(&dev->mtx); - -unlock_disconnect_exit: - mutex_unlock(&disconnect_mutex); - - return retval; -} - -/** usb_alphatrack_release */ -static int usb_alphatrack_release(struct inode *inode, struct file *file) -{ - struct usb_alphatrack *dev; - int retval = 0; - - dev = file->private_data; - - if (dev == NULL) { - retval = -ENODEV; - goto exit; - } - - if (mutex_lock_interruptible(&dev->mtx)) { - retval = -ERESTARTSYS; - goto exit; - } - - if (dev->open_count != 1) { - retval = -ENODEV; - goto unlock_exit; - } - - if (dev->intf == NULL) { - /* the device was unplugged before the file was released */ - mutex_unlock(&dev->mtx); - /* unlock here as usb_alphatrack_delete frees dev */ - usb_alphatrack_delete(dev); - retval = -ENODEV; - goto exit; - } - - /* wait until write transfer is finished */ - if (dev->interrupt_out_busy) - wait_event_interruptible_timeout(dev->write_wait, - !dev->interrupt_out_busy, - 2 * HZ); - usb_alphatrack_abort_transfers(dev); - dev->open_count = 0; - -unlock_exit: - mutex_unlock(&dev->mtx); - -exit: - return retval; -} - -/** usb_alphatrack_poll */ -static unsigned int usb_alphatrack_poll(struct file *file, poll_table *wait) -{ - struct usb_alphatrack *dev; - unsigned int mask = 0; - - dev = file->private_data; - - poll_wait(file, &dev->read_wait, wait); - poll_wait(file, &dev->write_wait, wait); - - if (dev->ring_head != dev->ring_tail) - mask |= POLLIN | POLLRDNORM; - if (!dev->interrupt_out_busy) - mask |= POLLOUT | POLLWRNORM; - - return mask; -} - -/** usb_alphatrack_read */ -static ssize_t usb_alphatrack_read(struct file *file, char __user *buffer, - size_t count, loff_t *ppos) -{ - struct usb_alphatrack *dev; - int retval = 0; - - int c = 0; - - dev = file->private_data; - - /* verify that we actually have some data to read */ - if (count == 0) - goto exit; - - /* lock this object */ - if (mutex_lock_interruptible(&dev->mtx)) { - retval = -ERESTARTSYS; - goto exit; - } - - /* verify that the device wasn't unplugged */ - if (dev->intf == NULL) { - retval = -ENODEV; - pr_err("%s: No device or device unplugged %d\n", - __func__, retval); - goto unlock_exit; - } - - while (dev->ring_head == dev->ring_tail) { - if (file->f_flags & O_NONBLOCK) { - retval = -EAGAIN; - goto unlock_exit; - } - dev->interrupt_in_done = 0; - retval = - wait_event_interruptible(dev->read_wait, - dev->interrupt_in_done); - if (retval < 0) - goto unlock_exit; - } - - alphatrack_ocmd_info(&dev->intf->dev, - &(*dev->ring_buffer)[dev->ring_tail].cmd, "%s", - ": copying to userspace"); - - c = 0; - while ((c < count) && (dev->ring_tail != dev->ring_head)) { - if (copy_to_user - (&buffer[c], &(*dev->ring_buffer)[dev->ring_tail], - INPUT_CMD_SIZE)) { - retval = -EFAULT; - goto unlock_exit; - } - dev->ring_tail = (dev->ring_tail + 1) % ring_buffer_size; - c += INPUT_CMD_SIZE; - dbg_info(&dev->intf->dev, "%s: head, tail are %x, %x\n", - __func__, dev->ring_head, dev->ring_tail); - } - retval = c; - -unlock_exit: - /* unlock the device */ - mutex_unlock(&dev->mtx); - -exit: - return retval; -} - -/** usb_alphatrack_write */ -static ssize_t usb_alphatrack_write(struct file *file, - const char __user *buffer, size_t count, - loff_t *ppos) -{ - struct usb_alphatrack *dev; - size_t bytes_to_write; - int retval = 0; - - dev = file->private_data; - - /* verify that we actually have some data to write */ - if (count == 0) - goto exit; - - /* lock this object */ - if (mutex_lock_interruptible(&dev->mtx)) { - retval = -ERESTARTSYS; - goto exit; - } - - /* verify that the device wasn't unplugged */ - if (dev->intf == NULL) { - retval = -ENODEV; - pr_err("%s: No device or device unplugged %d\n", - __func__, retval); - goto unlock_exit; - } - - /* wait until previous transfer is finished */ - if (dev->interrupt_out_busy) { - if (file->f_flags & O_NONBLOCK) { - retval = -EAGAIN; - goto unlock_exit; - } - retval = - wait_event_interruptible(dev->write_wait, - !dev->interrupt_out_busy); - if (retval < 0) - goto unlock_exit; - } - - /* write the data into interrupt_out_buffer from userspace */ - /* FIXME - if you write more than 12 bytes this breaks */ - bytes_to_write = - min(count, write_buffer_size * dev->interrupt_out_endpoint_size); - if (bytes_to_write < count) - dev_warn(&dev->intf->dev, - "Write buffer overflow, %zd bytes dropped\n", - count - bytes_to_write); - - dbg_info(&dev->intf->dev, "%s: count = %zd, bytes_to_write = %zd\n", - __func__, count, bytes_to_write); - - if (copy_from_user(dev->interrupt_out_buffer, buffer, bytes_to_write)) { - retval = -EFAULT; - goto unlock_exit; - } - - if (dev->interrupt_out_endpoint == NULL) { - dev_err(&dev->intf->dev, "Endpoint should not be null!\n"); - goto unlock_exit; - } - - /* send off the urb */ - usb_fill_int_urb(dev->interrupt_out_urb, - interface_to_usbdev(dev->intf), - usb_sndintpipe(interface_to_usbdev(dev->intf), - dev->interrupt_out_endpoint-> - bEndpointAddress), - dev->interrupt_out_buffer, bytes_to_write, - usb_alphatrack_interrupt_out_callback, dev, - dev->interrupt_out_interval); - dev->interrupt_out_busy = 1; - atomic_inc(&dev->writes_pending); - wmb(); - - retval = usb_submit_urb(dev->interrupt_out_urb, GFP_KERNEL); - if (retval) { - dev->interrupt_out_busy = 0; - dev_err(&dev->intf->dev, - "Couldn't submit interrupt_out_urb %d\n", retval); - atomic_dec(&dev->writes_pending); - goto unlock_exit; - } - retval = bytes_to_write; - -unlock_exit: - /* unlock the device */ - mutex_unlock(&dev->mtx); - -exit: - return retval; -} - -/* file operations needed when we register this driver */ -static const struct file_operations usb_alphatrack_fops = { - .owner = THIS_MODULE, - .read = usb_alphatrack_read, - .write = usb_alphatrack_write, - .open = usb_alphatrack_open, - .release = usb_alphatrack_release, - .poll = usb_alphatrack_poll, - .llseek = no_llseek, -}; - -/* - * usb class driver info in order to get a minor number from the usb core, - * and to have the device registered with the driver core - */ - -static struct usb_class_driver usb_alphatrack_class = { - .name = "alphatrack%d", - .fops = &usb_alphatrack_fops, - .minor_base = USB_ALPHATRACK_MINOR_BASE, -}; - -/** - * usb_alphatrack_probe - * - * Called by the usb core when a new device is connected that it thinks - * this driver might be interested in. - */ -static int usb_alphatrack_probe(struct usb_interface *intf, - const struct usb_device_id *id) -{ - struct usb_device *udev = interface_to_usbdev(intf); - struct usb_alphatrack *dev = NULL; - struct usb_host_interface *iface_desc; - struct usb_endpoint_descriptor *endpoint; - int i; - int true_size; - int retval = -ENOMEM; - - /* allocate memory for our device state and initialize it */ - - dev = kzalloc(sizeof(*dev), GFP_KERNEL); - if (dev == NULL) - goto exit; - - mutex_init(&dev->mtx); - dev->intf = intf; - init_waitqueue_head(&dev->read_wait); - init_waitqueue_head(&dev->write_wait); - - iface_desc = intf->cur_altsetting; - - /* set up the endpoint information */ - for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { - endpoint = &iface_desc->endpoint[i].desc; - - if (usb_endpoint_is_int_in(endpoint)) - dev->interrupt_in_endpoint = endpoint; - - if (usb_endpoint_is_int_out(endpoint)) - dev->interrupt_out_endpoint = endpoint; - } - if (dev->interrupt_in_endpoint == NULL) { - dev_err(&intf->dev, "Interrupt in endpoint not found\n"); - goto error; - } - if (dev->interrupt_out_endpoint == NULL) - dev_warn(&intf->dev, - "Interrupt out endpoint not found (using control endpoint instead)\n"); - - dev->interrupt_in_endpoint_size = - le16_to_cpu(dev->interrupt_in_endpoint->wMaxPacketSize); - - if (dev->interrupt_in_endpoint_size != 64) - dev_warn(&intf->dev, "Interrupt in endpoint size is not 64!\n"); - - if (ring_buffer_size == 0) - ring_buffer_size = RING_BUFFER_SIZE; - - true_size = min(ring_buffer_size, RING_BUFFER_SIZE); - - /* - * FIXME - there are more usb_alloc routines for dma correctness. - * Needed? - */ - dev->ring_buffer = kmalloc_array(true_size, - sizeof(struct alphatrack_icmd), - GFP_KERNEL); - if (!dev->ring_buffer) - goto error; - - dev->interrupt_in_buffer = kmalloc(dev->interrupt_in_endpoint_size, - GFP_KERNEL); - if (!dev->interrupt_in_buffer) - goto error; - - dev->oldi_buffer = kmalloc(dev->interrupt_in_endpoint_size, GFP_KERNEL); - if (!dev->oldi_buffer) - goto error; - - dev->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL); - if (!dev->interrupt_in_urb) { - dev_err(&intf->dev, "Couldn't allocate interrupt_in_urb\n"); - goto error; - } - - dev->interrupt_out_endpoint_size = - dev->interrupt_out_endpoint ? le16_to_cpu(dev-> - interrupt_out_endpoint-> - wMaxPacketSize) : udev-> - descriptor.bMaxPacketSize0; - - if (dev->interrupt_out_endpoint_size != 64) - dev_warn(&intf->dev, - "Interrupt out endpoint size is not 64!)\n"); - - if (write_buffer_size == 0) - write_buffer_size = WRITE_BUFFER_SIZE; - true_size = min(write_buffer_size, WRITE_BUFFER_SIZE); - - dev->interrupt_out_buffer = - kmalloc_array(true_size, - dev->interrupt_out_endpoint_size, - GFP_KERNEL); - if (!dev->interrupt_out_buffer) - goto error; - - dev->write_buffer = kmalloc_array(true_size, - sizeof(struct alphatrack_ocmd), - GFP_KERNEL); - if (!dev->write_buffer) - goto error; - - dev->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL); - if (!dev->interrupt_out_urb) { - dev_err(&intf->dev, "Couldn't allocate interrupt_out_urb\n"); - goto error; - } - dev->interrupt_in_interval = - min_interrupt_in_interval > - dev->interrupt_in_endpoint-> - bInterval ? min_interrupt_in_interval : dev->interrupt_in_endpoint-> - bInterval; - if (dev->interrupt_out_endpoint) - dev->interrupt_out_interval = - min_interrupt_out_interval > - dev->interrupt_out_endpoint-> - bInterval ? min_interrupt_out_interval : dev-> - interrupt_out_endpoint->bInterval; - - /* we can register the device now, as it is ready */ - usb_set_intfdata(intf, dev); - - atomic_set(&dev->writes_pending, 0); - retval = usb_register_dev(intf, &usb_alphatrack_class); - if (retval) { - /* something prevented us from registering this driver */ - dev_err(&intf->dev, - "Not able to get a minor for this device.\n"); - usb_set_intfdata(intf, NULL); - goto error; - } - - /* let the user know what node this device is now attached to */ - dev_info(&intf->dev, - "Alphatrack Device #%d now attached to major %d minor %d\n", - (intf->minor - USB_ALPHATRACK_MINOR_BASE), USB_MAJOR, - intf->minor); - -exit: - return retval; - -error: - usb_alphatrack_delete(dev); - - return retval; -} - -/** - * usb_alphatrack_disconnect - * - * Called by the usb core when the device is removed from the system. - */ -static void usb_alphatrack_disconnect(struct usb_interface *intf) -{ - struct usb_alphatrack *dev; - int minor; - - mutex_lock(&disconnect_mutex); - - dev = usb_get_intfdata(intf); - usb_set_intfdata(intf, NULL); - - mutex_lock(&dev->mtx); - - minor = intf->minor; - - /* give back our minor */ - usb_deregister_dev(intf, &usb_alphatrack_class); - - /* if the device is not opened, then we clean up right now */ - if (!dev->open_count) { - mutex_unlock(&dev->mtx); - usb_alphatrack_delete(dev); - } else { - atomic_set(&dev->writes_pending, 0); - dev->intf = NULL; - mutex_unlock(&dev->mtx); - } - - mutex_unlock(&disconnect_mutex); - - dev_info(&intf->dev, "Alphatrack Surface #%d now disconnected\n", - (minor - USB_ALPHATRACK_MINOR_BASE)); -} - -/* usb specific object needed to register this driver with the usb subsystem */ -static struct usb_driver usb_alphatrack_driver = { - .name = "alphatrack", - .probe = usb_alphatrack_probe, - .disconnect = usb_alphatrack_disconnect, - .id_table = usb_alphatrack_table, -}; - -module_usb_driver(usb_alphatrack_driver); diff --git a/drivers/staging/frontier/alphatrack.h b/drivers/staging/frontier/alphatrack.h deleted file mode 100644 index 418c6053c027..000000000000 --- a/drivers/staging/frontier/alphatrack.h +++ /dev/null @@ -1,78 +0,0 @@ -struct alphatrack_icmd { - unsigned char cmd[12]; -}; - -struct alphatrack_ocmd { - unsigned char cmd[8]; -}; - -/* - * These are unused by the present driver but provide documentation for the - * userspace API. - */ -enum LightID { - LIGHT_EQ = 0, - LIGHT_OUT, - LIGHT_F2, - LIGHT_SEND, - LIGHT_IN, - LIGHT_F1, - LIGHT_PAN, - LIGHT_UNDEF1, - LIGHT_UNDEF2, - LIGHT_SHIFT, - LIGHT_TRACKMUTE, - LIGHT_TRACKSOLO, - LIGHT_TRACKREC, - LIGHT_READ, - LIGHT_WRITE, - LIGHT_ANYSOLO, - LIGHT_AUTO, - LIGHT_F4, - LIGHT_RECORD, - LIGHT_WINDOW, - LIGHT_PLUGIN, - LIGHT_F3, - LIGHT_LOOP -}; - -#define BUTTONMASK_BATTERY 0x00004000 -#define BUTTONMASK_BACKLIGHT 0x00008000 -#define BUTTONMASK_FASTFORWARD 0x04000000 -#define BUTTONMASK_TRACKMUTE 0x00040000 -#define BUTTONMASK_TRACKSOLO 0x00800000 -#define BUTTONMASK_TRACKLEFT 0x80000000 -#define BUTTONMASK_RECORD 0x02000000 -#define BUTTONMASK_SHIFT 0x20000000 -#define BUTTONMASK_PUNCH 0x00800000 -#define BUTTONMASK_TRACKRIGHT 0x00020000 -#define BUTTONMASK_REWIND 0x01000000 -#define BUTTONMASK_STOP 0x10000000 -#define BUTTONMASK_LOOP 0x00010000 -#define BUTTONMASK_TRACKREC 0x00001000 -#define BUTTONMASK_PLAY 0x08000000 -#define BUTTONMASK_TOUCH1 0x00000008 -#define BUTTONMASK_TOUCH2 0x00000010 -#define BUTTONMASK_TOUCH3 0x00000020 - -#define BUTTONMASK_PRESS1 0x00000009 -#define BUTTONMASK_PRESS2 0x00008010 -#define BUTTONMASK_PRESS3 0x00002020 - -/* - * last 3 bytes are the slider position - * 40 is the actual slider moving, the most sig bits, and 3 lsb - */ - -#define BUTTONMASK_FLIP 0x40000000 -#define BUTTONMASK_F1 0x00100000 -#define BUTTONMASK_F2 0x00400000 -#define BUTTONMASK_F3 0x00200000 -#define BUTTONMASK_F4 0x00080000 -#define BUTTONMASK_PAN 0x00000200 -#define BUTTONMASK_SEND 0x00000800 -#define BUTTONMASK_EQ 0x00004000 -#define BUTTONMASK_PLUGIN 0x00000400 -#define BUTTONMASK_AUTO 0x00000100 - -/* #define BUTTONMASK_FOOTSWITCH FIXME */ diff --git a/drivers/staging/frontier/tranzport.c b/drivers/staging/frontier/tranzport.c deleted file mode 100644 index 2f86163d7013..000000000000 --- a/drivers/staging/frontier/tranzport.c +++ /dev/null @@ -1,973 +0,0 @@ -/* - * Frontier Designs Tranzport driver - * - * Copyright (C) 2007 Michael Taht (m@taht.net) - * - * Based on the usbled driver and ldusb drivers by - * - * Copyright (C) 2004 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (C) 2005 Michael Hund - * - * The ldusb driver was, in turn, derived from Lego USB Tower driver - * Copyright (C) 2003 David Glance - * 2001-2004 Juergen Stuber - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation, version 2. - * - */ - -/* - * This driver uses a ring buffer for time critical reading of - * interrupt in reports and provides read and write methods for - * raw interrupt reports. - */ - -/* Note: this currently uses a dumb ringbuffer for reads and writes. - * A more optimal driver would cache and kill off outstanding urbs that are - * now invalid, and ignore ones that already were in the queue but valid - * as we only have 17 commands for the tranzport. In particular this is - * key for getting lights to flash in time as otherwise many commands - * can be buffered up before the light change makes it to the interface. - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -/* Define these values to match your devices */ -#define VENDOR_ID 0x165b -#define PRODUCT_ID 0x8101 - -#ifdef CONFIG_USB_DYNAMIC_MINORS -#define USB_TRANZPORT_MINOR_BASE 0 -#else /* FIXME 177- is the another driver's minor - apply for a minor soon */ -#define USB_TRANZPORT_MINOR_BASE 177 -#endif - -/* table of devices that work with this driver */ -static const struct usb_device_id usb_tranzport_table[] = { - {USB_DEVICE(VENDOR_ID, PRODUCT_ID)}, - {} /* Terminating entry */ -}; - -MODULE_DEVICE_TABLE(usb, usb_tranzport_table); -MODULE_VERSION("0.35"); -MODULE_AUTHOR("Mike Taht "); -MODULE_DESCRIPTION("Tranzport USB Driver"); -MODULE_LICENSE("GPL"); -MODULE_SUPPORTED_DEVICE("Frontier Designs Tranzport Control Surface"); - -#define SUPPRESS_EXTRA_OFFLINE_EVENTS 1 -#define COMPRESS_WHEEL_EVENTS 1 -#define BUFFERED_READS 1 -#define RING_BUFFER_SIZE 1000 -#define WRITE_BUFFER_SIZE 34 -#define TRANZPORT_USB_TIMEOUT 10 -#define TRANZPORT_DEBUG 0 - -static int debug = TRANZPORT_DEBUG; - -/* Use our own dbg macro */ -#define dbg_info(dev, format, arg...) do \ - { if (debug) dev_info(dev , format , ## arg); } while (0) - -/* Module parameters */ - -module_param(debug, int, S_IRUGO | S_IWUSR); -MODULE_PARM_DESC(debug, "Debug enabled or not"); - -/* - * All interrupt in transfers are collected in a ring buffer to - * avoid racing conditions and get better performance of the driver. - */ - -static int ring_buffer_size = RING_BUFFER_SIZE; - -module_param(ring_buffer_size, int, S_IRUGO); -MODULE_PARM_DESC(ring_buffer_size, "Read ring buffer size in reports"); - -/* - * The write_buffer can one day contain more than one interrupt out transfer. - */ -static int write_buffer_size = WRITE_BUFFER_SIZE; -module_param(write_buffer_size, int, S_IRUGO); -MODULE_PARM_DESC(write_buffer_size, "Write buffer size"); - -/* - * Increase the interval for debugging purposes. - * or set to 1 to use the standard interval from the endpoint descriptors. - */ - -static int min_interrupt_in_interval = TRANZPORT_USB_TIMEOUT; -module_param(min_interrupt_in_interval, int, 0); -MODULE_PARM_DESC(min_interrupt_in_interval, - "Minimum interrupt in interval in ms"); - -static int min_interrupt_out_interval = TRANZPORT_USB_TIMEOUT; -module_param(min_interrupt_out_interval, int, 0); -MODULE_PARM_DESC(min_interrupt_out_interval, - "Minimum interrupt out interval in ms"); - -struct tranzport_cmd { - unsigned char cmd[8]; -}; - -/* Structure to hold all of our device specific stuff */ - -struct usb_tranzport { - struct mutex mtx; /* locks this structure */ - struct usb_interface *intf; /* save off the usb interface pointer */ - int open_count; /* number of times this port opened */ - struct tranzport_cmd (*ring_buffer)[RING_BUFFER_SIZE]; - unsigned int ring_head; - unsigned int ring_tail; - wait_queue_head_t read_wait; - wait_queue_head_t write_wait; - unsigned char *interrupt_in_buffer; - struct usb_endpoint_descriptor *interrupt_in_endpoint; - struct urb *interrupt_in_urb; - int interrupt_in_interval; - size_t interrupt_in_endpoint_size; - int interrupt_in_running; - int interrupt_in_done; - char *interrupt_out_buffer; - struct usb_endpoint_descriptor *interrupt_out_endpoint; - struct urb *interrupt_out_urb; - int interrupt_out_interval; - size_t interrupt_out_endpoint_size; - int interrupt_out_busy; - - /* Sysfs support */ - - unsigned char enable; /* 0 if disabled 1 if enabled */ - unsigned char offline; /* if the device is out of range or asleep */ - unsigned char compress_wheel; /* flag to compress wheel events */ -}; - -/* prevent races between open() and disconnect() */ -static DEFINE_MUTEX(disconnect_mutex); - -static struct usb_driver usb_tranzport_driver; - -/** - * usb_tranzport_abort_transfers - * aborts transfers and frees associated data structures - */ -static void usb_tranzport_abort_transfers(struct usb_tranzport *dev) -{ - /* shutdown transfer */ - if (dev->interrupt_in_running) { - dev->interrupt_in_running = 0; - if (dev->intf) - usb_kill_urb(dev->interrupt_in_urb); - } - if (dev->interrupt_out_busy) - if (dev->intf) - usb_kill_urb(dev->interrupt_out_urb); -} - -#define show_int(value) \ - static ssize_t value##_show(struct device *dev, \ - struct device_attribute *attr, char *buf) \ - { \ - struct usb_interface *intf = to_usb_interface(dev); \ - struct usb_tranzport *t = usb_get_intfdata(intf); \ - return sprintf(buf, "%d\n", t->value); \ - } \ - static DEVICE_ATTR_RO(value) - -#define show_set_int(value) \ - static ssize_t value##_show(struct device *dev, \ - struct device_attribute *attr, char *buf) \ - { \ - struct usb_interface *intf = to_usb_interface(dev); \ - struct usb_tranzport *t = usb_get_intfdata(intf); \ - return sprintf(buf, "%d\n", t->value); \ - } \ - static ssize_t value##_store(struct device *dev, \ - struct device_attribute *attr, \ - const char *buf, size_t count) \ - { \ - struct usb_interface *intf = to_usb_interface(dev); \ - struct usb_tranzport *t = usb_get_intfdata(intf); \ - unsigned long temp; \ - if (kstrtoul(buf, 10, &temp)) \ - return -EINVAL; \ - t->value = temp; \ - return count; \ - } \ - static DEVICE_ATTR_RW(value) - -show_int(enable); -show_int(offline); -show_set_int(compress_wheel); - -/** - * usb_tranzport_delete - */ -static void usb_tranzport_delete(struct usb_tranzport *dev) -{ - usb_tranzport_abort_transfers(dev); - if (dev->intf != NULL) { - device_remove_file(&dev->intf->dev, &dev_attr_enable); - device_remove_file(&dev->intf->dev, &dev_attr_offline); - device_remove_file(&dev->intf->dev, &dev_attr_compress_wheel); - } - - /* free data structures */ - usb_free_urb(dev->interrupt_in_urb); - usb_free_urb(dev->interrupt_out_urb); - kfree(dev->ring_buffer); - kfree(dev->interrupt_in_buffer); - kfree(dev->interrupt_out_buffer); - kfree(dev); -} - -/** - * usb_tranzport_interrupt_in_callback - */ - -static void usb_tranzport_interrupt_in_callback(struct urb *urb) -{ - struct usb_tranzport *dev = urb->context; - unsigned int next_ring_head; - int retval = -1; - - if (urb->status) { - if (urb->status == -ENOENT || - urb->status == -ECONNRESET || - urb->status == -ESHUTDOWN) { - goto exit; - } else { - dbg_info(&dev->intf->dev, - "%s: nonzero status received: %d\n", - __func__, urb->status); - goto resubmit; /* maybe we can recover */ - } - } - - if (urb->actual_length != 8) { - dev_warn(&dev->intf->dev, - "Urb length was %d bytes!! Do something intelligent\n", - urb->actual_length); - } else { - dbg_info(&dev->intf->dev, - "%s: received: %02x%02x%02x%02x%02x%02x%02x%02x\n", - __func__, dev->interrupt_in_buffer[0], - dev->interrupt_in_buffer[1], - dev->interrupt_in_buffer[2], - dev->interrupt_in_buffer[3], - dev->interrupt_in_buffer[4], - dev->interrupt_in_buffer[5], - dev->interrupt_in_buffer[6], - dev->interrupt_in_buffer[7]); -#if SUPPRESS_EXTRA_OFFLINE_EVENTS - if (dev->offline == 2 && dev->interrupt_in_buffer[1] == 0xff) - goto resubmit; - if (dev->offline == 1 && dev->interrupt_in_buffer[1] == 0xff) { - dev->offline = 2; - goto resubmit; - } - - /* Always pass one offline event up the stack */ - if (dev->offline > 0 && dev->interrupt_in_buffer[1] != 0xff) - dev->offline = 0; - if (dev->offline == 0 && dev->interrupt_in_buffer[1] == 0xff) - dev->offline = 1; - -#endif /* SUPPRESS_EXTRA_OFFLINE_EVENTS */ - dbg_info(&dev->intf->dev, "%s: head, tail are %x, %x\n", - __func__, dev->ring_head, dev->ring_tail); - - next_ring_head = (dev->ring_head + 1) % ring_buffer_size; - - if (next_ring_head != dev->ring_tail) { - memcpy(&((*dev->ring_buffer)[dev->ring_head]), - dev->interrupt_in_buffer, urb->actual_length); - dev->ring_head = next_ring_head; - retval = 0; - memset(dev->interrupt_in_buffer, 0, urb->actual_length); - } else { - dev_warn(&dev->intf->dev, - "Ring buffer overflow, %d bytes dropped\n", - urb->actual_length); - memset(dev->interrupt_in_buffer, 0, urb->actual_length); - } - } - -resubmit: -/* resubmit if we're still running */ - if (dev->interrupt_in_running && dev->intf) { - retval = usb_submit_urb(dev->interrupt_in_urb, GFP_ATOMIC); - if (retval) - dev_err(&dev->intf->dev, - "usb_submit_urb failed (%d)\n", retval); - } - -exit: - dev->interrupt_in_done = 1; - wake_up_interruptible(&dev->read_wait); -} - -/** - * usb_tranzport_interrupt_out_callback - */ -static void usb_tranzport_interrupt_out_callback(struct urb *urb) -{ - struct usb_tranzport *dev = urb->context; - /* sync/async unlink faults aren't errors */ - if (urb->status && !(urb->status == -ENOENT || - urb->status == -ECONNRESET || - urb->status == -ESHUTDOWN)) - dbg_info(&dev->intf->dev, - "%s - nonzero write interrupt status received: %d\n", - __func__, urb->status); - - dev->interrupt_out_busy = 0; - wake_up_interruptible(&dev->write_wait); -} -/** - * usb_tranzport_open - */ -static int usb_tranzport_open(struct inode *inode, struct file *file) -{ - struct usb_tranzport *dev; - int subminor; - int retval = 0; - struct usb_interface *interface; - - nonseekable_open(inode, file); - subminor = iminor(inode); - - mutex_lock(&disconnect_mutex); - - interface = usb_find_interface(&usb_tranzport_driver, subminor); - - if (!interface) { - pr_err("%s - error, can't find device for minor %d\n", - __func__, subminor); - retval = -ENODEV; - goto unlock_disconnect_exit; - } - - dev = usb_get_intfdata(interface); - - if (!dev) { - retval = -ENODEV; - goto unlock_disconnect_exit; - } - - /* lock this device */ - if (mutex_lock_interruptible(&dev->mtx)) { - retval = -ERESTARTSYS; - goto unlock_disconnect_exit; - } - - /* allow opening only once */ - if (dev->open_count) { - retval = -EBUSY; - goto unlock_exit; - } - dev->open_count = 1; - - /* initialize in direction */ - dev->ring_head = 0; - dev->ring_tail = 0; - usb_fill_int_urb(dev->interrupt_in_urb, - interface_to_usbdev(interface), - usb_rcvintpipe(interface_to_usbdev(interface), - dev->interrupt_in_endpoint-> - bEndpointAddress), - dev->interrupt_in_buffer, - dev->interrupt_in_endpoint_size, - usb_tranzport_interrupt_in_callback, dev, - dev->interrupt_in_interval); - - dev->interrupt_in_running = 1; - dev->interrupt_in_done = 0; - dev->enable = 1; - dev->offline = 0; - dev->compress_wheel = 1; - - retval = usb_submit_urb(dev->interrupt_in_urb, GFP_KERNEL); - if (retval) { - dev_err(&interface->dev, - "Couldn't submit interrupt_in_urb %d\n", retval); - dev->interrupt_in_running = 0; - dev->open_count = 0; - goto unlock_exit; - } - - /* save device in the file's private structure */ - file->private_data = dev; - -unlock_exit: - mutex_unlock(&dev->mtx); - -unlock_disconnect_exit: - mutex_unlock(&disconnect_mutex); - - return retval; -} - -/** - * usb_tranzport_release - */ -static int usb_tranzport_release(struct inode *inode, struct file *file) -{ - struct usb_tranzport *dev; - int retval = 0; - - dev = file->private_data; - - if (dev == NULL) { - retval = -ENODEV; - goto exit; - } - - if (mutex_lock_interruptible(&dev->mtx)) { - retval = -ERESTARTSYS; - goto exit; - } - - if (dev->open_count != 1) { - retval = -ENODEV; - goto unlock_exit; - } - - if (dev->intf == NULL) { - /* the device was unplugged before the file was released */ - mutex_unlock(&dev->mtx); - /* unlock here as usb_tranzport_delete frees dev */ - usb_tranzport_delete(dev); - retval = -ENODEV; - goto exit; - } - - /* wait until write transfer is finished */ - if (dev->interrupt_out_busy) - wait_event_interruptible_timeout(dev->write_wait, - !dev->interrupt_out_busy, - 2 * HZ); - usb_tranzport_abort_transfers(dev); - dev->open_count = 0; - -unlock_exit: - mutex_unlock(&dev->mtx); - -exit: - return retval; -} - -/** - * usb_tranzport_poll - */ -static unsigned int usb_tranzport_poll(struct file *file, poll_table *wait) -{ - struct usb_tranzport *dev; - unsigned int mask = 0; - - dev = file->private_data; - poll_wait(file, &dev->read_wait, wait); - poll_wait(file, &dev->write_wait, wait); - if (dev->ring_head != dev->ring_tail) - mask |= POLLIN | POLLRDNORM; - if (!dev->interrupt_out_busy) - mask |= POLLOUT | POLLWRNORM; - return mask; -} -/** - * usb_tranzport_read - */ - -static ssize_t usb_tranzport_read(struct file *file, char __user *buffer, - size_t count, loff_t *ppos) -{ - struct usb_tranzport *dev; - int retval = 0; -#if BUFFERED_READS - int c = 0; -#endif -#if COMPRESS_WHEEL_EVENTS - signed char oldwheel; - signed char newwheel; - int cancompress = 1; - int next_tail; -#endif - - /* do I have such a thing as a null event? */ - - dev = file->private_data; - - /* verify that we actually have some data to read */ - if (count == 0) - goto exit; - - /* lock this object */ - if (mutex_lock_interruptible(&dev->mtx)) { - retval = -ERESTARTSYS; - goto exit; - } - - /* verify that the device wasn't unplugged */ - if (dev->intf == NULL) { - retval = -ENODEV; - pr_err("%s: No device or device unplugged %d\n", - __func__, retval); - goto unlock_exit; - } - - while (dev->ring_head == dev->ring_tail) { - - if (file->f_flags & O_NONBLOCK) { - retval = -EAGAIN; - goto unlock_exit; - } - /* tiny race - FIXME: make atomic? */ - /* atomic_cmp_exchange(&dev->interrupt_in_done,0,0); */ - dev->interrupt_in_done = 0; - retval = wait_event_interruptible(dev->read_wait, - dev->interrupt_in_done); - if (retval < 0) - goto unlock_exit; - } - - dbg_info(&dev->intf->dev, - "%s: copying to userspace: %02x%02x%02x%02x%02x%02x%02x%02x\n", - __func__, - (*dev->ring_buffer)[dev->ring_tail].cmd[0], - (*dev->ring_buffer)[dev->ring_tail].cmd[1], - (*dev->ring_buffer)[dev->ring_tail].cmd[2], - (*dev->ring_buffer)[dev->ring_tail].cmd[3], - (*dev->ring_buffer)[dev->ring_tail].cmd[4], - (*dev->ring_buffer)[dev->ring_tail].cmd[5], - (*dev->ring_buffer)[dev->ring_tail].cmd[6], - (*dev->ring_buffer)[dev->ring_tail].cmd[7]); - -#if BUFFERED_READS - c = 0; - while ((c < count) && (dev->ring_tail != dev->ring_head)) { - -#if COMPRESS_WHEEL_EVENTS - next_tail = (dev->ring_tail+1) % ring_buffer_size; - if (dev->compress_wheel) - cancompress = 1; - while (dev->ring_head != next_tail && cancompress == 1) { - newwheel = (*dev->ring_buffer)[next_tail].cmd[6]; - oldwheel = (*dev->ring_buffer)[dev->ring_tail].cmd[6]; - /* if both are wheel events, and - * no buttons have changes (FIXME, do I have to check?), - * and we are the same sign, we can compress +- 7F - */ - dbg_info(&dev->intf->dev, - "%s: trying to compress: %02x%02x%02x%02x%02x%02x%02x%02x\n", - __func__, - (*dev->ring_buffer)[dev->ring_tail].cmd[0], - (*dev->ring_buffer)[dev->ring_tail].cmd[1], - (*dev->ring_buffer)[dev->ring_tail].cmd[2], - (*dev->ring_buffer)[dev->ring_tail].cmd[3], - (*dev->ring_buffer)[dev->ring_tail].cmd[4], - (*dev->ring_buffer)[dev->ring_tail].cmd[5], - (*dev->ring_buffer)[dev->ring_tail].cmd[6], - (*dev->ring_buffer)[dev->ring_tail].cmd[7]); - - if (((*dev->ring_buffer)[dev->ring_tail].cmd[6] != 0 && - (*dev->ring_buffer)[next_tail].cmd[6] != 0) && - ((newwheel > 0 && oldwheel > 0) || - (newwheel < 0 && oldwheel < 0)) && - ((*dev->ring_buffer)[dev->ring_tail].cmd[2] == - (*dev->ring_buffer)[next_tail].cmd[2]) && - ((*dev->ring_buffer)[dev->ring_tail].cmd[3] == - (*dev->ring_buffer)[next_tail].cmd[3]) && - ((*dev->ring_buffer)[dev->ring_tail].cmd[4] == - (*dev->ring_buffer)[next_tail].cmd[4]) && - ((*dev->ring_buffer)[dev->ring_tail].cmd[5] == - (*dev->ring_buffer)[next_tail].cmd[5])) { - dbg_info(&dev->intf->dev, - "%s: should compress: " - "%02x%02x%02x%02x%02x%02x%02x%02x\n", - __func__, - (*dev->ring_buffer)[dev->ring_tail]. - cmd[0], - (*dev->ring_buffer)[dev->ring_tail]. - cmd[1], - (*dev->ring_buffer)[dev->ring_tail]. - cmd[2], - (*dev->ring_buffer)[dev->ring_tail]. - cmd[3], - (*dev->ring_buffer)[dev->ring_tail]. - cmd[4], - (*dev->ring_buffer)[dev->ring_tail]. - cmd[5], - (*dev->ring_buffer)[dev->ring_tail]. - cmd[6], - (*dev->ring_buffer)[dev->ring_tail]. - cmd[7]); - newwheel += oldwheel; - if (oldwheel > 0 && !(newwheel > 0)) { - newwheel = 0x7f; - cancompress = 0; - } - if (oldwheel < 0 && !(newwheel < 0)) { - newwheel = 0x80; - cancompress = 0; - } - - (*dev->ring_buffer)[next_tail].cmd[6] = - newwheel; - dev->ring_tail = next_tail; - next_tail = - (dev->ring_tail + 1) % ring_buffer_size; - } else { - cancompress = 0; - } - } -#endif /* COMPRESS_WHEEL_EVENTS */ - if (copy_to_user( - &buffer[c], - &(*dev->ring_buffer)[dev->ring_tail], 8)) { - retval = -EFAULT; - goto unlock_exit; - } - dev->ring_tail = (dev->ring_tail + 1) % ring_buffer_size; - c += 8; - dbg_info(&dev->intf->dev, - "%s: head, tail are %x, %x\n", - __func__, dev->ring_head, dev->ring_tail); - } - retval = c; - -#else -/* if (copy_to_user(buffer, &(*dev->ring_buffer)[dev->ring_tail], 8)) { */ - retval = -EFAULT; - goto unlock_exit; -} - -dev->ring_tail = (dev->ring_tail + 1) % ring_buffer_size; -dbg_info(&dev->intf->dev, "%s: head, tail are %x, %x\n", - __func__, dev->ring_head, dev->ring_tail); - -retval = 8; -#endif /* BUFFERED_READS */ - -unlock_exit: -/* unlock the device */ -mutex_unlock(&dev->mtx); - -exit: -return retval; -} - -/** - * usb_tranzport_write - */ -static ssize_t usb_tranzport_write(struct file *file, - const char __user *buffer, size_t count, - loff_t *ppos) -{ - struct usb_tranzport *dev; - size_t bytes_to_write; - int retval = 0; - - dev = file->private_data; - - /* verify that we actually have some data to write */ - if (count == 0) - goto exit; - - /* lock this object */ - if (mutex_lock_interruptible(&dev->mtx)) { - retval = -ERESTARTSYS; - goto exit; - } - /* verify that the device wasn't unplugged */ - if (dev->intf == NULL) { - retval = -ENODEV; - pr_err("%s: No device or device unplugged %d\n", - __func__, retval); - goto unlock_exit; - } - - /* wait until previous transfer is finished */ - if (dev->interrupt_out_busy) { - if (file->f_flags & O_NONBLOCK) { - retval = -EAGAIN; - goto unlock_exit; - } - retval = wait_event_interruptible(dev->write_wait, - !dev->interrupt_out_busy); - if (retval < 0) - goto unlock_exit; - } - - /* write the data into interrupt_out_buffer from userspace */ - bytes_to_write = min(count, - write_buffer_size * - dev->interrupt_out_endpoint_size); - if (bytes_to_write < count) - dev_warn(&dev->intf->dev, - "Write buffer overflow, %zd bytes dropped\n", - count - bytes_to_write); - - dbg_info(&dev->intf->dev, - "%s: count = %zd, bytes_to_write = %zd\n", __func__, - count, bytes_to_write); - - if (copy_from_user(dev->interrupt_out_buffer, buffer, bytes_to_write)) { - retval = -EFAULT; - goto unlock_exit; - } - - if (dev->interrupt_out_endpoint == NULL) { - dev_err(&dev->intf->dev, "Endpoint should not be null!\n"); - goto unlock_exit; - } - - /* send off the urb */ - usb_fill_int_urb(dev->interrupt_out_urb, - interface_to_usbdev(dev->intf), - usb_sndintpipe(interface_to_usbdev(dev->intf), - dev->interrupt_out_endpoint-> - bEndpointAddress), - dev->interrupt_out_buffer, bytes_to_write, - usb_tranzport_interrupt_out_callback, dev, - dev->interrupt_out_interval); - - dev->interrupt_out_busy = 1; - wmb(); - - retval = usb_submit_urb(dev->interrupt_out_urb, GFP_KERNEL); - if (retval) { - dev->interrupt_out_busy = 0; - dev_err(&dev->intf->dev, - "Couldn't submit interrupt_out_urb %d\n", retval); - goto unlock_exit; - } - retval = bytes_to_write; - -unlock_exit: - /* unlock the device */ - mutex_unlock(&dev->mtx); - -exit: - return retval; -} - -/* file operations needed when we register this driver */ -static const struct file_operations usb_tranzport_fops = { - .owner = THIS_MODULE, - .read = usb_tranzport_read, - .write = usb_tranzport_write, - .open = usb_tranzport_open, - .release = usb_tranzport_release, - .poll = usb_tranzport_poll, - .llseek = no_llseek, -}; - -/* - * usb class driver info in order to get a minor number from the usb core, - * and to have the device registered with the driver core - */ -static struct usb_class_driver usb_tranzport_class = { - .name = "tranzport%d", - .fops = &usb_tranzport_fops, - .minor_base = USB_TRANZPORT_MINOR_BASE, -}; - -/** - * usb_tranzport_probe - * - * Called by the usb core when a new device is connected that it thinks - * this driver might be interested in. - */ -static int usb_tranzport_probe(struct usb_interface *intf, - const struct usb_device_id *id) { - struct usb_device *udev = interface_to_usbdev(intf); - struct usb_tranzport *dev = NULL; - struct usb_host_interface *iface_desc; - struct usb_endpoint_descriptor *endpoint; - int i; - int true_size; - int retval = -ENOMEM; - - /* allocate memory for our device state and initialize it */ - - dev = kzalloc(sizeof(*dev), GFP_KERNEL); - if (dev == NULL) - goto exit; - - mutex_init(&dev->mtx); - dev->intf = intf; - init_waitqueue_head(&dev->read_wait); - init_waitqueue_head(&dev->write_wait); - - iface_desc = intf->cur_altsetting; - - /* set up the endpoint information */ - for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { - endpoint = &iface_desc->endpoint[i].desc; - - if (usb_endpoint_is_int_in(endpoint)) - dev->interrupt_in_endpoint = endpoint; - - if (usb_endpoint_is_int_out(endpoint)) - dev->interrupt_out_endpoint = endpoint; - } - if (dev->interrupt_in_endpoint == NULL) { - dev_err(&intf->dev, "Interrupt in endpoint not found\n"); - goto error; - } - if (dev->interrupt_out_endpoint == NULL) - dev_warn(&intf->dev, - "Interrupt out endpoint not found (using control endpoint instead)\n"); - - dev->interrupt_in_endpoint_size = - le16_to_cpu(dev->interrupt_in_endpoint->wMaxPacketSize); - - if (dev->interrupt_in_endpoint_size != 8) - dev_warn(&intf->dev, "Interrupt in endpoint size is not 8!\n"); - - if (ring_buffer_size == 0) - ring_buffer_size = RING_BUFFER_SIZE; - true_size = min(ring_buffer_size, RING_BUFFER_SIZE); - - /* - * FIXME - there are more usb_alloc routines for dma correctness. - * Needed? - */ - - dev->ring_buffer = - kmalloc((true_size * sizeof(struct tranzport_cmd)) + 8, GFP_KERNEL); - if (!dev->ring_buffer) - goto error; - - dev->interrupt_in_buffer = - kmalloc(dev->interrupt_in_endpoint_size, GFP_KERNEL); - if (!dev->interrupt_in_buffer) - goto error; - - dev->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL); - if (!dev->interrupt_in_urb) { - dev_err(&intf->dev, "Couldn't allocate interrupt_in_urb\n"); - goto error; - } - dev->interrupt_out_endpoint_size = - dev->interrupt_out_endpoint ? - le16_to_cpu(dev->interrupt_out_endpoint->wMaxPacketSize) : - udev->descriptor.bMaxPacketSize0; - - if (dev->interrupt_out_endpoint_size != 8) - dev_warn(&intf->dev, - "Interrupt out endpoint size is not 8!)\n"); - - dev->interrupt_out_buffer = - kmalloc_array(write_buffer_size, - dev->interrupt_out_endpoint_size, GFP_KERNEL); - if (!dev->interrupt_out_buffer) - goto error; - - dev->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL); - if (!dev->interrupt_out_urb) { - dev_err(&intf->dev, "Couldn't allocate interrupt_out_urb\n"); - goto error; - } - dev->interrupt_in_interval = - min_interrupt_in_interval > - dev->interrupt_in_endpoint->bInterval ? min_interrupt_in_interval - : dev->interrupt_in_endpoint->bInterval; - - if (dev->interrupt_out_endpoint) { - dev->interrupt_out_interval = - min_interrupt_out_interval > - dev->interrupt_out_endpoint->bInterval ? - min_interrupt_out_interval : - dev->interrupt_out_endpoint->bInterval; - } - - /* we can register the device now, as it is ready */ - usb_set_intfdata(intf, dev); - - retval = usb_register_dev(intf, &usb_tranzport_class); - if (retval) { - /* something prevented us from registering this driver */ - dev_err(&intf->dev, - "Not able to get a minor for this device.\n"); - usb_set_intfdata(intf, NULL); - goto error; - } - - retval = device_create_file(&intf->dev, &dev_attr_compress_wheel); - if (retval) - goto error; - retval = device_create_file(&intf->dev, &dev_attr_enable); - if (retval) - goto error; - retval = device_create_file(&intf->dev, &dev_attr_offline); - if (retval) - goto error; - - /* let the user know what node this device is now attached to */ - dev_info(&intf->dev, - "Tranzport Device #%d now attached to major %d minor %d\n", - (intf->minor - USB_TRANZPORT_MINOR_BASE), USB_MAJOR, - intf->minor); - -exit: - return retval; - -error: - usb_tranzport_delete(dev); - return retval; -} - -/** - * usb_tranzport_disconnect - * - * Called by the usb core when the device is removed from the system. - */ -static void usb_tranzport_disconnect(struct usb_interface *intf) -{ - struct usb_tranzport *dev; - int minor; - - mutex_lock(&disconnect_mutex); - dev = usb_get_intfdata(intf); - usb_set_intfdata(intf, NULL); - mutex_lock(&dev->mtx); - minor = intf->minor; - /* give back our minor */ - usb_deregister_dev(intf, &usb_tranzport_class); - - /* if the device is not opened, then we clean up right now */ - if (!dev->open_count) { - mutex_unlock(&dev->mtx); - usb_tranzport_delete(dev); - } else { - dev->intf = NULL; - mutex_unlock(&dev->mtx); - } - - mutex_unlock(&disconnect_mutex); - - dev_info(&intf->dev, "Tranzport Surface #%d now disconnected\n", - (minor - USB_TRANZPORT_MINOR_BASE)); -} - -/* usb specific object needed to register this driver with the usb subsystem */ -static struct usb_driver usb_tranzport_driver = { - .name = "tranzport", - .probe = usb_tranzport_probe, - .disconnect = usb_tranzport_disconnect, - .id_table = usb_tranzport_table, -}; - -module_usb_driver(usb_tranzport_driver); -- cgit v1.2.3 From 16fae052074aa44ffa8c15b789719bd9611a1278 Mon Sep 17 00:00:00 2001 From: Kristina Martšenko Date: Thu, 24 Jul 2014 04:34:38 +0300 Subject: staging: keucr: remove driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The driver hasn't been fully cleaned up and it doesn't look like anyone is working on it anymore (including the original author). So remove the driver and all references to it. If someone wants to finish cleaning the driver up and moving it out of staging, this commit can be reverted. Signed-off-by: Kristina Martšenko Cc: Cho, Yu-Chen Signed-off-by: Greg Kroah-Hartman --- MAINTAINERS | 5 - drivers/staging/Kconfig | 2 - drivers/staging/Makefile | 1 - drivers/staging/keucr/Kconfig | 14 - drivers/staging/keucr/Makefile | 13 - drivers/staging/keucr/TODO | 12 - drivers/staging/keucr/common.h | 7 - drivers/staging/keucr/init.c | 333 --------------- drivers/staging/keucr/init.h | 518 ----------------------- drivers/staging/keucr/scsiglue.c | 467 -------------------- drivers/staging/keucr/scsiglue.h | 10 - drivers/staging/keucr/smcommon.h | 29 -- drivers/staging/keucr/smil.h | 288 ------------- drivers/staging/keucr/smilecc.c | 211 ---------- drivers/staging/keucr/smilmain.c | 760 --------------------------------- drivers/staging/keucr/smilsub.c | 679 ------------------------------ drivers/staging/keucr/smscsi.c | 194 --------- drivers/staging/keucr/transport.c | 865 -------------------------------------- drivers/staging/keucr/transport.h | 73 ---- drivers/staging/keucr/usb.c | 643 ---------------------------- drivers/staging/keucr/usb.h | 240 ----------- drivers/usb/storage/Kconfig | 2 +- drivers/usb/storage/ene_ub6250.c | 4 +- 23 files changed, 3 insertions(+), 5367 deletions(-) delete mode 100644 drivers/staging/keucr/Kconfig delete mode 100644 drivers/staging/keucr/Makefile delete mode 100644 drivers/staging/keucr/TODO delete mode 100644 drivers/staging/keucr/common.h delete mode 100644 drivers/staging/keucr/init.c delete mode 100644 drivers/staging/keucr/init.h delete mode 100644 drivers/staging/keucr/scsiglue.c delete mode 100644 drivers/staging/keucr/scsiglue.h delete mode 100644 drivers/staging/keucr/smcommon.h delete mode 100644 drivers/staging/keucr/smil.h delete mode 100644 drivers/staging/keucr/smilecc.c delete mode 100644 drivers/staging/keucr/smilmain.c delete mode 100644 drivers/staging/keucr/smilsub.c delete mode 100644 drivers/staging/keucr/smscsi.c delete mode 100644 drivers/staging/keucr/transport.c delete mode 100644 drivers/staging/keucr/transport.h delete mode 100644 drivers/staging/keucr/usb.c delete mode 100644 drivers/staging/keucr/usb.h (limited to 'MAINTAINERS') diff --git a/MAINTAINERS b/MAINTAINERS index c6b4fa413b3b..6d2c52ea407d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8619,11 +8619,6 @@ W: http://www.linux-speakup.org/ S: Odd Fixes F: drivers/staging/speakup/ -STAGING - USB ENE SM/MS CARD READER DRIVER -M: Al Cho -S: Odd Fixes -F: drivers/staging/keucr/ - STAGING - VIA VT665X DRIVERS M: Forest Bond S: Odd Fixes diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index d6a10c013a7f..5b14f0d8d1b8 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -76,8 +76,6 @@ source "drivers/staging/quickstart/Kconfig" source "drivers/staging/emxx_udc/Kconfig" -source "drivers/staging/keucr/Kconfig" - source "drivers/staging/bcm/Kconfig" source "drivers/staging/ft1000/Kconfig" diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index 4a708e95d307..d4536df8b69b 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -32,7 +32,6 @@ obj-$(CONFIG_IIO) += iio/ obj-$(CONFIG_FB_XGI) += xgifb/ obj-$(CONFIG_ACPI_QUICKSTART) += quickstart/ obj-$(CONFIG_USB_EMXX) += emxx_udc/ -obj-$(CONFIG_USB_ENESTORAGE) += keucr/ obj-$(CONFIG_BCM_WIMAX) += bcm/ obj-$(CONFIG_FT1000) += ft1000/ obj-$(CONFIG_SPEAKUP) += speakup/ diff --git a/drivers/staging/keucr/Kconfig b/drivers/staging/keucr/Kconfig deleted file mode 100644 index ba756bf20665..000000000000 --- a/drivers/staging/keucr/Kconfig +++ /dev/null @@ -1,14 +0,0 @@ -config USB_ENESTORAGE - tristate "USB ENE SM card reader support" - depends on USB && SCSI && m - ---help--- - Say Y here if you wish to control a ENE SM Card reader. - To use SD/MS card, please build driver/usb/storage/ums-eneub6250.ko - - This option depends on 'SCSI' support being enabled, but you - probably also need 'SCSI device support: SCSI disk support' - (BLK_DEV_SD) for most USB storage devices. - - To compile this driver as a module, choose M here: the - module will be called keucr. - diff --git a/drivers/staging/keucr/Makefile b/drivers/staging/keucr/Makefile deleted file mode 100644 index c180bf4fab93..000000000000 --- a/drivers/staging/keucr/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -ccflags-y := -Idrivers/scsi - -obj-$(CONFIG_USB_ENESTORAGE) += keucr.o - -keucr-y := \ - usb.o \ - scsiglue.o \ - transport.o \ - init.o \ - smscsi.o \ - smilmain.o \ - smilsub.o \ - smilecc.o diff --git a/drivers/staging/keucr/TODO b/drivers/staging/keucr/TODO deleted file mode 100644 index d6da656eee1d..000000000000 --- a/drivers/staging/keucr/TODO +++ /dev/null @@ -1,12 +0,0 @@ -TODO: - - checkpatch.pl clean - - sparse clean - - determine if the driver should not be using a duplicate - version of the usb-storage scsi interface code, but should - be merged into the drivers/usb/storage/ directory and - infrastructure instead. - - review by the USB developer community - - smcommon.h & smilsub.c: use kernel hweight8(), hweight16() - -Please send any patches for this driver to Al Cho and -Greg Kroah-Hartman . diff --git a/drivers/staging/keucr/common.h b/drivers/staging/keucr/common.h deleted file mode 100644 index f0b977616cd5..000000000000 --- a/drivers/staging/keucr/common.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef COMMON_INCD -#define COMMON_INCD - -#define BYTE_MASK 0xff - -#endif - diff --git a/drivers/staging/keucr/init.c b/drivers/staging/keucr/init.c deleted file mode 100644 index 1e7449d6d120..000000000000 --- a/drivers/staging/keucr/init.c +++ /dev/null @@ -1,333 +0,0 @@ -#include -#include -#include - -#include -#include -#include - -#include "usb.h" -#include "scsiglue.h" -#include "transport.h" -#include "smil.h" -#include "init.h" - -/* - * ENE_InitMedia(): - */ -int ENE_InitMedia(struct us_data *us) -{ - int result; - u8 MiscReg03 = 0; - - dev_info(&us->pusb_dev->dev, "--- Init Media ---\n"); - result = ene_read_byte(us, REG_CARD_STATUS, &MiscReg03); - if (result != USB_STOR_XFER_GOOD) { - dev_err(&us->pusb_dev->dev, "Failed to read register\n"); - return USB_STOR_TRANSPORT_ERROR; - } - dev_info(&us->pusb_dev->dev, "MiscReg03 = %x\n", MiscReg03); - - if (MiscReg03 & 0x02) { - if (!us->SM_Status.Ready && !us->MS_Status.Ready) { - result = ENE_SMInit(us); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - } - - } - return result; -} - -/* - * ene_read_byte() : - */ -int ene_read_byte(struct us_data *us, u16 index, void *buf) -{ - struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; - int result; - - memset(bcb, 0, sizeof(struct bulk_cb_wrap)); - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = 0x01; - bcb->Flags = 0x80; - bcb->CDB[0] = 0xED; - bcb->CDB[2] = (u8)(index>>8); - bcb->CDB[3] = (u8)index; - - result = ENE_SendScsiCmd(us, FDIR_READ, buf, 0); - return result; -} - -/* - *ENE_SMInit() - */ -int ENE_SMInit(struct us_data *us) -{ - struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; - int result; - u8 buf[0x200]; - - dev_dbg(&us->pusb_dev->dev, "transport --- ENE_SMInit\n"); - - result = ENE_LoadBinCode(us, SM_INIT_PATTERN); - if (result != USB_STOR_XFER_GOOD) { - dev_info(&us->pusb_dev->dev, - "Failed to load SmartMedia init code\n: result= %x\n", - result); - return USB_STOR_TRANSPORT_ERROR; - } - - memset(bcb, 0, sizeof(struct bulk_cb_wrap)); - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = 0x200; - bcb->Flags = 0x80; - bcb->CDB[0] = 0xF1; - bcb->CDB[1] = 0x01; - - result = ENE_SendScsiCmd(us, FDIR_READ, &buf, 0); - if (result != USB_STOR_XFER_GOOD) { - dev_err(&us->pusb_dev->dev, - "Failed to load SmartMedia init code: result = %x\n", - result); - return USB_STOR_TRANSPORT_ERROR; - } - - us->SM_Status = *(struct keucr_sm_status *)&buf[0]; - - us->SM_DeviceID = buf[1]; - us->SM_CardID = buf[2]; - - if (us->SM_Status.Insert && us->SM_Status.Ready) { - dev_info(&us->pusb_dev->dev, "Insert = %x\n", - us->SM_Status.Insert); - dev_info(&us->pusb_dev->dev, "Ready = %x\n", - us->SM_Status.Ready); - dev_info(&us->pusb_dev->dev, "WtP = %x\n", - us->SM_Status.WtP); - dev_info(&us->pusb_dev->dev, "DeviceID = %x\n", - us->SM_DeviceID); - dev_info(&us->pusb_dev->dev, "CardID = %x\n", - us->SM_CardID); - MediaChange = 1; - Check_D_MediaFmt(us); - } else { - dev_err(&us->pusb_dev->dev, - "SmartMedia Card Not Ready --- %x\n", buf[0]); - return USB_STOR_TRANSPORT_ERROR; - } - - return USB_STOR_TRANSPORT_GOOD; -} - -/* - * ENE_LoadBinCode() - */ -int ENE_LoadBinCode(struct us_data *us, u8 flag) -{ - struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; - int result; - /* void *buf; */ - u8 *buf; - - /* dev_info(&us->pusb_dev->dev, "transport --- ENE_LoadBinCode\n"); */ - if (us->BIN_FLAG == flag) - return USB_STOR_TRANSPORT_GOOD; - - buf = kmalloc(0x800, GFP_KERNEL); - if (buf == NULL) - return USB_STOR_TRANSPORT_ERROR; - switch (flag) { - /* For SS */ - case SM_INIT_PATTERN: - dev_dbg(&us->pusb_dev->dev, "SM_INIT_PATTERN\n"); - memcpy(buf, SM_Init, 0x800); - break; - case SM_RW_PATTERN: - dev_dbg(&us->pusb_dev->dev, "SM_RW_PATTERN\n"); - memcpy(buf, SM_Rdwr, 0x800); - break; - } - - memset(bcb, 0, sizeof(struct bulk_cb_wrap)); - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = 0x800; - bcb->Flags = 0x00; - bcb->CDB[0] = 0xEF; - - result = ENE_SendScsiCmd(us, FDIR_WRITE, buf, 0); - - kfree(buf); - us->BIN_FLAG = flag; - return result; -} - -/* - * ENE_SendScsiCmd(): - */ -int ENE_SendScsiCmd(struct us_data *us, u8 fDir, void *buf, int use_sg) -{ - struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; - struct bulk_cs_wrap *bcs = (struct bulk_cs_wrap *) us->iobuf; - - int result; - unsigned int transfer_length = bcb->DataTransferLength, - cswlen = 0, partial = 0; - unsigned int residue; - - /* dev_dbg(&us->pusb_dev->dev, "transport --- ENE_SendScsiCmd\n"); */ - /* send cmd to out endpoint */ - result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe, - bcb, US_BULK_CB_WRAP_LEN, NULL); - if (result != USB_STOR_XFER_GOOD) { - dev_err(&us->pusb_dev->dev, - "send cmd to out endpoint fail ---\n"); - return USB_STOR_TRANSPORT_ERROR; - } - - if (buf) { - unsigned int pipe = fDir; - - if (fDir == FDIR_READ) - pipe = us->recv_bulk_pipe; - else - pipe = us->send_bulk_pipe; - - /* Bulk */ - if (use_sg) - result = usb_stor_bulk_srb(us, pipe, us->srb); - else - result = usb_stor_bulk_transfer_sg(us, pipe, buf, - transfer_length, 0, &partial); - if (result != USB_STOR_XFER_GOOD) { - dev_err(&us->pusb_dev->dev, "data transfer fail ---\n"); - return USB_STOR_TRANSPORT_ERROR; - } - } - - /* Get CSW for device status */ - result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, bcs, - US_BULK_CS_WRAP_LEN, &cswlen); - - if (result == USB_STOR_XFER_SHORT && cswlen == 0) { - dev_warn(&us->pusb_dev->dev, - "Received 0-length CSW; retrying...\n"); - result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, - bcs, US_BULK_CS_WRAP_LEN, &cswlen); - } - - if (result == USB_STOR_XFER_STALLED) { - /* get the status again */ - dev_warn(&us->pusb_dev->dev, - "Attempting to get CSW (2nd try)...\n"); - result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, - bcs, US_BULK_CS_WRAP_LEN, NULL); - } - - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - /* check bulk status */ - residue = le32_to_cpu(bcs->Residue); - - /* - * try to compute the actual residue, based on how much data - * was really transferred and what the device tells us - */ - if (residue && !(us->fflags & US_FL_IGNORE_RESIDUE)) { - residue = min(residue, transfer_length); - if (us->srb) - scsi_set_resid(us->srb, max(scsi_get_resid(us->srb), - (int) residue)); - } - - if (bcs->Status != US_BULK_STAT_OK) - return USB_STOR_TRANSPORT_ERROR; - - return USB_STOR_TRANSPORT_GOOD; -} - -/* - * ENE_Read_Data() - */ -int ENE_Read_Data(struct us_data *us, void *buf, unsigned int length) -{ - struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; - struct bulk_cs_wrap *bcs = (struct bulk_cs_wrap *) us->iobuf; - int result; - - /* dev_dbg(&us->pusb_dev->dev, "transport --- ENE_Read_Data\n"); */ - /* set up the command wrapper */ - memset(bcb, 0, sizeof(struct bulk_cb_wrap)); - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = length; - bcb->Flags = 0x80; - bcb->CDB[0] = 0xED; - bcb->CDB[2] = 0xFF; - bcb->CDB[3] = 0x81; - - /* send cmd to out endpoint */ - result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe, bcb, - US_BULK_CB_WRAP_LEN, NULL); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - /* R/W data */ - result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, - buf, length, NULL); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - /* Get CSW for device status */ - result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, bcs, - US_BULK_CS_WRAP_LEN, NULL); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - if (bcs->Status != US_BULK_STAT_OK) - return USB_STOR_TRANSPORT_ERROR; - - return USB_STOR_TRANSPORT_GOOD; -} - -/* - * ENE_Write_Data(): - */ -int ENE_Write_Data(struct us_data *us, void *buf, unsigned int length) -{ - struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; - struct bulk_cs_wrap *bcs = (struct bulk_cs_wrap *) us->iobuf; - int result; - - /* printk("transport --- ENE_Write_Data\n"); */ - /* set up the command wrapper */ - memset(bcb, 0, sizeof(struct bulk_cb_wrap)); - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = length; - bcb->Flags = 0x00; - bcb->CDB[0] = 0xEE; - bcb->CDB[2] = 0xFF; - bcb->CDB[3] = 0x81; - - /* send cmd to out endpoint */ - result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe, bcb, - US_BULK_CB_WRAP_LEN, NULL); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - /* R/W data */ - result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe, - buf, length, NULL); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - /* Get CSW for device status */ - result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, bcs, - US_BULK_CS_WRAP_LEN, NULL); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - if (bcs->Status != US_BULK_STAT_OK) - return USB_STOR_TRANSPORT_ERROR; - - return USB_STOR_TRANSPORT_GOOD; -} - diff --git a/drivers/staging/keucr/init.h b/drivers/staging/keucr/init.h deleted file mode 100644 index d1367e726ff1..000000000000 --- a/drivers/staging/keucr/init.h +++ /dev/null @@ -1,518 +0,0 @@ -#include "common.h" - -static u8 SM_Init[] = { -0x7B, 0x09, 0x7C, 0xF0, 0x7D, 0x10, 0x7E, 0xE9, -0x7F, 0xCC, 0x12, 0x2F, 0x71, 0x90, 0xE9, 0xCC, -0xE0, 0xB4, 0x07, 0x12, 0x90, 0xFF, 0x09, 0xE0, -0x30, 0xE1, 0x06, 0x90, 0xFF, 0x23, 0x74, 0x80, -0xF0, 0x12, 0x2F, 0x5C, 0xD3, 0x22, 0x78, 0x00, -0x90, 0xFF, 0x83, 0xE0, 0xA2, 0xE1, 0x92, 0x0A, -0x20, 0x0A, 0x03, 0x02, 0xE0, 0xD0, 0x7F, 0x00, -0x12, 0x2F, 0xCB, 0x20, 0x01, 0x05, 0xC2, 0x25, -0x02, 0xE0, 0xEB, 0xC3, 0xE8, 0x94, 0x02, 0x40, -0x03, 0x02, 0xE0, 0xD0, 0xC0, 0x00, 0x90, 0xFE, -0x66, 0x74, 0x90, 0xF0, 0x12, 0xE1, 0x40, 0x90, -0xFF, 0x95, 0xE0, 0xC2, 0xE4, 0xF0, 0x90, 0xFF, -0x97, 0x74, 0x01, 0xF0, 0x7E, 0x01, 0x7F, 0x90, -0x12, 0x2F, 0x74, 0x90, 0xFF, 0x97, 0x74, 0x03, -0xF0, 0x90, 0xFE, 0xC5, 0xE4, 0xF0, 0x74, 0x00, -0x90, 0xFE, 0x6A, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0x7E, 0x23, 0x7F, 0xDC, 0x12, 0x2F, -0x74, 0x12, 0x2F, 0x5C, 0x90, 0xFE, 0x64, 0xE0, -0x54, 0x01, 0x60, 0x04, 0xD2, 0x02, 0x80, 0x02, -0xC2, 0x02, 0x90, 0xFF, 0x95, 0xE0, 0xD2, 0xE4, -0xF0, 0x78, 0x10, 0x79, 0x04, 0x12, 0xE1, 0x71, -0x50, 0x3A, 0x90, 0xE9, 0xC6, 0xE0, 0x90, 0xE9, -0xC3, 0xF0, 0x78, 0x9A, 0x79, 0x04, 0x12, 0xE1, -0x71, 0x50, 0x29, 0x90, 0xE9, 0xC7, 0xE0, 0xB4, -0xB5, 0x22, 0x90, 0xE9, 0xC4, 0xF0, 0xD0, 0x00, -0xD2, 0x00, 0xC2, 0x01, 0xC2, 0x25, 0x80, 0x1B, -0xC2, 0x00, 0xD2, 0x01, 0x74, 0xFF, 0x90, 0xE9, -0xC3, 0xF0, 0xA3, 0xF0, 0x51, 0x01, 0xC2, 0x0A, -0xC2, 0x02, 0x80, 0x07, 0xD0, 0x00, 0x05, 0x00, -0x02, 0xE0, 0x43, 0x90, 0xFF, 0x09, 0xE0, 0x30, -0xE1, 0x06, 0x90, 0xFF, 0x23, 0x74, 0x80, 0xF0, -0x90, 0xFF, 0x09, 0xE0, 0x30, 0xE5, 0xFC, 0xE4, -0xA2, 0x0A, 0x92, 0xE0, 0xA2, 0x00, 0x92, 0xE1, -0xA2, 0x01, 0x92, 0xE2, 0xA2, 0x02, 0x92, 0xE6, -0xA2, 0x25, 0x92, 0xE7, 0x90, 0xF4, 0x00, 0xF0, -0x90, 0xE9, 0xC3, 0xE0, 0x90, 0xF4, 0x01, 0xF0, -0x90, 0xE9, 0xC4, 0xE0, 0x90, 0xF4, 0x02, 0xF0, -0x90, 0xFF, 0x2A, 0x74, 0x02, 0xF0, 0xA3, 0x74, -0x00, 0xF0, 0x75, 0x3C, 0x00, 0x75, 0x3D, 0x00, -0x75, 0x3E, 0x00, 0x75, 0x3F, 0x00, 0xD3, 0x22, -0x90, 0xFE, 0x71, 0xE4, 0xF0, 0x90, 0xFE, 0x72, -0x74, 0x01, 0xF0, 0x90, 0xFE, 0x64, 0x74, 0x0C, -0xF0, 0x90, 0xFE, 0x64, 0x74, 0x00, 0x45, 0x4E, -0xF0, 0x90, 0xFE, 0x64, 0xE0, 0x54, 0x10, 0x60, -0x08, 0x90, 0xFE, 0x72, 0x74, 0x81, 0xF0, 0xD3, -0x22, 0x90, 0xFE, 0x64, 0x74, 0x08, 0xF0, 0xC3, -0x22, 0x90, 0xFE, 0x6F, 0xE9, 0x14, 0xF0, 0x90, -0xFE, 0x70, 0xE0, 0x54, 0xFC, 0xF0, 0x90, 0xFE, -0x68, 0x74, 0x00, 0xF0, 0xB8, 0x9A, 0x2A, 0x74, -0x15, 0x90, 0xFE, 0x64, 0xF0, 0x74, 0x9A, 0x90, -0xFE, 0x60, 0xF0, 0x74, 0x16, 0x90, 0xFE, 0x64, -0xF0, 0x74, 0x00, 0x90, 0xFE, 0x60, 0xF0, 0x30, -0x0A, 0x5D, 0x90, 0xFE, 0x64, 0xE0, 0x20, 0xE7, -0xF6, 0x74, 0x14, 0x90, 0xFE, 0x64, 0xF0, 0x80, -0x20, 0x90, 0xFE, 0x6E, 0xE8, 0x44, 0x01, 0xF0, -0xC2, 0x09, 0x12, 0xE3, 0x26, 0x20, 0x08, 0x0E, -0x12, 0xE3, 0x32, 0x30, 0x3E, 0xF7, 0x90, 0xFE, -0xD8, 0x74, 0x01, 0xF0, 0xD2, 0x09, 0x20, 0x09, -0x2E, 0x7A, 0xE9, 0x7B, 0xC5, 0x7C, 0xFE, 0x7D, -0x60, 0xB8, 0x10, 0x07, 0x90, 0xFE, 0x69, 0xE0, -0x20, 0xE6, 0xFC, 0x8C, 0x83, 0x8D, 0x82, 0xE0, -0x8A, 0x83, 0x8B, 0x82, 0xF0, 0xA3, 0xAA, 0x83, -0xAB, 0x82, 0xD9, 0xE5, 0xB8, 0x9A, 0x06, 0x74, -0x10, 0x90, 0xFE, 0x64, 0xF0, 0xD3, 0x22, 0xC3, -0x22, 0x90, 0xFF, 0x83, 0xE0, 0xA2, 0xE1, 0x92, -0x25, 0x20, 0x25, 0x06, 0xC2, 0x1F, 0xD2, 0x19, -0xC3, 0x22, 0x7F, 0x02, 0x12, 0x2F, 0xCB, 0x20, -0x19, 0x05, 0x30, 0x1F, 0x02, 0xD3, 0x22, 0x90, -0xEA, 0x44, 0x74, 0x80, 0xF0, 0x7F, 0x10, 0x12, -0x2F, 0xC5, 0x90, 0xFE, 0x47, 0xE0, 0x44, 0x80, -0xF0, 0x78, 0x00, 0xE8, 0xC3, 0x94, 0x04, 0x50, -0x0A, 0x7F, 0x88, 0x7E, 0x13, 0x12, 0xE3, 0x4D, -0x08, 0x80, 0xF0, 0x90, 0xFE, 0x45, 0xE0, 0x54, -0xFB, 0xF0, 0x90, 0xFE, 0x47, 0xE0, 0x54, 0xBF, -0xF0, 0x90, 0xFE, 0x45, 0xE0, 0x54, 0xFE, 0xF0, -0x90, 0xFE, 0x45, 0xE0, 0x54, 0x7F, 0xF0, 0x90, -0xFE, 0x46, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xFE, -0x45, 0xE0, 0x54, 0xC7, 0x44, 0x18, 0xF0, 0x90, -0xFE, 0x47, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0xFE, -0x45, 0xE0, 0x44, 0x40, 0xF0, 0x7F, 0x32, 0x7E, -0x00, 0x12, 0xE3, 0x4D, 0x90, 0xFE, 0x51, 0xE0, -0x54, 0x33, 0xF0, 0x90, 0xFE, 0x44, 0x74, 0x02, -0xF0, 0x30, 0x25, 0x04, 0xE0, 0x20, 0xE1, 0xF9, -0x90, 0xFE, 0x51, 0xE0, 0x54, 0x0F, 0xF0, 0x90, -0xFE, 0x44, 0x74, 0x02, 0xF0, 0x30, 0x25, 0x04, -0xE0, 0x20, 0xE1, 0xF9, 0x90, 0xFE, 0x44, 0x74, -0x04, 0xF0, 0x30, 0x25, 0x04, 0xE0, 0x20, 0xE2, -0xF9, 0x90, 0xFE, 0x4C, 0xE0, 0xF0, 0x90, 0xFE, -0x4D, 0xE0, 0xF0, 0x90, 0xFE, 0x48, 0x74, 0x7F, -0xF0, 0x90, 0xFE, 0x49, 0x74, 0x9F, 0xF0, 0x90, -0xFE, 0x51, 0xE0, 0x54, 0x3C, 0x44, 0x02, 0xF0, -0x90, 0xFE, 0x44, 0x74, 0x02, 0xF0, 0x30, 0x25, -0x04, 0xE0, 0x20, 0xE1, 0xF9, 0x90, 0xFE, 0x46, -0xE0, 0x44, 0x20, 0xF0, 0x79, 0x02, 0x7A, 0x06, -0x7B, 0x00, 0x7C, 0x00, 0x7D, 0x06, 0x7E, 0xEB, -0x7F, 0xC9, 0x12, 0x2F, 0xA7, 0x40, 0x03, 0x02, -0xE3, 0x04, 0xD3, 0x22, 0xE4, 0x90, 0xFE, 0x48, -0xF0, 0x90, 0xFE, 0x49, 0xF0, 0x90, 0xFE, 0x4C, -0xE0, 0xF0, 0x90, 0xFE, 0x4D, 0xE0, 0xF0, 0x90, -0xFE, 0x47, 0xE0, 0x54, 0x7F, 0xF0, 0xC2, 0x25, -0xC2, 0x1F, 0xD2, 0x19, 0xC3, 0x22, 0xC2, 0x3E, -0x75, 0x7C, 0x00, 0x75, 0x7D, 0x00, 0x75, 0x7E, -0x00, 0x22, 0x05, 0x7C, 0xE5, 0x7C, 0x70, 0x14, -0x05, 0x7D, 0xE5, 0x7D, 0x70, 0x04, 0x05, 0x7E, -0x80, 0x0A, 0xB4, 0x17, 0x07, 0xE5, 0x7E, 0xB4, -0x06, 0x02, 0xD2, 0x3E, 0x22, 0x75, 0x8A, 0x00, -0x75, 0x8C, 0xCE, 0xC2, 0x8D, 0x90, 0xEA, 0x65, -0xE4, 0xF0, 0xA3, 0xF0, 0xD2, 0x8C, 0x90, 0xEA, -0x65, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xC3, -0x9E, 0x40, 0xF3, 0x70, 0x05, 0xED, 0xC3, 0x9F, -0x40, 0xEC, 0xC2, 0x8C, 0x22, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x58, 0x44, 0x2D, 0x49, 0x6E, 0x69, 0x74, 0x20, -0x20, 0x20, 0x20, 0x31, 0x30, 0x30, 0x30, 0x31 }; - -static u8 SM_Rdwr[] = { -0x7B, 0x0C, 0x7C, 0xF0, 0x7D, 0x10, 0x7E, 0xE9, -0x7F, 0xCC, 0x12, 0x2F, 0x71, 0x90, 0xE9, 0xC3, -0xE0, 0xB4, 0x73, 0x04, 0x74, 0x40, 0x80, 0x09, -0xB4, 0x75, 0x04, 0x74, 0x40, 0x80, 0x02, 0x74, -0xC0, 0x90, 0xFE, 0x70, 0xF0, 0x90, 0xFF, 0x09, -0xE0, 0x30, 0xE1, 0x06, 0x90, 0xFF, 0x23, 0x74, -0x80, 0xF0, 0x90, 0xFF, 0x83, 0xE0, 0xA2, 0xE1, -0x92, 0x0A, 0x40, 0x01, 0x22, 0x90, 0xFE, 0x6A, -0xE4, 0xF0, 0x90, 0xE9, 0xCC, 0xE0, 0xB4, 0x02, -0x05, 0xD2, 0x06, 0x02, 0xE0, 0x78, 0xB4, 0x03, -0x03, 0x02, 0xE3, 0xD0, 0xB4, 0x04, 0x03, 0x02, -0xE1, 0xC6, 0xB4, 0x05, 0x03, 0x02, 0xE5, 0x20, -0xB4, 0x06, 0x03, 0x02, 0xE5, 0xE0, 0xB4, 0x07, -0x05, 0x12, 0x2F, 0x5C, 0xD3, 0x22, 0xB4, 0x08, -0x05, 0xC2, 0x06, 0x02, 0xE6, 0x3B, 0xC3, 0x22, -0xE5, 0x3E, 0xC3, 0x13, 0x90, 0xE9, 0xCA, 0xF0, -0xC0, 0xE0, 0x75, 0xF0, 0x02, 0xC0, 0xF0, 0x12, -0xE0, 0xD8, 0xEF, 0x70, 0x21, 0x20, 0x37, 0x07, -0x20, 0x09, 0x04, 0xD0, 0xF0, 0x80, 0x05, 0xD0, -0xF0, 0xD5, 0xF0, 0xE9, 0xD0, 0xE0, 0x90, 0xFF, -0x28, 0xE0, 0x30, 0xE7, 0xFC, 0x90, 0xFF, 0x28, -0xE0, 0x44, 0x01, 0xF0, 0xC3, 0x22, 0xD0, 0xF0, -0x90, 0xE9, 0xCF, 0xE0, 0x24, 0x01, 0xF0, 0x90, -0xE9, 0xCE, 0xE0, 0x34, 0x00, 0xF0, 0x90, 0xE9, -0xCD, 0xE0, 0x34, 0x00, 0xF0, 0xD0, 0xE0, 0x14, -0x70, 0xB6, 0x75, 0x3C, 0x00, 0x75, 0x3D, 0x00, -0x75, 0x3E, 0x00, 0x75, 0x3F, 0x00, 0xD3, 0x22, -0xC2, 0x08, 0xC2, 0x36, 0xC2, 0x37, 0xE4, 0x90, -0xEB, 0xC2, 0xF0, 0x90, 0xE9, 0xCD, 0xE0, 0xF8, -0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0x90, 0xFE, 0x6B, -0xF0, 0xA3, 0xE9, 0xF0, 0xA3, 0xE8, 0xF0, 0x90, -0xFE, 0x6F, 0x74, 0x0F, 0xF0, 0x90, 0xFE, 0x70, -0xE0, 0x54, 0xFC, 0x44, 0x02, 0xF0, 0x90, 0xFE, -0xC6, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, -0x90, 0xFE, 0xC0, 0x74, 0xF4, 0xF0, 0x74, 0x00, -0xA3, 0xF0, 0x90, 0xFE, 0x68, 0x74, 0x21, 0xF0, -0x90, 0xFE, 0x64, 0x74, 0x70, 0x45, 0x4E, 0xF0, -0x90, 0xFE, 0x64, 0x74, 0x30, 0x45, 0x4E, 0xF0, -0x30, 0x06, 0x07, 0x90, 0xFF, 0x09, 0xE0, 0x30, -0xE5, 0xFC, 0x90, 0xFE, 0x6E, 0x74, 0x51, 0xF0, -0x90, 0xFE, 0xC4, 0x74, 0x21, 0xF0, 0xC2, 0x09, -0x12, 0xE7, 0xB0, 0x20, 0x08, 0x0E, 0x12, 0xE7, -0xBC, 0x30, 0x3E, 0xF7, 0x90, 0xFE, 0xD8, 0x74, -0x01, 0xF0, 0xD2, 0x09, 0x30, 0x09, 0x03, 0x7F, -0x00, 0x22, 0x12, 0xE7, 0xB0, 0x20, 0x36, 0x11, -0x20, 0x37, 0x0E, 0x12, 0xE7, 0xBC, 0x30, 0x3E, -0xF4, 0x90, 0xFE, 0xD8, 0x74, 0x01, 0xF0, 0xD2, -0x37, 0x30, 0x37, 0x03, 0x7F, 0x00, 0x22, 0x90, -0xFE, 0x64, 0x74, 0x10, 0x45, 0x4E, 0xF0, 0x90, -0xFE, 0x64, 0x74, 0x00, 0x45, 0x4E, 0xF0, 0x12, -0x2F, 0x65, 0x12, 0x2F, 0x68, 0xBF, 0x00, 0x09, -0x74, 0x02, 0x90, 0xEB, 0xC2, 0xF0, 0x7F, 0x00, -0x22, 0x12, 0x2F, 0x6B, 0xBF, 0x00, 0x0F, 0x12, -0x2F, 0x6E, 0xBF, 0x00, 0x09, 0x74, 0x01, 0x90, -0xEB, 0xC2, 0xF0, 0x7F, 0x00, 0x22, 0x30, 0x06, -0x0A, 0x90, 0xFF, 0x2A, 0x74, 0x02, 0xF0, 0xA3, -0x74, 0x00, 0xF0, 0x7F, 0x01, 0x22, 0x12, 0xE3, -0xAA, 0x74, 0x01, 0x90, 0xE9, 0xCB, 0xF0, 0xE5, -0x3E, 0xC3, 0x13, 0x90, 0xE9, 0xCA, 0xF0, 0xC0, -0xE0, 0x75, 0xF0, 0x02, 0xC0, 0xF0, 0x12, 0xE2, -0x2F, 0xEF, 0x70, 0x21, 0x20, 0x37, 0x07, 0x20, -0x09, 0x04, 0xD0, 0xF0, 0x80, 0x05, 0xD0, 0xF0, -0xD5, 0xF0, 0xE9, 0xD0, 0xE0, 0x90, 0xFF, 0x28, -0xE0, 0x30, 0xE7, 0xFC, 0x90, 0xFF, 0x28, 0xE0, -0x44, 0x01, 0xF0, 0xC3, 0x22, 0xD0, 0xF0, 0x90, -0xE9, 0xD2, 0xE0, 0x24, 0x01, 0xF0, 0x90, 0xE9, -0xD1, 0xE0, 0x34, 0x00, 0xF0, 0x90, 0xE9, 0xD0, -0xE0, 0x34, 0x00, 0xF0, 0xD0, 0xE0, 0x14, 0x70, -0xB6, 0x75, 0x3C, 0x00, 0x75, 0x3D, 0x00, 0x75, -0x3E, 0x00, 0x75, 0x3F, 0x00, 0xD3, 0x22, 0xC2, -0x08, 0xC2, 0x36, 0xC2, 0x37, 0x90, 0xFE, 0x68, -0x74, 0x31, 0xF0, 0x90, 0xE9, 0xD0, 0xE0, 0xF8, -0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0x90, 0xFE, 0x6B, -0xF0, 0xA3, 0xE9, 0xF0, 0xA3, 0xE8, 0xF0, 0x90, -0xFE, 0x6F, 0x74, 0x0F, 0xF0, 0x90, 0xFE, 0x70, -0xE0, 0x54, 0xFC, 0x44, 0x22, 0xF0, 0x90, 0xE9, -0xCB, 0xE0, 0x70, 0x0C, 0x90, 0xFE, 0xC0, 0x74, -0xF4, 0xF0, 0xA3, 0x74, 0x00, 0xF0, 0x80, 0x0A, -0x90, 0xFE, 0xC0, 0x74, 0xF0, 0xF0, 0xA3, 0x74, -0x00, 0xF0, 0x90, 0xFE, 0x64, 0x74, 0xF0, 0x45, -0x4E, 0xF0, 0x90, 0xFE, 0x64, 0x74, 0xB0, 0x45, -0x4E, 0xF0, 0x90, 0xFE, 0x6E, 0x74, 0x81, 0xF0, -0x90, 0xE9, 0xCB, 0xE0, 0x70, 0x0D, 0x90, 0xFE, -0xC6, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, -0x02, 0xE3, 0x56, 0x20, 0x2D, 0x03, 0x02, 0xE2, -0xEF, 0x90, 0xFE, 0xC6, 0x74, 0x01, 0xF0, 0xA3, -0x74, 0xFF, 0xF0, 0x90, 0xFF, 0x09, 0x30, 0x0A, -0x04, 0xE0, 0x30, 0xE1, 0xF9, 0x90, 0xFE, 0xC4, -0x74, 0x23, 0xF0, 0x12, 0xE7, 0xB0, 0x20, 0x36, -0x11, 0x20, 0x37, 0x0E, 0x12, 0xE7, 0xBC, 0x30, -0x3E, 0xF4, 0x90, 0xFE, 0xD8, 0x74, 0x01, 0xF0, -0xD2, 0x37, 0x30, 0x37, 0x02, 0x61, 0xA7, 0x90, -0xFF, 0x09, 0xE0, 0x30, 0xE1, 0x06, 0x90, 0xFF, -0x23, 0x74, 0x80, 0xF0, 0x02, 0xE3, 0x3F, 0x90, -0xFE, 0xC6, 0xE4, 0xF0, 0xA3, 0x74, 0x3F, 0xF0, -0x78, 0x08, 0xC0, 0x00, 0xC2, 0x36, 0xC2, 0x37, -0x90, 0xFF, 0x09, 0x30, 0x0A, 0x04, 0xE0, 0x30, -0xE1, 0xF9, 0x90, 0xFE, 0xC4, 0x74, 0x23, 0xF0, -0x12, 0xE7, 0xB0, 0x20, 0x36, 0x11, 0x20, 0x37, -0x0E, 0x12, 0xE7, 0xBC, 0x30, 0x3E, 0xF4, 0x90, -0xFE, 0xD8, 0x74, 0x01, 0xF0, 0xD2, 0x37, 0x90, -0xFF, 0x09, 0xE0, 0x30, 0xE1, 0x06, 0x90, 0xFF, -0x23, 0x74, 0x80, 0xF0, 0x30, 0x37, 0x04, 0xD0, -0x00, 0x80, 0x6C, 0xD0, 0x00, 0xD8, 0xBB, 0xC2, -0x36, 0xC2, 0x37, 0x90, 0xFE, 0xC6, 0xE4, 0xF0, -0xA3, 0x74, 0x0F, 0xF0, 0x90, 0xFE, 0xC0, 0x74, -0xF6, 0xF0, 0xA3, 0x74, 0x00, 0xF0, 0x90, 0xFE, -0xC4, 0x74, 0x23, 0xF0, 0x12, 0xE7, 0xB0, 0x20, -0x36, 0x11, 0x20, 0x37, 0x0E, 0x12, 0xE7, 0xBC, -0x30, 0x3E, 0xF4, 0x90, 0xFE, 0xD8, 0x74, 0x01, -0xF0, 0xD2, 0x37, 0x30, 0x37, 0x02, 0x80, 0x2F, -0xC2, 0x09, 0x12, 0xE7, 0xB0, 0x20, 0x08, 0x0E, -0x12, 0xE7, 0xBC, 0x30, 0x3E, 0xF7, 0x90, 0xFE, -0xD8, 0x74, 0x01, 0xF0, 0xD2, 0x09, 0x30, 0x09, -0x02, 0x80, 0x14, 0x90, 0xFE, 0x64, 0x74, 0x90, -0x45, 0x4E, 0xF0, 0x90, 0xFE, 0x64, 0x74, 0x80, -0x45, 0x4E, 0xF0, 0x12, 0x2F, 0x59, 0x22, 0x7F, -0x00, 0x22, 0x90, 0xF6, 0x00, 0x7F, 0x06, 0x74, -0xFF, 0xF0, 0xA3, 0xDF, 0xFC, 0x7B, 0x02, 0x7C, -0xE9, 0x7D, 0xD3, 0x7E, 0xF6, 0x7F, 0x06, 0x12, -0x2F, 0x71, 0x7B, 0x02, 0x7C, 0xE9, 0x7D, 0xD3, -0x7E, 0xF6, 0x7F, 0x0B, 0x12, 0x2F, 0x71, 0x22, -0x90, 0xFE, 0xC6, 0xE4, 0xF0, 0xA3, 0x74, 0x0F, -0xF0, 0x90, 0xFE, 0x6F, 0xF0, 0x90, 0xFE, 0x70, -0xE0, 0x54, 0xFC, 0xF0, 0x90, 0xFE, 0xC0, 0x74, -0xF6, 0xF0, 0xA3, 0x74, 0x00, 0xF0, 0x90, 0xFE, -0x68, 0x74, 0x21, 0xF0, 0x90, 0xFE, 0x66, 0xE0, -0x54, 0xEF, 0xF0, 0x90, 0xE9, 0xD3, 0xE0, 0xF5, -0x08, 0xA3, 0xE0, 0xF5, 0x09, 0x90, 0xFF, 0x09, -0xE0, 0x30, 0xE5, 0xFC, 0xE4, 0xF5, 0x10, 0x7E, -0xF4, 0x7F, 0x00, 0xC0, 0x06, 0xC0, 0x07, 0xC2, -0x36, 0xC2, 0x37, 0xC2, 0x09, 0x90, 0xE9, 0xCD, -0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0x90, -0xFE, 0x6B, 0xF0, 0xA3, 0xE9, 0xF0, 0xA3, 0xE8, -0xF0, 0x90, 0xFE, 0x6E, 0x74, 0x71, 0xF0, 0x90, -0xFE, 0xC4, 0x74, 0x21, 0xF0, 0x90, 0xFE, 0x65, -0x12, 0xE7, 0xB0, 0xE0, 0x20, 0xE4, 0x11, 0x12, -0xE7, 0xBC, 0x30, 0x3E, 0xF6, 0x90, 0xFE, 0xD8, -0x74, 0x01, 0xF0, 0xD2, 0x09, 0x02, 0xE4, 0x72, -0x74, 0x10, 0xF0, 0x12, 0xE7, 0xB0, 0x20, 0x36, -0x11, 0x20, 0x37, 0x0E, 0x12, 0xE7, 0xBC, 0x30, -0x3E, 0xF4, 0x90, 0xFE, 0xD8, 0x74, 0x01, 0xF0, -0xD2, 0x37, 0x20, 0x09, 0x05, 0x20, 0x37, 0x02, -0x80, 0x10, 0x90, 0xFE, 0x66, 0xE0, 0x44, 0x10, -0xF0, 0x12, 0x2F, 0x5C, 0xD0, 0x07, 0xD0, 0x06, -0xC3, 0x22, 0xD0, 0x07, 0xD0, 0x06, 0x7B, 0x10, -0x7C, 0xF6, 0x7D, 0x00, 0x12, 0x2F, 0x71, 0x05, -0x10, 0xC3, 0xE5, 0x09, 0x94, 0x01, 0xF5, 0x09, -0xE5, 0x08, 0x94, 0x00, 0xF5, 0x08, 0x45, 0x09, -0x70, 0x03, 0x02, 0xE4, 0xEF, 0x90, 0xE9, 0xCF, -0xE0, 0x24, 0x20, 0xF0, 0x90, 0xE9, 0xCE, 0xE0, -0x34, 0x00, 0xF0, 0x90, 0xE9, 0xCD, 0xE0, 0x34, -0x00, 0xF0, 0xC3, 0xEF, 0x24, 0x10, 0xFF, 0xEE, -0x34, 0x00, 0xFE, 0xE5, 0x10, 0x64, 0x20, 0x60, -0x03, 0x02, 0xE4, 0x13, 0x90, 0xFF, 0x2A, 0x74, -0x02, 0xF0, 0xA3, 0x74, 0x00, 0xF0, 0x75, 0x10, -0x00, 0x7E, 0xF4, 0x7F, 0x00, 0x90, 0xFF, 0x09, -0xE0, 0x30, 0xE5, 0xFC, 0x02, 0xE4, 0x13, 0xE5, -0x10, 0x60, 0x17, 0x7E, 0x00, 0x7F, 0x00, 0x78, -0x04, 0xC3, 0x33, 0xFF, 0xEE, 0x33, 0xFE, 0xEF, -0xD8, 0xF8, 0x90, 0xFF, 0x2A, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0x90, 0xFE, 0x66, 0xE0, 0x44, 0x10, -0xF0, 0x12, 0x2F, 0x5C, 0x78, 0x00, 0x88, 0x3C, -0x88, 0x3D, 0x88, 0x3E, 0x88, 0x3F, 0xD3, 0x22, -0x12, 0x2F, 0x5F, 0x12, 0x2F, 0x62, 0x90, 0xFE, -0xC6, 0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0x90, -0xFE, 0x6F, 0xF0, 0x90, 0xFE, 0x70, 0xE0, 0x54, -0xFC, 0xF0, 0x90, 0xFE, 0xC0, 0x74, 0xF6, 0xF0, -0xA3, 0x74, 0x00, 0xF0, 0x90, 0xFE, 0x68, 0x74, -0x31, 0xF0, 0x90, 0xE9, 0xD3, 0xE0, 0xF8, 0xC0, -0x00, 0xC2, 0x08, 0xC2, 0x36, 0xC2, 0x37, 0x90, -0xE9, 0xD0, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, -0xE0, 0x90, 0xFE, 0x6B, 0xF0, 0xA3, 0xE9, 0xF0, -0xA3, 0xE8, 0xF0, 0x90, 0xFE, 0x6E, 0x74, 0x81, -0xF0, 0x90, 0xFE, 0xC4, 0x74, 0x23, 0xF0, 0x12, -0xE7, 0xB0, 0x20, 0x36, 0x11, 0x20, 0x37, 0x0E, -0x12, 0xE7, 0xBC, 0x30, 0x3E, 0xF4, 0x90, 0xFE, -0xD8, 0x74, 0x01, 0xF0, 0xD2, 0x37, 0x30, 0x37, -0x07, 0xD0, 0x00, 0x12, 0x2F, 0x5C, 0xC3, 0x22, -0xC2, 0x09, 0x12, 0xE7, 0xB0, 0x20, 0x08, 0x0E, -0x12, 0xE7, 0xBC, 0x30, 0x3E, 0xF7, 0x90, 0xFE, -0xD8, 0x74, 0x01, 0xF0, 0xD2, 0x09, 0x20, 0x09, -0xE0, 0x90, 0xE9, 0xD2, 0xE0, 0x24, 0x01, 0xF0, -0x90, 0xE9, 0xD1, 0xE0, 0x34, 0x00, 0xF0, 0x90, -0xE9, 0xD0, 0xE0, 0x34, 0x00, 0xF0, 0xD0, 0x00, -0x18, 0xE8, 0x60, 0x03, 0x02, 0xE5, 0x4F, 0x12, -0x2F, 0x5C, 0x75, 0x3C, 0x00, 0x75, 0x3D, 0x00, -0x75, 0x3E, 0x00, 0x75, 0x3F, 0x00, 0xD3, 0x22, -0x90, 0xE9, 0xD0, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, -0xA3, 0xE0, 0x90, 0xFE, 0x6B, 0xF0, 0xA3, 0xE9, -0xF0, 0xA3, 0xE8, 0xF0, 0x90, 0xFE, 0x68, 0x74, -0x00, 0xF0, 0xC2, 0x08, 0x90, 0xFE, 0x6E, 0x74, -0xB1, 0xF0, 0xC2, 0x09, 0x12, 0xE7, 0xB0, 0x20, -0x08, 0x0E, 0x12, 0xE7, 0xBC, 0x30, 0x3E, 0xF7, -0x90, 0xFE, 0xD8, 0x74, 0x01, 0xF0, 0xD2, 0x09, -0x20, 0x09, 0x1E, 0x90, 0xFE, 0x70, 0xE0, 0x44, -0x10, 0xF0, 0x54, 0xEF, 0xF0, 0x12, 0x2F, 0x59, -0xEF, 0x60, 0x0E, 0x75, 0x3C, 0x00, 0x75, 0x3D, -0x00, 0x75, 0x3E, 0x00, 0x75, 0x3F, 0x00, 0xD3, -0x22, 0xC3, 0x22, 0x7B, 0x03, 0x7C, 0xE9, 0x7D, -0xCD, 0x7E, 0xE9, 0x7F, 0xD7, 0x12, 0x2F, 0x71, -0x12, 0xE3, 0xAA, 0x90, 0xE9, 0xD5, 0xE0, 0x60, -0x12, 0xF9, 0x12, 0xE7, 0x17, 0x40, 0x01, 0x22, -0x90, 0xF6, 0x00, 0x78, 0x06, 0x74, 0xFF, 0xF0, -0xA3, 0xD8, 0xFC, 0x74, 0x01, 0x90, 0xE9, 0xCB, -0xF0, 0xE5, 0x3E, 0xC3, 0x13, 0x90, 0xE9, 0xCA, -0xF0, 0xC0, 0xE0, 0x75, 0xF0, 0x02, 0xC0, 0xF0, -0x12, 0xE2, 0x2F, 0xEF, 0x70, 0x21, 0x20, 0x37, -0x07, 0x20, 0x09, 0x04, 0xD0, 0xF0, 0x80, 0x05, -0xD0, 0xF0, 0xD5, 0xF0, 0xE9, 0xD0, 0xE0, 0x90, -0xFF, 0x28, 0xE0, 0x30, 0xE7, 0xFC, 0x90, 0xFF, -0x28, 0xE0, 0x44, 0x01, 0xF0, 0xC3, 0x22, 0xD0, -0xF0, 0x90, 0xE9, 0xD2, 0xE0, 0x24, 0x01, 0xF0, -0x90, 0xE9, 0xD1, 0xE0, 0x34, 0x00, 0xF0, 0x90, -0xE9, 0xD0, 0xE0, 0x34, 0x00, 0xF0, 0xD0, 0xE0, -0x14, 0x70, 0xB6, 0x90, 0xE9, 0xD5, 0xE0, 0xF8, -0x90, 0xE9, 0xCA, 0xE0, 0x28, 0xF5, 0xF0, 0xC3, -0x74, 0x20, 0x95, 0xF0, 0x60, 0x22, 0xF9, 0x90, -0xE9, 0xCA, 0xE0, 0xF5, 0xF0, 0x90, 0xE9, 0xCF, -0xE0, 0x25, 0xF0, 0xF0, 0x90, 0xE9, 0xCE, 0xE0, -0x34, 0x00, 0xF0, 0x90, 0xE9, 0xCD, 0xE0, 0x34, -0x00, 0xF0, 0x12, 0xE7, 0x17, 0x40, 0x01, 0x22, -0x90, 0xE9, 0xD6, 0xE0, 0x70, 0x13, 0x7B, 0x03, -0x7C, 0xE9, 0x7D, 0xD7, 0x7E, 0xE9, 0x7F, 0xD0, -0x12, 0x2F, 0x71, 0x12, 0xE5, 0xE0, 0x40, 0x01, -0x22, 0x75, 0x3C, 0x00, 0x75, 0x3D, 0x00, 0x75, -0x3E, 0x00, 0x75, 0x3F, 0x00, 0xD3, 0x22, 0x90, -0xE9, 0xD6, 0xE0, 0x60, 0x18, 0x74, 0xFF, 0x90, -0xF4, 0x00, 0x78, 0xFF, 0xF0, 0xA3, 0x18, 0xB8, -0x00, 0xFA, 0x78, 0xFF, 0xF0, 0xA3, 0x18, 0xB8, -0x00, 0xFA, 0xF0, 0xA3, 0xF0, 0xC0, 0x01, 0x12, -0xE7, 0x70, 0x40, 0x04, 0xD0, 0x01, 0xC3, 0x22, -0x90, 0xE9, 0xCF, 0xE0, 0x24, 0x01, 0xF0, 0x90, -0xE9, 0xCE, 0xE0, 0x34, 0x00, 0xF0, 0x90, 0xE9, -0xCD, 0xE0, 0x34, 0x00, 0xF0, 0x90, 0xE9, 0xD2, -0xE0, 0x24, 0x01, 0xF0, 0x90, 0xE9, 0xD1, 0xE0, -0x34, 0x00, 0xF0, 0x90, 0xE9, 0xD0, 0xE0, 0x34, -0x00, 0xF0, 0xD0, 0x01, 0xD9, 0xC7, 0xD3, 0x22, -0xC2, 0x06, 0x90, 0xE9, 0xD6, 0xE0, 0x70, 0x28, -0x12, 0xE0, 0xD8, 0xEF, 0x60, 0x03, 0x02, 0xE7, -0xA0, 0x90, 0xEB, 0xC2, 0xE0, 0x60, 0x17, 0x64, -0x02, 0x60, 0x15, 0x90, 0xF6, 0x00, 0x78, 0x06, -0x74, 0xFF, 0xF0, 0xA3, 0xD8, 0xFC, 0x74, 0xF0, -0x90, 0xF6, 0x04, 0xF0, 0x80, 0x02, 0xC3, 0x22, -0xE4, 0x90, 0xE9, 0xCB, 0xF0, 0x12, 0xE2, 0x2F, -0xEF, 0x70, 0x03, 0x02, 0xE7, 0x81, 0xD3, 0x22, -0xC2, 0x3E, 0x75, 0x7C, 0x00, 0x75, 0x7D, 0x00, -0x75, 0x7E, 0x00, 0x22, 0x05, 0x7C, 0xE5, 0x7C, -0x70, 0x14, 0x05, 0x7D, 0xE5, 0x7D, 0x70, 0x04, -0x05, 0x7E, 0x80, 0x0A, 0xB4, 0x17, 0x07, 0xE5, -0x7E, 0xB4, 0x06, 0x02, 0xD2, 0x3E, 0x22, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x58, 0x44, 0x2D, 0x52, 0x57, 0x20, 0x20, 0x20, -0x20, 0x20, 0x20, 0x31, 0x30, 0x30, 0x30, 0x30 }; - diff --git a/drivers/staging/keucr/scsiglue.c b/drivers/staging/keucr/scsiglue.c deleted file mode 100644 index 7d8d444910c1..000000000000 --- a/drivers/staging/keucr/scsiglue.c +++ /dev/null @@ -1,467 +0,0 @@ -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "usb.h" -#include "scsiglue.h" -#include "transport.h" - -/* Host functions */ -/* - * host_info() - */ -static const char *host_info(struct Scsi_Host *host) -{ - /* pr_info("scsiglue --- host_info\n"); */ - return "SCSI emulation for USB Mass Storage devices"; -} - -/* - * slave_alloc() - */ -static int slave_alloc(struct scsi_device *sdev) -{ - struct us_data *us = host_to_us(sdev->host); - - /* pr_info("scsiglue --- slave_alloc\n"); */ - sdev->inquiry_len = 36; - - blk_queue_update_dma_alignment(sdev->request_queue, (512 - 1)); - - if (us->subclass == USB_SC_UFI) - sdev->sdev_target->pdt_1f_for_no_lun = 1; - - return 0; -} - -/* - * slave_configure() - */ -static int slave_configure(struct scsi_device *sdev) -{ - struct us_data *us = host_to_us(sdev->host); - - /* pr_info("scsiglue --- slave_configure\n"); */ - if (us->fflags & (US_FL_MAX_SECTORS_64 | US_FL_MAX_SECTORS_MIN)) { - unsigned int max_sectors = 64; - - if (us->fflags & US_FL_MAX_SECTORS_MIN) - max_sectors = PAGE_CACHE_SIZE >> 9; - if (queue_max_sectors(sdev->request_queue) > max_sectors) - blk_queue_max_hw_sectors(sdev->request_queue, - max_sectors); - } - - if (sdev->type == TYPE_DISK) { - if (us->subclass != USB_SC_SCSI && - us->subclass != USB_SC_CYP_ATACB) - sdev->use_10_for_ms = 1; - sdev->use_192_bytes_for_3f = 1; - if (us->fflags & US_FL_NO_WP_DETECT) - sdev->skip_ms_page_3f = 1; - sdev->skip_ms_page_8 = 1; - if (us->fflags & US_FL_FIX_CAPACITY) - sdev->fix_capacity = 1; - if (us->fflags & US_FL_CAPACITY_HEURISTICS) - sdev->guess_capacity = 1; - if (sdev->scsi_level > SCSI_2) - sdev->sdev_target->scsi_level = sdev->scsi_level - = SCSI_2; - sdev->retry_hwerror = 1; - sdev->allow_restart = 1; - sdev->last_sector_bug = 1; - } else { - sdev->use_10_for_ms = 1; - } - - if ((us->protocol == USB_PR_CB || us->protocol == USB_PR_CBI) && - sdev->scsi_level == SCSI_UNKNOWN) - us->max_lun = 0; - - if (us->fflags & US_FL_NOT_LOCKABLE) - sdev->lockable = 0; - - return 0; -} - -/* This is always called with scsi_lock(host) held */ -/* - * queuecommand() - */ -static int queuecommand_lck(struct scsi_cmnd *srb, - void (*done)(struct scsi_cmnd *)) -{ - struct us_data *us = host_to_us(srb->device->host); - - /* pr_info("scsiglue --- queuecommand\n"); */ - - /* check for state-transition errors */ - if (us->srb != NULL) { - /* pr_info("Error in %s: us->srb = %p\n" - __func__, us->srb); */ - return SCSI_MLQUEUE_HOST_BUSY; - } - - /* fail the command if we are disconnecting */ - if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) { - pr_info("Fail command during disconnect\n"); - srb->result = DID_NO_CONNECT << 16; - done(srb); - return 0; - } - - /* enqueue the command and wake up the control thread */ - srb->scsi_done = done; - us->srb = srb; - complete(&us->cmnd_ready); - - return 0; -} - -static DEF_SCSI_QCMD(queuecommand) - -/*********************************************************************** - * Error handling functions - ***********************************************************************/ - -/* Command timeout and abort */ -/* - * command_abort() - */ -static int command_abort(struct scsi_cmnd *srb) -{ - struct us_data *us = host_to_us(srb->device->host); - - /* pr_info("scsiglue --- command_abort\n"); */ - - scsi_lock(us_to_host(us)); - if (us->srb != srb) { - scsi_unlock(us_to_host(us)); - dev_info(&us->pusb_dev->dev, "-- nothing to abort\n"); - return FAILED; - } - - set_bit(US_FLIDX_TIMED_OUT, &us->dflags); - if (!test_bit(US_FLIDX_RESETTING, &us->dflags)) { - set_bit(US_FLIDX_ABORTING, &us->dflags); - usb_stor_stop_transport(us); - } - scsi_unlock(us_to_host(us)); - - /* Wait for the aborted command to finish */ - wait_for_completion(&us->notify); - return SUCCESS; -} - -/* This invokes the transport reset mechanism to reset the state of the - * device. - */ -/* - * device_reset() - */ -static int device_reset(struct scsi_cmnd *srb) -{ - struct us_data *us = host_to_us(srb->device->host); - int result; - - /* pr_info("scsiglue --- device_reset\n"); */ - - /* lock the device pointers and do the reset */ - mutex_lock(&(us->dev_mutex)); - result = us->transport_reset(us); - mutex_unlock(&us->dev_mutex); - - return result < 0 ? FAILED : SUCCESS; -} - -/* - * bus_reset() - */ -static int bus_reset(struct scsi_cmnd *srb) -{ - struct us_data *us = host_to_us(srb->device->host); - int result; - - /* pr_info("scsiglue --- bus_reset\n"); */ - result = usb_stor_port_reset(us); - return result < 0 ? FAILED : SUCCESS; -} - -/* - * usb_stor_report_device_reset() - */ -void usb_stor_report_device_reset(struct us_data *us) -{ - int i; - struct Scsi_Host *host = us_to_host(us); - - /* pr_info("scsiglue --- usb_stor_report_device_reset\n"); */ - scsi_report_device_reset(host, 0, 0); - if (us->fflags & US_FL_SCM_MULT_TARG) { - for (i = 1; i < host->max_id; ++i) - scsi_report_device_reset(host, 0, i); - } -} - -/* - * usb_stor_report_bus_reset() - */ -void usb_stor_report_bus_reset(struct us_data *us) -{ - struct Scsi_Host *host = us_to_host(us); - - /* pr_info("scsiglue --- usb_stor_report_bus_reset\n"); */ - scsi_lock(host); - scsi_report_bus_reset(host, 0); - scsi_unlock(host); -} - -/*********************************************************************** - * /proc/scsi/ functions - ***********************************************************************/ - -/* we use this macro to help us write into the buffer */ -#undef SPRINTF -#define SPRINTF(args...) seq_printf(m, ##args) - -static int write_info(struct Scsi_Host *host, char *buffer, int length) -{ - return length; -} - -static int show_info(struct seq_file *m, struct Scsi_Host *host) -{ - struct us_data *us = host_to_us(host); - const char *string; - - /* print the controller name */ - SPRINTF(" Host scsi%d: usb-storage\n", host->host_no); - - /* print product, vendor, and serial number strings */ - if (us->pusb_dev->manufacturer) - string = us->pusb_dev->manufacturer; - else if (us->unusual_dev->vendorName) - string = us->unusual_dev->vendorName; - else - string = "Unknown"; - SPRINTF(" Vendor: %s\n", string); - if (us->pusb_dev->product) - string = us->pusb_dev->product; - else if (us->unusual_dev->productName) - string = us->unusual_dev->productName; - else - string = "Unknown"; - SPRINTF(" Product: %s\n", string); - if (us->pusb_dev->serial) - string = us->pusb_dev->serial; - else - string = "None"; - SPRINTF("Serial Number: %s\n", string); - - /* show the protocol and transport */ - SPRINTF(" Protocol: %s\n", us->protocol_name); - SPRINTF(" Transport: %s\n", us->transport_name); - - /* show the device flags */ - SPRINTF(" Quirks:"); - -#define US_FLAG(name, value) \ - do { \ - if (us->fflags & value) \ - SPRINTF(" " #name); \ - } while (0); -US_DO_ALL_FLAGS -#undef US_FLAG - seq_putc(m, '\n'); - return 0; -} - -/*********************************************************************** - * Sysfs interface - ***********************************************************************/ - -/* Output routine for the sysfs max_sectors file */ -static ssize_t max_sectors_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct scsi_device *sdev = to_scsi_device(dev); - - /* pr_info("scsiglue --- ssize_t show_max_sectors\n"); */ - return sprintf(buf, "%u\n", queue_max_sectors(sdev->request_queue)); -} - -/* Input routine for the sysfs max_sectors file */ -static ssize_t max_sectors_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct scsi_device *sdev = to_scsi_device(dev); - unsigned short ms; - - /* pr_info("scsiglue --- ssize_t store_max_sectors\n"); */ - if (sscanf(buf, "%hu", &ms) > 0 && ms <= SCSI_DEFAULT_MAX_SECTORS) { - blk_queue_max_hw_sectors(sdev->request_queue, ms); - return strlen(buf); - } - return -EINVAL; -} -static DEVICE_ATTR_RW(max_sectors); - -static struct device_attribute *sysfs_device_attr_list[] = { - &dev_attr_max_sectors, NULL, -}; - -/* this defines our host template, with which we'll allocate hosts */ - -/* - * usb_stor_host_template() - */ -struct scsi_host_template usb_stor_host_template = { - /* basic userland interface stuff */ - .name = "eucr-storage", - .proc_name = "eucr-storage", - .write_info = write_info, - .show_info = show_info, - .info = host_info, - - /* command interface -- queued only */ - .queuecommand = queuecommand, - - /* error and abort handlers */ - .eh_abort_handler = command_abort, - .eh_device_reset_handler = device_reset, - .eh_bus_reset_handler = bus_reset, - - /* queue commands only, only one command per LUN */ - .can_queue = 1, - .cmd_per_lun = 1, - - /* unknown initiator id */ - .this_id = -1, - - .slave_alloc = slave_alloc, - .slave_configure = slave_configure, - - /* lots of sg segments can be handled */ - .sg_tablesize = SG_ALL, - - /* limit the total size of a transfer to 120 KB */ - .max_sectors = 240, - - /* merge commands... this seems to help performance, but - * periodically someone should test to see which setting is more - * optimal. - */ - .use_clustering = 1, - - /* emulated HBA */ - .emulated = 1, - - /* we do our own delay after a device or bus reset */ - .skip_settle_delay = 1, - - /* sysfs device attributes */ - .sdev_attrs = sysfs_device_attr_list, - - /* module management */ - .module = THIS_MODULE -}; - -/* To Report "Illegal Request: Invalid Field in CDB */ -unsigned char usb_stor_sense_invalidCDB[18] = { - [0] = 0x70, /* current error */ - [2] = ILLEGAL_REQUEST, /* Illegal Request = 0x05 */ - [7] = 0x0a, /* additional length */ - [12] = 0x24 /* Invalid Field in CDB */ -}; - -/*********************************************************************** - * Scatter-gather transfer buffer access routines - ***********************************************************************/ - -/* - * usb_stor_access_xfer_buf() - */ -unsigned int usb_stor_access_xfer_buf(struct us_data *us, - unsigned char *buffer, unsigned int buflen, - struct scsi_cmnd *srb, struct scatterlist **sgptr, - unsigned int *offset, enum xfer_buf_dir dir) -{ - unsigned int cnt; - - /* pr_info("transport --- usb_stor_access_xfer_buf\n"); */ - struct scatterlist *sg = *sgptr; - - if (!sg) - sg = scsi_sglist(srb); - - cnt = 0; - while (cnt < buflen && sg) { - struct page *page = sg_page(sg) + - ((sg->offset + *offset) >> PAGE_SHIFT); - unsigned int poff = (sg->offset + *offset) & (PAGE_SIZE-1); - unsigned int sglen = sg->length - *offset; - - if (sglen > buflen - cnt) { - /* Transfer ends within this s-g entry */ - sglen = buflen - cnt; - *offset += sglen; - } else { - /* Transfer continues to next s-g entry */ - *offset = 0; - sg = sg_next(sg); - } - - while (sglen > 0) { - unsigned int plen = min(sglen, - (unsigned int)PAGE_SIZE - poff); - unsigned char *ptr = kmap(page); - - if (dir == TO_XFER_BUF) - memcpy(ptr + poff, buffer + cnt, plen); - else - memcpy(buffer + cnt, ptr + poff, plen); - kunmap(page); - - /* Start at the beginning of the next page */ - poff = 0; - ++page; - cnt += plen; - sglen -= plen; - } - } - *sgptr = sg; - - /* Return the amount actually transferred */ - return cnt; -} - -/* - * Store the contents of buffer into srb's transfer - * buffer and set the SCSI residue. - */ -/* - * usb_stor_set_xfer_buf() - */ -void usb_stor_set_xfer_buf(struct us_data *us, unsigned char *buffer, - unsigned int buflen, struct scsi_cmnd *srb, unsigned int dir) -{ - unsigned int offset = 0; - struct scatterlist *sg = NULL; - - /* pr_info("transport --- usb_stor_set_xfer_buf\n"); */ - /* TO_XFER_BUF = 0, FROM_XFER_BUF = 1 */ - buflen = min(buflen, scsi_bufflen(srb)); - buflen = usb_stor_access_xfer_buf(us, buffer, buflen, srb, - &sg, &offset, dir); - if (buflen < scsi_bufflen(srb)) - scsi_set_resid(srb, scsi_bufflen(srb) - buflen); -} diff --git a/drivers/staging/keucr/scsiglue.h b/drivers/staging/keucr/scsiglue.h deleted file mode 100644 index c7e59f0f9cd6..000000000000 --- a/drivers/staging/keucr/scsiglue.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _SCSIGLUE_H_ -#define _SCSIGLUE_H_ - -extern void usb_stor_report_device_reset(struct us_data *us); -extern void usb_stor_report_bus_reset(struct us_data *us); - -extern unsigned char usb_stor_sense_invalidCDB[18]; -extern struct scsi_host_template usb_stor_host_template; - -#endif diff --git a/drivers/staging/keucr/smcommon.h b/drivers/staging/keucr/smcommon.h deleted file mode 100644 index 1d2752a1d5c4..000000000000 --- a/drivers/staging/keucr/smcommon.h +++ /dev/null @@ -1,29 +0,0 @@ -/*----- < SMCommon.h> --------------------------------------------------*/ -#ifndef SMCOMMON_INCD -#define SMCOMMON_INCD - - -/*************************************************************************** -Define Definition -***************************************************************************/ -#define SMSUCCESS 0x0000 /* SUCCESS */ -#define ERROR 0xFFFF /* ERROR */ -#define CORRECT 0x0001 /* CORRECTABLE */ - -/***************************************************************************/ -#define NO_ERROR 0x0000 /* NO ERROR */ -#define ERR_WriteFault 0x0003 /* Peripheral Device Write Fault */ -#define ERR_HwError 0x0004 /* Hardware Error */ -#define ERR_DataStatus 0x0010 /* DataStatus Error */ -#define ERR_EccReadErr 0x0011 /* Unrecovered Read Error */ -#define ERR_CorReadErr 0x0018 /* Recovered Read Data with ECC */ -#define ERR_OutOfLBA 0x0021 /* Illegal Logical Block Address */ -#define ERR_WrtProtect 0x0027 /* Write Protected */ -#define ERR_ChangedMedia 0x0028 /* Medium Changed */ -#define ERR_UnknownMedia 0x0030 /* Incompatible Medium Installed */ -#define ERR_IllegalFmt 0x0031 /* Medium Format Corrupted */ -#define ERR_NoSmartMedia 0x003A /* Medium Not Present */ - -/***************************************************************************/ - -#endif diff --git a/drivers/staging/keucr/smil.h b/drivers/staging/keucr/smil.h deleted file mode 100644 index f938759337e6..000000000000 --- a/drivers/staging/keucr/smil.h +++ /dev/null @@ -1,288 +0,0 @@ -/*----- < smil.h> ----------------------------------------------------*/ -#ifndef SMIL_INCD -#define SMIL_INCD - -/*************************************************************************** -Define Definition -***************************************************************************/ -#define K_BYTE 1024 /* Kilo Byte */ -#define SECTSIZE 512 /* Sector buffer size */ -#define REDTSIZE 16 /* Redundant buffer size */ - -/***************************************************************************/ -#define DUMMY_DATA 0xFF /* No Assign Sector Read Data */ - -/*************************************************************************** -Max Zone/Block/Sectors Data Definition -***************************************************************************/ -#define MAX_ZONENUM 128 /* Max Zone Numbers in a SmartMedia */ -#define MAX_BLOCKNUM 0x0400 /* Max Block Numbers in a Zone */ -#define MAX_SECTNUM 0x20 /* Max Sector Numbers in a Block */ -#define MAX_LOGBLOCK 1000 /* Max Logical Block Numbers in a Zone */ - -/***************************************************************************/ -#define CIS_SEARCH_SECT 0x08 /* Max CIS Search Sector Number */ - -/*************************************************************************** -Logical to Physical Block Table Data Definition -***************************************************************************/ -#define NO_ASSIGN 0xFFFF /* No Assign Logical Block Address */ - -/*************************************************************************** -'SectCopyMode' Data -***************************************************************************/ -#define COMPLETED 0 /* Sector Copy Completed */ -#define REQ_ERASE 1 /* Request Read Block Erase */ -#define REQ_FAIL 2 /* Request Read Block Failed */ - -/*************************************************************************** -Retry Counter Definition -***************************************************************************/ -#define RDERR_REASSIGN 1 /* Reassign with Read Error */ -#define L2P_ERR_ERASE 1 /* BlockErase for Contradicted L2P Table */ - -/*************************************************************************** -Hardware ECC Definition -***************************************************************************/ -#define HW_ECC_SUPPORTED 1 /* Hardware ECC Supported */ -/* No definition for Software ECC */ - -/*************************************************************************** -SmartMedia Command & Status Definition -***************************************************************************/ -/* SmartMedia Command */ -#define WRDATA 0x80 -/* #define READ 0x00 */ -#define READ_REDT 0x50 -/* #define WRITE 0x10 */ -#define RDSTATUS 0x70 - -#define READ1 0x00 /* NO */ -#define READ2 0x01 /* NO */ -#define READ3 0x50 /* NO */ -#define RST_CHIP 0xFF -#define ERASE1 0x60 -#define ERASE2 0xD0 -#define READ_ID_1 0x90 -#define READ_ID_2 0x91 -#define READ_ID_3 0x9A - -/* 712 SmartMedia Command */ -#define SM_CMD_RESET 0x00 /* 0xFF */ -#define SM_CMD_READ_ID_1 0x10 /* 0x90 */ -#define SM_CMD_READ_ID_2 0x20 /* 0x91 */ -#define SM_CMD_READ_STAT 0x30 /* 0x70 */ -#define SM_CMD_RDMULTPL_STAT 0x40 /* 0x71 */ -#define SM_CMD_READ_1 0x50 /* 0x00 */ -#define SM_CMD_READ_2 0x60 /* 0x01 */ -#define SM_CMD_READ_3 0x70 /* 0x50 */ -#define SM_CMD_PAGPRGM_TRUE 0x80 /* {0x80, 0x10} */ -#define SM_CMD_PAGPRGM_DUMY 0x90 /* {0x80, 0x11} */ -#define SM_CMD_PAGPRGM_MBLK 0xA0 /* {0x80, 0x15} */ -#define SM_CMD_BLKERASE 0xB0 /* {0x60, 0xD0} */ -#define SM_CMD_BLKERASE_MULTPL 0xC0 /* {0x60-0x60, 0xD0} */ - -#define SM_CRADDTCT_DEBNCETIMER_EN 0x02 -#define SM_CMD_START_BIT 0x01 - -#define SM_WaitCmdDone { while (!SM_CmdDone); } -#define SM_WaitDmaDone { while (!SM_DmaDone); } - -/* SmartMedia Status */ -#define WR_FAIL 0x01 /* 0:Pass, 1:Fail */ -#define SUSPENDED 0x20 /* 0:Not Suspended, 1:Suspended */ -#define READY 0x40 /* 0:Busy, 1:Ready */ -#define WR_PRTCT 0x80 /* 0:Protect, 1:Not Protect */ - -/* SmartMedia Busy Time (1bit:0.1ms) */ -#define BUSY_PROG 200 /* tPROG : 20ms ----- Program Time old : 200 */ -#define BUSY_ERASE 4000 /* tBERASE : 400ms ----- Block Erase Time old : 4000 */ - -/*for 712 Test */ -/* #define BUSY_READ 1 *//* tR : 100us ----- Data transfer Time old : 1 */ -/* #define BUSY_READ 10 *//* tR : 100us ----- Data transfer Time old : 1 */ - -#define BUSY_READ 200 /* tR : 20ms ----- Data transfer Time old : 1 */ - -/* #define BUSY_RESET 60 *//* tRST : 6ms ----- Device Resetting Time old : 60 */ - -#define BUSY_RESET 600 /* tRST : 60ms ----- Device Resetting Time old : 60 */ - -/* Hardware Timer (1bit:0.1ms) */ -#define TIME_PON 3000 /* 300ms ------ Power On Wait Time */ -#define TIME_CDCHK 200 /* 20ms ------ Card Check Interval Timer */ -#define TIME_WPCHK 50 /* 5ms ------ WP Check Interval Timer */ -#define TIME_5VCHK 10 /* 1ms ------ 5V Check Interval Timer */ - -/*************************************************************************** -Redundant Data -***************************************************************************/ -#define REDT_DATA 0x04 -#define REDT_BLOCK 0x05 -#define REDT_ADDR1H 0x06 -#define REDT_ADDR1L 0x07 -#define REDT_ADDR2H 0x0B -#define REDT_ADDR2L 0x0C -#define REDT_ECC10 0x0D -#define REDT_ECC11 0x0E -#define REDT_ECC12 0x0F -#define REDT_ECC20 0x08 -#define REDT_ECC21 0x09 -#define REDT_ECC22 0x0A - -/*************************************************************************** -SmartMedia Model & Attribute -***************************************************************************/ -/* SmartMedia Attribute */ -#define NOWP 0x00 /* 0... .... No Write Protect */ -#define WP 0x80 /* 1... .... Write Protected */ -#define MASK 0x00 /* .00. .... NAND MASK ROM Model */ -#define FLASH 0x20 /* .01. .... NAND Flash ROM Model */ -#define AD3CYC 0x00 /* ...0 .... Address 3-cycle */ -#define AD4CYC 0x10 /* ...1 .... Address 4-cycle */ -#define BS16 0x00 /* .... 00.. 16page/block */ -#define BS32 0x04 /* .... 01.. 32page/block */ -#define PS256 0x00 /* .... ..00 256byte/page */ -#define PS512 0x01 /* .... ..01 512byte/page */ -#define MWP 0x80 /* WriteProtect mask */ -#define MFLASH 0x60 /* Flash Rom mask */ -#define MADC 0x10 /* Address Cycle */ -#define MBS 0x0C /* BlockSize mask */ -#define MPS 0x03 /* PageSize mask */ - -/* SmartMedia Model */ -#define NOSSFDC 0x00 /* NO SmartMedia */ -#define SSFDC1MB 0x01 /* 1MB SmartMedia */ -#define SSFDC2MB 0x02 /* 2MB SmartMedia */ -#define SSFDC4MB 0x03 /* 4MB SmartMedia */ -#define SSFDC8MB 0x04 /* 8MB SmartMedia */ -#define SSFDC16MB 0x05 /* 16MB SmartMedia */ -#define SSFDC32MB 0x06 /* 32MB SmartMedia */ -#define SSFDC64MB 0x07 /* 64MB SmartMedia */ -#define SSFDC128MB 0x08 /*128MB SmartMedia */ -#define SSFDC256MB 0x09 -#define SSFDC512MB 0x0A -#define SSFDC1GB 0x0B -#define SSFDC2GB 0x0C - -/*************************************************************************** -Struct Definition -***************************************************************************/ -struct keucr_media_info { - u8 Model; - u8 Attribute; - u8 MaxZones; - u8 MaxSectors; - u16 MaxBlocks; - u16 MaxLogBlocks; -}; - -struct keucr_media_address { - u8 Zone; /* Zone Number */ - u8 Sector; /* Sector(512byte) Number on Block */ - u16 PhyBlock; /* Physical Block Number on Zone */ - u16 LogBlock; /* Logical Block Number of Zone */ -}; - -struct keucr_media_area { - u8 Sector; /* Sector(512byte) Number on Block */ - u16 PhyBlock; /* Physical Block Number on Zone 0 */ -}; - -extern u16 ReadBlock; -extern u16 WriteBlock; -extern u32 MediaChange; - -extern struct keucr_media_info Ssfdc; -extern struct keucr_media_address Media; -extern struct keucr_media_area CisArea; - -/* - * SMILMain.c - */ -/******************************************/ -int Init_D_SmartMedia(void); -int Pwoff_D_SmartMedia(void); -int Check_D_SmartMedia(void); -int Check_D_MediaFmt(struct us_data *); -int Check_D_Parameter(struct us_data *, u16 *, u8 *, u8 *); -int Media_D_ReadSector(struct us_data *, u32, u16, u8 *); -int Media_D_WriteSector(struct us_data *, u32, u16, u8 *); -int Media_D_CopySector(struct us_data *, u32, u16, u8 *); -int Media_D_EraseBlock(struct us_data *, u32, u16); -int Media_D_EraseAll(struct us_data *); -/******************************************/ -int Media_D_OneSectWriteStart(struct us_data *, u32, u8 *); -int Media_D_OneSectWriteNext(struct us_data *, u8 *); -int Media_D_OneSectWriteFlush(struct us_data *); - -/******************************************/ -extern int SM_FreeMem(void); /* ENE SM function */ -void SM_EnableLED(struct us_data *, bool); -void Led_D_TernOn(void); -void Led_D_TernOff(void); - -int Media_D_EraseAllRedtData(u32 Index, bool CheckBlock); -/*DWORD Media_D_GetMediaInfo(struct us_data * fdoExt, - PIOCTL_MEDIA_INFO_IN pParamIn, PIOCTL_MEDIA_INFO_OUT pParamOut); */ - -/* - * SMILSub.c - */ -/******************************************/ -int Check_D_DataBlank(u8 *); -int Check_D_FailBlock(u8 *); -int Check_D_DataStatus(u8 *); -int Load_D_LogBlockAddr(u8 *); -void Clr_D_RedundantData(u8 *); -void Set_D_LogBlockAddr(u8 *); -void Set_D_FailBlock(u8 *); -void Set_D_DataStaus(u8 *); - -/******************************************/ -void Ssfdc_D_Reset(struct us_data *); -int Ssfdc_D_ReadCisSect(struct us_data *, u8 *, u8 *); -void Ssfdc_D_WriteRedtMode(void); -void Ssfdc_D_ReadID(u8 *, u8); -int Ssfdc_D_ReadSect(struct us_data *, u8 *, u8 *); -int Ssfdc_D_ReadBlock(struct us_data *, u16, u8 *, u8 *); -int Ssfdc_D_WriteSect(struct us_data *, u8 *, u8 *); -int Ssfdc_D_WriteBlock(struct us_data *, u16, u8 *, u8 *); -int Ssfdc_D_CopyBlock(struct us_data *, u16, u8 *, u8 *); -int Ssfdc_D_WriteSectForCopy(struct us_data *, u8 *, u8 *); -int Ssfdc_D_EraseBlock(struct us_data *); -int Ssfdc_D_ReadRedtData(struct us_data *, u8 *); -int Ssfdc_D_WriteRedtData(struct us_data *, u8 *); -int Ssfdc_D_CheckStatus(void); -int Set_D_SsfdcModel(u8); -void Cnt_D_Reset(void); -int Cnt_D_PowerOn(void); -void Cnt_D_PowerOff(void); -void Cnt_D_LedOn(void); -void Cnt_D_LedOff(void); -int Check_D_CntPower(void); -int Check_D_CardExist(void); -int Check_D_CardStsChg(void); -int Check_D_SsfdcWP(void); -int SM_ReadBlock(struct us_data *, u8 *, u8 *); - -int Ssfdc_D_ReadSect_DMA(struct us_data *, u8 *, u8 *); -int Ssfdc_D_ReadSect_PIO(struct us_data *, u8 *, u8 *); -int Ssfdc_D_WriteSect_DMA(struct us_data *, u8 *, u8 *); -int Ssfdc_D_WriteSect_PIO(struct us_data *, u8 *, u8 *); - -/******************************************/ -int Check_D_ReadError(u8 *); -int Check_D_Correct(u8 *, u8 *); -int Check_D_CISdata(u8 *, u8 *); -void Set_D_RightECC(u8 *); - -/* - * SMILECC.c - */ -void calculate_ecc(u8 *, u8 *, u8 *, u8 *, u8 *); -u8 correct_data(u8 *, u8 *, u8, u8, u8); -int _Correct_D_SwECC(u8 *, u8 *, u8 *); -void _Calculate_D_SwECC(u8 *, u8 *); - -#endif /* already included */ diff --git a/drivers/staging/keucr/smilecc.c b/drivers/staging/keucr/smilecc.c deleted file mode 100644 index ffe6030f5e4d..000000000000 --- a/drivers/staging/keucr/smilecc.c +++ /dev/null @@ -1,211 +0,0 @@ -#include "usb.h" -#include "scsiglue.h" -#include "transport.h" -/* #include "stdlib.h" */ -/* #include "EUCR6SK.h" */ -#include "smcommon.h" -#include "smil.h" - -/* #include */ -/* #include */ -/* #include */ -/* #include */ -/* #include "EMCRIOS.h" */ - -/* CP0-CP5 code table */ -static u8 ecctable[256] = { -0x00, 0x55, 0x56, 0x03, 0x59, 0x0C, 0x0F, 0x5A, 0x5A, 0x0F, 0x0C, 0x59, 0x03, -0x56, 0x55, 0x00, 0x65, 0x30, 0x33, 0x66, 0x3C, 0x69, 0x6A, 0x3F, 0x3F, 0x6A, -0x69, 0x3C, 0x66, 0x33, 0x30, 0x65, 0x66, 0x33, 0x30, 0x65, 0x3F, 0x6A, 0x69, -0x3C, 0x3C, 0x69, 0x6A, 0x3F, 0x65, 0x30, 0x33, 0x66, 0x03, 0x56, 0x55, 0x00, -0x5A, 0x0F, 0x0C, 0x59, 0x59, 0x0C, 0x0F, 0x5A, 0x00, 0x55, 0x56, 0x03, 0x69, -0x3C, 0x3F, 0x6A, 0x30, 0x65, 0x66, 0x33, 0x33, 0x66, 0x65, 0x30, 0x6A, 0x3F, -0x3C, 0x69, 0x0C, 0x59, 0x5A, 0x0F, 0x55, 0x00, 0x03, 0x56, 0x56, 0x03, 0x00, -0x55, 0x0F, 0x5A, 0x59, 0x0C, 0x0F, 0x5A, 0x59, 0x0C, 0x56, 0x03, 0x00, 0x55, -0x55, 0x00, 0x03, 0x56, 0x0C, 0x59, 0x5A, 0x0F, 0x6A, 0x3F, 0x3C, 0x69, 0x33, -0x66, 0x65, 0x30, 0x30, 0x65, 0x66, 0x33, 0x69, 0x3C, 0x3F, 0x6A, 0x6A, 0x3F, -0x3C, 0x69, 0x33, 0x66, 0x65, 0x30, 0x30, 0x65, 0x66, 0x33, 0x69, 0x3C, 0x3F, -0x6A, 0x0F, 0x5A, 0x59, 0x0C, 0x56, 0x03, 0x00, 0x55, 0x55, 0x00, 0x03, 0x56, -0x0C, 0x59, 0x5A, 0x0F, 0x0C, 0x59, 0x5A, 0x0F, 0x55, 0x00, 0x03, 0x56, 0x56, -0x03, 0x00, 0x55, 0x0F, 0x5A, 0x59, 0x0C, 0x69, 0x3C, 0x3F, 0x6A, 0x30, 0x65, -0x66, 0x33, 0x33, 0x66, 0x65, 0x30, 0x6A, 0x3F, 0x3C, 0x69, 0x03, 0x56, 0x55, -0x00, 0x5A, 0x0F, 0x0C, 0x59, 0x59, 0x0C, 0x0F, 0x5A, 0x00, 0x55, 0x56, 0x03, -0x66, 0x33, 0x30, 0x65, 0x3F, 0x6A, 0x69, 0x3C, 0x3C, 0x69, 0x6A, 0x3F, 0x65, -0x30, 0x33, 0x66, 0x65, 0x30, 0x33, 0x66, 0x3C, 0x69, 0x6A, 0x3F, 0x3F, 0x6A, -0x69, 0x3C, 0x66, 0x33, 0x30, 0x65, 0x00, 0x55, 0x56, 0x03, 0x59, 0x0C, 0x0F, -0x5A, 0x5A, 0x0F, 0x0C, 0x59, 0x03, 0x56, 0x55, 0x00 -}; - -static void trans_result(u8, u8, u8 *, u8 *); - -#define BIT7 0x80 -#define BIT6 0x40 -#define BIT5 0x20 -#define BIT4 0x10 -#define BIT3 0x08 -#define BIT2 0x04 -#define BIT1 0x02 -#define BIT0 0x01 -#define BIT1BIT0 0x03 -#define BIT23 0x00800000L -#define MASK_CPS 0x3f -#define CORRECTABLE 0x00555554L - -/* - * reg2; * LP14,LP12,LP10,... - * reg3; * LP15,LP13,LP11,... - * *ecc1; * LP15,LP14,LP13,... - * *ecc2; * LP07,LP06,LP05,... - */ -static void trans_result(u8 reg2, u8 reg3, u8 *ecc1, u8 *ecc2) -{ - u8 a; /* Working for reg2,reg3 */ - u8 b; /* Working for ecc1,ecc2 */ - u8 i; /* For counting */ - - a = BIT7; b = BIT7; /* 80h=10000000b */ - *ecc1 = *ecc2 = 0; /* Clear ecc1,ecc2 */ - for (i = 0; i < 4; ++i) { - if ((reg3&a) != 0) - *ecc1 |= b; /* LP15,13,11,9 -> ecc1 */ - b = b>>1; /* Right shift */ - if ((reg2&a) != 0) - *ecc1 |= b; /* LP14,12,10,8 -> ecc1 */ - b = b>>1; /* Right shift */ - a = a>>1; /* Right shift */ - } - - b = BIT7; /* 80h=10000000b */ - for (i = 0; i < 4; ++i) { - if ((reg3&a) != 0) - *ecc2 |= b; /* LP7,5,3,1 -> ecc2 */ - b = b>>1; /* Right shift */ - if ((reg2&a) != 0) - *ecc2 |= b; /* LP6,4,2,0 -> ecc2 */ - b = b>>1; /* Right shift */ - a = a>>1; /* Right shift */ - } -} - -/*static void calculate_ecc(table,data,ecc1,ecc2,ecc3) */ -/* - * *table; * CP0-CP5 code table - * *data; * DATA - * *ecc1; * LP15,LP14,LP13,... - * *ecc2; * LP07,LP06,LP05,... - * *ecc3; * CP5,CP4,CP3,...,"1","1" - */ -void calculate_ecc(u8 *table, u8 *data, u8 *ecc1, u8 *ecc2, u8 *ecc3) -{ - u32 i; /* For counting */ - u8 a; /* Working for table */ - u8 reg1; /* D-all,CP5,CP4,CP3,... */ - u8 reg2; /* LP14,LP12,L10,... */ - u8 reg3; /* LP15,LP13,L11,... */ - - reg1 = reg2 = reg3 = 0; /* Clear parameter */ - for (i = 0; i < 256; ++i) { - a = table[data[i]]; /* Get CP0-CP5 code from table */ - reg1 ^= (a&MASK_CPS); /* XOR with a */ - if ((a&BIT6) != 0) { /* If D_all(all bit XOR) = 1 */ - reg3 ^= (u8)i; /* XOR with counter */ - reg2 ^= ~((u8)i); /* XOR with inv. of counter */ - } - } - - /* Trans LP14,12,10,... & LP15,13,11,... -> - LP15,14,13,... & LP7,6,5,.. */ - trans_result(reg2, reg3, ecc1, ecc2); - *ecc1 = ~(*ecc1); *ecc2 = ~(*ecc2); /* Inv. ecc2 & ecc3 */ - *ecc3 = ((~reg1)<<2)|BIT1BIT0; /* Make TEL format */ -} - -/* - * *data; * DATA - * *eccdata; * ECC DATA - * ecc1; * LP15,LP14,LP13,... - * ecc2; * LP07,LP06,LP05,... - * ecc3; * CP5,CP4,CP3,...,"1","1" - */ -u8 correct_data(u8 *data, u8 *eccdata, u8 ecc1, u8 ecc2, u8 ecc3) -{ - u32 l; /* Working to check d */ - u32 d; /* Result of comparison */ - u32 i; /* For counting */ - u8 d1, d2, d3; /* Result of comparison */ - u8 a; /* Working for add */ - u8 add; /* Byte address of cor. DATA */ - u8 b; /* Working for bit */ - u8 bit; /* Bit address of cor. DATA */ - - d1 = ecc1^eccdata[1]; d2 = ecc2^eccdata[0]; /* Compare LP's */ - d3 = ecc3^eccdata[2]; /* Compare CP's */ - d = ((u32)d1<<16) /* Result of comparison */ - +((u32)d2<<8) - +(u32)d3; - - if (d == 0) - return 0; /* If No error, return */ - - if (((d^(d>>1))&CORRECTABLE) == CORRECTABLE) { /* If correctable */ - l = BIT23; - add = 0; /* Clear parameter */ - a = BIT7; - - for (i = 0; i < 8; ++i) { /* Checking 8 bit */ - if ((d&l) != 0) - add |= a; /* Make byte address from LP's */ - l >>= 2; a >>= 1; /* Right Shift */ - } - - bit = 0; /* Clear parameter */ - b = BIT2; - for (i = 0; i < 3; ++i) { /* Checking 3 bit */ - if ((d&l) != 0) - bit |= b; /* Make bit address from CP's */ - l >>= 2; b >>= 1; /* Right shift */ - } - - b = BIT0; - data[add] ^= (b<>= 1; /* Right shift */ - } - - if (i == 1) { /* If ECC error */ - eccdata[1] = ecc1; eccdata[0] = ecc2; /* Put right ECC code */ - eccdata[2] = ecc3; - return 2; - } - return 3; /* Uncorrectable error */ -} - -int _Correct_D_SwECC(u8 *buf, u8 *redundant_ecc, u8 *calculate_ecc) -{ - u32 err; - - err = correct_data(buf, redundant_ecc, *(calculate_ecc + 1), - *(calculate_ecc), *(calculate_ecc + 2)); - if (err == 1) - memcpy(calculate_ecc, redundant_ecc, 3); - - if (err == 0 || err == 1 || err == 2) - return 0; - - return -1; -} - -void _Calculate_D_SwECC(u8 *buf, u8 *ecc) -{ - calculate_ecc(ecctable, buf, ecc+1, ecc+0, ecc+2); -} - - diff --git a/drivers/staging/keucr/smilmain.c b/drivers/staging/keucr/smilmain.c deleted file mode 100644 index 42ec8a669ad3..000000000000 --- a/drivers/staging/keucr/smilmain.c +++ /dev/null @@ -1,760 +0,0 @@ -#include -#include "usb.h" -#include "scsiglue.h" -#include "smcommon.h" -#include "smil.h" - -static int Conv_D_MediaAddr(struct us_data *, u32); -static int Inc_D_MediaAddr(struct us_data *); -static int Media_D_ReadOneSect(struct us_data *, u16, u8 *); - -static int Copy_D_BlockAll(struct us_data *, u32); - -static int Assign_D_WriteBlock(void); -static int Release_D_ReadBlock(struct us_data *); -static int Release_D_WriteBlock(struct us_data *); -static int Release_D_CopySector(struct us_data *); - -static int Copy_D_PhyOneSect(struct us_data *); -static int Read_D_PhyOneSect(struct us_data *, u16, u8 *); -static int Erase_D_PhyOneBlock(struct us_data *); - -static int Set_D_PhyFmtValue(struct us_data *); -static int Search_D_CIS(struct us_data *); -static int Make_D_LogTable(struct us_data *); - -static int MarkFail_D_PhyOneBlock(struct us_data *); - -static u32 ErrCode; -static u8 WorkBuf[SECTSIZE]; -static u8 Redundant[REDTSIZE]; -static u8 WorkRedund[REDTSIZE]; -/* 128 x 1000, Log2Phy[MAX_ZONENUM][MAX_LOGBLOCK]; */ -static u16 *Log2Phy[MAX_ZONENUM]; -static u8 Assign[MAX_ZONENUM][MAX_BLOCKNUM / 8]; -static u16 AssignStart[MAX_ZONENUM]; -u16 ReadBlock; -u16 WriteBlock; -u32 MediaChange; -static u32 SectCopyMode; - -/* BIT Control Macro */ -static u8 BitData[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; -#define Set_D_Bit(a, b) (a[(u8)((b) / 8)] |= BitData[(b) % 8]) -#define Clr_D_Bit(a, b) (a[(u8)((b) / 8)] &= ~BitData[(b) % 8]) -#define Chk_D_Bit(a, b) (a[(u8)((b) / 8)] & BitData[(b) % 8]) - -/* ----- SM_FreeMem() ------------------------------------------------- */ -int SM_FreeMem(void) -{ - int i; - - pr_info("SM_FreeMem start\n"); - for (i = 0; i < MAX_ZONENUM; i++) { - if (Log2Phy[i] != NULL) { - pr_info("Free Zone = %x, Addr = %p\n", i, Log2Phy[i]); - kfree(Log2Phy[i]); - Log2Phy[i] = NULL; - } - } - return NO_ERROR; -} - -/* SmartMedia Read/Write/Erase Function */ -/* ----- Media_D_ReadSector() ------------------------------------------- */ -int Media_D_ReadSector(struct us_data *us, u32 start, u16 count, u8 *buf) -{ - u16 len, bn; - - if (Conv_D_MediaAddr(us, start)) - return ErrCode; - - while (1) { - len = Ssfdc.MaxSectors - Media.Sector; - if (count > len) - bn = len; - else - bn = count; - - if (Media_D_ReadOneSect(us, bn, buf)) { - ErrCode = ERR_EccReadErr; - return ErrCode; - } - - Media.Sector += bn; - count -= bn; - - if (count <= 0) - break; - - buf += bn * SECTSIZE; - - if (Inc_D_MediaAddr(us)) - return ErrCode; - } - - return NO_ERROR; -} -/* here */ -/* ----- Media_D_CopySector() ------------------------------------------ */ -int Media_D_CopySector(struct us_data *us, u32 start, u16 count, u8 *buf) -{ - u16 len, bn; - - /* pr_info("Media_D_CopySector !!!\n"); */ - if (Conv_D_MediaAddr(us, start)) - return ErrCode; - - while (1) { - if (Assign_D_WriteBlock()) - return ERROR; - - len = Ssfdc.MaxSectors - Media.Sector; - if (count > len) - bn = len; - else - bn = count; - - if (Ssfdc_D_CopyBlock(us, bn, buf, Redundant)) { - ErrCode = ERR_WriteFault; - return ErrCode; - } - - Media.Sector = 0x1F; - if (Release_D_CopySector(us)) { - if (ErrCode == ERR_HwError) { - ErrCode = ERR_WriteFault; - return ErrCode; - } - } - count -= bn; - - if (count <= 0) - break; - - buf += bn * SECTSIZE; - - if (Inc_D_MediaAddr(us)) - return ErrCode; - - } - return NO_ERROR; -} - -/* SmartMedia Physical Format Test Subroutine */ -/* ----- Check_D_MediaFmt() --------------------------------------------- */ -int Check_D_MediaFmt(struct us_data *us) -{ - pr_info("Check_D_MediaFmt\n"); - - if (!MediaChange) - return SMSUCCESS; - - MediaChange = ERROR; - SectCopyMode = COMPLETED; - - if (Set_D_PhyFmtValue(us)) { - ErrCode = ERR_UnknownMedia; - return ERROR; - } - - if (Search_D_CIS(us)) { - ErrCode = ERR_IllegalFmt; - return ERROR; - } - - MediaChange = SMSUCCESS; - return SMSUCCESS; -} - -/* ----- Release_D_CopySector() ------------------------------------------ */ -static int Release_D_CopySector(struct us_data *us) -{ - Log2Phy[Media.Zone][Media.LogBlock] = WriteBlock; - Media.PhyBlock = ReadBlock; - - if (Media.PhyBlock == NO_ASSIGN) { - Media.PhyBlock = WriteBlock; - return SMSUCCESS; - } - - Clr_D_Bit(Assign[Media.Zone], Media.PhyBlock); - Media.PhyBlock = WriteBlock; - - return SMSUCCESS; -} - -/* SmartMedia Physical Address Control Subroutine */ -/* ----- Conv_D_MediaAddr() --------------------------------------------- */ -static int Conv_D_MediaAddr(struct us_data *us, u32 addr) -{ - u32 temp; - - temp = addr / Ssfdc.MaxSectors; - Media.Zone = (u8) (temp / Ssfdc.MaxLogBlocks); - - if (Log2Phy[Media.Zone] == NULL) { - if (Make_D_LogTable(us)) { - ErrCode = ERR_IllegalFmt; - return ERROR; - } - } - - Media.Sector = (u8) (addr % Ssfdc.MaxSectors); - Media.LogBlock = (u16) (temp % Ssfdc.MaxLogBlocks); - - if (Media.Zone < Ssfdc.MaxZones) { - Clr_D_RedundantData(Redundant); - Set_D_LogBlockAddr(Redundant); - Media.PhyBlock = Log2Phy[Media.Zone][Media.LogBlock]; - return SMSUCCESS; - } - - ErrCode = ERR_OutOfLBA; - return ERROR; -} - -/* ----- Inc_D_MediaAddr() ---------------------------------------------- */ -static int Inc_D_MediaAddr(struct us_data *us) -{ - u16 LogBlock = Media.LogBlock; - - if (++Media.Sector < Ssfdc.MaxSectors) - return SMSUCCESS; - - if (Log2Phy[Media.Zone] == NULL) { - if (Make_D_LogTable(us)) { - ErrCode = ERR_IllegalFmt; - return ERROR; - } - } - - Media.Sector = 0; - Media.LogBlock = LogBlock; - - if (++Media.LogBlock < Ssfdc.MaxLogBlocks) { - Clr_D_RedundantData(Redundant); - Set_D_LogBlockAddr(Redundant); - Media.PhyBlock = Log2Phy[Media.Zone][Media.LogBlock]; - return SMSUCCESS; - } - - Media.LogBlock = 0; - - if (++Media.Zone < Ssfdc.MaxZones) { - if (Log2Phy[Media.Zone] == NULL) { - if (Make_D_LogTable(us)) { - ErrCode = ERR_IllegalFmt; - return ERROR; - } - } - - Media.LogBlock = 0; - - Clr_D_RedundantData(Redundant); - Set_D_LogBlockAddr(Redundant); - Media.PhyBlock = Log2Phy[Media.Zone][Media.LogBlock]; - return SMSUCCESS; - } - - Media.Zone = 0; - ErrCode = ERR_OutOfLBA; - - return ERROR; -} - -/* SmartMedia Read/Write Subroutine with Retry */ -/* ----- Media_D_ReadOneSect() ------------------------------------------ */ -static int Media_D_ReadOneSect(struct us_data *us, u16 count, u8 *buf) -{ - u32 err, retry; - - if (!Read_D_PhyOneSect(us, count, buf)) - return SMSUCCESS; - if (ErrCode == ERR_HwError) - return ERROR; - if (ErrCode == ERR_DataStatus) - return ERROR; - -#ifdef RDERR_REASSIGN - if (Ssfdc.Attribute & MWP) { - if (ErrCode == ERR_CorReadErr) - return SMSUCCESS; - return ERROR; - } - - err = ErrCode; - for (retry = 0; retry < 2; retry++) { - if (Copy_D_BlockAll(us, - (err == ERR_EccReadErr) ? REQ_FAIL : REQ_ERASE)) { - if (ErrCode == ERR_HwError) - return ERROR; - continue; - } - - ErrCode = err; - if (ErrCode == ERR_CorReadErr) - return SMSUCCESS; - return ERROR; - } - - MediaChange = ERROR; -#else - if (ErrCode == ERR_CorReadErr) - return SMSUCCESS; -#endif - - return ERROR; -} - -/* SmartMedia Physical Sector Data Copy Subroutine */ -/* ----- Copy_D_BlockAll() ---------------------------------------------- */ -static int Copy_D_BlockAll(struct us_data *us, u32 mode) -{ - u8 sect; - - sect = Media.Sector; - - if (Assign_D_WriteBlock()) - return ERROR; - if (mode == REQ_FAIL) - SectCopyMode = REQ_FAIL; - - for (Media.Sector = 0; Media.Sector < Ssfdc.MaxSectors; - Media.Sector++) { - if (Copy_D_PhyOneSect(us)) { - if (ErrCode == ERR_HwError) - return ERROR; - if (Release_D_WriteBlock(us)) - return ERROR; - - ErrCode = ERR_WriteFault; - Media.PhyBlock = ReadBlock; - Media.Sector = sect; - - return ERROR; - } - } - - if (Release_D_ReadBlock(us)) - return ERROR; - - Media.PhyBlock = WriteBlock; - Media.Sector = sect; - return SMSUCCESS; -} - -/* SmartMedia Physical Block Assign/Release Subroutine */ -/* ----- Assign_D_WriteBlock() ------------------------------------------ */ -static int Assign_D_WriteBlock(void) -{ - ReadBlock = Media.PhyBlock; - - for (WriteBlock = AssignStart[Media.Zone]; - WriteBlock < Ssfdc.MaxBlocks; WriteBlock++) { - if (!Chk_D_Bit(Assign[Media.Zone], WriteBlock)) { - Set_D_Bit(Assign[Media.Zone], WriteBlock); - AssignStart[Media.Zone] = WriteBlock + 1; - Media.PhyBlock = WriteBlock; - SectCopyMode = REQ_ERASE; - return SMSUCCESS; - } - } - - for (WriteBlock = 0; - WriteBlock < AssignStart[Media.Zone]; WriteBlock++) { - if (!Chk_D_Bit(Assign[Media.Zone], WriteBlock)) { - Set_D_Bit(Assign[Media.Zone], WriteBlock); - AssignStart[Media.Zone] = WriteBlock + 1; - Media.PhyBlock = WriteBlock; - SectCopyMode = REQ_ERASE; - return SMSUCCESS; - } - } - - WriteBlock = NO_ASSIGN; - ErrCode = ERR_WriteFault; - - return ERROR; -} - -/* ----- Release_D_ReadBlock() ------------------------------------------ */ -static int Release_D_ReadBlock(struct us_data *us) -{ - u32 mode; - - mode = SectCopyMode; - SectCopyMode = COMPLETED; - - if (mode == COMPLETED) - return SMSUCCESS; - - Log2Phy[Media.Zone][Media.LogBlock] = WriteBlock; - Media.PhyBlock = ReadBlock; - - if (Media.PhyBlock == NO_ASSIGN) { - Media.PhyBlock = WriteBlock; - return SMSUCCESS; - } - - if (mode == REQ_ERASE) { - if (Erase_D_PhyOneBlock(us)) { - if (ErrCode == ERR_HwError) - return ERROR; - if (MarkFail_D_PhyOneBlock(us)) - return ERROR; - } else - Clr_D_Bit(Assign[Media.Zone], Media.PhyBlock); - } else if (MarkFail_D_PhyOneBlock(us)) - return ERROR; - - Media.PhyBlock = WriteBlock; - return SMSUCCESS; -} - -/* ----- Release_D_WriteBlock() ----------------------------------------- */ -static int Release_D_WriteBlock(struct us_data *us) -{ - SectCopyMode = COMPLETED; - Media.PhyBlock = WriteBlock; - - if (MarkFail_D_PhyOneBlock(us)) - return ERROR; - - Media.PhyBlock = ReadBlock; - return SMSUCCESS; -} - -/* SmartMedia Physical Sector Data Copy Subroutine */ -/* ----- Copy_D_PhyOneSect() -------------------------------------------- */ -static int Copy_D_PhyOneSect(struct us_data *us) -{ - int i; - u32 err, retry; - - /* pr_info("Copy_D_PhyOneSect --- Sector = %x\n", Media.Sector); */ - if (ReadBlock != NO_ASSIGN) { - Media.PhyBlock = ReadBlock; - for (retry = 0; retry < 2; retry++) { - if (retry != 0) { - Ssfdc_D_Reset(us); - if (Ssfdc_D_ReadCisSect(us, WorkBuf, - WorkRedund)) { - ErrCode = ERR_HwError; - MediaChange = ERROR; - return ERROR; - } - - if (Check_D_CISdata(WorkBuf, WorkRedund)) { - ErrCode = ERR_HwError; - MediaChange = ERROR; - return ERROR; - } - } - - if (Ssfdc_D_ReadSect(us, WorkBuf, WorkRedund)) { - ErrCode = ERR_HwError; - MediaChange = ERROR; - return ERROR; - } - if (Check_D_DataStatus(WorkRedund)) { - err = ERROR; - break; - } - if (!Check_D_ReadError(WorkRedund)) { - err = SMSUCCESS; - break; - } - if (!Check_D_Correct(WorkBuf, WorkRedund)) { - err = SMSUCCESS; - break; - } - - err = ERROR; - SectCopyMode = REQ_FAIL; - } - } else { - err = SMSUCCESS; - for (i = 0; i < SECTSIZE; i++) - WorkBuf[i] = DUMMY_DATA; - Clr_D_RedundantData(WorkRedund); - } - - Set_D_LogBlockAddr(WorkRedund); - if (err == ERROR) { - Set_D_RightECC(WorkRedund); - Set_D_DataStaus(WorkRedund); - } - - Media.PhyBlock = WriteBlock; - - if (Ssfdc_D_WriteSectForCopy(us, WorkBuf, WorkRedund)) { - ErrCode = ERR_HwError; - MediaChange = ERROR; - return ERROR; - } - if (Ssfdc_D_CheckStatus()) { - ErrCode = ERR_WriteFault; - return ERROR; - } - - Media.PhyBlock = ReadBlock; - return SMSUCCESS; -} - -/* SmartMedia Physical Sector Read/Write/Erase Subroutine */ -/* ----- Read_D_PhyOneSect() -------------------------------------------- */ -static int Read_D_PhyOneSect(struct us_data *us, u16 count, u8 *buf) -{ - int i; - u32 retry; - - if (Media.PhyBlock == NO_ASSIGN) { - for (i = 0; i < SECTSIZE; i++) - *buf++ = DUMMY_DATA; - return SMSUCCESS; - } - - for (retry = 0; retry < 2; retry++) { - if (retry != 0) { - Ssfdc_D_Reset(us); - - if (Ssfdc_D_ReadCisSect(us, WorkBuf, WorkRedund)) { - ErrCode = ERR_HwError; - MediaChange = ERROR; - return ERROR; - } - if (Check_D_CISdata(WorkBuf, WorkRedund)) { - ErrCode = ERR_HwError; - MediaChange = ERROR; - return ERROR; - } - } - - if (Ssfdc_D_ReadBlock(us, count, buf, Redundant)) { - ErrCode = ERR_HwError; - MediaChange = ERROR; - return ERROR; - } - if (Check_D_DataStatus(Redundant)) { - ErrCode = ERR_DataStatus; - return ERROR; - } - - if (!Check_D_ReadError(Redundant)) - return SMSUCCESS; - - if (!Check_D_Correct(buf, Redundant)) { - ErrCode = ERR_CorReadErr; - return ERROR; - } - } - - ErrCode = ERR_EccReadErr; - return ERROR; -} - -/* ----- Erase_D_PhyOneBlock() ------------------------------------------ */ -static int Erase_D_PhyOneBlock(struct us_data *us) -{ - if (Ssfdc_D_EraseBlock(us)) { - ErrCode = ERR_HwError; - MediaChange = ERROR; - return ERROR; - } - if (Ssfdc_D_CheckStatus()) { - ErrCode = ERR_WriteFault; - return ERROR; - } - - return SMSUCCESS; -} - -/* SmartMedia Physical Format Check Local Subroutine */ -/* ----- Set_D_PhyFmtValue() -------------------------------------------- */ -static int Set_D_PhyFmtValue(struct us_data *us) -{ - if (Set_D_SsfdcModel(us->SM_DeviceID)) - return ERROR; - - return SMSUCCESS; -} - -/* ----- Search_D_CIS() ------------------------------------------------- */ -static int Search_D_CIS(struct us_data *us) -{ - Media.Zone = 0; - Media.Sector = 0; - - for (Media.PhyBlock = 0; - Media.PhyBlock < (Ssfdc.MaxBlocks - Ssfdc.MaxLogBlocks - 1); - Media.PhyBlock++) { - if (Ssfdc_D_ReadRedtData(us, Redundant)) { - Ssfdc_D_Reset(us); - return ERROR; - } - - if (!Check_D_FailBlock(Redundant)) - break; - } - - if (Media.PhyBlock == (Ssfdc.MaxBlocks - Ssfdc.MaxLogBlocks - 1)) { - Ssfdc_D_Reset(us); - return ERROR; - } - - while (Media.Sector < CIS_SEARCH_SECT) { - if (Media.Sector) { - if (Ssfdc_D_ReadRedtData(us, Redundant)) { - Ssfdc_D_Reset(us); - return ERROR; - } - } - if (!Check_D_DataStatus(Redundant)) { - if (Ssfdc_D_ReadSect(us, WorkBuf, Redundant)) { - Ssfdc_D_Reset(us); - return ERROR; - } - - if (Check_D_CISdata(WorkBuf, Redundant)) { - Ssfdc_D_Reset(us); - return ERROR; - } - - CisArea.PhyBlock = Media.PhyBlock; - CisArea.Sector = Media.Sector; - Ssfdc_D_Reset(us); - return SMSUCCESS; - } - - Media.Sector++; - } - - Ssfdc_D_Reset(us); - return ERROR; -} - -/* ----- Make_D_LogTable() ---------------------------------------------- */ -static int Make_D_LogTable(struct us_data *us) -{ - u16 phyblock, logblock; - - if (Log2Phy[Media.Zone] == NULL) { - Log2Phy[Media.Zone] = kmalloc(MAX_LOGBLOCK * sizeof(u16), - GFP_KERNEL); - /* pr_info("ExAllocatePool Zone = %x, Addr = %x\n", - Media.Zone, Log2Phy[Media.Zone]); */ - if (Log2Phy[Media.Zone] == NULL) - return ERROR; - } - - Media.Sector = 0; - - /* pr_info("Make_D_LogTable --- MediaZone = 0x%x\n", - Media.Zone); */ - for (Media.LogBlock = 0; Media.LogBlock < Ssfdc.MaxLogBlocks; - Media.LogBlock++) - Log2Phy[Media.Zone][Media.LogBlock] = NO_ASSIGN; - - for (Media.PhyBlock = 0; Media.PhyBlock < (MAX_BLOCKNUM / 8); - Media.PhyBlock++) - Assign[Media.Zone][Media.PhyBlock] = 0x00; - - for (Media.PhyBlock = 0; Media.PhyBlock < Ssfdc.MaxBlocks; - Media.PhyBlock++) { - if ((!Media.Zone) && (Media.PhyBlock <= CisArea.PhyBlock)) { - Set_D_Bit(Assign[Media.Zone], Media.PhyBlock); - continue; - } - - if (Ssfdc_D_ReadRedtData(us, Redundant)) { - Ssfdc_D_Reset(us); - return ERROR; - } - - if (!Check_D_DataBlank(Redundant)) - continue; - - Set_D_Bit(Assign[Media.Zone], Media.PhyBlock); - - if (Check_D_FailBlock(Redundant)) - continue; - - if (Load_D_LogBlockAddr(Redundant)) - continue; - - if (Media.LogBlock >= Ssfdc.MaxLogBlocks) - continue; - - if (Log2Phy[Media.Zone][Media.LogBlock] == NO_ASSIGN) { - Log2Phy[Media.Zone][Media.LogBlock] = Media.PhyBlock; - continue; - } - - phyblock = Media.PhyBlock; - logblock = Media.LogBlock; - Media.Sector = (u8)(Ssfdc.MaxSectors - 1); - - if (Ssfdc_D_ReadRedtData(us, Redundant)) { - Ssfdc_D_Reset(us); - return ERROR; - } - - if (!Load_D_LogBlockAddr(Redundant) && - (Media.LogBlock == logblock)) { - Media.PhyBlock = Log2Phy[Media.Zone][logblock]; - - if (Ssfdc_D_ReadRedtData(us, Redundant)) { - Ssfdc_D_Reset(us); - return ERROR; - } - - Media.PhyBlock = phyblock; - - if (!Load_D_LogBlockAddr(Redundant)) { - if (Media.LogBlock != logblock) { - Media.PhyBlock = - Log2Phy[Media.Zone][logblock]; - Log2Phy[Media.Zone][logblock] = - phyblock; - } - } else { - Media.PhyBlock = Log2Phy[Media.Zone][logblock]; - Log2Phy[Media.Zone][logblock] = phyblock; - } - } - - Media.Sector = 0; - Media.PhyBlock = phyblock; - - AssignStart[Media.Zone] = 0; - - } /* End for (Media.Zone -#include "usb.h" -#include "scsiglue.h" -#include "transport.h" - -#include "smcommon.h" -#include "smil.h" - -static u8 _Check_D_DevCode(u8); -static u32 ErrXDCode; -static u8 IsSSFDCCompliance; -static u8 IsXDCompliance; - -struct keucr_media_info Ssfdc; -struct keucr_media_address Media; -struct keucr_media_area CisArea; - -static u8 EccBuf[6]; - -#define EVEN 0 /* Even Page for 256byte/page */ -#define ODD 1 /* Odd Page for 256byte/page */ - - -/* SmartMedia Redundant buffer data Control Subroutine - *----- Check_D_DataBlank() -------------------------------------------- - */ -int Check_D_DataBlank(u8 *redundant) -{ - char i; - - for (i = 0; i < REDTSIZE; i++) - if (*redundant++ != 0xFF) - return ERROR; - - return SMSUCCESS; -} - -/* ----- Check_D_FailBlock() -------------------------------------------- */ -int Check_D_FailBlock(u8 *redundant) -{ - redundant += REDT_BLOCK; - - if (*redundant == 0xFF) - return SMSUCCESS; - if (!*redundant) - return ERROR; - if (hweight8(*redundant) < 7) - return ERROR; - - return SMSUCCESS; -} - -/* ----- Check_D_DataStatus() ------------------------------------------- */ -int Check_D_DataStatus(u8 *redundant) -{ - redundant += REDT_DATA; - - if (*redundant == 0xFF) - return SMSUCCESS; - if (!*redundant) { - ErrXDCode = ERR_DataStatus; - return ERROR; - } else - ErrXDCode = NO_ERROR; - - if (hweight8(*redundant) < 5) - return ERROR; - - return SMSUCCESS; -} - -/* ----- Load_D_LogBlockAddr() ------------------------------------------ */ -int Load_D_LogBlockAddr(u8 *redundant) -{ - u16 addr1, addr2; - - addr1 = (u16)*(redundant + REDT_ADDR1H)*0x0100 + - (u16)*(redundant + REDT_ADDR1L); - addr2 = (u16)*(redundant + REDT_ADDR2H)*0x0100 + - (u16)*(redundant + REDT_ADDR2L); - - if (addr1 == addr2) - if ((addr1 & 0xF000) == 0x1000) { - Media.LogBlock = (addr1 & 0x0FFF) / 2; - return SMSUCCESS; - } - - if (hweight16((u16)(addr1^addr2)) != 0x01) - return ERROR; - - if ((addr1 & 0xF000) == 0x1000) - if (!(hweight16(addr1) & 0x01)) { - Media.LogBlock = (addr1 & 0x0FFF) / 2; - return SMSUCCESS; - } - - if ((addr2 & 0xF000) == 0x1000) - if (!(hweight16(addr2) & 0x01)) { - Media.LogBlock = (addr2 & 0x0FFF) / 2; - return SMSUCCESS; - } - - return ERROR; -} - -/* ----- Clr_D_RedundantData() ------------------------------------------ */ -void Clr_D_RedundantData(u8 *redundant) -{ - char i; - - for (i = 0; i < REDTSIZE; i++) - *(redundant + i) = 0xFF; -} - -/* ----- Set_D_LogBlockAddr() ------------------------------------------- */ -void Set_D_LogBlockAddr(u8 *redundant) -{ - u16 addr; - - *(redundant + REDT_BLOCK) = 0xFF; - *(redundant + REDT_DATA) = 0xFF; - addr = Media.LogBlock*2 + 0x1000; - - if ((hweight16(addr) % 2)) - addr++; - - *(redundant + REDT_ADDR1H) = *(redundant + REDT_ADDR2H) = - (u8)(addr / 0x0100); - *(redundant + REDT_ADDR1L) = *(redundant + REDT_ADDR2L) = (u8)addr; -} - -/*----- Set_D_FailBlock() ---------------------------------------------- */ -void Set_D_FailBlock(u8 *redundant) -{ - char i; - - for (i = 0; i < REDTSIZE; i++) - *redundant++ = (u8)((i == REDT_BLOCK) ? 0xF0 : 0xFF); -} - -/* ----- Set_D_DataStaus() ---------------------------------------------- */ -void Set_D_DataStaus(u8 *redundant) -{ - redundant += REDT_DATA; - *redundant = 0x00; -} - -/* SmartMedia Function Command Subroutine - * 6250 CMD 6 - */ -/* ----- Ssfdc_D_Reset() ------------------------------------------------ */ -void Ssfdc_D_Reset(struct us_data *us) -{ - return; -} - -/* ----- Ssfdc_D_ReadCisSect() ------------------------------------------ */ -int Ssfdc_D_ReadCisSect(struct us_data *us, u8 *buf, u8 *redundant) -{ - u8 zone, sector; - u16 block; - - zone = Media.Zone; block = Media.PhyBlock; sector = Media.Sector; - Media.Zone = 0; - Media.PhyBlock = CisArea.PhyBlock; - Media.Sector = CisArea.Sector; - - if (Ssfdc_D_ReadSect(us, buf, redundant)) { - Media.Zone = zone; - Media.PhyBlock = block; - Media.Sector = sector; - return ERROR; - } - - Media.Zone = zone; Media.PhyBlock = block; Media.Sector = sector; - return SMSUCCESS; -} - -/* 6250 CMD 1 */ -/* ----- Ssfdc_D_ReadSect() --------------------------------------------- */ -int Ssfdc_D_ReadSect(struct us_data *us, u8 *buf, u8 *redundant) -{ - struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; - int result; - u16 addr; - - result = ENE_LoadBinCode(us, SM_RW_PATTERN); - if (result != USB_STOR_XFER_GOOD) { - dev_err(&us->pusb_dev->dev, - "Failed to load SmartMedia read/write code\n"); - return USB_STOR_TRANSPORT_ERROR; - } - - addr = (u16)Media.Zone*Ssfdc.MaxBlocks + Media.PhyBlock; - addr = addr*(u16)Ssfdc.MaxSectors + Media.Sector; - - /* Read sect data */ - memset(bcb, 0, sizeof(struct bulk_cb_wrap)); - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = 0x200; - bcb->Flags = 0x80; - bcb->CDB[0] = 0xF1; - bcb->CDB[1] = 0x02; - bcb->CDB[4] = (u8)addr; - bcb->CDB[3] = (u8)(addr / 0x0100); - bcb->CDB[2] = Media.Zone / 2; - - result = ENE_SendScsiCmd(us, FDIR_READ, buf, 0); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - /* Read redundant */ - memset(bcb, 0, sizeof(struct bulk_cb_wrap)); - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = 0x10; - bcb->Flags = 0x80; - bcb->CDB[0] = 0xF1; - bcb->CDB[1] = 0x03; - bcb->CDB[4] = (u8)addr; - bcb->CDB[3] = (u8)(addr / 0x0100); - bcb->CDB[2] = Media.Zone / 2; - bcb->CDB[8] = 0; - bcb->CDB[9] = 1; - - result = ENE_SendScsiCmd(us, FDIR_READ, redundant, 0); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - return USB_STOR_TRANSPORT_GOOD; -} - -/* ----- Ssfdc_D_ReadBlock() --------------------------------------------- */ -int Ssfdc_D_ReadBlock(struct us_data *us, u16 count, u8 *buf, - u8 *redundant) -{ - struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; - int result; - u16 addr; - - result = ENE_LoadBinCode(us, SM_RW_PATTERN); - if (result != USB_STOR_XFER_GOOD) { - dev_err(&us->pusb_dev->dev, - "Failed to load SmartMedia read/write code\n"); - return USB_STOR_TRANSPORT_ERROR; - } - - addr = (u16)Media.Zone*Ssfdc.MaxBlocks + Media.PhyBlock; - addr = addr*(u16)Ssfdc.MaxSectors + Media.Sector; - - /* Read sect data */ - memset(bcb, 0, sizeof(struct bulk_cb_wrap)); - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = 0x200*count; - bcb->Flags = 0x80; - bcb->CDB[0] = 0xF1; - bcb->CDB[1] = 0x02; - bcb->CDB[4] = (u8)addr; - bcb->CDB[3] = (u8)(addr / 0x0100); - bcb->CDB[2] = Media.Zone / 2; - - result = ENE_SendScsiCmd(us, FDIR_READ, buf, 0); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - /* Read redundant */ - memset(bcb, 0, sizeof(struct bulk_cb_wrap)); - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = 0x10; - bcb->Flags = 0x80; - bcb->CDB[0] = 0xF1; - bcb->CDB[1] = 0x03; - bcb->CDB[4] = (u8)addr; - bcb->CDB[3] = (u8)(addr / 0x0100); - bcb->CDB[2] = Media.Zone / 2; - bcb->CDB[8] = 0; - bcb->CDB[9] = 1; - - result = ENE_SendScsiCmd(us, FDIR_READ, redundant, 0); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - return USB_STOR_TRANSPORT_GOOD; -} - - -/* ----- Ssfdc_D_CopyBlock() -------------------------------------------- */ -int Ssfdc_D_CopyBlock(struct us_data *us, u16 count, u8 *buf, - u8 *redundant) -{ - struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; - int result; - u16 ReadAddr, WriteAddr; - - result = ENE_LoadBinCode(us, SM_RW_PATTERN); - if (result != USB_STOR_XFER_GOOD) { - dev_err(&us->pusb_dev->dev, - "Failed to load SmartMedia read/write code\n"); - return USB_STOR_TRANSPORT_ERROR; - } - - ReadAddr = (u16)Media.Zone*Ssfdc.MaxBlocks + ReadBlock; - ReadAddr = ReadAddr*(u16)Ssfdc.MaxSectors; - WriteAddr = (u16)Media.Zone*Ssfdc.MaxBlocks + WriteBlock; - WriteAddr = WriteAddr*(u16)Ssfdc.MaxSectors; - - /* Write sect data */ - memset(bcb, 0, sizeof(struct bulk_cb_wrap)); - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = 0x200*count; - bcb->Flags = 0x00; - bcb->CDB[0] = 0xF0; - bcb->CDB[1] = 0x08; - bcb->CDB[7] = (u8)WriteAddr; - bcb->CDB[6] = (u8)(WriteAddr / 0x0100); - bcb->CDB[5] = Media.Zone / 2; - bcb->CDB[8] = *(redundant + REDT_ADDR1H); - bcb->CDB[9] = *(redundant + REDT_ADDR1L); - bcb->CDB[10] = Media.Sector; - - if (ReadBlock != NO_ASSIGN) { - bcb->CDB[4] = (u8)ReadAddr; - bcb->CDB[3] = (u8)(ReadAddr / 0x0100); - bcb->CDB[2] = Media.Zone / 2; - } else - bcb->CDB[11] = 1; - - result = ENE_SendScsiCmd(us, FDIR_WRITE, buf, 0); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - return USB_STOR_TRANSPORT_GOOD; -} - -/* ----- Ssfdc_D_WriteSectForCopy() ------------------------------------- */ -int Ssfdc_D_WriteSectForCopy(struct us_data *us, u8 *buf, u8 *redundant) -{ - struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; - int result; - u16 addr; - - result = ENE_LoadBinCode(us, SM_RW_PATTERN); - if (result != USB_STOR_XFER_GOOD) { - dev_err(&us->pusb_dev->dev, - "Failed to load SmartMedia read/write code\n"); - return USB_STOR_TRANSPORT_ERROR; - } - - - addr = (u16)Media.Zone*Ssfdc.MaxBlocks + Media.PhyBlock; - addr = addr*(u16)Ssfdc.MaxSectors + Media.Sector; - - /* Write sect data */ - memset(bcb, 0, sizeof(struct bulk_cb_wrap)); - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = 0x200; - bcb->Flags = 0x00; - bcb->CDB[0] = 0xF0; - bcb->CDB[1] = 0x04; - bcb->CDB[7] = (u8)addr; - bcb->CDB[6] = (u8)(addr / 0x0100); - bcb->CDB[5] = Media.Zone / 2; - bcb->CDB[8] = *(redundant + REDT_ADDR1H); - bcb->CDB[9] = *(redundant + REDT_ADDR1L); - - result = ENE_SendScsiCmd(us, FDIR_WRITE, buf, 0); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - return USB_STOR_TRANSPORT_GOOD; -} - -/* 6250 CMD 5 */ -/* ----- Ssfdc_D_EraseBlock() ------------------------------------------- */ -int Ssfdc_D_EraseBlock(struct us_data *us) -{ - struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; - int result; - u16 addr; - - result = ENE_LoadBinCode(us, SM_RW_PATTERN); - if (result != USB_STOR_XFER_GOOD) { - dev_err(&us->pusb_dev->dev, - "Failed to load SmartMedia read/write code\n"); - return USB_STOR_TRANSPORT_ERROR; - } - - addr = (u16)Media.Zone*Ssfdc.MaxBlocks + Media.PhyBlock; - addr = addr*(u16)Ssfdc.MaxSectors; - - memset(bcb, 0, sizeof(struct bulk_cb_wrap)); - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = 0x200; - bcb->Flags = 0x80; - bcb->CDB[0] = 0xF2; - bcb->CDB[1] = 0x06; - bcb->CDB[7] = (u8)addr; - bcb->CDB[6] = (u8)(addr / 0x0100); - bcb->CDB[5] = Media.Zone / 2; - - result = ENE_SendScsiCmd(us, FDIR_READ, NULL, 0); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - return USB_STOR_TRANSPORT_GOOD; -} - -/* 6250 CMD 2 */ -/*----- Ssfdc_D_ReadRedtData() ----------------------------------------- */ -int Ssfdc_D_ReadRedtData(struct us_data *us, u8 *redundant) -{ - struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; - int result; - u16 addr; - u8 *buf; - - result = ENE_LoadBinCode(us, SM_RW_PATTERN); - if (result != USB_STOR_XFER_GOOD) { - dev_err(&us->pusb_dev->dev, - "Failed to load SmartMedia read/write code\n"); - return USB_STOR_TRANSPORT_ERROR; - } - - addr = (u16)Media.Zone*Ssfdc.MaxBlocks + Media.PhyBlock; - addr = addr*(u16)Ssfdc.MaxSectors + Media.Sector; - - memset(bcb, 0, sizeof(struct bulk_cb_wrap)); - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = 0x10; - bcb->Flags = 0x80; - bcb->CDB[0] = 0xF1; - bcb->CDB[1] = 0x03; - bcb->CDB[4] = (u8)addr; - bcb->CDB[3] = (u8)(addr / 0x0100); - bcb->CDB[2] = Media.Zone / 2; - bcb->CDB[8] = 0; - bcb->CDB[9] = 1; - - buf = kmalloc(0x10, GFP_KERNEL); - result = ENE_SendScsiCmd(us, FDIR_READ, buf, 0); - memcpy(redundant, buf, 0x10); - kfree(buf); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - return USB_STOR_TRANSPORT_GOOD; -} - -/* 6250 CMD 4 */ -/* ----- Ssfdc_D_WriteRedtData() ---------------------------------------- */ -int Ssfdc_D_WriteRedtData(struct us_data *us, u8 *redundant) -{ - struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; - int result; - u16 addr; - - result = ENE_LoadBinCode(us, SM_RW_PATTERN); - if (result != USB_STOR_XFER_GOOD) { - dev_err(&us->pusb_dev->dev, - "Failed to load SmartMedia read/write code\n"); - return USB_STOR_TRANSPORT_ERROR; - } - - addr = (u16)Media.Zone*Ssfdc.MaxBlocks + Media.PhyBlock; - addr = addr*(u16)Ssfdc.MaxSectors + Media.Sector; - - memset(bcb, 0, sizeof(struct bulk_cb_wrap)); - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = 0x10; - bcb->Flags = 0x80; - bcb->CDB[0] = 0xF2; - bcb->CDB[1] = 0x05; - bcb->CDB[7] = (u8)addr; - bcb->CDB[6] = (u8)(addr / 0x0100); - bcb->CDB[5] = Media.Zone / 2; - bcb->CDB[8] = *(redundant + REDT_ADDR1H); - bcb->CDB[9] = *(redundant + REDT_ADDR1L); - - result = ENE_SendScsiCmd(us, FDIR_READ, NULL, 0); - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - return USB_STOR_TRANSPORT_GOOD; -} - -/* ----- Ssfdc_D_CheckStatus() ------------------------------------------ */ -int Ssfdc_D_CheckStatus(void) -{ - return SMSUCCESS; -} - - - -/* SmartMedia ID Code Check & Mode Set Subroutine - * ----- Set_D_SsfdcModel() --------------------------------------------- - */ -int Set_D_SsfdcModel(u8 dcode) -{ - switch (_Check_D_DevCode(dcode)) { - case SSFDC1MB: - Ssfdc.Model = SSFDC1MB; - Ssfdc.Attribute = FLASH | AD3CYC | BS16 | PS256; - Ssfdc.MaxZones = 1; - Ssfdc.MaxBlocks = 256; - Ssfdc.MaxLogBlocks = 250; - Ssfdc.MaxSectors = 8; - break; - case SSFDC2MB: - Ssfdc.Model = SSFDC2MB; - Ssfdc.Attribute = FLASH | AD3CYC | BS16 | PS256; - Ssfdc.MaxZones = 1; - Ssfdc.MaxBlocks = 512; - Ssfdc.MaxLogBlocks = 500; - Ssfdc.MaxSectors = 8; - break; - case SSFDC4MB: - Ssfdc.Model = SSFDC4MB; - Ssfdc.Attribute = FLASH | AD3CYC | BS16 | PS512; - Ssfdc.MaxZones = 1; - Ssfdc.MaxBlocks = 512; - Ssfdc.MaxLogBlocks = 500; - Ssfdc.MaxSectors = 16; - break; - case SSFDC8MB: - Ssfdc.Model = SSFDC8MB; - Ssfdc.Attribute = FLASH | AD3CYC | BS16 | PS512; - Ssfdc.MaxZones = 1; - Ssfdc.MaxBlocks = 1024; - Ssfdc.MaxLogBlocks = 1000; - Ssfdc.MaxSectors = 16; - break; - case SSFDC16MB: - Ssfdc.Model = SSFDC16MB; - Ssfdc.Attribute = FLASH | AD3CYC | BS32 | PS512; - Ssfdc.MaxZones = 1; - Ssfdc.MaxBlocks = 1024; - Ssfdc.MaxLogBlocks = 1000; - Ssfdc.MaxSectors = 32; - break; - case SSFDC32MB: - Ssfdc.Model = SSFDC32MB; - Ssfdc.Attribute = FLASH | AD3CYC | BS32 | PS512; - Ssfdc.MaxZones = 2; - Ssfdc.MaxBlocks = 1024; - Ssfdc.MaxLogBlocks = 1000; - Ssfdc.MaxSectors = 32; - break; - case SSFDC64MB: - Ssfdc.Model = SSFDC64MB; - Ssfdc.Attribute = FLASH | AD4CYC | BS32 | PS512; - Ssfdc.MaxZones = 4; - Ssfdc.MaxBlocks = 1024; - Ssfdc.MaxLogBlocks = 1000; - Ssfdc.MaxSectors = 32; - break; - case SSFDC128MB: - Ssfdc.Model = SSFDC128MB; - Ssfdc.Attribute = FLASH | AD4CYC | BS32 | PS512; - Ssfdc.MaxZones = 8; - Ssfdc.MaxBlocks = 1024; - Ssfdc.MaxLogBlocks = 1000; - Ssfdc.MaxSectors = 32; - break; - case SSFDC256MB: - Ssfdc.Model = SSFDC256MB; - Ssfdc.Attribute = FLASH | AD4CYC | BS32 | PS512; - Ssfdc.MaxZones = 16; - Ssfdc.MaxBlocks = 1024; - Ssfdc.MaxLogBlocks = 1000; - Ssfdc.MaxSectors = 32; - break; - case SSFDC512MB: - Ssfdc.Model = SSFDC512MB; - Ssfdc.Attribute = FLASH | AD4CYC | BS32 | PS512; - Ssfdc.MaxZones = 32; - Ssfdc.MaxBlocks = 1024; - Ssfdc.MaxLogBlocks = 1000; - Ssfdc.MaxSectors = 32; - break; - case SSFDC1GB: - Ssfdc.Model = SSFDC1GB; - Ssfdc.Attribute = FLASH | AD4CYC | BS32 | PS512; - Ssfdc.MaxZones = 64; - Ssfdc.MaxBlocks = 1024; - Ssfdc.MaxLogBlocks = 1000; - Ssfdc.MaxSectors = 32; - break; - case SSFDC2GB: - Ssfdc.Model = SSFDC2GB; - Ssfdc.Attribute = FLASH | AD4CYC | BS32 | PS512; - Ssfdc.MaxZones = 128; - Ssfdc.MaxBlocks = 1024; - Ssfdc.MaxLogBlocks = 1000; - Ssfdc.MaxSectors = 32; - break; - default: - Ssfdc.Model = NOSSFDC; - return ERROR; - } - - return SMSUCCESS; -} - -/* ----- _Check_D_DevCode() --------------------------------------------- */ -static u8 _Check_D_DevCode(u8 dcode) -{ - switch (dcode) { - case 0x6E: - case 0xE8: - case 0xEC: return SSFDC1MB; /* 8Mbit (1M) NAND */ - case 0x64: - case 0xEA: return SSFDC2MB; /* 16Mbit (2M) NAND */ - case 0x6B: - case 0xE3: - case 0xE5: return SSFDC4MB; /* 32Mbit (4M) NAND */ - case 0xE6: return SSFDC8MB; /* 64Mbit (8M) NAND */ - case 0x73: return SSFDC16MB; /* 128Mbit (16M)NAND */ - case 0x75: return SSFDC32MB; /* 256Mbit (32M)NAND */ - case 0x76: return SSFDC64MB; /* 512Mbit (64M)NAND */ - case 0x79: return SSFDC128MB; /* 1Gbit(128M)NAND */ - case 0x71: return SSFDC256MB; - case 0xDC: return SSFDC512MB; - case 0xD3: return SSFDC1GB; - case 0xD5: return SSFDC2GB; - default: return NOSSFDC; - } -} - - - - -/* SmartMedia ECC Control Subroutine - * ----- Check_D_ReadError() ---------------------------------------------- - */ -int Check_D_ReadError(u8 *redundant) -{ - return SMSUCCESS; -} - -/* ----- Check_D_Correct() ---------------------------------------------- */ -int Check_D_Correct(u8 *buf, u8 *redundant) -{ - return SMSUCCESS; -} - -/* ----- Check_D_CISdata() ---------------------------------------------- */ -int Check_D_CISdata(u8 *buf, u8 *redundant) -{ - u8 cis[] = {0x01, 0x03, 0xD9, 0x01, 0xFF, 0x18, 0x02, - 0xDF, 0x01, 0x20}; - - int cis_len = sizeof(cis); - - if (!IsSSFDCCompliance && !IsXDCompliance) - return SMSUCCESS; - - if (!memcmp(redundant + 0x0D, EccBuf, 3)) - return memcmp(buf, cis, cis_len); - - if (!_Correct_D_SwECC(buf, redundant + 0x0D, EccBuf)) - return memcmp(buf, cis, cis_len); - - buf += 0x100; - if (!memcmp(redundant + 0x08, EccBuf + 0x03, 3)) - return memcmp(buf, cis, cis_len); - - if (!_Correct_D_SwECC(buf, redundant + 0x08, EccBuf + 0x03)) - return memcmp(buf, cis, cis_len); - - return ERROR; -} - -/* ----- Set_D_RightECC() ---------------------------------------------- */ -void Set_D_RightECC(u8 *redundant) -{ - /* Driver ECC Check */ - return; -} - - diff --git a/drivers/staging/keucr/smscsi.c b/drivers/staging/keucr/smscsi.c deleted file mode 100644 index 20858f6777c8..000000000000 --- a/drivers/staging/keucr/smscsi.c +++ /dev/null @@ -1,194 +0,0 @@ -#include -#include -#include - -#include -#include -#include - -#include "usb.h" -#include "scsiglue.h" -#include "transport.h" -#include "smil.h" - -static int SM_SCSI_Test_Unit_Ready(struct us_data *us, struct scsi_cmnd *srb); -static int SM_SCSI_Inquiry(struct us_data *us, struct scsi_cmnd *srb); -static int SM_SCSI_Mode_Sense(struct us_data *us, struct scsi_cmnd *srb); -static int SM_SCSI_Read_Capacity(struct us_data *us, struct scsi_cmnd *srb); -static int SM_SCSI_Read(struct us_data *us, struct scsi_cmnd *srb); -static int SM_SCSI_Write(struct us_data *us, struct scsi_cmnd *srb); - -/* ----- SM_SCSIIrp() -------------------------------------------------- */ -int SM_SCSIIrp(struct us_data *us, struct scsi_cmnd *srb) -{ - int result; - - us->SrbStatus = SS_SUCCESS; - switch (srb->cmnd[0]) { - case TEST_UNIT_READY: - result = SM_SCSI_Test_Unit_Ready(us, srb); - break; /* 0x00 */ - case INQUIRY: - result = SM_SCSI_Inquiry(us, srb); - break; /* 0x12 */ - case MODE_SENSE: - result = SM_SCSI_Mode_Sense(us, srb); - break; /* 0x1A */ - case READ_CAPACITY: - result = SM_SCSI_Read_Capacity(us, srb); - break; /* 0x25 */ - case READ_10: - result = SM_SCSI_Read(us, srb); - break; /* 0x28 */ - case WRITE_10: - result = SM_SCSI_Write(us, srb); - break; /* 0x2A */ - - default: - us->SrbStatus = SS_ILLEGAL_REQUEST; - result = USB_STOR_TRANSPORT_FAILED; - break; - } - return result; -} - -/* ----- SM_SCSI_Test_Unit_Ready() ------------------------------------- */ -static int SM_SCSI_Test_Unit_Ready(struct us_data *us, struct scsi_cmnd *srb) -{ - if (us->SM_Status.Insert && us->SM_Status.Ready) - return USB_STOR_TRANSPORT_GOOD; - else { - ENE_SMInit(us); - return USB_STOR_TRANSPORT_GOOD; - } - - return USB_STOR_TRANSPORT_GOOD; -} - -/* ----- SM_SCSI_Inquiry() --------------------------------------------- */ -static int SM_SCSI_Inquiry(struct us_data *us, struct scsi_cmnd *srb) -{ - u8 data_ptr[36] = {0x00, 0x80, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x55, 0x53, 0x42, 0x32, 0x2E, 0x30, 0x20, - 0x20, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x30, 0x31, 0x30, 0x30}; - - usb_stor_set_xfer_buf(us, data_ptr, 36, srb, TO_XFER_BUF); - return USB_STOR_TRANSPORT_GOOD; -} - - -/* ----- SM_SCSI_Mode_Sense() ------------------------------------------ */ -static int SM_SCSI_Mode_Sense(struct us_data *us, struct scsi_cmnd *srb) -{ - u8 mediaNoWP[12] = {0x0b, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x71, 0xc0, 0x00, 0x00, 0x02, 0x00}; - u8 mediaWP[12] = {0x0b, 0x00, 0x80, 0x08, 0x00, 0x00, - 0x71, 0xc0, 0x00, 0x00, 0x02, 0x00}; - - if (us->SM_Status.WtP) - usb_stor_set_xfer_buf(us, mediaWP, 12, srb, TO_XFER_BUF); - else - usb_stor_set_xfer_buf(us, mediaNoWP, 12, srb, TO_XFER_BUF); - - - return USB_STOR_TRANSPORT_GOOD; -} - -/* ----- SM_SCSI_Read_Capacity() --------------------------------------- */ -static int SM_SCSI_Read_Capacity(struct us_data *us, struct scsi_cmnd *srb) -{ - unsigned int offset = 0; - struct scatterlist *sg = NULL; - u32 bl_num; - u16 bl_len; - u8 buf[8]; - - dev_dbg(&us->pusb_dev->dev, "SM_SCSI_Read_Capacity\n"); - - bl_len = 0x200; - bl_num = Ssfdc.MaxLogBlocks * Ssfdc.MaxSectors * Ssfdc.MaxZones - 1; - - us->bl_num = bl_num; - dev_dbg(&us->pusb_dev->dev, "bl_len = %x\n", bl_len); - dev_dbg(&us->pusb_dev->dev, "bl_num = %x\n", bl_num); - - buf[0] = (bl_num >> 24) & 0xff; - buf[1] = (bl_num >> 16) & 0xff; - buf[2] = (bl_num >> 8) & 0xff; - buf[3] = (bl_num >> 0) & 0xff; - buf[4] = (bl_len >> 24) & 0xff; - buf[5] = (bl_len >> 16) & 0xff; - buf[6] = (bl_len >> 8) & 0xff; - buf[7] = (bl_len >> 0) & 0xff; - - usb_stor_access_xfer_buf(us, buf, 8, srb, &sg, &offset, TO_XFER_BUF); - - return USB_STOR_TRANSPORT_GOOD; -} - -/* ----- SM_SCSI_Read() -------------------------------------------------- */ -static int SM_SCSI_Read(struct us_data *us, struct scsi_cmnd *srb) -{ - int result = 0; - u8 *Cdb = srb->cmnd; - u32 bn = ((Cdb[2] << 24) & 0xff000000) | - ((Cdb[3] << 16) & 0x00ff0000) | - ((Cdb[4] << 8) & 0x0000ff00) | - ((Cdb[5] << 0) & 0x000000ff); - u16 blen = ((Cdb[7] << 8) & 0xff00) | ((Cdb[8] << 0) & 0x00ff); - u32 blenByte = blen * 0x200; - void *buf; - - - if (bn > us->bl_num) - return USB_STOR_TRANSPORT_ERROR; - - buf = kmalloc(blenByte, GFP_KERNEL); - if (buf == NULL) - return USB_STOR_TRANSPORT_ERROR; - result = Media_D_ReadSector(us, bn, blen, buf); - usb_stor_set_xfer_buf(us, buf, blenByte, srb, TO_XFER_BUF); - kfree(buf); - - if (!result) - return USB_STOR_TRANSPORT_GOOD; - else - return USB_STOR_TRANSPORT_ERROR; - - return USB_STOR_TRANSPORT_GOOD; -} - -/* ----- SM_SCSI_Write() -------------------------------------------------- */ -static int SM_SCSI_Write(struct us_data *us, struct scsi_cmnd *srb) -{ - int result = 0; - u8 *Cdb = srb->cmnd; - u32 bn = ((Cdb[2] << 24) & 0xff000000) | - ((Cdb[3] << 16) & 0x00ff0000) | - ((Cdb[4] << 8) & 0x0000ff00) | - ((Cdb[5] << 0) & 0x000000ff); - u16 blen = ((Cdb[7] << 8) & 0xff00) | ((Cdb[8] << 0) & 0x00ff); - u32 blenByte = blen * 0x200; - void *buf; - - - if (bn > us->bl_num) - return USB_STOR_TRANSPORT_ERROR; - - buf = kmalloc(blenByte, GFP_KERNEL); - if (buf == NULL) - return USB_STOR_TRANSPORT_ERROR; - usb_stor_set_xfer_buf(us, buf, blenByte, srb, FROM_XFER_BUF); - result = Media_D_CopySector(us, bn, blen, buf); - kfree(buf); - - if (!result) - return USB_STOR_TRANSPORT_GOOD; - else - return USB_STOR_TRANSPORT_ERROR; - - return USB_STOR_TRANSPORT_GOOD; -} - diff --git a/drivers/staging/keucr/transport.c b/drivers/staging/keucr/transport.c deleted file mode 100644 index 5e59525271f8..000000000000 --- a/drivers/staging/keucr/transport.c +++ /dev/null @@ -1,865 +0,0 @@ -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -#include -#include -#include - -#include -#include -#include - -#include "usb.h" -#include "scsiglue.h" -#include "transport.h" - -/*********************************************************************** - * Data transfer routines - ***********************************************************************/ -/* - * usb_stor_blocking_completion() - */ -static void usb_stor_blocking_completion(struct urb *urb) -{ - struct completion *urb_done_ptr = urb->context; - - /* pr_info("transport --- usb_stor_blocking_completion\n"); */ - complete(urb_done_ptr); -} - -/* - * usb_stor_msg_common() - */ -static int usb_stor_msg_common(struct us_data *us, int timeout) -{ - struct completion urb_done; - long timeleft; - int status; - - /* pr_info("transport --- usb_stor_msg_common\n"); */ - if (test_bit(US_FLIDX_ABORTING, &us->dflags)) - return -EIO; - - init_completion(&urb_done); - - us->current_urb->context = &urb_done; - us->current_urb->actual_length = 0; - us->current_urb->error_count = 0; - us->current_urb->status = 0; - - us->current_urb->transfer_flags = 0; - if (us->current_urb->transfer_buffer == us->iobuf) - us->current_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - us->current_urb->transfer_dma = us->iobuf_dma; - us->current_urb->setup_dma = us->cr_dma; - - status = usb_submit_urb(us->current_urb, GFP_NOIO); - if (status) - return status; - - set_bit(US_FLIDX_URB_ACTIVE, &us->dflags); - - if (test_bit(US_FLIDX_ABORTING, &us->dflags)) { - if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->dflags)) { - /* pr_info("-- cancelling URB\n"); */ - usb_unlink_urb(us->current_urb); - } - } - - timeleft = wait_for_completion_interruptible_timeout(&urb_done, - timeout ? : MAX_SCHEDULE_TIMEOUT); - clear_bit(US_FLIDX_URB_ACTIVE, &us->dflags); - - if (timeleft <= 0) { - /* pr_info("%s -- cancelling URB\n", - timeleft == 0 ? "Timeout" : "Signal"); */ - usb_kill_urb(us->current_urb); - } - - return us->current_urb->status; -} - -/* - * usb_stor_print_cmd(): - */ -static void usb_stor_print_cmd(struct us_data *us, struct scsi_cmnd *srb) -{ - u8 *Cdb = srb->cmnd; - u32 cmd = Cdb[0]; - - switch (cmd) { - case TEST_UNIT_READY: - break; - case INQUIRY: - dev_dbg(&us->pusb_dev->dev, - "scsi cmd %X --- SCSIOP_INQUIRY\n", cmd); - break; - case MODE_SENSE: - dev_dbg(&us->pusb_dev->dev, - "scsi cmd %X --- SCSIOP_MODE_SENSE\n", cmd); - break; - case START_STOP: - dev_dbg(&us->pusb_dev->dev, - "scsi cmd %X --- SCSIOP_START_STOP\n", cmd); - break; - case READ_CAPACITY: - dev_dbg(&us->pusb_dev->dev, - "scsi cmd %X --- SCSIOP_READ_CAPACITY\n", cmd); - break; - case READ_10: - break; - case WRITE_10: - break; - case ALLOW_MEDIUM_REMOVAL: - dev_dbg(&us->pusb_dev->dev, - "scsi cmd %X --- SCSIOP_ALLOW_MEDIUM_REMOVAL\n", cmd); - break; - default: - dev_dbg(&us->pusb_dev->dev, "scsi cmd %X --- Other cmd\n", cmd); - break; - } -} - -/* - * usb_stor_control_msg() - */ -int usb_stor_control_msg(struct us_data *us, unsigned int pipe, - u8 request, u8 requesttype, u16 value, u16 index, - void *data, u16 size, int timeout) -{ - int status; - - /* pr_info("transport --- usb_stor_control_msg\n"); */ - - /* fill in the devrequest structure */ - us->cr->bRequestType = requesttype; - us->cr->bRequest = request; - us->cr->wValue = cpu_to_le16(value); - us->cr->wIndex = cpu_to_le16(index); - us->cr->wLength = cpu_to_le16(size); - - /* fill and submit the URB */ - usb_fill_control_urb(us->current_urb, us->pusb_dev, pipe, - (unsigned char *) us->cr, data, size, - usb_stor_blocking_completion, NULL); - status = usb_stor_msg_common(us, timeout); - - /* return the actual length of the data transferred if no error */ - if (status == 0) - status = us->current_urb->actual_length; - return status; -} - -/* - * usb_stor_clear_halt() - */ -int usb_stor_clear_halt(struct us_data *us, unsigned int pipe) -{ - int result; - int endp = usb_pipeendpoint(pipe); - - /* pr_info("transport --- usb_stor_clear_halt\n"); */ - if (usb_pipein(pipe)) - endp |= USB_DIR_IN; - - result = usb_stor_control_msg(us, us->send_ctrl_pipe, - USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, - USB_ENDPOINT_HALT, endp, - NULL, 0, 3*HZ); - - /* reset the endpoint toggle */ - if (result >= 0) - /* usb_settoggle(us->pusb_dev, usb_pipeendpoint(pipe), - usb_pipeout(pipe), 0); */ - usb_reset_endpoint(us->pusb_dev, endp); - - return result; -} - -/* - * interpret_urb_result() - */ -static int interpret_urb_result(struct us_data *us, unsigned int pipe, - unsigned int length, int result, unsigned int partial) -{ - /* pr_info("transport --- interpret_urb_result\n"); */ - switch (result) { - /* no error code; did we send all the data? */ - case 0: - if (partial != length) { - /* pr_info("-- short transfer\n"); */ - return USB_STOR_XFER_SHORT; - } - /* pr_info("-- transfer complete\n"); */ - return USB_STOR_XFER_GOOD; - case -EPIPE: - if (usb_pipecontrol(pipe)) { - /* pr_info("-- stall on control pipe\n"); */ - return USB_STOR_XFER_STALLED; - } - /* pr_info("clearing endpoint halt for pipe 0x%x\n", pipe); */ - if (usb_stor_clear_halt(us, pipe) < 0) - return USB_STOR_XFER_ERROR; - return USB_STOR_XFER_STALLED; - case -EOVERFLOW: - /* pr_info("-- babble\n"); */ - return USB_STOR_XFER_LONG; - case -ECONNRESET: - /* pr_info("-- transfer cancelled\n"); */ - return USB_STOR_XFER_ERROR; - case -EREMOTEIO: - /* pr_info("-- short read transfer\n"); */ - return USB_STOR_XFER_SHORT; - case -EIO: - /* pr_info("-- abort or disconnect in progress\n"); */ - return USB_STOR_XFER_ERROR; - default: - /* pr_info("-- unknown error\n"); */ - return USB_STOR_XFER_ERROR; - } -} - -/* - * usb_stor_bulk_transfer_buf() - */ -int usb_stor_bulk_transfer_buf(struct us_data *us, unsigned int pipe, - void *buf, unsigned int length, unsigned int *act_len) -{ - int result; - - /* pr_info("transport --- usb_stor_bulk_transfer_buf\n"); */ - - /* fill and submit the URB */ - usb_fill_bulk_urb(us->current_urb, us->pusb_dev, pipe, buf, - length, usb_stor_blocking_completion, NULL); - result = usb_stor_msg_common(us, 0); - - /* store the actual length of the data transferred */ - if (act_len) - *act_len = us->current_urb->actual_length; - - return interpret_urb_result(us, pipe, length, result, - us->current_urb->actual_length); -} - -/* - * usb_stor_bulk_transfer_sglist() - */ -static int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe, - struct scatterlist *sg, int num_sg, unsigned int length, - unsigned int *act_len) -{ - int result; - - /* pr_info("transport --- usb_stor_bulk_transfer_sglist\n"); */ - if (test_bit(US_FLIDX_ABORTING, &us->dflags)) - return USB_STOR_XFER_ERROR; - - /* initialize the scatter-gather request block */ - result = usb_sg_init(&us->current_sg, us->pusb_dev, pipe, 0, - sg, num_sg, length, GFP_NOIO); - if (result) { - /* pr_info("usb_sg_init returned %d\n", result); */ - return USB_STOR_XFER_ERROR; - } - - /* since the block has been initialized successfully, - it's now okay to cancel it */ - set_bit(US_FLIDX_SG_ACTIVE, &us->dflags); - - /* did an abort/disconnect occur during the submission? */ - if (test_bit(US_FLIDX_ABORTING, &us->dflags)) { - /* cancel the request, if it hasn't been cancelled already */ - if (test_and_clear_bit(US_FLIDX_SG_ACTIVE, &us->dflags)) { - /* pr_info("-- cancelling sg request\n"); */ - usb_sg_cancel(&us->current_sg); - } - } - - /* wait for the completion of the transfer */ - usb_sg_wait(&us->current_sg); - clear_bit(US_FLIDX_SG_ACTIVE, &us->dflags); - - result = us->current_sg.status; - if (act_len) - *act_len = us->current_sg.bytes; - - return interpret_urb_result(us, pipe, length, - result, us->current_sg.bytes); -} - -/* - * usb_stor_bulk_srb() - */ -int usb_stor_bulk_srb(struct us_data *us, unsigned int pipe, - struct scsi_cmnd *srb) -{ - unsigned int partial; - int result = usb_stor_bulk_transfer_sglist(us, pipe, scsi_sglist(srb), - scsi_sg_count(srb), scsi_bufflen(srb), - &partial); - - scsi_set_resid(srb, scsi_bufflen(srb) - partial); - return result; -} - -/* - * usb_stor_bulk_transfer_sg() - */ -int usb_stor_bulk_transfer_sg(struct us_data *us, unsigned int pipe, - void *buf, unsigned int length_left, int use_sg, int *residual) -{ - int result; - unsigned int partial; - - /* pr_info("transport --- usb_stor_bulk_transfer_sg\n"); */ - /* are we scatter-gathering? */ - if (use_sg) { - /* use the usb core scatter-gather primitives */ - result = usb_stor_bulk_transfer_sglist(us, pipe, - (struct scatterlist *) buf, use_sg, - length_left, &partial); - length_left -= partial; - } else { - /* no scatter-gather, just make the request */ - result = usb_stor_bulk_transfer_buf(us, pipe, buf, - length_left, &partial); - length_left -= partial; - } - - /* store the residual and return the error code */ - if (residual) - *residual = length_left; - return result; -} - -/*********************************************************************** - * Transport routines - ***********************************************************************/ -/* - * usb_stor_invoke_transport() - */ -void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) -{ - int need_auto_sense; - int result; - - /* pr_info("transport --- usb_stor_invoke_transport\n"); */ - usb_stor_print_cmd(us, srb); - /* send the command to the transport layer */ - scsi_set_resid(srb, 0); - result = us->transport(srb, us); /* usb_stor_Bulk_transport; */ - - /* if the command gets aborted by the higher layers, - we need to short-circuit all other processing */ - if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) { - /* pr_info("-- command was aborted\n"); */ - srb->result = DID_ABORT << 16; - goto Handle_Errors; - } - - /* if there is a transport error, reset and don't auto-sense */ - if (result == USB_STOR_TRANSPORT_ERROR) { - /* pr_info("-- transport indicates error, resetting\n"); */ - srb->result = DID_ERROR << 16; - goto Handle_Errors; - } - - /* if the transport provided its own sense data, don't auto-sense */ - if (result == USB_STOR_TRANSPORT_NO_SENSE) { - srb->result = SAM_STAT_CHECK_CONDITION; - return; - } - - srb->result = SAM_STAT_GOOD; - - /* Determine if we need to auto-sense */ - need_auto_sense = 0; - - if ((us->protocol == USB_PR_CB || us->protocol == USB_PR_DPCM_USB) && - srb->sc_data_direction != DMA_FROM_DEVICE) { - /* pr_info("-- CB transport device requiring auto-sense\n"); */ - need_auto_sense = 1; - } - - if (result == USB_STOR_TRANSPORT_FAILED) { - /* pr_info("-- transport indicates command failure\n"); */ - need_auto_sense = 1; - } - - /* Now, if we need to do the auto-sense, let's do it */ - if (need_auto_sense) { - int temp_result; - struct scsi_eh_save ses; - - pr_info("Issuing auto-REQUEST_SENSE\n"); - - scsi_eh_prep_cmnd(srb, &ses, NULL, 0, US_SENSE_SIZE); - - /* we must do the protocol translation here */ - if (us->subclass == USB_SC_RBC || - us->subclass == USB_SC_SCSI || - us->subclass == USB_SC_CYP_ATACB) { - srb->cmd_len = 6; - } else { - srb->cmd_len = 12; - } - /* issue the auto-sense command */ - scsi_set_resid(srb, 0); - temp_result = us->transport(us->srb, us); - - /* let's clean up right away */ - scsi_eh_restore_cmnd(srb, &ses); - - if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) { - /* pr_info("-- auto-sense aborted\n"); */ - srb->result = DID_ABORT << 16; - goto Handle_Errors; - } - if (temp_result != USB_STOR_TRANSPORT_GOOD) { - /* pr_info("-- auto-sense failure\n"); */ - srb->result = DID_ERROR << 16; - if (!(us->fflags & US_FL_SCM_MULT_TARG)) - goto Handle_Errors; - return; - } - - /* set the result so the higher layers expect this data */ - srb->result = SAM_STAT_CHECK_CONDITION; - - if (result == USB_STOR_TRANSPORT_GOOD && - (srb->sense_buffer[2] & 0xaf) == 0 && - srb->sense_buffer[12] == 0 && - srb->sense_buffer[13] == 0) { - srb->result = SAM_STAT_GOOD; - srb->sense_buffer[0] = 0x0; - } - } - - /* Did we transfer less than the minimum amount required? */ - if (srb->result == SAM_STAT_GOOD && scsi_bufflen(srb) - - scsi_get_resid(srb) < srb->underflow) - srb->result = (DID_ERROR << 16); - /* v02 | (SUGGEST_RETRY << 24); */ - - return; - -Handle_Errors: - scsi_lock(us_to_host(us)); - set_bit(US_FLIDX_RESETTING, &us->dflags); - clear_bit(US_FLIDX_ABORTING, &us->dflags); - scsi_unlock(us_to_host(us)); - - mutex_unlock(&us->dev_mutex); - result = usb_stor_port_reset(us); - mutex_lock(&us->dev_mutex); - - if (result < 0) { - scsi_lock(us_to_host(us)); - usb_stor_report_device_reset(us); - scsi_unlock(us_to_host(us)); - us->transport_reset(us); - } - clear_bit(US_FLIDX_RESETTING, &us->dflags); -} - -/* - * ENE_stor_invoke_transport() - */ -void ENE_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) -{ - int result = 0; - - /* pr_info("transport --- ENE_stor_invoke_transport\n"); */ - usb_stor_print_cmd(us, srb); - /* send the command to the transport layer */ - scsi_set_resid(srb, 0); - if (!(us->SM_Status.Ready)) - result = ENE_InitMedia(us); - - if (us->Power_IsResum == true) { - result = ENE_InitMedia(us); - us->Power_IsResum = false; - } - - if (us->SM_Status.Ready) - result = SM_SCSIIrp(us, srb); - - /* if the command gets aborted by the higher layers, - we need to short-circuit all other processing */ - if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) { - /* pr_info("-- command was aborted\n"); */ - srb->result = DID_ABORT << 16; - goto Handle_Errors; - } - - /* if there is a transport error, reset and don't auto-sense */ - if (result == USB_STOR_TRANSPORT_ERROR) { - /* pr_info("-- transport indicates error, resetting\n"); */ - srb->result = DID_ERROR << 16; - goto Handle_Errors; - } - - /* if the transport provided its own sense data, don't auto-sense */ - if (result == USB_STOR_TRANSPORT_NO_SENSE) { - srb->result = SAM_STAT_CHECK_CONDITION; - return; - } - - srb->result = SAM_STAT_GOOD; - if (result == USB_STOR_TRANSPORT_FAILED) { - /* pr_info("-- transport indicates command failure\n"); */ - /* need_auto_sense = 1; */ - BuildSenseBuffer(srb, us->SrbStatus); - srb->result = SAM_STAT_CHECK_CONDITION; - } - - /* Did we transfer less than the minimum amount required? */ - if (srb->result == SAM_STAT_GOOD && scsi_bufflen(srb) - - scsi_get_resid(srb) < srb->underflow) - srb->result = (DID_ERROR << 16); - /* v02 | (SUGGEST_RETRY << 24); */ - - return; - -Handle_Errors: - scsi_lock(us_to_host(us)); - set_bit(US_FLIDX_RESETTING, &us->dflags); - clear_bit(US_FLIDX_ABORTING, &us->dflags); - scsi_unlock(us_to_host(us)); - - mutex_unlock(&us->dev_mutex); - result = usb_stor_port_reset(us); - mutex_lock(&us->dev_mutex); - - if (result < 0) { - scsi_lock(us_to_host(us)); - usb_stor_report_device_reset(us); - scsi_unlock(us_to_host(us)); - us->transport_reset(us); - } - clear_bit(US_FLIDX_RESETTING, &us->dflags); -} - -/* - * BuildSenseBuffer() - */ -void BuildSenseBuffer(struct scsi_cmnd *srb, int SrbStatus) -{ - u8 *buf = srb->sense_buffer; - u8 asc; - - pr_info("transport --- BuildSenseBuffer\n"); - switch (SrbStatus) { - case SS_NOT_READY: - asc = 0x3a; - break; /* sense key = 0x02 */ - case SS_MEDIUM_ERR: - asc = 0x0c; - break; /* sense key = 0x03 */ - case SS_ILLEGAL_REQUEST: - asc = 0x20; - break; /* sense key = 0x05 */ - default: - asc = 0x00; - break; /* ?? */ - } - - memset(buf, 0, 18); - buf[0x00] = 0xf0; - buf[0x02] = SrbStatus; - buf[0x07] = 0x0b; - buf[0x0c] = asc; -} - -/* - * usb_stor_stop_transport() - */ -void usb_stor_stop_transport(struct us_data *us) -{ - /* pr_info("transport --- usb_stor_stop_transport\n"); */ - - if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->dflags)) { - /* pr_info("-- cancelling URB\n"); */ - usb_unlink_urb(us->current_urb); - } - - if (test_and_clear_bit(US_FLIDX_SG_ACTIVE, &us->dflags)) { - /* pr_info("-- cancelling sg request\n"); */ - usb_sg_cancel(&us->current_sg); - } -} - -/* - * usb_stor_Bulk_max_lun() - */ -int usb_stor_Bulk_max_lun(struct us_data *us) -{ - int result; - - /* pr_info("transport --- usb_stor_Bulk_max_lun\n"); */ - /* issue the command */ - us->iobuf[0] = 0; - result = usb_stor_control_msg(us, us->recv_ctrl_pipe, - US_BULK_GET_MAX_LUN, - USB_DIR_IN | USB_TYPE_CLASS | - USB_RECIP_INTERFACE, - 0, us->ifnum, us->iobuf, 1, HZ); - - /* pr_info("GetMaxLUN command result is %d, data is %d\n", - result, us->iobuf[0]); */ - - /* if we have a successful request, return the result */ - if (result > 0) - return us->iobuf[0]; - - return 0; -} - -/* - * usb_stor_Bulk_transport() - */ -int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) -{ - struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; - struct bulk_cs_wrap *bcs = (struct bulk_cs_wrap *) us->iobuf; - unsigned int transfer_length = scsi_bufflen(srb); - unsigned int residue; - int result; - int fake_sense = 0; - unsigned int cswlen; - unsigned int cbwlen = US_BULK_CB_WRAP_LEN; - - /* pr_info("transport --- usb_stor_Bulk_transport\n"); */ - /* Take care of BULK32 devices; set extra byte to 0 */ - if (unlikely(us->fflags & US_FL_BULK32)) { - cbwlen = 32; - us->iobuf[31] = 0; - } - - /* set up the command wrapper */ - bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); - bcb->DataTransferLength = cpu_to_le32(transfer_length); - bcb->Flags = srb->sc_data_direction == DMA_FROM_DEVICE ? 1 << 7 : 0; - bcb->Tag = ++us->tag; - bcb->Lun = srb->device->lun; - if (us->fflags & US_FL_SCM_MULT_TARG) - bcb->Lun |= srb->device->id << 4; - bcb->Length = srb->cmd_len; - - /* copy the command payload */ - memset(bcb->CDB, 0, sizeof(bcb->CDB)); - memcpy(bcb->CDB, srb->cmnd, bcb->Length); - - /* send command */ - /* send it to out endpoint */ - /* pr_info("Bulk Command S 0x%x T 0x%x L %d F %d Trg %d LUN %d CL %d\n", - le32_to_cpu(bcb->Signature), bcb->Tag, - le32_to_cpu(bcb->DataTransferLength), bcb->Flags, - (bcb->Lun >> 4), (bcb->Lun & 0x0F), - bcb->Length); */ - result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe, - bcb, cbwlen, NULL); - /* pr_info("Bulk command transfer result=%d\n", result); */ - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - if (unlikely(us->fflags & US_FL_GO_SLOW)) - udelay(125); - - /* R/W data */ - if (transfer_length) { - unsigned int pipe; - - if (srb->sc_data_direction == DMA_FROM_DEVICE) - pipe = us->recv_bulk_pipe; - else - pipe = us->send_bulk_pipe; - - result = usb_stor_bulk_srb(us, pipe, srb); - /* pr_info("Bulk data transfer result 0x%x\n", result); */ - if (result == USB_STOR_XFER_ERROR) - return USB_STOR_TRANSPORT_ERROR; - - if (result == USB_STOR_XFER_LONG) - fake_sense = 1; - } - - /* get CSW for device status */ - /* pr_info("Attempting to get CSW...\n"); */ - result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, bcs, - US_BULK_CS_WRAP_LEN, &cswlen); - - if (result == USB_STOR_XFER_SHORT && cswlen == 0) { - /* pr_info("Received 0-length CSW; retrying...\n"); */ - result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, bcs, - US_BULK_CS_WRAP_LEN, &cswlen); - } - - /* did the attempt to read the CSW fail? */ - if (result == USB_STOR_XFER_STALLED) { - /* get the status again */ - /* pr_info("Attempting to get CSW (2nd try)...\n"); */ - result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, bcs, - US_BULK_CS_WRAP_LEN, NULL); - } - - /* if we still have a failure at this point, we're in trouble */ - /* pr_info("Bulk status result = %d\n", result); */ - if (result != USB_STOR_XFER_GOOD) - return USB_STOR_TRANSPORT_ERROR; - - /* check bulk status */ - residue = le32_to_cpu(bcs->Residue); - /* pr_info("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n", - le32_to_cpu(bcs->Signature), - bcs->Tag, residue, bcs->Status); */ - if (!(bcs->Tag == us->tag || - (us->fflags & US_FL_BULK_IGNORE_TAG)) || - bcs->Status > US_BULK_STAT_PHASE) { - /* pr_info("Bulk logical error\n"); */ - return USB_STOR_TRANSPORT_ERROR; - } - - if (!us->bcs_signature) { - us->bcs_signature = bcs->Signature; - /* if (us->bcs_signature != cpu_to_le32(US_BULK_CS_SIGN)) */ - /* pr_info("Learnt BCS signature 0x%08X\n", - le32_to_cpu(us->bcs_signature)); */ - } else if (bcs->Signature != us->bcs_signature) { - /* pr_info("Signature mismatch: got %08X, expecting %08X\n", - le32_to_cpu(bcs->Signature), - le32_to_cpu(us->bcs_signature)); */ - return USB_STOR_TRANSPORT_ERROR; - } - - /* try to compute the actual residue, based on how much data - * was really transferred and what the device tells us */ - if (residue && !(us->fflags & US_FL_IGNORE_RESIDUE)) { - - /* Heuristically detect devices that generate bogus residues - * by seeing what happens with INQUIRY and READ CAPACITY - * commands. - */ - if (bcs->Status == US_BULK_STAT_OK && - scsi_get_resid(srb) == 0 && - ((srb->cmnd[0] == INQUIRY && - transfer_length == 36) || - (srb->cmnd[0] == READ_CAPACITY && - transfer_length == 8))) { - us->fflags |= US_FL_IGNORE_RESIDUE; - - } else { - residue = min(residue, transfer_length); - scsi_set_resid(srb, max_t(int, scsi_get_resid(srb), - residue)); - } - } - - /* based on the status code, we report good or bad */ - switch (bcs->Status) { - case US_BULK_STAT_OK: - if (fake_sense) { - memcpy(srb->sense_buffer, usb_stor_sense_invalidCDB, - sizeof(usb_stor_sense_invalidCDB)); - return USB_STOR_TRANSPORT_NO_SENSE; - } - return USB_STOR_TRANSPORT_GOOD; - - case US_BULK_STAT_FAIL: - return USB_STOR_TRANSPORT_FAILED; - - case US_BULK_STAT_PHASE: - return USB_STOR_TRANSPORT_ERROR; - } - return USB_STOR_TRANSPORT_ERROR; -} - -/*********************************************************************** - * Reset routines - ***********************************************************************/ -/* - * usb_stor_reset_common() - */ -static int usb_stor_reset_common(struct us_data *us, - u8 request, u8 requesttype, - u16 value, u16 index, void *data, u16 size) -{ - int result; - int result2; - - /* pr_info("transport --- usb_stor_reset_common\n"); */ - if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) { - /* pr_info("No reset during disconnect\n"); */ - return -EIO; - } - - result = usb_stor_control_msg(us, us->send_ctrl_pipe, - request, requesttype, value, index, data, size, 5*HZ); - - if (result < 0) { - /* pr_info("Soft reset failed: %d\n", result); */ - return result; - } - - wait_event_interruptible_timeout(us->delay_wait, - test_bit(US_FLIDX_DISCONNECTING, &us->dflags), HZ*6); - - if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) { - /* pr_info("Reset interrupted by disconnect\n"); */ - return -EIO; - } - - /* pr_info("Soft reset: clearing bulk-in endpoint halt\n"); */ - result = usb_stor_clear_halt(us, us->recv_bulk_pipe); - - /* pr_info("Soft reset: clearing bulk-out endpoint halt\n"); */ - result2 = usb_stor_clear_halt(us, us->send_bulk_pipe); - - /* return a result code based on the result of the clear-halts */ - if (result >= 0) - result = result2; - /* if (result < 0) */ - /* pr_info("Soft reset failed\n"); */ - /* else */ - /* pr_info("Soft reset done\n"); */ - return result; -} - -/* - * usb_stor_Bulk_reset() - */ -int usb_stor_Bulk_reset(struct us_data *us) -{ - /* pr_info("transport --- usb_stor_Bulk_reset\n"); */ - return usb_stor_reset_common(us, US_BULK_RESET_REQUEST, - USB_TYPE_CLASS | USB_RECIP_INTERFACE, - 0, us->ifnum, NULL, 0); -} - -/* - * usb_stor_port_reset() - */ -int usb_stor_port_reset(struct us_data *us) -{ - int result; - - /* pr_info("transport --- usb_stor_port_reset\n"); */ - result = usb_lock_device_for_reset(us->pusb_dev, us->pusb_intf); - if (result < 0) - pr_info("unable to lock device for reset: %d\n", result); - else { - /* Were we disconnected while waiting for the lock? */ - if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) { - result = -EIO; - /* pr_info("No reset during disconnect\n"); */ - } else { - result = usb_reset_device(us->pusb_dev); - /* pr_info("usb_reset_composite_device returns %d\n", - result); */ - } - usb_unlock_device(us->pusb_dev); - } - return result; -} - - diff --git a/drivers/staging/keucr/transport.h b/drivers/staging/keucr/transport.h deleted file mode 100644 index abd8e5a3dd6e..000000000000 --- a/drivers/staging/keucr/transport.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef _TRANSPORT_H_ -#define _TRANSPORT_H_ - -#include - -/* usb_stor_bulk_transfer_xxx() return codes, in order of severity */ -#define USB_STOR_XFER_GOOD 0 /* good transfer */ -#define USB_STOR_XFER_SHORT 1 /* transferred less than expected */ -#define USB_STOR_XFER_STALLED 2 /* endpoint stalled */ -#define USB_STOR_XFER_LONG 3 /* device tried to send too much */ -#define USB_STOR_XFER_ERROR 4 /* transfer died in the middle */ - -/* Transport return codes */ -#define USB_STOR_TRANSPORT_GOOD 0 /* Transport good, command good */ -#define USB_STOR_TRANSPORT_FAILED 1 /* Transport good, command failed */ -#define USB_STOR_TRANSPORT_NO_SENSE 2 /* Command failed, no auto-sense */ -#define USB_STOR_TRANSPORT_ERROR 3 /* Transport bad (i.e. device dead) */ - -/* - * We used to have USB_STOR_XFER_ABORTED and USB_STOR_TRANSPORT_ABORTED - * return codes. But now the transport and low-level transfer routines - * treat an abort as just another error (-ENOENT for a cancelled URB). - * It is up to the invoke_transport() function to test for aborts and - * distinguish them from genuine communication errors. - */ - -/* CBI accept device specific command */ -#define US_CBI_ADSC 0 -extern int usb_stor_Bulk_transport(struct scsi_cmnd *, struct us_data*); -extern int usb_stor_Bulk_max_lun(struct us_data *); -extern int usb_stor_Bulk_reset(struct us_data *); -extern void usb_stor_invoke_transport(struct scsi_cmnd *, struct us_data*); -extern void usb_stor_stop_transport(struct us_data *); -extern int usb_stor_control_msg(struct us_data *us, unsigned int pipe, - u8 request, u8 requesttype, u16 value, u16 index, - void *data, u16 size, int timeout); -extern int usb_stor_clear_halt(struct us_data *us, unsigned int pipe); -extern int usb_stor_bulk_transfer_buf(struct us_data *us, unsigned int pipe, - void *buf, unsigned int length, unsigned int *act_len); -extern int usb_stor_bulk_transfer_sg(struct us_data *us, unsigned int pipe, - void *buf, unsigned int length, int use_sg, int *residual); -extern int usb_stor_bulk_srb(struct us_data *us, unsigned int pipe, - struct scsi_cmnd *srb); -extern int usb_stor_port_reset(struct us_data *us); - -/* Protocol handling routines */ -enum xfer_buf_dir {TO_XFER_BUF, FROM_XFER_BUF}; -extern unsigned int usb_stor_access_xfer_buf(struct us_data*, - unsigned char *buffer, unsigned int buflen, struct scsi_cmnd *srb, - struct scatterlist **, unsigned int *offset, enum xfer_buf_dir dir); -extern void usb_stor_set_xfer_buf(struct us_data*, unsigned char *buffer, - unsigned int buflen, struct scsi_cmnd *srb, - unsigned int dir); - -/* - * ENE scsi function - */ -extern void ENE_stor_invoke_transport(struct scsi_cmnd *, struct us_data *); -extern int ENE_InitMedia(struct us_data *); -extern int ENE_SMInit(struct us_data *); -extern int ENE_SendScsiCmd(struct us_data*, u8, void*, int); -extern int ENE_LoadBinCode(struct us_data*, u8); -extern int ene_read_byte(struct us_data*, u16 index, void *buf); -extern int ENE_Read_Data(struct us_data*, void *buf, unsigned int length); -extern int ENE_Write_Data(struct us_data*, void *buf, unsigned int length); -extern void BuildSenseBuffer(struct scsi_cmnd *, int); - -/* - * ENE scsi function - */ -extern int SM_SCSIIrp(struct us_data *us, struct scsi_cmnd *srb); - -#endif diff --git a/drivers/staging/keucr/usb.c b/drivers/staging/keucr/usb.c deleted file mode 100644 index 1e2073b28f0f..000000000000 --- a/drivers/staging/keucr/usb.c +++ /dev/null @@ -1,643 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "usb.h" -#include "scsiglue.h" -#include "smil.h" -#include "transport.h" - -/* Some informational data */ -MODULE_AUTHOR("Domao"); -MODULE_DESCRIPTION("ENE USB Mass Storage driver for Linux"); -MODULE_LICENSE("GPL"); - -static unsigned int delay_use = 1; - -static struct usb_device_id eucr_usb_ids[] = { - { USB_DEVICE(0x058f, 0x6366) }, - { USB_DEVICE(0x0cf2, 0x6230) }, - { USB_DEVICE(0x0cf2, 0x6250) }, - { } /* Terminating entry */ -}; -MODULE_DEVICE_TABLE(usb, eucr_usb_ids); - - -#ifdef CONFIG_PM - -static int eucr_suspend(struct usb_interface *iface, pm_message_t message) -{ - struct us_data *us = usb_get_intfdata(iface); - - pr_info("--- eucr_suspend ---\n"); - /* Wait until no command is running */ - mutex_lock(&us->dev_mutex); - - if (us->suspend_resume_hook) - (us->suspend_resume_hook)(us, US_SUSPEND); - - mutex_unlock(&us->dev_mutex); - return 0; -} - -static int eucr_resume(struct usb_interface *iface) -{ - u8 tmp = 0; - struct us_data *us = usb_get_intfdata(iface); - - pr_info("--- eucr_resume---\n"); - mutex_lock(&us->dev_mutex); - - if (us->suspend_resume_hook) - (us->suspend_resume_hook)(us, US_RESUME); - - - mutex_unlock(&us->dev_mutex); - - us->Power_IsResum = true; - - us->SM_Status = *(struct keucr_sm_status *)&tmp; - - return 0; -} - -static int eucr_reset_resume(struct usb_interface *iface) -{ - u8 tmp = 0; - struct us_data *us = usb_get_intfdata(iface); - - pr_info("--- eucr_reset_resume---\n"); - - /* Report the reset to the SCSI core */ - usb_stor_report_bus_reset(us); - - /* - * FIXME: Notify the subdrivers that they need to reinitialize - * the device - */ - - us->Power_IsResum = true; - - us->SM_Status = *(struct keucr_sm_status *)&tmp; - - return 0; -} - -#else - -#define eucr_suspend NULL -#define eucr_resume NULL -#define eucr_reset_resume NULL - -#endif - -static int eucr_pre_reset(struct usb_interface *iface) -{ - struct us_data *us = usb_get_intfdata(iface); - - pr_info("usb --- eucr_pre_reset\n"); - - /* Make sure no command runs during the reset */ - mutex_lock(&us->dev_mutex); - return 0; -} - -static int eucr_post_reset(struct usb_interface *iface) -{ - struct us_data *us = usb_get_intfdata(iface); - - pr_info("usb --- eucr_post_reset\n"); - - /* Report the reset to the SCSI core */ - usb_stor_report_bus_reset(us); - - mutex_unlock(&us->dev_mutex); - return 0; -} - -void fill_inquiry_response(struct us_data *us, unsigned char *data, - unsigned int data_len) -{ - pr_info("usb --- fill_inquiry_response\n"); - if (data_len < 36) /* You lose. */ - return; - - if (data[0]&0x20) { - memset(data+8, 0, 28); - } else { - u16 bcdDevice = - le16_to_cpu(us->pusb_dev->descriptor.bcdDevice); - memcpy(data+8, us->unusual_dev->vendorName, - strlen(us->unusual_dev->vendorName) > 8 ? 8 : - strlen(us->unusual_dev->vendorName)); - memcpy(data+16, us->unusual_dev->productName, - strlen(us->unusual_dev->productName) > 16 ? 16 : - strlen(us->unusual_dev->productName)); - data[32] = 0x30 + ((bcdDevice>>12) & 0x0F); - data[33] = 0x30 + ((bcdDevice>>8) & 0x0F); - data[34] = 0x30 + ((bcdDevice>>4) & 0x0F); - data[35] = 0x30 + ((bcdDevice) & 0x0F); - } - usb_stor_set_xfer_buf(us, data, data_len, us->srb, TO_XFER_BUF); -} - -static int usb_stor_control_thread(void *__us) -{ - struct us_data *us = (struct us_data *)__us; - struct Scsi_Host *host = us_to_host(us); - - pr_info("usb --- usb_stor_control_thread\n"); - for (;;) { - if (wait_for_completion_interruptible(&us->cmnd_ready)) - break; - - /* lock the device pointers */ - mutex_lock(&(us->dev_mutex)); - - /* if the device has disconnected, we are free to exit */ - if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) { - mutex_unlock(&us->dev_mutex); - break; - } - - /* lock access to the state */ - scsi_lock(host); - - /* When we are called with no command pending, we're done */ - if (us->srb == NULL) { - scsi_unlock(host); - mutex_unlock(&us->dev_mutex); - break; - } - - /* has the command timed out *already* ? */ - if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) { - us->srb->result = DID_ABORT << 16; - goto SkipForAbort; - } - - scsi_unlock(host); - - if (us->srb->sc_data_direction == DMA_BIDIRECTIONAL) { - us->srb->result = DID_ERROR << 16; - } else if (us->srb->device->id - && !(us->fflags & US_FL_SCM_MULT_TARG)) { - us->srb->result = DID_BAD_TARGET << 16; - } else if (us->srb->device->lun > us->max_lun) { - us->srb->result = DID_BAD_TARGET << 16; - } else if ((us->srb->cmnd[0] == INQUIRY) - && (us->fflags & US_FL_FIX_INQUIRY)) { - unsigned char data_ptr[36] = {0x00, 0x80, 0x02, 0x02, - 0x1F, 0x00, 0x00, 0x00}; - - fill_inquiry_response(us, data_ptr, 36); - us->srb->result = SAM_STAT_GOOD; - } else { - us->proto_handler(us->srb, us); - } - - /* lock access to the state */ - scsi_lock(host); - - /* indicate that the command is done */ - if (us->srb->result != DID_ABORT << 16) { - us->srb->scsi_done(us->srb); - } else { -SkipForAbort: - pr_info("scsi command aborted\n"); - } - - if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) { - complete(&(us->notify)); - - /* Allow USB transfers to resume */ - clear_bit(US_FLIDX_ABORTING, &us->dflags); - clear_bit(US_FLIDX_TIMED_OUT, &us->dflags); - } - - /* finished working on this command */ - us->srb = NULL; - scsi_unlock(host); - - /* unlock the device pointers */ - mutex_unlock(&us->dev_mutex); - } /* for (;;) */ - - /* Wait until we are told to stop */ - for (;;) { - set_current_state(TASK_INTERRUPTIBLE); - if (kthread_should_stop()) - break; - schedule(); - } - __set_current_state(TASK_RUNNING); - return 0; -} - -static int associate_dev(struct us_data *us, struct usb_interface *intf) -{ - pr_info("usb --- associate_dev\n"); - - /* Fill in the device-related fields */ - us->pusb_dev = interface_to_usbdev(intf); - us->pusb_intf = intf; - us->ifnum = intf->cur_altsetting->desc.bInterfaceNumber; - - /* Store our private data in the interface */ - usb_set_intfdata(intf, us); - - /* Allocate the device-related DMA-mapped buffers */ - us->cr = usb_alloc_coherent(us->pusb_dev, sizeof(*us->cr), GFP_KERNEL, - &us->cr_dma); - if (!us->cr) { - pr_info("usb_ctrlrequest allocation failed\n"); - return -ENOMEM; - } - - us->iobuf = usb_alloc_coherent(us->pusb_dev, US_IOBUF_SIZE, GFP_KERNEL, - &us->iobuf_dma); - if (!us->iobuf) { - pr_info("I/O buffer allocation failed\n"); - return -ENOMEM; - } - - us->sensebuf = kmalloc(US_SENSE_SIZE, GFP_KERNEL); - if (!us->sensebuf) - return -ENOMEM; - - return 0; -} - -static int get_device_info(struct us_data *us, const struct usb_device_id *id) -{ - struct usb_device *dev = us->pusb_dev; - struct usb_interface_descriptor *idesc = - &us->pusb_intf->cur_altsetting->desc; - - pr_info("usb --- get_device_info\n"); - - us->subclass = idesc->bInterfaceSubClass; - us->protocol = idesc->bInterfaceProtocol; - us->fflags = id->driver_info; - us->Power_IsResum = false; - - if (us->fflags & US_FL_IGNORE_DEVICE) { - pr_info("device ignored\n"); - return -ENODEV; - } - - if (dev->speed != USB_SPEED_HIGH) - us->fflags &= ~US_FL_GO_SLOW; - - return 0; -} - -static int get_transport(struct us_data *us) -{ - pr_info("usb --- get_transport\n"); - switch (us->protocol) { - case USB_PR_BULK: - us->transport_name = "Bulk"; - us->transport = usb_stor_Bulk_transport; - us->transport_reset = usb_stor_Bulk_reset; - break; - - default: - return -EIO; - } - - /* fix for single-lun devices */ - if (us->fflags & US_FL_SINGLE_LUN) - us->max_lun = 0; - return 0; -} - -static int get_protocol(struct us_data *us) -{ - pr_info("usb --- get_protocol\n"); - pr_info("us->pusb_dev->descriptor.idVendor = %x\n", - us->pusb_dev->descriptor.idVendor); - pr_info("us->pusb_dev->descriptor.idProduct = %x\n", - us->pusb_dev->descriptor.idProduct); - switch (us->subclass) { - case USB_SC_SCSI: - us->protocol_name = "Transparent SCSI"; - if ((us->pusb_dev->descriptor.idVendor == 0x0CF2) - && (us->pusb_dev->descriptor.idProduct == 0x6250)) - us->proto_handler = ENE_stor_invoke_transport; - else - us->proto_handler = usb_stor_invoke_transport; - break; - - default: - return -EIO; - } - return 0; -} - -static int get_pipes(struct us_data *us) -{ - struct usb_host_interface *altsetting = us->pusb_intf->cur_altsetting; - int i; - struct usb_endpoint_descriptor *ep; - struct usb_endpoint_descriptor *ep_in = NULL; - struct usb_endpoint_descriptor *ep_out = NULL; - struct usb_endpoint_descriptor *ep_int = NULL; - - pr_info("usb --- get_pipes\n"); - - for (i = 0; i < altsetting->desc.bNumEndpoints; i++) { - ep = &altsetting->endpoint[i].desc; - - if (usb_endpoint_xfer_bulk(ep)) { - if (usb_endpoint_dir_in(ep)) { - if (!ep_in) - ep_in = ep; - } else { - if (!ep_out) - ep_out = ep; - } - } else if (usb_endpoint_is_int_in(ep)) { - if (!ep_int) - ep_int = ep; - } - } - - if (!ep_in || !ep_out || (us->protocol == USB_PR_CBI && !ep_int)) { - pr_info("Endpoint sanity check failed! Rejecting dev.\n"); - return -EIO; - } - - /* Calculate and store the pipe values */ - us->send_ctrl_pipe = usb_sndctrlpipe(us->pusb_dev, 0); - us->recv_ctrl_pipe = usb_rcvctrlpipe(us->pusb_dev, 0); - us->send_bulk_pipe = usb_sndbulkpipe(us->pusb_dev, - ep_out->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); - us->recv_bulk_pipe = usb_rcvbulkpipe(us->pusb_dev, - ep_in->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); - if (ep_int) { - us->recv_intr_pipe = usb_rcvintpipe(us->pusb_dev, - ep_int->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); - us->ep_bInterval = ep_int->bInterval; - } - return 0; -} - -static int usb_stor_acquire_resources(struct us_data *us) -{ - struct task_struct *th; - - pr_info("usb --- usb_stor_acquire_resources\n"); - us->current_urb = usb_alloc_urb(0, GFP_KERNEL); - if (!us->current_urb) { - pr_info("URB allocation failed\n"); - return -ENOMEM; - } - - /* Start up our control thread */ - th = kthread_run(usb_stor_control_thread, us, "eucr-storage"); - if (IS_ERR(th)) { - pr_info("Unable to start control thread\n"); - return PTR_ERR(th); - } - us->ctl_thread = th; - - return 0; -} - -static void usb_stor_release_resources(struct us_data *us) -{ - pr_info("usb --- usb_stor_release_resources\n"); - - SM_FreeMem(); - - complete(&us->cmnd_ready); - if (us->ctl_thread) - kthread_stop(us->ctl_thread); - - /* Call the destructor routine, if it exists */ - if (us->extra_destructor) { - pr_info("-- calling extra_destructor()\n"); - us->extra_destructor(us->extra); - } - - /* Free the extra data and the URB */ - kfree(us->extra); - usb_free_urb(us->current_urb); -} - -static void dissociate_dev(struct us_data *us) -{ - pr_info("usb --- dissociate_dev\n"); - - kfree(us->sensebuf); - - /* Free the device-related DMA-mapped buffers */ - usb_free_coherent(us->pusb_dev, sizeof(*us->cr), us->cr, us->cr_dma); - usb_free_coherent(us->pusb_dev, US_IOBUF_SIZE, us->iobuf, - us->iobuf_dma); - - /* Remove our private data from the interface */ - usb_set_intfdata(us->pusb_intf, NULL); -} - -static void quiesce_and_remove_host(struct us_data *us) -{ - struct Scsi_Host *host = us_to_host(us); - - pr_info("usb --- quiesce_and_remove_host\n"); - - /* If the device is really gone, cut short reset delays */ - if (us->pusb_dev->state == USB_STATE_NOTATTACHED) - set_bit(US_FLIDX_DISCONNECTING, &us->dflags); - - /* - * Prevent SCSI-scanning (if it hasn't started yet) - * and wait for the SCSI-scanning thread to stop. - */ - set_bit(US_FLIDX_DONT_SCAN, &us->dflags); - wake_up(&us->delay_wait); - wait_for_completion(&us->scanning_done); - - /* - * Removing the host will perform an orderly shutdown: caches - * synchronized, disks spun down, etc. - */ - scsi_remove_host(host); - - /* - * Prevent any new commands from being accepted and cut short - * reset delays. - */ - scsi_lock(host); - set_bit(US_FLIDX_DISCONNECTING, &us->dflags); - scsi_unlock(host); - wake_up(&us->delay_wait); -} - -static void release_everything(struct us_data *us) -{ - pr_info("usb --- release_everything\n"); - - usb_stor_release_resources(us); - dissociate_dev(us); - scsi_host_put(us_to_host(us)); -} - -static int usb_stor_scan_thread(void *__us) -{ - struct us_data *us = (struct us_data *)__us; - - pr_info("usb --- usb_stor_scan_thread\n"); - pr_info("EUCR : device found at %d\n", us->pusb_dev->devnum); - - set_freezable(); - /* Wait for the timeout to expire or for a disconnect */ - if (delay_use > 0) { - wait_event_freezable_timeout(us->delay_wait, - test_bit(US_FLIDX_DONT_SCAN, &us->dflags), - delay_use * HZ); - } - - /* If the device is still connected, perform the scanning */ - if (!test_bit(US_FLIDX_DONT_SCAN, &us->dflags)) { - /* For bulk-only devices, determine the max LUN value */ - if (us->protocol == USB_PR_BULK - && !(us->fflags & US_FL_SINGLE_LUN)) { - mutex_lock(&us->dev_mutex); - us->max_lun = usb_stor_Bulk_max_lun(us); - mutex_unlock(&us->dev_mutex); - } - scsi_scan_host(us_to_host(us)); - pr_info("EUCR : device scan complete\n"); - } - complete_and_exit(&us->scanning_done, 0); -} - -static int eucr_probe(struct usb_interface *intf, - const struct usb_device_id *id) -{ - struct Scsi_Host *host; - struct us_data *us; - int result; - u8 MiscReg03 = 0; - struct task_struct *th; - - pr_info("usb --- eucr_probe\n"); - - host = scsi_host_alloc(&usb_stor_host_template, sizeof(*us)); - if (!host) { - pr_info("Unable to allocate the scsi host\n"); - return -ENOMEM; - } - - /* Allow 16-byte CDBs and thus > 2TB */ - host->max_cmd_len = 16; - us = host_to_us(host); - memset(us, 0, sizeof(struct us_data)); - mutex_init(&(us->dev_mutex)); - init_completion(&us->cmnd_ready); - init_completion(&(us->notify)); - init_waitqueue_head(&us->delay_wait); - init_completion(&us->scanning_done); - - /* Associate the us_data structure with the USB device */ - result = associate_dev(us, intf); - if (result) - goto BadDevice; - - /* Get Device info */ - result = get_device_info(us, id); - if (result) - goto BadDevice; - - /* Get the transport, protocol, and pipe settings */ - result = get_transport(us); - if (result) - goto BadDevice; - result = get_protocol(us); - if (result) - goto BadDevice; - result = get_pipes(us); - if (result) - goto BadDevice; - - /* Acquire all the other resources and add the host */ - result = usb_stor_acquire_resources(us); - if (result) - goto BadDevice; - - result = scsi_add_host(host, &intf->dev); - if (result) { - pr_info("Unable to add the scsi host\n"); - goto BadDevice; - } - - /* Start up the thread for delayed SCSI-device scanning */ - th = kthread_create(usb_stor_scan_thread, us, "eucr-stor-scan"); - if (IS_ERR(th)) { - pr_info("Unable to start the device-scanning thread\n"); - complete(&us->scanning_done); - quiesce_and_remove_host(us); - result = PTR_ERR(th); - goto BadDevice; - } - wake_up_process(th); - - /* probe card type */ - result = ene_read_byte(us, REG_CARD_STATUS, &MiscReg03); - if (result != USB_STOR_XFER_GOOD) { - result = USB_STOR_TRANSPORT_ERROR; - quiesce_and_remove_host(us); - goto BadDevice; - } - - if (!(MiscReg03 & 0x02)) { - result = -ENODEV; - quiesce_and_remove_host(us); - pr_info("keucr: The driver only supports SM/MS card. To use SD card, please build driver/usb/storage/ums-eneub6250.ko\n"); - goto BadDevice; - } - - return 0; - - /* We come here if there are any problems */ -BadDevice: - pr_info("usb --- eucr_probe failed\n"); - release_everything(us); - return result; -} - -static void eucr_disconnect(struct usb_interface *intf) -{ - struct us_data *us = usb_get_intfdata(intf); - - pr_info("usb --- eucr_disconnect\n"); - quiesce_and_remove_host(us); - release_everything(us); -} - -/* Initialization and registration */ -static struct usb_driver usb_storage_driver = { - .name = "eucr", - .probe = eucr_probe, - .suspend = eucr_suspend, - .resume = eucr_resume, - .reset_resume = eucr_reset_resume, - .disconnect = eucr_disconnect, - .pre_reset = eucr_pre_reset, - .post_reset = eucr_post_reset, - .id_table = eucr_usb_ids, - .soft_unbind = 1, -}; - -module_usb_driver(usb_storage_driver); diff --git a/drivers/staging/keucr/usb.h b/drivers/staging/keucr/usb.h deleted file mode 100644 index e894f840c708..000000000000 --- a/drivers/staging/keucr/usb.h +++ /dev/null @@ -1,240 +0,0 @@ -/* Driver for USB Mass Storage compliant devices */ - -#ifndef _USB_H_ -#define _USB_H_ - -#include -#include -#include -#include -#include -#include -#include "common.h" - -struct us_data; -struct scsi_cmnd; - -/* - * Unusual device list definitions - */ - -struct us_unusual_dev { - const char *vendorName; - const char *productName; - __u8 useProtocol; - __u8 useTransport; - int (*initFunction)(struct us_data *); -}; - -/* EnE HW Register */ -#define REG_CARD_STATUS 0xFF83 -#define REG_HW_TRAP1 0xFF89 - -/* SRB Status. Refers /usr/include/wine/wine/wnaspi32.h & SCSI sense key */ -#define SS_SUCCESS 0x00 /* No Sense */ -#define SS_NOT_READY 0x02 -#define SS_MEDIUM_ERR 0x03 -#define SS_HW_ERR 0x04 -#define SS_ILLEGAL_REQUEST 0x05 -#define SS_UNIT_ATTENTION 0x06 - -/* ENE Load FW Pattern */ -#define SD_INIT1_PATTERN 1 -#define SD_INIT2_PATTERN 2 -#define SD_RW_PATTERN 3 -#define MS_INIT_PATTERN 4 -#define MSP_RW_PATTERN 5 -#define MS_RW_PATTERN 6 -#define SM_INIT_PATTERN 7 -#define SM_RW_PATTERN 8 - -#define FDIR_WRITE 0 -#define FDIR_READ 1 - -struct keucr_sd_status { - u8 Insert:1; - u8 Ready:1; - u8 MediaChange:1; - u8 IsMMC:1; - u8 HiCapacity:1; - u8 HiSpeed:1; - u8 WtP:1; - u8 Reserved:1; -}; - -struct keucr_ms_status { - u8 Insert:1; - u8 Ready:1; - u8 MediaChange:1; - u8 IsMSPro:1; - u8 IsMSPHG:1; - u8 Reserved1:1; - u8 WtP:1; - u8 Reserved2:1; -}; - -struct keucr_sm_status { - u8 Insert:1; - u8 Ready:1; - u8 MediaChange:1; - u8 Reserved:3; - u8 WtP:1; - u8 IsMS:1; -}; - -/* SD Block Length */ -#define SD_BLOCK_LEN 9 /* 2^9 = 512 Bytes, - The HW maximum read/write data length */ - -/* Dynamic bitflag definitions (us->dflags): used in set_bit() etc. */ -#define US_FLIDX_URB_ACTIVE 0 /* current_urb is in use */ -#define US_FLIDX_SG_ACTIVE 1 /* current_sg is in use */ -#define US_FLIDX_ABORTING 2 /* abort is in progress */ -#define US_FLIDX_DISCONNECTING 3 /* disconnect in progress */ -#define US_FLIDX_RESETTING 4 /* device reset in progress */ -#define US_FLIDX_TIMED_OUT 5 /* SCSI midlayer timed out */ -#define US_FLIDX_DONT_SCAN 6 /* don't scan (disconnect) */ - - -#define USB_STOR_STRING_LEN 32 - -/* - * We provide a DMA-mapped I/O buffer for use with small USB transfers. - * It turns out that CB[I] needs a 12-byte buffer and Bulk-only needs a - * 31-byte buffer. But Freecom needs a 64-byte buffer, so that's the - * size we'll allocate. - */ - -#define US_IOBUF_SIZE 64 /* Size of the DMA-mapped I/O buffer */ -#define US_SENSE_SIZE 18 /* Size of the autosense data buffer */ - -typedef int (*trans_cmnd)(struct scsi_cmnd *, struct us_data *); -typedef int (*trans_reset)(struct us_data *); -typedef void (*proto_cmnd)(struct scsi_cmnd *, struct us_data *); -typedef void (*extra_data_destructor)(void *); /* extra data destructor */ -typedef void (*pm_hook)(struct us_data *, int); /* power management hook */ - -#define US_SUSPEND 0 -#define US_RESUME 1 - -/* we allocate one of these for every device that we remember */ -struct us_data { - /* The device we're working with - * It's important to note: - * (o) you must hold dev_mutex to change pusb_dev - */ - struct mutex dev_mutex; /* protect pusb_dev */ - struct usb_device *pusb_dev; /* this usb_device */ - struct usb_interface *pusb_intf; /* this interface */ - struct us_unusual_dev *unusual_dev; /* device-filter entry */ - unsigned long fflags; /* fixed flags from filter */ - unsigned long dflags; /* dynamic atomic bitflags */ - unsigned int send_bulk_pipe; /* cached pipe values */ - unsigned int recv_bulk_pipe; - unsigned int send_ctrl_pipe; - unsigned int recv_ctrl_pipe; - unsigned int recv_intr_pipe; - - /* information about the device */ - char *transport_name; - char *protocol_name; - __le32 bcs_signature; - u8 subclass; - u8 protocol; - u8 max_lun; - - u8 ifnum; /* interface number */ - u8 ep_bInterval; /* interrupt interval */ - - /* function pointers for this device */ - trans_cmnd transport; /* transport function */ - trans_reset transport_reset; /* transport device reset */ - proto_cmnd proto_handler; /* protocol handler */ - - /* SCSI interfaces */ - struct scsi_cmnd *srb; /* current srb */ - unsigned int tag; /* current dCBWTag */ - - /* control and bulk communications data */ - struct urb *current_urb; /* USB requests */ - struct usb_ctrlrequest *cr; /* control requests */ - struct usb_sg_request current_sg; /* scatter-gather req. */ - unsigned char *iobuf; /* I/O buffer */ - unsigned char *sensebuf; /* sense data buffer */ - dma_addr_t cr_dma; /* buffer DMA addresses */ - dma_addr_t iobuf_dma; - struct task_struct *ctl_thread; /* the control thread */ - - /* mutual exclusion and synchronization structures */ - struct completion cmnd_ready; /* to sleep thread on */ - struct completion notify; /* thread begin/end */ - wait_queue_head_t delay_wait; /* wait during scan, reset */ - struct completion scanning_done; /* wait for scan thread */ - - /* subdriver information */ - void *extra; /* Any extra data */ - extra_data_destructor extra_destructor;/* extra data destructor */ -#ifdef CONFIG_PM - pm_hook suspend_resume_hook; -#endif - /* for 6250 code */ - struct keucr_sd_status SD_Status; - struct keucr_ms_status MS_Status; - struct keucr_sm_status SM_Status; - - /* ----- SD Control Data ---------------- */ - /* SD_REGISTER SD_Regs; */ - u16 SD_Block_Mult; - u8 SD_READ_BL_LEN; - u16 SD_C_SIZE; - u8 SD_C_SIZE_MULT; - - /* SD/MMC New spec. */ - u8 SD_SPEC_VER; - u8 SD_CSD_VER; - u8 SD20_HIGH_CAPACITY; - u32 HC_C_SIZE; - u8 MMC_SPEC_VER; - u8 MMC_BusWidth; - u8 MMC_HIGH_CAPACITY; - - /* ----- MS Control Data ---------------- */ - bool MS_SWWP; - u32 MSP_TotalBlock; - /* MS_LibControl MS_Lib; */ - bool MS_IsRWPage; - u16 MS_Model; - - /* ----- SM Control Data ---------------- */ - u8 SM_DeviceID; - u8 SM_CardID; - - u8 *testbuf; - u8 BIN_FLAG; - u32 bl_num; - int SrbStatus; - - /* ------Power Managerment --------------- */ - bool Power_IsResum; -}; - -/* Convert between us_data and the corresponding Scsi_Host */ -static inline struct Scsi_Host *us_to_host(struct us_data *us) -{ - return container_of((void *) us, struct Scsi_Host, hostdata); -} -static inline struct us_data *host_to_us(struct Scsi_Host *host) -{ - return (struct us_data *) host->hostdata; -} - -/* Function to fill an inquiry response. See usb.c for details */ -extern void fill_inquiry_response(struct us_data *us, - unsigned char *data, unsigned int data_len); - -/* The scsi_lock() and scsi_unlock() macros protect the sm_state and the - * single queue element srb for write access */ -#define scsi_unlock(host) spin_unlock_irq(host->host_lock) -#define scsi_lock(host) spin_lock_irq(host->host_lock) - -#endif diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig index 13b5bfbaf951..9a26242baefa 100644 --- a/drivers/usb/storage/Kconfig +++ b/drivers/usb/storage/Kconfig @@ -193,7 +193,7 @@ config USB_STORAGE_ENE_UB6250 depends on USB_STORAGE ---help--- Say Y here if you wish to control a ENE SD/MS Card reader. - To use SM card, please build driver/staging/keucr/keucr.ko + Note that this driver does not support SM cards. This option depends on 'SCSI' support being enabled, but you probably also need 'SCSI device support: SCSI disk support' diff --git a/drivers/usb/storage/ene_ub6250.c b/drivers/usb/storage/ene_ub6250.c index ef6efb55dc31..56f782bef36b 100644 --- a/drivers/usb/storage/ene_ub6250.c +++ b/drivers/usb/storage/ene_ub6250.c @@ -2344,8 +2344,8 @@ static int ene_ub6250_probe(struct usb_interface *intf, } if (!(misc_reg03 & 0x01)) { - pr_info("ums_eneub6250: The driver only supports SD/MS card. " - "To use SM card, please build driver/staging/keucr\n"); + pr_info("ums_eneub6250: This driver only supports SD/MS cards. " + "It does not support SM cards.\n"); } return result; -- cgit v1.2.3